From d98c50c36aa4c1e8dcbae751eb2613575c09c240 Mon Sep 17 00:00:00 2001 From: Castiron Bot Date: Mon, 3 Aug 2026 12:28:02 -0400 Subject: [PATCH 1/5] [castiron] SDK generated baseline checkpoint bootstrap --- .devcontainer/Dockerfile | 23 - .devcontainer/devcontainer.json | 20 - .gitattributes | 5 - .github/CODEOWNERS | 4 - .gitignore | 8 - .release-please-manifest.json | 3 - .stats.yml | 4 - CHANGELOG.md | 3241 ---------- CONTRIBUTING.md | 276 - LICENSE | 201 - README.md | 2040 ------- SECURITY.md | 29 - bedrock.md | 140 - build.gradle.kts | 142 - buildSrc/build.gradle.kts | 22 - .../GenerateVersionSupportMatrixTask.kt | 33 - .../gradle/VerifyVersionSupportPolicyTask.kt | 100 - .../com/openai/gradle/VersionSupportPolicy.kt | 166 - .../src/main/kotlin/openai.java.gradle.kts | 135 - .../src/main/kotlin/openai.kotlin.gradle.kts | 115 - .../src/main/kotlin/openai.publish.gradle.kts | 72 - .../kotlin/openai.wiremock-test.gradle.kts | 43 - .../openai/gradle/VersionSupportPolicyTest.kt | 79 - docs/spring-boot-2-eol.md | 63 - docs/version-support-policy.md | 88 - gradle.properties | 22 - gradle/version-support.properties | 17 - gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 7 - gradlew | 251 - gradlew.bat | 94 - openai-java-bedrock/build.gradle.kts | 44 - .../kotlin/com/openai/bedrock/BedrockAuth.kt | 472 -- .../okhttp/BedrockOpenAIOkHttpClient.kt | 247 - .../com/openai/bedrock/BedrockAuthTest.kt | 714 --- .../okhttp/BedrockOpenAIOkHttpClientTest.kt | 211 - .../resources/fixtures/bedrock/v1/sigv4.json | 23 - openai-java-client-okhttp/build.gradle.kts | 31 - .../com/openai/client/okhttp/OkHttpClient.kt | 364 -- .../client/okhttp/OpenAIOkHttpClient.kt | 481 -- .../client/okhttp/OpenAIOkHttpClientAsync.kt | 481 -- .../openai/client/okhttp/OkHttpClientTest.kt | 44 - .../OpenAIOkHttpClientNativeMutualTlsTest.kt | 165 - openai-java-core/build.gradle.kts | 150 - .../src/apiCompatibility/dependencies.txt | 9 - .../excluded-generated-tests.txt | 24 - .../compatibility/MultipartCompatibility.kt | 92 - .../ResponseStreamEventCompatibility.kt | 8 - .../StructuredOutputsCompatibility.kt | 112 - .../UnionFactoriesCompatibility.kt | 82 - .../structured-output-public-api.txt | 640 -- .../auth/AzureManagedIdentityTokenProvider.kt | 144 - .../com/openai/auth/GcpIdTokenProvider.kt | 133 - .../auth/K8sServiceAccountTokenProvider.kt | 87 - .../com/openai/auth/SubjectTokenProvider.kt | 39 - .../com/openai/auth/TokenExchangeResponse.kt | 10 - .../com/openai/auth/WorkloadIdentity.kt | 68 - .../com/openai/auth/WorkloadIdentityAuth.kt | 319 - .../openai/azure/AzureOpenAIServiceVersion.kt | 54 - .../com/openai/azure/AzureUrlCategory.kt | 47 - .../com/openai/azure/AzureUrlPathMode.kt | 14 - .../azure/HttpRequestBuilderExtensions.kt | 30 - .../azure/credential/AzureApiKeyCredential.kt | 26 - .../main/kotlin/com/openai/core/AutoPager.kt | 21 - .../kotlin/com/openai/core/AutoPagerAsync.kt | 88 - .../com/openai/core/BaseDeserializer.kt | 44 - .../kotlin/com/openai/core/BaseSerializer.kt | 6 - .../src/main/kotlin/com/openai/core/Check.kt | 96 - .../kotlin/com/openai/core/ClientOptions.kt | 833 --- .../kotlin/com/openai/core/DefaultSleeper.kt | 28 - .../openai/core/JsonSchemaLocalValidation.kt | 19 - .../com/openai/core/JsonSchemaValidator.kt | 714 --- .../main/kotlin/com/openai/core/LogLevel.kt | 33 - .../kotlin/com/openai/core/ObjectMappers.kt | 180 - .../src/main/kotlin/com/openai/core/Page.kt | 33 - .../main/kotlin/com/openai/core/PageAsync.kt | 35 - .../src/main/kotlin/com/openai/core/Params.kt | 16 - .../com/openai/core/PhantomReachable.kt | 56 - .../core/PhantomReachableExecutorService.kt | 58 - .../openai/core/PhantomReachableSleeper.kt | 23 - .../kotlin/com/openai/core/PrepareRequest.kt | 56 - .../main/kotlin/com/openai/core/Properties.kt | 42 - .../kotlin/com/openai/core/RequestOptions.kt | 55 - .../kotlin/com/openai/core/SecurityOptions.kt | 73 - .../main/kotlin/com/openai/core/Sleeper.kt | 21 - .../com/openai/core/StructuredOutputs.kt | 244 - .../main/kotlin/com/openai/core/Timeout.kt | 171 - .../src/main/kotlin/com/openai/core/Utils.kt | 121 - .../src/main/kotlin/com/openai/core/Values.kt | 723 --- .../com/openai/core/handlers/EmptyHandler.kt | 12 - .../com/openai/core/handlers/ErrorHandler.kt | 93 - .../com/openai/core/handlers/JsonHandler.kt | 20 - .../com/openai/core/handlers/SseHandler.kt | 147 - .../com/openai/core/handlers/StreamHandler.kt | 102 - .../com/openai/core/handlers/StringHandler.kt | 13 - .../openai/core/http/AsyncStreamResponse.kt | 157 - .../core/http/AuthenticatingHttpClient.kt | 37 - .../kotlin/com/openai/core/http/Headers.kt | 115 - .../kotlin/com/openai/core/http/HttpClient.kt | 26 - .../kotlin/com/openai/core/http/HttpMethod.kt | 13 - .../com/openai/core/http/HttpRequest.kt | 180 - .../core/http/HttpRequestAuthenticator.kt | 26 - .../com/openai/core/http/HttpRequestBodies.kt | 243 - .../com/openai/core/http/HttpRequestBody.kt | 25 - .../com/openai/core/http/HttpResponse.kt | 30 - .../com/openai/core/http/HttpResponseFor.kt | 25 - .../com/openai/core/http/LoggingHttpClient.kt | 636 -- ...ntomReachableClosingAsyncStreamResponse.kt | 56 - .../http/PhantomReachableClosingHttpClient.kt | 26 - ...eachableClosingHttpRequestAuthenticator.kt | 26 - .../PhantomReachableClosingStreamResponse.kt | 21 - .../openai/core/http/ProxyAuthenticator.kt | 59 - .../com/openai/core/http/QueryParams.kt | 109 - .../openai/core/http/RetryingHttpClient.kt | 262 - .../kotlin/com/openai/core/http/SseMessage.kt | 83 - .../com/openai/core/http/StreamResponse.kt | 19 - .../core/http/WorkloadIdentityHttpClient.kt | 61 - .../credential/BearerTokenCredential.kt | 36 - .../com/openai/credential/Credential.kt | 4 - .../credential/WorkloadIdentityCredential.kt | 9 - .../com/openai/errors/BadRequestException.kt | 100 - .../openai/errors/InternalServerException.kt | 112 - .../InvalidWebhookSignatureException.kt | 5 - .../com/openai/errors/NotFoundException.kt | 100 - .../com/openai/errors/OpenAIException.kt | 5 - .../errors/OpenAIInvalidDataException.kt | 5 - .../com/openai/errors/OpenAIIoException.kt | 5 - .../openai/errors/OpenAIRetryableException.kt | 14 - .../openai/errors/OpenAIServiceException.kt | 23 - .../errors/PermissionDeniedException.kt | 100 - .../com/openai/errors/RateLimitException.kt | 100 - .../kotlin/com/openai/errors/SseException.kt | 112 - .../errors/SubjectTokenProviderException.kt | 14 - .../openai/errors/UnauthorizedException.kt | 100 - .../errors/UnexpectedStatusCodeException.kt | 113 - .../errors/UnprocessableEntityException.kt | 100 - .../helpers/ChatCompletionAccumulator.kt | 360 -- .../com/openai/helpers/ResponseAccumulator.kt | 337 -- .../models/audio/AudioResponseFormat.kt | 11 - .../beta/realtime/ConversationCreatedEvent.kt | 564 -- .../models/beta/realtime/ConversationItem.kt | 1068 ---- .../beta/realtime/ConversationItemContent.kt | 451 -- .../realtime/ConversationItemCreateEvent.kt | 312 - .../realtime/ConversationItemCreatedEvent.kt | 314 - .../realtime/ConversationItemDeleteEvent.kt | 253 - .../realtime/ConversationItemDeletedEvent.kt | 254 - ...emInputAudioTranscriptionCompletedEvent.kt | 1718 ------ ...onItemInputAudioTranscriptionDeltaEvent.kt | 647 -- ...nItemInputAudioTranscriptionFailedEvent.kt | 593 -- .../realtime/ConversationItemRetrieveEvent.kt | 255 - .../realtime/ConversationItemTruncateEvent.kt | 349 -- .../ConversationItemTruncatedEvent.kt | 340 -- .../realtime/ConversationItemWithReference.kt | 1518 ----- .../openai/models/beta/realtime/ErrorEvent.kt | 570 -- .../realtime/InputAudioBufferAppendEvent.kt | 262 - .../realtime/InputAudioBufferClearEvent.kt | 201 - .../realtime/InputAudioBufferClearedEvent.kt | 217 - .../realtime/InputAudioBufferCommitEvent.kt | 207 - .../InputAudioBufferCommittedEvent.kt | 310 - .../InputAudioBufferSpeechStartedEvent.kt | 312 - .../InputAudioBufferSpeechStoppedEvent.kt | 303 - .../beta/realtime/RateLimitsUpdatedEvent.kt | 664 --- .../beta/realtime/RealtimeClientEvent.kt | 1146 ---- .../models/beta/realtime/RealtimeResponse.kt | 1744 ------ .../beta/realtime/RealtimeResponseStatus.kt | 706 --- .../beta/realtime/RealtimeResponseUsage.kt | 770 --- .../beta/realtime/RealtimeServerEvent.kt | 3101 ---------- .../beta/realtime/ResponseAudioDeltaEvent.kt | 416 -- .../beta/realtime/ResponseAudioDoneEvent.kt | 382 -- .../ResponseAudioTranscriptDeltaEvent.kt | 419 -- .../ResponseAudioTranscriptDoneEvent.kt | 434 -- .../beta/realtime/ResponseCancelEvent.kt | 242 - .../realtime/ResponseContentPartAddedEvent.kt | 803 --- .../realtime/ResponseContentPartDoneEvent.kt | 802 --- .../beta/realtime/ResponseCreateEvent.kt | 2220 ------- .../beta/realtime/ResponseCreatedEvent.kt | 261 - .../models/beta/realtime/ResponseDoneEvent.kt | 262 - ...ResponseFunctionCallArgumentsDeltaEvent.kt | 417 -- .../ResponseFunctionCallArgumentsDoneEvent.kt | 419 -- .../realtime/ResponseOutputItemAddedEvent.kt | 332 -- .../realtime/ResponseOutputItemDoneEvent.kt | 335 -- .../beta/realtime/ResponseTextDeltaEvent.kt | 416 -- .../beta/realtime/ResponseTextDoneEvent.kt | 419 -- .../beta/realtime/SessionCreatedEvent.kt | 255 - .../beta/realtime/SessionUpdateEvent.kt | 4768 --------------- .../beta/realtime/SessionUpdatedEvent.kt | 252 - .../realtime/TranscriptionSessionUpdate.kt | 2948 --------- .../TranscriptionSessionUpdatedEvent.kt | 273 - .../models/beta/realtime/sessions/Session.kt | 3913 ------------ .../realtime/sessions/SessionCreateParams.kt | 5271 ----------------- .../sessions/SessionCreateResponse.kt | 2760 --------- .../TranscriptionSession.kt | 1410 ----- .../TranscriptionSessionCreateParams.kt | 3158 ---------- .../completions/ChatCompletionCreateParams.kt | 99 +- .../ChatCompletionMessageFunctionToolCall.kt | 17 - .../ChatCompletionToolMessageParam.kt | 9 - .../completions/StructuredChatCompletion.kt | 182 - .../StructuredChatCompletionCreateParams.kt | 914 --- .../StructuredChatCompletionMessage.kt | 95 - .../com/openai/models/embeddings/Embedding.kt | 70 +- .../embeddings/EmbeddingCreateParams.kt | 3 +- .../models/embeddings/EmbeddingValue.kt | 225 - .../models/responses/ResponseCreateParams.kt | 58 - .../responses/ResponseFunctionToolCall.kt | 16 - .../responses/ResponseFunctionWebSearch.kt | 44 +- .../models/responses/ResponseInputItem.kt | 9 - .../models/responses/ResponseStreamEvent.kt | 1 - .../models/responses/ResponseTextConfig.kt | 23 - .../models/responses/StructuredResponse.kt | 267 - .../StructuredResponseCreateParams.kt | 832 --- .../responses/StructuredResponseOutputItem.kt | 611 -- .../StructuredResponseOutputMessage.kt | 187 - .../responses/StructuredResponseTextConfig.kt | 143 - .../kotlin/com/openai/models/videos/Video.kt | 4 +- .../webhooks/WebhookVerificationParams.kt | 85 - .../services/ResponseStreamEventValidation.kt | 18 - .../openai/services/async/BetaServiceAsync.kt | 11 - .../services/async/BetaServiceAsyncImpl.kt | 18 - .../services/async/ResponseServiceAsync.kt | 46 - .../async/ResponseServiceAsyncImpl.kt | 5 +- .../services/async/WebhookServiceAsync.kt | 16 +- .../services/async/WebhookServiceAsyncImpl.kt | 8 +- .../audio/TranscriptionServiceAsyncImpl.kt | 21 +- .../async/beta/RealtimeServiceAsync.kt | 52 - .../async/beta/RealtimeServiceAsyncImpl.kt | 64 - .../async/beta/ResponseServiceAsyncImpl.kt | 3 +- .../beta/realtime/SessionServiceAsync.kt | 90 - .../beta/realtime/SessionServiceAsyncImpl.kt | 98 - .../TranscriptionSessionServiceAsync.kt | 93 - .../TranscriptionSessionServiceAsyncImpl.kt | 103 - .../async/chat/ChatCompletionServiceAsync.kt | 48 - .../checkpoints/PermissionServiceAsyncImpl.kt | 8 +- .../openai/services/blocking/BetaService.kt | 11 - .../services/blocking/BetaServiceImpl.kt | 18 - .../services/blocking/ImageServiceImpl.kt | 4 +- .../services/blocking/ResponseService.kt | 45 - .../services/blocking/ResponseServiceImpl.kt | 5 +- .../services/blocking/WebhookService.kt | 13 +- .../services/blocking/WebhookServiceImpl.kt | 115 +- .../audio/TranscriptionServiceImpl.kt | 20 +- .../services/blocking/beta/RealtimeService.kt | 48 - .../blocking/beta/RealtimeServiceImpl.kt | 63 - .../blocking/beta/ResponseServiceImpl.kt | 3 +- .../blocking/beta/realtime/SessionService.kt | 85 - .../beta/realtime/SessionServiceImpl.kt | 94 - .../realtime/TranscriptionSessionService.kt | 93 - .../TranscriptionSessionServiceImpl.kt | 96 - .../blocking/chat/ChatCompletionService.kt | 48 - .../checkpoints/PermissionServiceImpl.kt | 8 +- .../META-INF/proguard/openai-java-core.pro | 32 - .../kotlin/com/openai/TestServerExtension.kt | 80 - .../AzureManagedIdentityTokenProviderTest.kt | 203 - .../com/openai/auth/GcpIdTokenProviderTest.kt | 137 - .../K8sServiceAccountTokenProviderTest.kt | 120 - .../openai/auth/WorkloadIdentityAuthTest.kt | 544 -- .../com/openai/azure/AzureUrlCategoryTest.kt | 344 -- .../com/openai/core/AutoPagerAsyncTest.kt | 182 - .../kotlin/com/openai/core/AutoPagerTest.kt | 41 - .../com/openai/core/ClientOptionsTest.kt | 388 -- .../com/openai/core/JacksonVersionTest.kt | 33 - .../com/openai/core/ObjectMappersTest.kt | 117 - .../com/openai/core/PhantomReachableTest.kt | 27 - .../com/openai/core/PrepareRequestTest.kt | 109 - .../com/openai/core/StructuredOutputsTest.kt | 2154 ------- .../openai/core/StructuredOutputsTestUtils.kt | 371 -- .../test/kotlin/com/openai/core/UtilsTest.kt | 33 - .../test/kotlin/com/openai/core/ValuesTest.kt | 144 - .../WireMockHandlebarsCompatibilityTest.kt | 40 - .../openai/core/handlers/SseHandlerTest.kt | 196 - .../openai/core/handlers/StreamHandlerTest.kt | 94 - .../core/http/AsyncStreamResponseTest.kt | 268 - .../core/http/AuthenticatingHttpClientTest.kt | 67 - .../com/openai/core/http/ClientOptionsTest.kt | 106 - .../com/openai/core/http/HeadersTest.kt | 242 - .../openai/core/http/HttpRequestBodiesTest.kt | 739 --- .../com/openai/core/http/HttpRequestTest.kt | 110 - .../openai/core/http/LoggingHttpClientTest.kt | 1013 ---- .../com/openai/core/http/QueryParamsTest.kt | 180 - .../core/http/RetryingHttpClientTest.kt | 525 -- .../http/WorkloadIdentityHttpClientTest.kt | 148 - .../helpers/ChatCompletionAccumulatorTest.kt | 713 --- .../openai/helpers/ResponseAccumulatorTest.kt | 224 - .../realtime/ConversationCreatedEventTest.kt | 57 - .../realtime/ConversationItemContentTest.kt | 50 - .../ConversationItemCreateEventTest.kt | 108 - .../ConversationItemCreatedEventTest.kt | 108 - .../ConversationItemDeleteEventTest.kt | 35 - .../ConversationItemDeletedEventTest.kt | 35 - ...putAudioTranscriptionCompletedEventTest.kt | 135 - ...emInputAudioTranscriptionDeltaEventTest.kt | 72 - ...mInputAudioTranscriptionFailedEventTest.kt | 71 - .../ConversationItemRetrieveEventTest.kt | 36 - .../beta/realtime/ConversationItemTest.kt | 91 - .../ConversationItemTruncateEventTest.kt | 48 - .../ConversationItemTruncatedEventTest.kt | 48 - .../ConversationItemWithReferenceTest.kt | 96 - .../models/beta/realtime/ErrorEventTest.kt | 66 - .../InputAudioBufferAppendEventTest.kt | 35 - .../InputAudioBufferClearEventTest.kt | 34 - .../InputAudioBufferClearedEventTest.kt | 34 - .../InputAudioBufferCommitEventTest.kt | 34 - .../InputAudioBufferCommittedEventTest.kt | 45 - .../InputAudioBufferSpeechStartedEventTest.kt | 45 - .../InputAudioBufferSpeechStoppedEventTest.kt | 45 - .../realtime/RateLimitsUpdatedEventTest.kt | 63 - .../beta/realtime/RealtimeClientEventTest.kt | 920 --- .../realtime/RealtimeResponseStatusTest.kt | 46 - .../beta/realtime/RealtimeResponseTest.kt | 237 - .../realtime/RealtimeResponseUsageTest.kt | 85 - .../beta/realtime/RealtimeServerEventTest.kt | 3270 ---------- .../realtime/ResponseAudioDeltaEventTest.kt | 53 - .../realtime/ResponseAudioDoneEventTest.kt | 50 - .../ResponseAudioTranscriptDeltaEventTest.kt | 54 - .../ResponseAudioTranscriptDoneEventTest.kt | 54 - .../beta/realtime/ResponseCancelEventTest.kt | 35 - .../ResponseContentPartAddedEventTest.kt | 76 - .../ResponseContentPartDoneEventTest.kt | 75 - .../beta/realtime/ResponseCreateEventTest.kt | 181 - .../beta/realtime/ResponseCreatedEventTest.kt | 256 - .../beta/realtime/ResponseDoneEventTest.kt | 256 - ...onseFunctionCallArgumentsDeltaEventTest.kt | 54 - ...ponseFunctionCallArgumentsDoneEventTest.kt | 54 - .../ResponseOutputItemAddedEventTest.kt | 111 - .../ResponseOutputItemDoneEventTest.kt | 111 - .../realtime/ResponseTextDeltaEventTest.kt | 53 - .../realtime/ResponseTextDoneEventTest.kt | 53 - .../beta/realtime/SessionCreatedEventTest.kt | 182 - .../beta/realtime/SessionUpdateEventTest.kt | 227 - .../beta/realtime/SessionUpdatedEventTest.kt | 182 - .../TranscriptionSessionUpdateTest.kt | 203 - .../TranscriptionSessionUpdatedEventTest.kt | 130 - .../sessions/SessionCreateParamsTest.kt | 198 - .../sessions/SessionCreateResponseTest.kt | 145 - .../beta/realtime/sessions/SessionTest.kt | 168 - .../TranscriptionSessionCreateParamsTest.kt | 168 - .../TranscriptionSessionTest.kt | 100 - .../ChatCompletionCreateParamsTest.kt | 32 - ...tructuredChatCompletionCreateParamsTest.kt | 394 -- .../StructuredChatCompletionMessageTest.kt | 129 - .../StructuredChatCompletionTest.kt | 309 - .../openai/models/embeddings/EmbeddingTest.kt | 26 - .../models/embeddings/EmbeddingValueTest.kt | 35 - .../StructuredResponseCreateParamsTest.kt | 394 -- .../StructuredResponseOutputItemTest.kt | 559 -- .../StructuredResponseOutputMessageTest.kt | 294 - .../responses/StructuredResponseTest.kt | 219 - .../StructuredResponseTextConfigTest.kt | 130 - .../com/openai/services/ErrorHandlingTest.kt | 2042 ------- .../ResponseStreamEventValidationTest.kt | 180 - .../async/CompletionServiceAsyncTest.kt | 2 - .../services/async/ImageServiceAsyncTest.kt | 3 - .../async/ResponseServiceAsyncTest.kt | 3 - .../services/async/WebhookServiceAsyncTest.kt | 64 +- .../audio/TranscriptionServiceAsyncTest.kt | 2 - .../async/beta/ResponseServiceAsyncTest.kt | 5 +- .../async/beta/ThreadServiceAsyncTest.kt | 2 - .../async/beta/threads/RunServiceAsyncTest.kt | 3 - .../chat/ChatCompletionServiceAsyncTest.kt | 2 - .../blocking/CompletionServiceTest.kt | 2 - .../services/blocking/ImageServiceTest.kt | 3 - .../services/blocking/ResponseServiceTest.kt | 3 - .../services/blocking/WebhookServiceTest.kt | 259 +- .../audio/TranscriptionServiceTest.kt | 2 - .../blocking/beta/ResponseServiceTest.kt | 4 +- .../blocking/beta/ThreadServiceTest.kt | 2 - .../blocking/beta/threads/RunServiceTest.kt | 3 - .../chat/ChatCompletionServiceTest.kt | 2 - openai-java-example/build.gradle.kts | 32 - .../AudioTranscriptionsAsyncExample.java | 34 - .../example/AudioTranscriptionsExample.java | 32 - .../AudioTranscriptionsVttExample.java | 34 - .../openai/example/AzureEntraIdExample.java | 34 - .../example/AzureKeyCredentialExample.java | 29 - .../AzureLegacyPathsEnabledExample.java | 33 - .../example/AzureUnifiedEndpointExample.java | 28 - .../example/BatchProcessingAsyncExample.java | 79 - .../example/BatchProcessingExample.java | 53 - .../example/BedrockResponsesExample.java | 26 - ...BedrockResponsesStreamingAsyncExample.java | 27 - .../example/CompletionsAsyncExample.java | 32 - .../CompletionsConversationAsyncExample.java | 56 - .../CompletionsConversationExample.java | 46 - .../openai/example/CompletionsExample.java | 28 - .../example/CompletionsFileExample.java | 57 - .../example/CompletionsImageUrlExample.java | 48 - .../CompletionsStreamingAsyncExample.java | 33 - ...ionsStreamingCancellationAsyncExample.java | 41 - ...mpletionsStreamingCancellationExample.java | 40 - .../example/CompletionsStreamingExample.java | 34 - .../example/EmbeddingsAsyncExample.java | 24 - .../com/openai/example/EmbeddingsExample.java | 24 - .../example/FunctionCallingAsyncExample.java | 100 - .../example/FunctionCallingExample.java | 92 - .../example/FunctionCallingRawExample.java | 93 - .../openai/example/ImageEditingExample.java | 49 - .../example/ImageGenerationExample.java | 30 - .../openai/example/ImageStreamingExample.java | 74 - .../main/java/com/openai/example/Main.java | 11 - .../openai/example/ModelListAsyncExample.java | 24 - .../com/openai/example/ModelListExample.java | 17 - .../example/ModerationsAsyncExample.java | 27 - .../openai/example/ModerationsExample.java | 24 - .../com/openai/example/MutualTlsExample.java | 133 - .../openai/example/ResponsesAsyncExample.java | 31 - .../example/ResponsesConversationExample.java | 55 - .../com/openai/example/ResponsesExample.java | 28 - .../ResponsesFunctionCallingExample.java | 98 - .../ResponsesFunctionCallingRawExample.java | 130 - .../example/ResponsesImageUrlExample.java | 46 - .../example/ResponsesInputFileExample.java | 49 - .../ResponsesStreamingAsyncExample.java | 28 - .../example/ResponsesStreamingExample.java | 31 - .../ResponsesStructuredOutputsExample.java | 73 - .../ResponsesStructuredOutputsRawExample.java | 52 - ...tructuredOutputsStreamingAsyncExample.java | 86 - ...nsesStructuredOutputsStreamingExample.java | 87 - ...nsesStructuredOutputsVerbosityExample.java | 77 - .../StructuredOutputsAsyncExample.java | 80 - .../example/StructuredOutputsExample.java | 76 - .../StructuredOutputsRawAsyncExample.java | 46 - .../example/StructuredOutputsRawExample.java | 42 - .../StructuredOutputsStreamingExample.java | 91 - .../example/VideoGenerationExample.java | 39 - .../src/main/resources/aloha-mask.png | Bin 413483 -> 0 bytes .../src/main/resources/aloha.png | Bin 446038 -> 0 bytes .../src/main/resources/logo.png | Bin 359514 -> 0 bytes .../src/main/resources/pdflatex-image.pdf | Bin 74061 -> 0 bytes .../src/main/resources/requests.jsonl | 2 - .../src/main/resources/sports.wav | Bin 478124 -> 0 bytes openai-java-lib/.keep | 4 - openai-java-proguard-test/build.gradle.kts | 113 - .../proguard/ProGuardCompatibilityTest.kt | 327 - openai-java-proguard-test/test.pro | 9 - .../build.gradle.kts | 100 - .../compatibility/BedrockRuntimeProbe.java | 39 - .../compatibility/CoreRuntimeProbe.java | 35 - .../compatibility/OkHttpRuntimeProbe.java | 22 - openai-java/build.gradle.kts | 29 - release-please-config.json | 68 - scripts/build | 11 - scripts/detect-breaking-changes | 418 -- scripts/fast-format | 46 - scripts/format | 21 - scripts/gradle | 13 - scripts/java-format | 7 - scripts/kotlin-format | 7 - scripts/lint | 23 - scripts/mock | 61 - scripts/test | 64 - scripts/upload-artifacts | 193 - settings.gradle.kts | 14 - 451 files changed, 147 insertions(+), 107398 deletions(-) delete mode 100644 .devcontainer/Dockerfile delete mode 100644 .devcontainer/devcontainer.json delete mode 100644 .gitattributes delete mode 100644 .github/CODEOWNERS delete mode 100644 .gitignore delete mode 100644 .release-please-manifest.json delete mode 100644 .stats.yml delete mode 100644 CHANGELOG.md delete mode 100644 CONTRIBUTING.md delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 SECURITY.md delete mode 100644 bedrock.md delete mode 100644 build.gradle.kts delete mode 100644 buildSrc/build.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/com/openai/gradle/GenerateVersionSupportMatrixTask.kt delete mode 100644 buildSrc/src/main/kotlin/com/openai/gradle/VerifyVersionSupportPolicyTask.kt delete mode 100644 buildSrc/src/main/kotlin/com/openai/gradle/VersionSupportPolicy.kt delete mode 100644 buildSrc/src/main/kotlin/openai.java.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/openai.kotlin.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/openai.publish.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/openai.wiremock-test.gradle.kts delete mode 100644 buildSrc/src/test/kotlin/com/openai/gradle/VersionSupportPolicyTest.kt delete mode 100644 docs/spring-boot-2-eol.md delete mode 100644 docs/version-support-policy.md delete mode 100644 gradle.properties delete mode 100644 gradle/version-support.properties delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100755 gradlew delete mode 100644 gradlew.bat delete mode 100644 openai-java-bedrock/build.gradle.kts delete mode 100644 openai-java-bedrock/src/main/kotlin/com/openai/bedrock/BedrockAuth.kt delete mode 100644 openai-java-bedrock/src/main/kotlin/com/openai/client/okhttp/BedrockOpenAIOkHttpClient.kt delete mode 100644 openai-java-bedrock/src/test/kotlin/com/openai/bedrock/BedrockAuthTest.kt delete mode 100644 openai-java-bedrock/src/test/kotlin/com/openai/client/okhttp/BedrockOpenAIOkHttpClientTest.kt delete mode 100644 openai-java-bedrock/src/test/resources/fixtures/bedrock/v1/sigv4.json delete mode 100644 openai-java-client-okhttp/build.gradle.kts delete mode 100644 openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OkHttpClient.kt delete mode 100644 openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClient.kt delete mode 100644 openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClientAsync.kt delete mode 100644 openai-java-client-okhttp/src/test/kotlin/com/openai/client/okhttp/OkHttpClientTest.kt delete mode 100644 openai-java-client-okhttp/src/test/kotlin/com/openai/client/okhttp/OpenAIOkHttpClientNativeMutualTlsTest.kt delete mode 100644 openai-java-core/build.gradle.kts delete mode 100644 openai-java-core/src/apiCompatibility/dependencies.txt delete mode 100644 openai-java-core/src/apiCompatibility/excluded-generated-tests.txt delete mode 100644 openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/MultipartCompatibility.kt delete mode 100644 openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/ResponseStreamEventCompatibility.kt delete mode 100644 openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/StructuredOutputsCompatibility.kt delete mode 100644 openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/UnionFactoriesCompatibility.kt delete mode 100644 openai-java-core/src/apiCompatibility/structured-output-public-api.txt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/auth/AzureManagedIdentityTokenProvider.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/auth/GcpIdTokenProvider.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/auth/K8sServiceAccountTokenProvider.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/auth/SubjectTokenProvider.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/auth/TokenExchangeResponse.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/auth/WorkloadIdentity.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/auth/WorkloadIdentityAuth.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/azure/AzureOpenAIServiceVersion.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/azure/AzureUrlCategory.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/azure/AzureUrlPathMode.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/azure/HttpRequestBuilderExtensions.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/azure/credential/AzureApiKeyCredential.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/AutoPager.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/AutoPagerAsync.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/BaseDeserializer.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/BaseSerializer.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/Check.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/ClientOptions.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/DefaultSleeper.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/JsonSchemaLocalValidation.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/JsonSchemaValidator.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/LogLevel.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/ObjectMappers.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/Page.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/PageAsync.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/Params.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/PhantomReachable.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/PhantomReachableExecutorService.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/PhantomReachableSleeper.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/PrepareRequest.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/Properties.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/RequestOptions.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/SecurityOptions.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/Sleeper.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/StructuredOutputs.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/Timeout.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/Utils.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/Values.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/handlers/EmptyHandler.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/handlers/ErrorHandler.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/handlers/JsonHandler.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/handlers/SseHandler.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/handlers/StreamHandler.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/handlers/StringHandler.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/AsyncStreamResponse.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/AuthenticatingHttpClient.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/Headers.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/HttpClient.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/HttpMethod.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequest.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequestAuthenticator.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequestBodies.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequestBody.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/HttpResponse.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/HttpResponseFor.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/LoggingHttpClient.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingAsyncStreamResponse.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingHttpClient.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingHttpRequestAuthenticator.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingStreamResponse.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/ProxyAuthenticator.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/QueryParams.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/RetryingHttpClient.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/SseMessage.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/StreamResponse.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/core/http/WorkloadIdentityHttpClient.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/credential/BearerTokenCredential.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/credential/Credential.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/credential/WorkloadIdentityCredential.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/BadRequestException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/InternalServerException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/InvalidWebhookSignatureException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/NotFoundException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/OpenAIException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/OpenAIInvalidDataException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/OpenAIIoException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/OpenAIRetryableException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/OpenAIServiceException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/PermissionDeniedException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/RateLimitException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/SseException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/SubjectTokenProviderException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/UnauthorizedException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/UnexpectedStatusCodeException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/errors/UnprocessableEntityException.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/helpers/ChatCompletionAccumulator.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/helpers/ResponseAccumulator.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationCreatedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItem.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemContent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemCreateEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemCreatedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemDeleteEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemDeletedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionCompletedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionDeltaEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionFailedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemRetrieveEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemTruncateEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemTruncatedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemWithReference.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ErrorEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferAppendEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommitEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommittedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStartedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStoppedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RateLimitsUpdatedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeClientEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeResponse.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeResponseStatus.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeResponseUsage.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeServerEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioDeltaEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioDoneEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDeltaEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDoneEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseCancelEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseContentPartAddedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseContentPartDoneEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseCreateEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseCreatedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseDoneEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDeltaEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDoneEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseOutputItemAddedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseOutputItemDoneEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseTextDeltaEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseTextDoneEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/SessionCreatedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/SessionUpdateEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/SessionUpdatedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdate.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdatedEvent.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/sessions/Session.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateParams.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateResponse.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSession.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSessionCreateParams.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletion.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletionCreateParams.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletionMessage.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingValue.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponse.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseCreateParams.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseOutputItem.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseOutputMessage.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseTextConfig.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/models/webhooks/WebhookVerificationParams.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/services/ResponseStreamEventValidation.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/services/async/beta/RealtimeServiceAsync.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/services/async/beta/RealtimeServiceAsyncImpl.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/SessionServiceAsync.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/SessionServiceAsyncImpl.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/TranscriptionSessionServiceAsync.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/TranscriptionSessionServiceAsyncImpl.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/RealtimeService.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/RealtimeServiceImpl.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/SessionService.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/SessionServiceImpl.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/TranscriptionSessionService.kt delete mode 100644 openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/TranscriptionSessionServiceImpl.kt delete mode 100644 openai-java-core/src/main/resources/META-INF/proguard/openai-java-core.pro delete mode 100644 openai-java-core/src/test/kotlin/com/openai/TestServerExtension.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/auth/AzureManagedIdentityTokenProviderTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/auth/GcpIdTokenProviderTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/auth/K8sServiceAccountTokenProviderTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/auth/WorkloadIdentityAuthTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/azure/AzureUrlCategoryTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/AutoPagerAsyncTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/AutoPagerTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/ClientOptionsTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/JacksonVersionTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/ObjectMappersTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/PhantomReachableTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/PrepareRequestTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/StructuredOutputsTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/StructuredOutputsTestUtils.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/UtilsTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/ValuesTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/WireMockHandlebarsCompatibilityTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/handlers/SseHandlerTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/handlers/StreamHandlerTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/http/AsyncStreamResponseTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/http/AuthenticatingHttpClientTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/http/ClientOptionsTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/http/HeadersTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/http/HttpRequestBodiesTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/http/HttpRequestTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/http/LoggingHttpClientTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/http/QueryParamsTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/http/RetryingHttpClientTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/core/http/WorkloadIdentityHttpClientTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/helpers/ChatCompletionAccumulatorTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/helpers/ResponseAccumulatorTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationCreatedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemContentTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemCreateEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemCreatedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemDeleteEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemDeletedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionCompletedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionDeltaEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionFailedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemRetrieveEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemTruncateEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemTruncatedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemWithReferenceTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ErrorEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferAppendEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommitEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommittedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStartedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStoppedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RateLimitsUpdatedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeClientEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeResponseStatusTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeResponseTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeResponseUsageTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeServerEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioDeltaEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioDoneEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDeltaEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDoneEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseCancelEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseContentPartAddedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseContentPartDoneEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseCreateEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseCreatedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseDoneEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDeltaEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDoneEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseOutputItemAddedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseOutputItemDoneEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseTextDeltaEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseTextDoneEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/SessionCreatedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/SessionUpdateEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/SessionUpdatedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdateTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdatedEventTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateParamsTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateResponseTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/sessions/SessionTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSessionCreateParamsTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSessionTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionCreateParamsTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionMessageTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingValueTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseCreateParamsTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseOutputItemTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseOutputMessageTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseTextConfigTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/services/ErrorHandlingTest.kt delete mode 100644 openai-java-core/src/test/kotlin/com/openai/services/ResponseStreamEventValidationTest.kt delete mode 100644 openai-java-example/build.gradle.kts delete mode 100644 openai-java-example/src/main/java/com/openai/example/AudioTranscriptionsAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/AudioTranscriptionsExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/AudioTranscriptionsVttExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/AzureEntraIdExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/AzureKeyCredentialExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/AzureLegacyPathsEnabledExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/AzureUnifiedEndpointExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/BatchProcessingAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/BatchProcessingExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/BedrockResponsesExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/BedrockResponsesStreamingAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/CompletionsAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/CompletionsConversationAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/CompletionsConversationExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/CompletionsExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/CompletionsFileExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/CompletionsImageUrlExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/CompletionsStreamingAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/CompletionsStreamingCancellationAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/CompletionsStreamingCancellationExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/CompletionsStreamingExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/EmbeddingsAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/EmbeddingsExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/FunctionCallingAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/FunctionCallingExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/FunctionCallingRawExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ImageEditingExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ImageGenerationExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ImageStreamingExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/Main.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ModelListAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ModelListExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ModerationsAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ModerationsExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/MutualTlsExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesConversationExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesFunctionCallingExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesFunctionCallingRawExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesImageUrlExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesInputFileExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesStreamingAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesStreamingExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsRawExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsStreamingAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsStreamingExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsVerbosityExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/StructuredOutputsAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/StructuredOutputsExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/StructuredOutputsRawAsyncExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/StructuredOutputsRawExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/StructuredOutputsStreamingExample.java delete mode 100644 openai-java-example/src/main/java/com/openai/example/VideoGenerationExample.java delete mode 100644 openai-java-example/src/main/resources/aloha-mask.png delete mode 100644 openai-java-example/src/main/resources/aloha.png delete mode 100644 openai-java-example/src/main/resources/logo.png delete mode 100644 openai-java-example/src/main/resources/pdflatex-image.pdf delete mode 100644 openai-java-example/src/main/resources/requests.jsonl delete mode 100644 openai-java-example/src/main/resources/sports.wav delete mode 100644 openai-java-lib/.keep delete mode 100644 openai-java-proguard-test/build.gradle.kts delete mode 100644 openai-java-proguard-test/src/test/kotlin/com/openai/proguard/ProGuardCompatibilityTest.kt delete mode 100644 openai-java-proguard-test/test.pro delete mode 100644 openai-java-runtime-compatibility/build.gradle.kts delete mode 100644 openai-java-runtime-compatibility/src/main/java/com/openai/compatibility/BedrockRuntimeProbe.java delete mode 100644 openai-java-runtime-compatibility/src/main/java/com/openai/compatibility/CoreRuntimeProbe.java delete mode 100644 openai-java-runtime-compatibility/src/main/java/com/openai/compatibility/OkHttpRuntimeProbe.java delete mode 100644 openai-java/build.gradle.kts delete mode 100644 release-please-config.json delete mode 100755 scripts/build delete mode 100755 scripts/detect-breaking-changes delete mode 100755 scripts/fast-format delete mode 100755 scripts/format delete mode 100755 scripts/gradle delete mode 100755 scripts/java-format delete mode 100755 scripts/kotlin-format delete mode 100755 scripts/lint delete mode 100755 scripts/mock delete mode 100755 scripts/test delete mode 100755 scripts/upload-artifacts delete mode 100644 settings.gradle.kts diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index bd8e26191..000000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# syntax=docker/dockerfile:1 -FROM debian:bookworm-slim - -RUN apt-get update && apt-get install -y --no-install-recommends \ - libxkbcommon0 \ - ca-certificates \ - ca-certificates-java \ - make \ - curl \ - git \ - openjdk-17-jdk-headless \ - unzip \ - libc++1 \ - vim \ - && apt-get clean autoclean - -# Ensure UTF-8 encoding -ENV LANG=C.UTF-8 -ENV LC_ALL=C.UTF-8 - -WORKDIR /workspace - -COPY . /workspace diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index d55fc4d67..000000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,20 +0,0 @@ -// For format details, see https://aka.ms/devcontainer.json. For config options, see the -// README at: https://github.com/devcontainers/templates/tree/main/src/debian -{ - "name": "Debian", - "build": { - "dockerfile": "Dockerfile" - } - - // Features to add to the dev container. More info: https://containers.dev/features. - // "features": {}, - - // Use 'forwardPorts' to make a list of ports inside the container available locally. - // "forwardPorts": [], - - // Configure tool-specific properties. - // "customizations": {}, - - // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. - // "remoteUser": "root" -} diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 022b84144..000000000 --- a/.gitattributes +++ /dev/null @@ -1,5 +0,0 @@ -# -# https://help.github.com/articles/dealing-with-line-endings/ -# -# These are explicitly windows files and should use crlf -*.bat text eol=crlf diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index d58c8454c..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,4 +0,0 @@ -# This file is used to automatically assign reviewers to PRs -# For more information see: https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners - -* @openai/sdks-team diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 90b85e944..000000000 --- a/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -.prism.log -.stdy.log -.gradle -.idea -.kotlin -build/ -codegen.log -kls_database.db diff --git a/.release-please-manifest.json b/.release-please-manifest.json deleted file mode 100644 index d351f029a..000000000 --- a/.release-please-manifest.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - ".": "4.49.0" -} \ No newline at end of file diff --git a/.stats.yml b/.stats.yml deleted file mode 100644 index 284e122e6..000000000 --- a/.stats.yml +++ /dev/null @@ -1,4 +0,0 @@ -configured_endpoints: 278 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openai/openai-31fcc3c97e5c432754bf0b72c5d5abbe1493573f0ca888af914baf81188b453e.yml -openapi_spec_hash: f867849a0c2a9c9b838d21f1c720a9e3 -config_hash: fce3820c4f95b555e486349bc7d297d8 diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 25218ff1d..000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,3241 +0,0 @@ -# Changelog - -## 4.49.0 (2026-07-31) - -Full Changelog: [v4.48.0...v4.49.0](https://github.com/openai/openai-java/compare/v4.48.0...v4.49.0) - -### Features - -* **client:** add native mTLS transport recipe ([#828](https://github.com/openai/openai-java/issues/828)) ([b40ba7a](https://github.com/openai/openai-java/commit/b40ba7ad78835c92d5f15876dfaadc59235eb6cb)) - -## 4.48.0 (2026-07-31) - -Full Changelog: [v4.47.0...v4.48.0](https://github.com/openai/openai-java/compare/v4.47.0...v4.48.0) - -### Features - -* **api:** content provenance checks ([b89a308](https://github.com/openai/openai-java/commit/b89a3082b84d68cd7003f53397fb56cdd3062bd6)) -* **api:** support the fast service tier for response compaction ([b89a308](https://github.com/openai/openai-java/commit/b89a3082b84d68cd7003f53397fb56cdd3062bd6)) - -## 4.47.0 (2026-07-30) - -Full Changelog: [v4.46.0...v4.47.0](https://github.com/openai/openai-java/compare/v4.46.0...v4.47.0) - -### Features - -* **api:** fast tier ([5a139f4](https://github.com/openai/openai-java/commit/5a139f47a9d6482ef4759f14a81d03633861dc5c)) - -## 4.46.0 (2026-07-28) - -Full Changelog: [v4.45.0...v4.46.0](https://github.com/openai/openai-java/compare/v4.45.0...v4.46.0) - -### Features - -* **api:** transcription model updates ([82b568b](https://github.com/openai/openai-java/commit/82b568bbd3e1bb5f2e80756a2f06284fbe28a192)) -* **support:** establish Java support policy and retire the Spring Boot 2 starter ([#820](https://github.com/openai/openai-java/issues/820)) ([f87609f](https://github.com/openai/openai-java/commit/f87609f0039f9dc4fc4b0e224f977c8ee1a86627)) - - -### Build System - -* **deps:** fix 27 consumer-isolated Dependabot alerts ([#810](https://github.com/openai/openai-java/issues/810)) ([d9eefdc](https://github.com/openai/openai-java/commit/d9eefdc7ede7b648894ca8f2aadd9626a38353c1)) -* **deps:** patch consumer-neutral dependencies ([#816](https://github.com/openai/openai-java/issues/816)) ([8b79573](https://github.com/openai/openai-java/commit/8b7957326f399314a0a40027865b01ae49f0c304)) - -## 4.45.0 (2026-07-23) - -Full Changelog: [v4.44.0...v4.45.0](https://github.com/openai/openai-java/compare/v4.44.0...v4.45.0) - -### Features - -* **api:** accept `None` for prompt_cache_key/safety_identifier ([e9c054c](https://github.com/openai/openai-java/commit/e9c054c0537444218ba6dec14b788a12f063835b)) -* **api:** add support for `spend_limit` admin apis ([d2ddc33](https://github.com/openai/openai-java/commit/d2ddc33d2c83f693800be05c014593d73e1a9933)) -* **bedrock:** support AWS credentials files ([#761](https://github.com/openai/openai-java/issues/761)) ([a3fc7f6](https://github.com/openai/openai-java/commit/a3fc7f66c671f7cc1932d35203a86af022a77477)) -* **stlc:** configurable CI runner and private-production-repo support in workflow templates ([b435090](https://github.com/openai/openai-java/commit/b435090953e903bcf126cc3b8078fb85b62498d3)) - - -### Bug Fixes - -* **api:** align structured output builder optional fields ([8e03393](https://github.com/openai/openai-java/commit/8e03393b5391b4a68b4f898601e5f00a9cca24c6)) -* **core:** ignore metadata-only SSE blocks ([#805](https://github.com/openai/openai-java/issues/805)) ([c33e020](https://github.com/openai/openai-java/commit/c33e02091ee62f2b2f29cc87c1d148186d162243)) - - -### Build System - -* **deps:** migrate test WireMock to Jetty 12 ([#798](https://github.com/openai/openai-java/issues/798)) ([0522672](https://github.com/openai/openai-java/commit/0522672d4994092f6e9cd68fe78eb8bcd8bf3349)) -* **deps:** patch test Jackson dependencies ([#807](https://github.com/openai/openai-java/issues/807)) ([271d102](https://github.com/openai/openai-java/commit/271d102dabefdf86432ac8a958d6f33f37c9c074)) -* **deps:** patch test-only Logback dependencies ([#806](https://github.com/openai/openai-java/issues/806)) ([de56d63](https://github.com/openai/openai-java/commit/de56d63c2e1e159783b742f574f131ec22729b4c)) -* **deps:** remove vulnerable Logback from starter tests ([#808](https://github.com/openai/openai-java/issues/808)) ([1fe659e](https://github.com/openai/openai-java/commit/1fe659e3bab81d8974faeacf283b1dfbb812122d)) -* **deps:** update test Commons IO to 2.22.0 ([#788](https://github.com/openai/openai-java/issues/788)) ([f50d19b](https://github.com/openai/openai-java/commit/f50d19be803f055eb63d755844ac1d6e331964dc)) -* **deps:** update test commons-lang3 to 3.18.0 ([c3be8f9](https://github.com/openai/openai-java/commit/c3be8f9d60b242d55b0a9f1db57bb1e4e30df0a7)) -* **deps:** update test JSONPath to 2.10.0 ([#790](https://github.com/openai/openai-java/issues/790)) ([b2cf0ff](https://github.com/openai/openai-java/commit/b2cf0ff66e42cc8755e7e98948a41cdaab3aef1a)) - -## 4.44.0 (2026-07-17) - -Full Changelog: [v4.43.0...v4.44.0](https://github.com/openai/openai-java/compare/v4.43.0...v4.44.0) - -### Features - -* **api:** /organization/projects/{project_id}/service_accounts/{service_account_id}/api_keys" endpoint ([2e1c539](https://github.com/openai/openai-java/commit/2e1c53912220bab9b4f5275dae37a55c0af1bc8e)) -* **api:** manual updates ([5c78d3e](https://github.com/openai/openai-java/commit/5c78d3e4d993261f5b48f6612ebf17d30bd7ce94)) -* **api:** manual updates ([ef9016c](https://github.com/openai/openai-java/commit/ef9016c3463e52f3be22c2bd435c4ebf53fd6e67)) - - -### Bug Fixes - -* **client:** handle response stream keepalive events ([#776](https://github.com/openai/openai-java/issues/776)) ([6eef965](https://github.com/openai/openai-java/commit/6eef9653f95a9be63436c11ced9c1f8f6c192f3b)) -* **deps:** update Azure Identity to 1.18.4 ([#779](https://github.com/openai/openai-java/issues/779)) ([d2b695c](https://github.com/openai/openai-java/commit/d2b695cbdff8d7ca6c1fe10ea3b0e7a64ec24edf)) -* **deps:** update Jackson to 2.18.9 ([#777](https://github.com/openai/openai-java/issues/777)) ([2935d47](https://github.com/openai/openai-java/commit/2935d47e753fcbef81a6a0d720eedb3ac559ac73)) -* **deps:** update plexus-utils to 4.0.3 ([#780](https://github.com/openai/openai-java/issues/780)) ([6e4e2a7](https://github.com/openai/openai-java/commit/6e4e2a78b2b021288d141ddbedd9fa3e5d592073)) -* **deps:** update test Handlebars to 4.5.3 ([#783](https://github.com/openai/openai-java/issues/783)) ([ae10648](https://github.com/openai/openai-java/commit/ae10648c9c50824bae1ba3c7ba0853b06b6bbb88)) - - -### Chores - -* **deps:** secure build-time Log4j ([#781](https://github.com/openai/openai-java/issues/781)) ([8735bf7](https://github.com/openai/openai-java/commit/8735bf71d18041f35087b6ec2c3fe8f3edcc903b)) - - -### Build System - -* **deps:** align Palantir Jackson to 2.21.5 ([#794](https://github.com/openai/openai-java/issues/794)) ([cc9af3d](https://github.com/openai/openai-java/commit/cc9af3dc63e40150b692243a691a441d37e5beae)) -* **deps:** secure Dokka Jackson classpath ([#795](https://github.com/openai/openai-java/issues/795)) ([8b72d57](https://github.com/openai/openai-java/commit/8b72d57c87cc80966f55c1b5f894532b462a1bf1)) -* **deps:** update Dokka to 2.1.0 ([#791](https://github.com/openai/openai-java/issues/791)) ([420f91d](https://github.com/openai/openai-java/commit/420f91da5b9bdd3c43130d4720f650d84f89d7d2)) -* **deps:** update palantir-java-format to 2.96.0 ([#784](https://github.com/openai/openai-java/issues/784)) ([243d996](https://github.com/openai/openai-java/commit/243d996e9d6efb292b4f1986882cca50b5a6b8b2)) -* **deps:** update ProGuard to 7.9.1 ([#782](https://github.com/openai/openai-java/issues/782)) ([845b2bc](https://github.com/openai/openai-java/commit/845b2bc87fb077f2ff1a0f81893cd4f4384214b4)) -* **deps:** update test commons-fileupload to 1.6.0 ([#787](https://github.com/openai/openai-java/issues/787)) ([5e5fabe](https://github.com/openai/openai-java/commit/5e5fabe7061dee5031e519b867cb874eebb8a69a)) -* **deps:** update test Guava to 33.6.0 ([#786](https://github.com/openai/openai-java/issues/786)) ([e2b4cf1](https://github.com/openai/openai-java/commit/e2b4cf15f75a9733f870b4a67aae8c6045ee83be)) -* **deps:** update test Jetty to 9.4.58 ([#785](https://github.com/openai/openai-java/issues/785)) ([fab7e44](https://github.com/openai/openai-java/commit/fab7e44a8dbdd2d4c819e940cb119ccc0a24342b)) -* **deps:** update test SnakeYAML to 2.6 ([#793](https://github.com/openai/openai-java/issues/793)) ([7cf5b73](https://github.com/openai/openai-java/commit/7cf5b737e442662b4ee9570caf14f322631d6e2f)) -* **deps:** update test XMLUnit to 2.11.0 ([#792](https://github.com/openai/openai-java/issues/792)) ([a30161d](https://github.com/openai/openai-java/commit/a30161d495ac25e6d865d0ddc8c7f02c05ac31fd)) - -## 4.43.0 (2026-07-13) - -Full Changelog: [v4.42.0...v4.43.0](https://github.com/openai/openai-java/compare/v4.42.0...v4.43.0) - -### Features - -* **api:** add owner_project_access to APIKeyListParams ([b5c0fbc](https://github.com/openai/openai-java/commit/b5c0fbcf410a351988f117640bb1c9809775c4d1)) - -## [4.42.0](https://github.com/openai/openai-java/compare/v4.41.0...v4.42.0) (2026-07-09) - - -### Features - -* **api:** gpt-5.6-sol updates ([2ca768a](https://github.com/openai/openai-java/commit/2ca768ad80da1643680ce99fee977080e19f2e2b)) - - -### Bug Fixes - -* **api:** preserve deprecated beta realtime accessors ([a1cd1f1](https://github.com/openai/openai-java/commit/a1cd1f1ad58f7009073819765792d62995650da7)) -* **api:** restore beta responses custom code ([73f67f2](https://github.com/openai/openai-java/commit/73f67f286ef5147fc252090f9d3b8e44a857a208)) - - -### Chores - -* retrigger release automation ([a3006ee](https://github.com/openai/openai-java/commit/a3006ee468a3e4d4167368cf5a2e66590e4a65a0)) - -## 4.41.0 (2026-06-17) - -Full Changelog: [v4.40.0...v4.41.0](https://github.com/openai/openai-java/compare/v4.40.0...v4.41.0) - -### Features - -* **api:** update OpenAPI spec or Stainless config ([ce1d334](https://github.com/openai/openai-java/commit/ce1d334a2856395d95491db52a26c15472598896)) - -## 4.40.0 (2026-06-16) - -Full Changelog: [v4.39.1...v4.40.0](https://github.com/openai/openai-java/compare/v4.39.1...v4.40.0) - -### Features - -* **api:** admin spend_alerts ([512770c](https://github.com/openai/openai-java/commit/512770c119201347bfab9e68fec00e1cff5b2df8)) -* **api:** manual updates ([701ebe0](https://github.com/openai/openai-java/commit/701ebe011fa2ed05f80e51307bc7e9886bfb9d8b)) -* **api:** update OpenAPI spec or Stainless config ([94b7412](https://github.com/openai/openai-java/commit/94b7412a98fb60d6865d362c48526b4a6dd0896a)) - - -### Build System - -* Use CI environment for OpenAI API key workflow ([#756](https://github.com/openai/openai-java/issues/756)) ([27de5f5](https://github.com/openai/openai-java/commit/27de5f5b159394b7f29a31389854890460122c1a)) -* Use publish environment for release job ([#758](https://github.com/openai/openai-java/issues/758)) ([bbb66f8](https://github.com/openai/openai-java/commit/bbb66f870877a3e9e3f73c5c41eb4558f23a901a)) - -## 4.39.1 (2026-06-04) - -Full Changelog: [v4.39.0...v4.39.1](https://github.com/openai/openai-java/compare/v4.39.0...v4.39.1) - -### Chores - -* **ci:** allow local testing to use incremental compilation + daemons ([a1c71e4](https://github.com/openai/openai-java/commit/a1c71e41471abcf75ae36a5821d6877a17b59958)) - -## 4.39.0 (2026-06-03) - -Full Changelog: [v4.38.0...v4.39.0](https://github.com/openai/openai-java/compare/v4.38.0...v4.39.0) - -### Features - -* **api:** responses.moderation and chat_completions.moderation ([b8f8bdd](https://github.com/openai/openai-java/commit/b8f8bdd6834803fe49e17f00770fd3e56f25b9c0)) - -## 4.38.0 (2026-06-01) - -Full Changelog: [v4.37.0...v4.38.0](https://github.com/openai/openai-java/compare/v4.37.0...v4.38.0) - -### Features - -* **api:** workload identity in audit logs, additional_tools item in responses, fix ActionSearch.query to be optional. ([76574c1](https://github.com/openai/openai-java/commit/76574c1d80aef8abeca6de1826c6479206899734)) - -## 4.37.0 (2026-05-21) - -Full Changelog: [v4.36.0...v4.37.0](https://github.com/openai/openai-java/compare/v4.36.0...v4.37.0) - -### Features - -* **api:** manual updates ([751f476](https://github.com/openai/openai-java/commit/751f476ae83e88dcf122aa2d34bdc16983e800b4)) -* **api:** manual updates ([1a21364](https://github.com/openai/openai-java/commit/1a21364f95933116344b0ab703796fb559eb8735)) -* **api:** update OpenAPI spec or Stainless config ([33debac](https://github.com/openai/openai-java/commit/33debacb88320787265e083cbdb91ec6e3e812f5)) - - -### Chores - -* **api:** docs updates ([704032e](https://github.com/openai/openai-java/commit/704032ebbb3244054e5e8425c82dfe45562378e9)) - -## 4.36.0 (2026-05-13) - -Full Changelog: [v4.35.0...v4.36.0](https://github.com/openai/openai-java/compare/v4.35.0...v4.36.0) - -### Features - -* **api:** add service_tier parameter to response compact method ([c72b807](https://github.com/openai/openai-java/commit/c72b807908abb11b86f782bf93bcd26e18d6ab06)) -* **api:** realtime 2 ([8057452](https://github.com/openai/openai-java/commit/80574522eec0c84dad8e4e0a2a1e582f9d962850)) - -## 4.35.0 (2026-05-07) - -Full Changelog: [v4.34.0...v4.35.0](https://github.com/openai/openai-java/compare/v4.34.0...v4.35.0) - -### Features - -* **api:** add quantity field to organization usage responses, update topLogprobs docs ([d4686cc](https://github.com/openai/openai-java/commit/d4686cc7eb9bcd551282d421811341518ddc8584)) -* **api:** launch realtime translate + update image 2 ([28ad918](https://github.com/openai/openai-java/commit/28ad9189d7293388d043ed83496333132afc517f)) -* **api:** manual updates ([7905ef6](https://github.com/openai/openai-java/commit/7905ef6cc30852f0d80bd10c937d949028ff1303)) -* **api:** manual updates ([8328a1e](https://github.com/openai/openai-java/commit/8328a1eb51291dd0a317989e31e0989572bbfa0b)) -* **client:** improve logging ([6393b34](https://github.com/openai/openai-java/commit/6393b3431e87d15ad3ee23cc274161f8e00a87ec)) -* **client:** more robust error parsing ([5a1bfdc](https://github.com/openai/openai-java/commit/5a1bfdcb283dc6efc1ab5058ef96740087112288)) -* **client:** support proxy authentication ([97c8087](https://github.com/openai/openai-java/commit/97c808706c3684892d309245a205fcfcf90738cd)) - - -### Bug Fixes - -* **api:** fix imagegen `size` enum regression ([aacb886](https://github.com/openai/openai-java/commit/aacb886fd99a7571dabe5bc8f1086bef650c11fc)) -* **client:** match `JsonSchemaValidator` heading levels to API ([#733](https://github.com/openai/openai-java/issues/733)) ([fc57ef7](https://github.com/openai/openai-java/commit/fc57ef7963e6ebdfde0c716adc4f29d315dc9021)) -* **logging:** redact Azure api-key header in logging ([#717](https://github.com/openai/openai-java/issues/717)) ([157207f](https://github.com/openai/openai-java/commit/157207fefe59174141a5aec6a983c546def242b4)) - - -### Performance Improvements - -* **client:** create one json mapper ([6bdc12e](https://github.com/openai/openai-java/commit/6bdc12ed832827d3e9bdb9825898bfa5aee94d26)) - - -### Chores - -* fix build error ([82a8527](https://github.com/openai/openai-java/commit/82a85274f613aad7ae277765b12bc3469832e1b1)) -* redact api-key headers in debug logs ([73d01b0](https://github.com/openai/openai-java/commit/73d01b0a5a9af1e4722381701654ff5880ff8986)) -* remove duplicated dokka setup ([06e43e2](https://github.com/openai/openai-java/commit/06e43e2ca1a630dd8b4d38b151724d6b3fb5e014)) -* **tests:** update test fixtures to use valid example URLs ([021f44a](https://github.com/openai/openai-java/commit/021f44a12a39f7e1b8e405e4f309f1a4d0223ed6)) - - -### Documentation - -* **api:** document web_search_call.results in response includables ([18fe08a](https://github.com/openai/openai-java/commit/18fe08af6a53d6ef9b35e03190e137b02231608e)) -* clarify forwards compat behavior ([d44f466](https://github.com/openai/openai-java/commit/d44f4664a550f4d34b2d1b14c7f376d1047514e0)) -* clarify structured output map limitations ([#726](https://github.com/openai/openai-java/issues/726)) ([e1e1161](https://github.com/openai/openai-java/commit/e1e1161d69d30bd6639ada5ead3a30f14c68cf8d)) -* remove bad semicolon ([#725](https://github.com/openai/openai-java/issues/725)) ([b5dbd07](https://github.com/openai/openai-java/commit/b5dbd07e1147f5554509481798978717e22b03af)) - -## 4.34.0 (2026-05-01) - -Full Changelog: [v4.33.0...v4.34.0](https://github.com/openai/openai-java/compare/v4.33.0...v4.34.0) - -### Features - -* **api:** add fields to groups/projects/users, remove enums, update types ([abda696](https://github.com/openai/openai-java/commit/abda69632b75ac30f6e89669bd7a04120748830f)) -* **api:** add support for Admin API Keys per endpoint ([52840e8](https://github.com/openai/openai-java/commit/52840e83e8f16eb7e9399386d1c9f94ea8d76419)) -* **api:** admin API updates ([ce01f2c](https://github.com/openai/openai-java/commit/ce01f2c9f2c49ae548804a76c219f3bfd1f8c4c3)) -* **api:** manual updates ([4ce7800](https://github.com/openai/openai-java/commit/4ce7800d39b240ef3792794c0bbf56ec071b22b2)) -* **api:** manual updates ([54bb616](https://github.com/openai/openai-java/commit/54bb6169b1d6294044d707e0c4f9592ed9396717)) -* support setting headers via env ([f37acbd](https://github.com/openai/openai-java/commit/f37acbd918c36fa77f135414aefd87dfe06d17bb)) - - -### Bug Fixes - -* **api:** allow admin api key credential auth ([d0ea12d](https://github.com/openai/openai-java/commit/d0ea12d06f4e193ac6321a93a3d93108ab630d6c)) -* **auth:** apply route-specific security options ([4203865](https://github.com/openai/openai-java/commit/4203865e860f7862ac3b009c36dfd51a990cd944)) -* ignore post-completion response stream events ([65ea33e](https://github.com/openai/openai-java/commit/65ea33e4617b9648106a47dde3277dd2022620be)) -* **types:** correct createdAt and completedAt to Double in Response model ([e591f78](https://github.com/openai/openai-java/commit/e591f7864c5ba92777a663a9c9914f046a6b4b55)) -* **types:** correct timestamp precision in transcriptions/realtime, unix timestamps in responses ([cc8d80f](https://github.com/openai/openai-java/commit/cc8d80fd791cc86ea60812f8195f8b3290916184)) - - -### Chores - -* **internal:** regenerate SDK with no functional changes ([0a4327c](https://github.com/openai/openai-java/commit/0a4327ce9d043913cb3c3ee330e9f562e6914bf8)) - - -### Documentation - -* **api:** update rate limit documentation for file upload endpoint ([f4eb157](https://github.com/openai/openai-java/commit/f4eb1572450bf7cebb1a6e5148f422f741d7db14)) - -## 4.33.0 (2026-04-28) - -Full Changelog: [v4.32.0...v4.33.0](https://github.com/openai/openai-java/compare/v4.32.0...v4.33.0) - -### Features - -* **api:** api update ([059c9d4](https://github.com/openai/openai-java/commit/059c9d4bf7b78bdf14bc976aaf1e5df07d6c266c)) - - -### Bug Fixes - -* **types:** correct IN_MEMORY constant value in chat completions/responses ([7c39981](https://github.com/openai/openai-java/commit/7c39981b37c3a6d531667aa8519f2608f6058dc1)) - - -### Chores - -* **ci:** remove release-doctor workflow ([db2b3e3](https://github.com/openai/openai-java/commit/db2b3e350610bd3918ccb94dea12924811d4a414)) -* **tests:** bump steady to v0.22.1 ([4cc89dd](https://github.com/openai/openai-java/commit/4cc89dd91dcd6e4a7af6de613220eaa8422ba156)) - - -### Documentation - -* **api:** add rate limits and vector store guidance to file upload ([83f4731](https://github.com/openai/openai-java/commit/83f4731121e83b213b969ecf5e00b65bd0f95aa9)) - -## 4.32.0 (2026-04-16) - -Full Changelog: [v4.31.0...v4.32.0](https://github.com/openai/openai-java/compare/v4.31.0...v4.32.0) - -### Features - -* **api:** Add detail to InputFileContent ([0c8418c](https://github.com/openai/openai-java/commit/0c8418cb584103e273b12f70b1cf535364d44bfd)) -* **api:** add OAuthErrorCode type ([09b41e1](https://github.com/openai/openai-java/commit/09b41e1d925371b6b6c94b8a147dce6264be6120)) - - -### Documentation - -* improve examples ([717a8d5](https://github.com/openai/openai-java/commit/717a8d5cc331c2746ed1548ef89418f70707d23a)) - -## 4.31.0 (2026-04-08) - -Full Changelog: [v4.30.0...v4.31.0](https://github.com/openai/openai-java/compare/v4.30.0...v4.31.0) - -### Features - -* **api:** add phase field to conversations Message ([e562a17](https://github.com/openai/openai-java/commit/e562a1701cfb7c92aa308d80d7bfe8e99c6394c8)) -* **api:** add WEB_SEARCH_CALL_RESULTS to ResponseIncludable enum ([eda0a61](https://github.com/openai/openai-java/commit/eda0a61f837af3a0aba2851a23320aadfce82979)) -* **client:** add support for short-lived tokens ([#1185](https://github.com/openai/openai-java/issues/1185)) ([40e729d](https://github.com/openai/openai-java/commit/40e729ddc83f37dfe6429d257072cd39396fb104)) - - -### Bug Fixes - -* **api:** remove web_search_call.results from ResponseIncludable ([936b2ab](https://github.com/openai/openai-java/commit/936b2ab08e8641bd1d6a1b2432140762185e22eb)) - - -### Chores - -* **internal:** update multipart form array serialization ([240ca42](https://github.com/openai/openai-java/commit/240ca42401366b75cf70b0eb0ff9f63425c9b358)) -* **tests:** bump steady to v0.20.1 ([a3c95b0](https://github.com/openai/openai-java/commit/a3c95b073d7b10a13ce83865947ab4fbec5a95d0)) -* **tests:** bump steady to v0.20.2 ([78b1d56](https://github.com/openai/openai-java/commit/78b1d5629bf7d31173ec1cec50f3191959cdba9d)) - - -### Documentation - -* **api:** clarify file_batches usage in vector stores files and file batches ([9c56841](https://github.com/openai/openai-java/commit/9c56841ff2f052a7e54290b36c3f74528be3de19)) -* fix function arguments typo in README ([#713](https://github.com/openai/openai-java/issues/713)) ([36c4888](https://github.com/openai/openai-java/commit/36c48883fa898da1b41ccc03fe1682934079923c)) - -## 4.30.0 (2026-03-25) - -Full Changelog: [v4.29.1...v4.30.0](https://github.com/openai/openai-java/compare/v4.29.1...v4.30.0) - -### Features - -* **api:** add keys field to computer action types in ComputerAction/ResponseComputerToolCall ([67e4a24](https://github.com/openai/openai-java/commit/67e4a24686d73de70335e169baba3c9b5774cf6d)) - - -### Bug Fixes - -* **api:** align SDK response types with expanded item schemas ([f05a663](https://github.com/openai/openai-java/commit/f05a6636cbf87672a6ba31004b8fdcee124994e1)) - - -### Chores - -* **ci:** skip lint on metadata-only changes ([ed9e951](https://github.com/openai/openai-java/commit/ed9e95194d3cf44c896f44b6d57f310c12fd39b9)) -* **tests:** bump steady to v0.19.7 ([924632a](https://github.com/openai/openai-java/commit/924632a2c973f7fac6e67cd063f906efbf7148f4)) - -## 4.29.1 (2026-03-23) - -Full Changelog: [v4.29.0...v4.29.1](https://github.com/openai/openai-java/compare/v4.29.0...v4.29.1) - -### Bug Fixes - -* **client:** allow updating header/query affecting fields in `toBuilder()` ([fd3b67c](https://github.com/openai/openai-java/commit/fd3b67cef9c4457506a76b9e994210e512e0181f)) -* **client:** remove redundant apiKey override ([8383a7d](https://github.com/openai/openai-java/commit/8383a7de659aa6f17e1707614f5a246ced127532)) -* **core:** format StructuredOutputs ([256718e](https://github.com/openai/openai-java/commit/256718e5ac3f3bd821d97829c5af09b2db6f113d)) -* **types:** change type field to constant in ResponseInputMessageItem ([a8ae57f](https://github.com/openai/openai-java/commit/a8ae57f73a04878013869f75bc331fa60f02b979)) - - -### Chores - -* **internal:** update gitignore ([2663595](https://github.com/openai/openai-java/commit/26635957cbcfb2438bcece6476eea1e206d54115)) -* **tests:** bump steady to v0.19.4 ([f0d4ba8](https://github.com/openai/openai-java/commit/f0d4ba8685e6376e72a928da9aaf2bdc9e1655e5)) -* **tests:** bump steady to v0.19.5 ([cbd424e](https://github.com/openai/openai-java/commit/cbd424e5e2220cc8c88522b9850fe1a923a2e523)) -* **tests:** bump steady to v0.19.6 ([28a4c27](https://github.com/openai/openai-java/commit/28a4c278d4f81e61f732d1576e09b91e85e48ca8)) - - -### Refactors - -* **tests:** switch from prism to steady ([a8cb9e8](https://github.com/openai/openai-java/commit/a8cb9e8c62c492a6aeda6fcdd6e9b09afc4f71fa)) - -## 4.29.0 (2026-03-17) - -Full Changelog: [v4.28.0...v4.29.0](https://github.com/openai/openai-java/compare/v4.28.0...v4.29.0) - -### Features - -* **api:** 5.4 nano and mini model slugs ([397027a](https://github.com/openai/openai-java/commit/397027a4117ab49e0a500b8dec8594ad34763011)) -* **api:** add defer_loading field to NamespaceTool.Tool.Function ([ff60586](https://github.com/openai/openai-java/commit/ff60586659f25204a545cb08623fe0a12810cbfa)) -* **api:** add IN and NIN filter types to ComparisonFilter ([6d0eac3](https://github.com/openai/openai-java/commit/6d0eac374f8eab9de341ae1a19c185512614893b)) -* **api:** add v1/videos endpoint to batch create ([421acd8](https://github.com/openai/openai-java/commit/421acd884ef736944c5368a7282fda8a890f0aed)) - - -### Chores - -* **internal:** tweak CI branches ([bfe3f0a](https://github.com/openai/openai-java/commit/bfe3f0ac8ac068443a40b4b7b23e7d179e8b4837)) -* **internal:** update retry delay tests ([dfcccf1](https://github.com/openai/openai-java/commit/dfcccf14f4f3a72e85db513955a3ede7bcdb1d6b)) - -## 4.28.0 (2026-03-13) - -Full Changelog: [v4.27.0...v4.28.0](https://github.com/openai/openai-java/compare/v4.27.0...v4.28.0) - -### Features - -* **api:** custom voices ([e576130](https://github.com/openai/openai-java/commit/e57613014fa561418c77afb9cec87149f012bb67)) - -## 4.27.0 (2026-03-13) - -Full Changelog: [v4.26.0...v4.27.0](https://github.com/openai/openai-java/compare/v4.26.0...v4.27.0) - -### Features - -* **api:** api update ([ce42160](https://github.com/openai/openai-java/commit/ce421607a7d839d4477217d7a35abc13ffd1c9fc)) -* **api:** manual updates ([39b947b](https://github.com/openai/openai-java/commit/39b947b75af1dbb9544c6c1db27dba1b995b2b52)) -* **api:** manual updates ([7b4fbeb](https://github.com/openai/openai-java/commit/7b4fbeb15137592fb75fbcd79c1b5f4d28cf7601)) -* **api:** sora api improvements: character api, video extensions/edits, higher resolution exports. ([54bf78f](https://github.com/openai/openai-java/commit/54bf78f851562794c679eb7126726629ec724314)) - - -### Bug Fixes - -* **client:** incorrect `Retry-After` parsing ([948b279](https://github.com/openai/openai-java/commit/948b279b6ccf1e39e201dc193bcfc3b66b4f7359)) - - -### Chores - -* **internal:** codegen related update ([0ea414d](https://github.com/openai/openai-java/commit/0ea414d19b78c438fe360f6b73fd42881be37d86)) - -## 4.26.0 (2026-03-05) - -Full Changelog: [v4.25.0...v4.26.0](https://github.com/openai/openai-java/compare/v4.25.0...v4.26.0) - -### Features - -* **api:** The GA ComputerTool now uses the CompuerTool class. The 'computer_use_preview' tool is moved to ComputerUsePreview ([a8d8de8](https://github.com/openai/openai-java/commit/a8d8de803d9df873eb13ecd912cdea096532a062)) - - -### Bug Fixes - -* **api:** update structured response tool overloads ([5562fc1](https://github.com/openai/openai-java/commit/5562fc13a259d567aa03c59f36e74825effa53da)) - -## 4.25.0 (2026-03-05) - -Full Changelog: [v4.24.1...v4.25.0](https://github.com/openai/openai-java/compare/v4.24.1...v4.25.0) - -### Features - -* **api:** gpt-5.4, tool search tool, and new computer tool ([18c8870](https://github.com/openai/openai-java/commit/18c8870b9f16b4fb2d87eb10d73797da3ecc6fdf)) - - -### Bug Fixes - -* **api:** allow unknown video seconds in responses ([82d67cb](https://github.com/openai/openai-java/commit/82d67cb396925dbe221cd9713afc414c0b9406ad)) - - -### Chores - -* **internal:** codegen related update ([42a435d](https://github.com/openai/openai-java/commit/42a435d6e939b6ecf1dc5866d5fce60f50b8b08b)) - -## 4.24.1 (2026-03-04) - -Full Changelog: [v4.24.0...v4.24.1](https://github.com/openai/openai-java/compare/v4.24.0...v4.24.1) - -### Bug Fixes - -* **api:** internal schema fixes ([b4d6777](https://github.com/openai/openai-java/commit/b4d67776443c04d9283e9d349af237d047b9e5c9)) -* **api:** manual updates ([95d5732](https://github.com/openai/openai-java/commit/95d5732a7eaac2ba4708e3d9ab48433f64aa9d13)) -* **java:** add missing phase delegates to structured response output wrapper ([9c61370](https://github.com/openai/openai-java/commit/9c6137015ca7f95fb1144810986f2097e7f5d0ca)) - - -### Chores - -* **internal:** codegen related update ([e5c572f](https://github.com/openai/openai-java/commit/e5c572f40fce11d20f24de6afbeef6b69d4bc7bb)) -* **internal:** reduce warnings ([445d1ad](https://github.com/openai/openai-java/commit/445d1ad99e6a7745bf30c4ec4d8f9a9c02e7dab7)) - -## 4.24.0 (2026-02-24) - -Full Changelog: [v4.23.0...v4.24.0](https://github.com/openai/openai-java/compare/v4.23.0...v4.24.0) - -### Features - -* **api:** add phase ([28dfb07](https://github.com/openai/openai-java/commit/28dfb07eea2195b13ab9bf4d47f40e3bbbe386f1)) -* **api:** remove phase from messages and promptCacheKey parameter ([6eb0909](https://github.com/openai/openai-java/commit/6eb09098f7509d17f83c2b92c86f43ed28d278e9)) - - -### Bug Fixes - -* **api:** fix phase enum ([9217829](https://github.com/openai/openai-java/commit/9217829f66334fba3323acd38369a81da39b19d3)) -* **api:** phase docs ([215079e](https://github.com/openai/openai-java/commit/215079e8e83b527a5480db9ebc7a4c43fbe01490)) -* **api:** readd phase ([9d234b2](https://github.com/openai/openai-java/commit/9d234b208b5e77b57665589a8881c8b4c8f3372e)) - - -### Chores - -* **internal:** expand imports ([73adcb9](https://github.com/openai/openai-java/commit/73adcb9d348bc2e51c98c4535f7f2373fcf782c9)) - -## 4.23.0 (2026-02-23) - -Full Changelog: [v4.22.0...v4.23.0](https://github.com/openai/openai-java/compare/v4.22.0...v4.23.0) - -### Features - -* **api:** add gpt-realtime-1.5 and gpt-audio-1.5 models to realtime session ([b00b515](https://github.com/openai/openai-java/commit/b00b515f591c8651ab4d5d46606e31a69787eebf)) - - -### Bug Fixes - -* **api:** manual updates ([bd83804](https://github.com/openai/openai-java/commit/bd83804f76f2be62a2a09e4b9f2ed7832fdb740f)) -* set Accept header in more places ([9e2e714](https://github.com/openai/openai-java/commit/9e2e7145e357dfe6e8b3f8701df70a42e07a4f63)) -* **tests:** skip unsupported streaming tests ([24f9854](https://github.com/openai/openai-java/commit/24f9854de6299572a6b836059855218f68f2e412)) - - -### Chores - -* drop apache dependency ([37805bf](https://github.com/openai/openai-java/commit/37805bf5dad1f503cec009dfaca6c6b2b21fc279)) -* make `Properties` more resilient to `null` ([0039eb0](https://github.com/openai/openai-java/commit/0039eb008840c33d9f62d44999e4b4533a3a50d2)) - - -### Documentation - -* **api:** add batch size limit to file batch create parameters ([764fd86](https://github.com/openai/openai-java/commit/764fd868ab4d0f9642ae2facb6ca98ef3a491888)) -* **api:** clarify safety_identifier max length in chat completions and responses ([b2735b0](https://github.com/openai/openai-java/commit/b2735b002e3591513ea743062e36d6f965f1fd46)) - -## 4.22.0 (2026-02-19) - -Full Changelog: [v4.21.0...v4.22.0](https://github.com/openai/openai-java/compare/v4.21.0...v4.22.0) - -### Features - -* **client:** add connection pooling option ([6b5fd77](https://github.com/openai/openai-java/commit/6b5fd77b364bd494b5630805f0cd62d5a381eceb)) - - -### Chores - -* **internal:** make `OkHttp` constructor internal ([a1e3ca6](https://github.com/openai/openai-java/commit/a1e3ca67621046ae0e2abe41e4a3f17c573c7ac1)) -* **internal:** remove unnecessary base URL ([360edde](https://github.com/openai/openai-java/commit/360edde0e5ea5d0ee30c926905a950db3e14b6fa)) -* **internal:** update `TestServerExtension` comment ([41182d1](https://github.com/openai/openai-java/commit/41182d164e3739af338ad8f6d17955792c3a48a5)) -* **internal:** update CI step name ([eeb51c6](https://github.com/openai/openai-java/commit/eeb51c61925e9e49ce1b2994f069d89068028e00)) - - -### Documentation - -* **api:** update docstrings across audio, chatkit, skills, videos, and other endpoints ([f5018f5](https://github.com/openai/openai-java/commit/f5018f5bfc839b22397d184c18fc5a359fabd430)) - -## 4.21.0 (2026-02-13) - -Full Changelog: [v4.20.0...v4.21.0](https://github.com/openai/openai-java/compare/v4.20.0...v4.21.0) - -### Features - -* **api:** container network_policy and skills ([c248c52](https://github.com/openai/openai-java/commit/c248c522e1ef826aa28c1176dee234ba64bc0550)) - - -### Documentation - -* update comment ([6a1a02b](https://github.com/openai/openai-java/commit/6a1a02b54a87dc5ad846086f4ca0eda047928720)) - -## 4.20.0 (2026-02-10) - -Full Changelog: [v4.19.0...v4.20.0](https://github.com/openai/openai-java/compare/v4.19.0...v4.20.0) - -### Features - -* **api:** skills and hosted shell ([fcd724d](https://github.com/openai/openai-java/commit/fcd724d2822b755ef44b9de8f9b5573d82271ce7)) -* **api:** support for images in batch api ([c73908a](https://github.com/openai/openai-java/commit/c73908a19f26fa12350f7a5880401bd260420216)) - -## 4.19.0 (2026-02-09) - -Full Changelog: [v4.18.0...v4.19.0](https://github.com/openai/openai-java/compare/v4.18.0...v4.19.0) - -### Features - -* **api:** add context_management to responses ([da0fb59](https://github.com/openai/openai-java/commit/da0fb59b0e0362ee68353829c97ac8b2944cd49b)) -* **api:** add webhook signature verification ([1823eca](https://github.com/openai/openai-java/commit/1823ecab53fd72ef7f7fdc7776e6ecd631307f7c)) -* **api:** responses context_management ([c0f2cd1](https://github.com/openai/openai-java/commit/c0f2cd1c854d6fca90c9000de46f042e64a8cbf5)) - - -### Chores - -* **internal:** upgrade AssertJ ([5c01787](https://github.com/openai/openai-java/commit/5c017872b071272eff021318dab9a4a774cfcd4c)) - -## 4.18.0 (2026-02-05) - -Full Changelog: [v4.17.0...v4.18.0](https://github.com/openai/openai-java/compare/v4.17.0...v4.18.0) - -### Features - -* **api:** image generation actions for responses; ResponseFunctionCallArgumentsDoneEvent.name ([a0cc1d8](https://github.com/openai/openai-java/commit/a0cc1d81ca67e8618f51df4359b2877d27cba572)) - - -### Bug Fixes - -* **client:** undo change to web search Find action ([7b2ebe5](https://github.com/openai/openai-java/commit/7b2ebe54b58b97fbc9ad1bba5cb54cb346606483)) -* **client:** update type for `find_in_page` action ([2cde783](https://github.com/openai/openai-java/commit/2cde783b5d33d7498548074ad45ee04d4d9d7c05)) - - -### Chores - -* **internal:** allow passing args to `./scripts/test` ([ce2c0ed](https://github.com/openai/openai-java/commit/ce2c0edb51c10779f3c7bb68aef8666057d4e400)) - -## 4.17.0 (2026-01-30) - -Full Changelog: [v4.16.1...v4.17.0](https://github.com/openai/openai-java/compare/v4.16.1...v4.17.0) - -### Features - -* **api:** add shell_call_output status field ([1e8a078](https://github.com/openai/openai-java/commit/1e8a0786f54b7e618a93ce1eb7a42a9b851d1ad0)) -* **api:** api updates ([23a49f6](https://github.com/openai/openai-java/commit/23a49f68f655658c07bdd98f3d603d2aaf8f5812)) - - -### Bug Fixes - -* **api:** mark assistants as deprecated ([a21625e](https://github.com/openai/openai-java/commit/a21625e3378eb635a6045e59746a62ffc846ee6f)) - - -### Chores - -* **ci:** upgrade `actions/github-script` ([ddbc5a1](https://github.com/openai/openai-java/commit/ddbc5a161dd5b1760eae9f70e149b4360f1b9203)) -* **client:** improve example values ([f5941b5](https://github.com/openai/openai-java/commit/f5941b53a08e457368895735cc3f265fa09415cb)) - -## 4.16.1 (2026-01-23) - -Full Changelog: [v4.16.0...v4.16.1](https://github.com/openai/openai-java/compare/v4.16.0...v4.16.1) - -### Bug Fixes - -* **client:** preserve time zone in lenient date-time parsing ([2dcc893](https://github.com/openai/openai-java/commit/2dcc893a155d1170f361ee7a64f79f75f88a10a1)) - - -### Chores - -* **internal:** correct cache invalidation for `SKIP_MOCK_TESTS` ([4f7b317](https://github.com/openai/openai-java/commit/4f7b317dcfb66644e58be5d056e058e8c8cb866a)) - - -### Documentation - -* add comment for arbitrary value fields ([2d87940](https://github.com/openai/openai-java/commit/2d87940031547ea6fe48a75f266f560297e210b9)) - -## 4.16.0 (2026-01-21) - -Full Changelog: [v4.15.0...v4.16.0](https://github.com/openai/openai-java/compare/v4.15.0...v4.16.0) - -### Features - -* **api:** api update ([e5203e2](https://github.com/openai/openai-java/commit/e5203e29d3a2c8e74c976ecf3e1db93102953870)) -* **client:** send `X-Stainless-Kotlin-Version` header ([d77a171](https://github.com/openai/openai-java/commit/d77a1713511e9b30abd2df66a3ecc95ad811e276)) - - -### Bug Fixes - -* **client:** disallow coercion from float to int ([4332495](https://github.com/openai/openai-java/commit/4332495f9d237a854ef0fc64bfa523a342eb7d98)) -* **client:** fully respect max retries ([b2ac5ce](https://github.com/openai/openai-java/commit/b2ac5cecb0819e6e5165f727cc76551654c0d680)) -* **client:** send retry count header for max retries 0 ([b2ac5ce](https://github.com/openai/openai-java/commit/b2ac5cecb0819e6e5165f727cc76551654c0d680)) -* date time deserialization leniency ([35a4662](https://github.com/openai/openai-java/commit/35a4662ed2657f9a0b22487d1c5c4da8f27f0f96)) -* make ResponseAccumulator forwards compatible with new event types ([d9dc902](https://github.com/openai/openai-java/commit/d9dc902beb83a9b3ec8e6d6fdc6ec59be580ec39)) - - -### Chores - -* **ci:** upgrade `actions/setup-java` ([d739c6a](https://github.com/openai/openai-java/commit/d739c6ab75bc155fdb44f4a49be8cb61a2807888)) -* **internal:** clean up maven repo artifact script and add html documentation to repo root ([763df3f](https://github.com/openai/openai-java/commit/763df3fcd6c64ad48f8b1c2391fa22010ebfd9ec)) -* **internal:** depend on packages directly in example ([b2ac5ce](https://github.com/openai/openai-java/commit/b2ac5cecb0819e6e5165f727cc76551654c0d680)) -* **internal:** improve maven repo docs ([005acfc](https://github.com/openai/openai-java/commit/005acfc499a7c2d26926ec95a3f9b2a7ad7cff47)) -* **internal:** support uploading Maven repo artifacts to stainless package server ([24dd88f](https://github.com/openai/openai-java/commit/24dd88f2fba4594b1c317b9840ca24e5aa6379bb)) -* **internal:** update `actions/checkout` version ([64b074f](https://github.com/openai/openai-java/commit/64b074fe39e628ba11b4d36e182b4156e656566f)) -* **internal:** update maven repo doc to include authentication ([c00b703](https://github.com/openai/openai-java/commit/c00b70307b9bdd6a9f94cf63551a15352b58352e)) -* test on Jackson 2.14.0 to avoid encountering FasterXML/jackson-databind[#3240](https://github.com/openai/openai-java/issues/3240) in tests ([35a4662](https://github.com/openai/openai-java/commit/35a4662ed2657f9a0b22487d1c5c4da8f27f0f96)) - -## 4.15.0 (2026-01-09) - -Full Changelog: [v4.14.0...v4.15.0](https://github.com/openai/openai-java/compare/v4.14.0...v4.15.0) - -### Features - -* **api:** add new Response completed_at prop ([703a651](https://github.com/openai/openai-java/commit/703a6511f98fd016a0a27e0694fccf1d81cc3280)) -* **client:** allow configuring dispatcher executor service ([8e579d9](https://github.com/openai/openai-java/commit/8e579d9db0c7fde0da3abb180f5bc72c2798ede4)) - - -### Bug Fixes - -* **client:** allow `withOptions` to modify credentials ([#674](https://github.com/openai/openai-java/issues/674)) ([1d5a8f9](https://github.com/openai/openai-java/commit/1d5a8f9dda2420d3dfe916bb90f07ee596886511)) - - -### Chores - -* **internal:** use different example values for some enums ([d8c6ed4](https://github.com/openai/openai-java/commit/d8c6ed431b65bbf6746731de3052a3a2f3a6aaa8)) - -## 4.14.0 (2026-01-06) - -Full Changelog: [v4.13.0...v4.14.0](https://github.com/openai/openai-java/compare/v4.13.0...v4.14.0) - -### Features - -* **client:** add `HttpRequest#url()` method ([cf7d459](https://github.com/openai/openai-java/commit/cf7d459019625c6e08f376efb588c8aff332bf8c)) - -## 4.13.0 (2025-12-19) - -Full Changelog: [v4.12.0...v4.13.0](https://github.com/openai/openai-java/compare/v4.12.0...v4.13.0) - -### Features - -* **api:** gpt-image-1.5 ([165b588](https://github.com/openai/openai-java/commit/165b588743c301493e0dc8126cfe32c549bdc4ad)) -* **api:** slugs for new audio models; make all `model` params accept strings ([cf46781](https://github.com/openai/openai-java/commit/cf4678180c4c2d4f79356a0dd5228db0a2e4cd84)) - -## 4.12.0 (2025-12-15) - -Full Changelog: [v4.11.0...v4.12.0](https://github.com/openai/openai-java/compare/v4.11.0...v4.12.0) - -### Features - -* **api:** api update ([29174d7](https://github.com/openai/openai-java/commit/29174d7275d95ef5a6d4f88d4ebe2bcd178746b5)) -* **api:** fix grader input list, add dated slugs for sora-2 ([f75af83](https://github.com/openai/openai-java/commit/f75af830fdaf2874313c125a8de0aecde6f447b7)) -* **api:** manual updates for java ([ffd07a2](https://github.com/openai/openai-java/commit/ffd07a2ad1ae064e65f4564c663502fe3901c21e)) - -## 4.11.0 (2025-12-12) - -Full Changelog: [v4.10.0...v4.11.0](https://github.com/openai/openai-java/compare/v4.10.0...v4.11.0) - -### Features - -* **api:** gpt 5.2 ([de55bd3](https://github.com/openai/openai-java/commit/de55bd3ecfcf1c325a6908b8521b4fc06ed6fc7c)) - -## 4.10.0 (2025-12-10) - -Full Changelog: [v4.9.0...v4.10.0](https://github.com/openai/openai-java/compare/v4.9.0...v4.10.0) - -### Features - -* **api:** make model required for the responses/compact endpoint ([904f55a](https://github.com/openai/openai-java/commit/904f55aba8bacfbaa1bff9e1d96a747db2020775)) - -## 4.9.0 (2025-12-04) - -Full Changelog: [v4.8.0...v4.9.0](https://github.com/openai/openai-java/compare/v4.8.0...v4.9.0) - -### Features - -* **api:** gpt-5.1-codex-max and responses/compact ([651c44f](https://github.com/openai/openai-java/commit/651c44f570ba07784d715a382d94b255fd3afa60)) - - -### Bug Fixes - -* **api:** align types of input items / output items for typescript ([9202c69](https://github.com/openai/openai-java/commit/9202c695d939def7c9598e9ee75999b8ebd87e32)) -* **client:** cancel okhttp call when future cancelled ([c665e21](https://github.com/openai/openai-java/commit/c665e21c83123931baed5b21b9bbaa96a4d77495)) - - -### Documentation - -* remove `$` for better copy-pasteabality ([66f7a4b](https://github.com/openai/openai-java/commit/66f7a4b3d2b88fc3e80c1552d0a0df86cd45c1ff)) - -## 4.8.0 (2025-11-13) - -Full Changelog: [v4.7.2...v4.8.0](https://github.com/openai/openai-java/compare/v4.7.2...v4.8.0) - -### Features - -* **api:** gpt 5.1 ([bb89ad7](https://github.com/openai/openai-java/commit/bb89ad78b91643bb1bb1578894fd2b123a4c6dae)) - -## 4.7.2 (2025-11-13) - -Full Changelog: [v4.7.1...v4.7.2](https://github.com/openai/openai-java/compare/v4.7.1...v4.7.2) - -### Bug Fixes - -* **client:** multi-value header serialization ([4a198b2](https://github.com/openai/openai-java/commit/4a198b2f0e2531295bb1bf9d4ca2fdbd74af64e5)) - -## 4.7.1 (2025-11-04) - -Full Changelog: [v4.7.0...v4.7.1](https://github.com/openai/openai-java/compare/v4.7.0...v4.7.1) - -### Bug Fixes - -* **api:** fix nullability of logprobs ([f1733f8](https://github.com/openai/openai-java/commit/f1733f8e81580b4e6c1a29ea6913af5e98d41607)) - -## 4.7.0 (2025-11-04) - -Full Changelog: [v4.6.1...v4.7.0](https://github.com/openai/openai-java/compare/v4.6.1...v4.7.0) - -### Features - -* **api:** Realtime API token_limits, Hybrid searching ranking options ([bd9bcfd](https://github.com/openai/openai-java/commit/bd9bcfdd560cfc8df2a9336d162a0ee1f6604b84)) -* **api:** remove InputAudio from ResponseInputContent ([630fecf](https://github.com/openai/openai-java/commit/630fecf8f0e04ce82ac0f0df9b5d60df4edd0655)) - - -### Bug Fixes - -* **api:** docs updates ([3e970ec](https://github.com/openai/openai-java/commit/3e970ec8c9b3895b087f5722a0bfae23ca9e4e2c)) - -## 4.6.1 (2025-10-20) - -Full Changelog: [v4.6.0...v4.6.1](https://github.com/openai/openai-java/compare/v4.6.0...v4.6.1) - -### Bug Fixes - -* **api:** fix discriminator propertyName for ResponseFormatJsonSchema ([a54219b](https://github.com/openai/openai-java/commit/a54219baeeba6968a2645a4f6b1b24746f057401)) - -## 4.6.0 (2025-10-20) - -Full Changelog: [v4.5.0...v4.6.0](https://github.com/openai/openai-java/compare/v4.5.0...v4.6.0) - -### Features - -* **api:** Add responses.input_tokens.count ([4cc3097](https://github.com/openai/openai-java/commit/4cc3097bbcc97071d41ba46d114ac24045e7e1f0)) - - -### Bug Fixes - -* **api:** internal openapi updates ([faead94](https://github.com/openai/openai-java/commit/faead94dc548f0ae623c6a132b84459d7fb4bb23)) - -## 4.5.0 (2025-10-17) - -Full Changelog: [v4.4.0...v4.5.0](https://github.com/openai/openai-java/compare/v4.4.0...v4.5.0) - -### Features - -* **api:** api update ([09dd95f](https://github.com/openai/openai-java/commit/09dd95f948bca9e26597a9971d7799a1defb6a28)) - -## 4.4.0 (2025-10-16) - -Full Changelog: [v4.3.0...v4.4.0](https://github.com/openai/openai-java/compare/v4.3.0...v4.4.0) - -### Features - -* **api:** Add support for gpt-4o-transcribe-diarize on audio/transcriptions endpoint ([dc2c297](https://github.com/openai/openai-java/commit/dc2c297526f2ebe4003642dfe8b1c2499d0a4b56)) - -## 4.3.0 (2025-10-10) - -Full Changelog: [v4.2.0...v4.3.0](https://github.com/openai/openai-java/compare/v4.2.0...v4.3.0) - -### Features - -* add more helper methods to instantiate union objects ([e5e61b5](https://github.com/openai/openai-java/commit/e5e61b5a56e5eb6269a99171b8ce3bfe4e5bdc6f)) -* **api:** comparison filter in/not in ([29b6606](https://github.com/openai/openai-java/commit/29b66068d56cc7afb9485eed34a6744c47296785)) - - -### Bug Fixes - -* **api:** manual updates ([8d54d5d](https://github.com/openai/openai-java/commit/8d54d5d5bc0be0cda7648a28a2817d3cfaab2e6a)) - -## 4.2.0 (2025-10-06) - -Full Changelog: [v4.1.0...v4.2.0](https://github.com/openai/openai-java/compare/v4.1.0...v4.2.0) - -### Features - -* **api:** dev day 2025 launches ([d4f0999](https://github.com/openai/openai-java/commit/d4f09991051ca1554f2452dd014941b3e5b77f73)) - -## 4.1.0 (2025-10-02) - -Full Changelog: [v4.0.1...v4.1.0](https://github.com/openai/openai-java/compare/v4.0.1...v4.1.0) - -### Features - -* **api:** add support for realtime calls ([c4d224c](https://github.com/openai/openai-java/commit/c4d224cf9b37aa0535c2857f3159421898304ff6)) - -## 4.0.1 (2025-10-01) - -Full Changelog: [v4.0.0...v4.0.1](https://github.com/openai/openai-java/compare/v4.0.0...v4.0.1) - -### Bug Fixes - -* **api:** add status, approval_request_id to MCP tool call ([56ed867](https://github.com/openai/openai-java/commit/56ed86777a63590b79559e850ce1c34d0c0b9af0)) - -## 4.0.0 (2025-09-30) - -Full Changelog: [v3.7.1...v4.0.0](https://github.com/openai/openai-java/compare/v3.7.1...v4.0.0) - -### ⚠ BREAKING CHANGES - -* **api:** `ResponseFunctionToolCallOutputItem.output` and `ResponseCustomToolCallOutput.output` now return `string | Array` instead of `string` only. This may break existing callsites that assume `output` is always a string. - -### Features - -* **api:** Support images and files for function call outputs in responses, BatchUsage ([de7a6c1](https://github.com/openai/openai-java/commit/de7a6c18862af4f94ce7bbc3a3ae447520be5880)) - - -### Bug Fixes - -* **client:** remove duplicate outputAsJson function ([4718871](https://github.com/openai/openai-java/commit/4718871e7e281b0a75c914d013e3b644340d5c4b)) - -## 3.7.1 (2025-09-26) - -Full Changelog: [v3.7.0...v3.7.1](https://github.com/openai/openai-java/compare/v3.7.0...v3.7.1) - -### Bug Fixes - -* **client:** deserialization of empty objects ([9a1f927](https://github.com/openai/openai-java/commit/9a1f927f3f966ada762ba4764ba9fe448dd8edc7)) - - -### Chores - -* **internal:** change some comment formatting ([3ae2e58](https://github.com/openai/openai-java/commit/3ae2e58c926ea789e986a12d4644a06c01fe3f84)) - -## 3.7.0 (2025-09-23) - -Full Changelog: [v3.6.1...v3.7.0](https://github.com/openai/openai-java/compare/v3.6.1...v3.7.0) - -### Features - -* **api:** gpt-5-codex ([cf7d02f](https://github.com/openai/openai-java/commit/cf7d02ff2624397628eefd5bdcd025b60980691c)) - -## 3.6.1 (2025-09-22) - -Full Changelog: [v3.6.0...v3.6.1](https://github.com/openai/openai-java/compare/v3.6.0...v3.6.1) - -### Bug Fixes - -* **api:** fix mcp tool name ([d2e947d](https://github.com/openai/openai-java/commit/d2e947dc5a8585f0200c6ff96d093fa0997a39e7)) - - -### Chores - -* **api:** openapi updates for conversations ([0dbcc0a](https://github.com/openai/openai-java/commit/0dbcc0a4c7cdd514a3405213fc173708ca1b5013)) -* improve example values ([109a350](https://github.com/openai/openai-java/commit/109a350313bb39d7d62d56020fdc458d798924ee)) -* improve formatter performance ([3fce946](https://github.com/openai/openai-java/commit/3fce946567568c0dc92b247c984c4dfcb34f603d)) - -## 3.6.0 (2025-09-19) - -Full Changelog: [v3.5.3...v3.6.0](https://github.com/openai/openai-java/compare/v3.5.3...v3.6.0) - -### Features - -* **api:** add reasoning_text ([2bde290](https://github.com/openai/openai-java/commit/2bde29036040664aa4ae54f6522e5e5336ed2c87)) -* **api:** type updates for conversations, reasoning_effort and results for evals ([364a176](https://github.com/openai/openai-java/commit/364a1766d34b6cc19fca81a445b287fc9ccefe2c)) -* **client:** expose sleeper option ([a5ffd57](https://github.com/openai/openai-java/commit/a5ffd57e75b6f0abe14d326c87f58abd2048cf73)) - - -### Bug Fixes - -* **client:** ensure single timer is created per client ([a5ffd57](https://github.com/openai/openai-java/commit/a5ffd57e75b6f0abe14d326c87f58abd2048cf73)) - -## 3.5.3 (2025-09-15) - -Full Changelog: [v3.5.2...v3.5.3](https://github.com/openai/openai-java/compare/v3.5.2...v3.5.3) - -### Bug Fixes - -* **client:** incorrect `getPackageVersion` impl ([51a0e59](https://github.com/openai/openai-java/commit/51a0e594bc1a2b42f5e5fde308f8608eb65796df)) - - -### Chores - -* **api:** docs and spec refactoring ([02720cf](https://github.com/openai/openai-java/commit/02720cf00517f874eb76b5f3b31c040361da8720)) - -## 3.5.2 (2025-09-12) - -Full Changelog: [v3.5.1...v3.5.2](https://github.com/openai/openai-java/compare/v3.5.1...v3.5.2) - -### Chores - -* **api:** Minor docs and type updates for realtime ([63ad148](https://github.com/openai/openai-java/commit/63ad148f1f998de1c9d66021037d7d5e04615022)) -* improve formatter performance ([be0acb7](https://github.com/openai/openai-java/commit/be0acb7a7779c4df1bf3e4678c40f4bd6d2b50d6)) -* **internal:** codegen related update ([18a0e64](https://github.com/openai/openai-java/commit/18a0e645fd3ea28957e55633f2a271287b56c312)) -* **internal:** codegen related update ([ab87009](https://github.com/openai/openai-java/commit/ab870095a749e00bcc2e864476553f782d098525)) -* **internal:** remove redundant deserializer symbols ([8c63a5b](https://github.com/openai/openai-java/commit/8c63a5b4983039ace361ab08b89a0c227a88cf90)) - -## 3.5.1 (2025-09-10) - -Full Changelog: [v3.5.0...v3.5.1](https://github.com/openai/openai-java/compare/v3.5.0...v3.5.1) - -### Chores - -* **api:** fix realtime GA types ([10cd1c4](https://github.com/openai/openai-java/commit/10cd1c49b63b63aa7d3a357ab5b0e982628cd933)) - -## 3.5.0 (2025-09-08) - -Full Changelog: [v3.4.1...v3.5.0](https://github.com/openai/openai-java/compare/v3.4.1...v3.5.0) - -### Features - -* **api:** ship the RealtimeGA API shape ([4eb0dfa](https://github.com/openai/openai-java/commit/4eb0dfa45278656462c69ea20573745d630b9559)) - -## 3.4.1 (2025-09-03) - -Full Changelog: [v3.4.0...v3.4.1](https://github.com/openai/openai-java/compare/v3.4.0...v3.4.1) - -### Bug Fixes - -* **ci:** use java-version 21 for publish step ([db861bd](https://github.com/openai/openai-java/commit/db861bd0cd1b6c109b4bff081e89209eef2257e4)) - -## 3.4.0 (2025-09-03) - -Full Changelog: [v3.3.0...v3.4.0](https://github.com/openai/openai-java/compare/v3.3.0...v3.4.0) - -### Features - -* **api:** Add gpt-realtime models ([37b8b69](https://github.com/openai/openai-java/commit/37b8b69cb027e9c9e3abd7d9d9ce211a2c6e165c)) - -## 3.3.0 (2025-09-03) - -Full Changelog: [v3.2.1...v3.3.0](https://github.com/openai/openai-java/compare/v3.2.1...v3.3.0) - -### Features - -* **client:** support verbosity with structured outputs ([#603](https://github.com/openai/openai-java/issues/603)) ([2496464](https://github.com/openai/openai-java/commit/24964646ab02a3ff61efb9802facac66b204bdaf)) - -## 3.2.1 (2025-09-02) - -Full Changelog: [v3.2.0...v3.2.1](https://github.com/openai/openai-java/compare/v3.2.0...v3.2.1) - -### Chores - -* **api:** manual updates for ResponseInputAudio ([d070eb7](https://github.com/openai/openai-java/commit/d070eb72346cfc57d3bf952ddb1f89c9a7b2d5c8)) - -## 3.2.0 (2025-09-02) - -Full Changelog: [v3.1.2...v3.2.0](https://github.com/openai/openai-java/compare/v3.1.2...v3.2.0) - -### Features - -* **api:** Add connectors support for MCP tool ([ee175a9](https://github.com/openai/openai-java/commit/ee175a98a1ed4f1e939c301dd5bf62f10e367c6c)) -* **api:** add web search filters ([45c5856](https://github.com/openai/openai-java/commit/45c585612b161359b2055ddfa679debdba7986bb)) -* **api:** adding support for /v1/conversations to the API ([9d088c5](https://github.com/openai/openai-java/commit/9d088c5d77c450a2e1371a8293e9c05ebf102937)) -* **api:** realtime API updates ([0ea523e](https://github.com/openai/openai-java/commit/0ea523e383ca0384139d44da384b101bf74ef7c2)) - - -### Bug Fixes - -* fix casing issue ([201f54e](https://github.com/openai/openai-java/commit/201f54ea01817ebe7362e21e4e79c68a63eb3cb9)) -* update singularization rules ([7cbc830](https://github.com/openai/openai-java/commit/7cbc8305e4da79560969ba365f6f33427688bc50)) - - -### Chores - -* add missing delegate methods ([557e9ee](https://github.com/openai/openai-java/commit/557e9ee897e11c95788300922e8094383eb1dd97)) -* **ci:** reduce log noise ([9e91952](https://github.com/openai/openai-java/commit/9e9195269a225cdbaba81e2dd6ee26caba407d00)) -* **client:** refactor closing / shutdown ([94cdfcd](https://github.com/openai/openai-java/commit/94cdfcdf57225ee606acf51ffe3e0b6a4321f7e6)) -* **internal:** support running formatters directly ([6242da5](https://github.com/openai/openai-java/commit/6242da594134e736470c006bc1af6b38ce757705)) -* remove memory upper bound from publishing step ([fdc5fdd](https://github.com/openai/openai-java/commit/fdc5fdd3969d2ecc3d6df1546b34167b63074991)) - -## 3.1.2 (2025-08-20) - -Full Changelog: [v3.1.1...v3.1.2](https://github.com/openai/openai-java/compare/v3.1.1...v3.1.2) - -### Bug Fixes - -* **client:** ensure correct binary content type ([86386c9](https://github.com/openai/openai-java/commit/86386c923fe1856c56ca501795857d1ab150f908)) - - -### Chores - -* **client:** rename parameter ([86386c9](https://github.com/openai/openai-java/commit/86386c923fe1856c56ca501795857d1ab150f908)) -* **internal:** fix multipart tests ([ea67d5d](https://github.com/openai/openai-java/commit/ea67d5df786add1c3d6549bcc94e835b795d3fca)) - -## 3.1.1 (2025-08-20) - -Full Changelog: [v3.1.0...v3.1.1](https://github.com/openai/openai-java/compare/v3.1.0...v3.1.1) - -### Chores - -* **internal/ci:** setup breaking change detection ([2a18622](https://github.com/openai/openai-java/commit/2a1862218ccafea3a37801367aee303564b48ca3)) - -## 3.1.0 (2025-08-19) - -Full Changelog: [v3.0.3...v3.1.0](https://github.com/openai/openai-java/compare/v3.0.3...v3.1.0) - -### Features - -* **api:** add new text parameters, expiration options ([658f053](https://github.com/openai/openai-java/commit/658f053bc5a50f100459377b225fd7059e037c02)) - - -### Performance Improvements - -* **internal:** make formatting faster ([d7909d9](https://github.com/openai/openai-java/commit/d7909d936ede0d49b0ea62eb6e13dfb559a3dd0c)) - - -### Chores - -* **api:** accurately represent shape for verbosity on Chat Completions ([d01f37f](https://github.com/openai/openai-java/commit/d01f37f4012c7f3135c65218eb4326ba2ee27f12)) -* **ci:** add build job ([7699c4f](https://github.com/openai/openai-java/commit/7699c4f97f0d6a9fb26381c9d60570d1f07d8359)) -* **internal:** dynamically determine included projects ([1342647](https://github.com/openai/openai-java/commit/13426472f96739de27f9e7baae3e7cde7e6bd7ac)) -* **internal:** support passing arguments to test script ([ac596c6](https://github.com/openai/openai-java/commit/ac596c66026d35e3a5a1094303c8ed15a7a96166)) - -## 3.0.3 (2025-08-13) - -Full Changelog: [v3.0.2...v3.0.3](https://github.com/openai/openai-java/compare/v3.0.2...v3.0.3) - -### Bug Fixes - -* serialize dates correctly in structured outputs ([8cd3639](https://github.com/openai/openai-java/commit/8cd3639fb8027fbb4945ab0d984b0ef82fc9ea5c)) - - -### Chores - -* **internal:** format identity methods ([fd2661b](https://github.com/openai/openai-java/commit/fd2661b3ef67229394c80adeeba2377403d89d44)) - - -### Documentation - -* add response raw structured outputs ([e68d31e](https://github.com/openai/openai-java/commit/e68d31e6828fe9139e4720e12a12e028b11bb2fb)) - -## 3.0.2 (2025-08-09) - -Full Changelog: [v3.0.1...v3.0.2](https://github.com/openai/openai-java/compare/v3.0.1...v3.0.2) - -### Chores - -* **internal:** update comment in script ([925656f](https://github.com/openai/openai-java/commit/925656f5693d7a50ca58e56468b9858a7c757db6)) - -## 3.0.1 (2025-08-08) - -Full Changelog: [v3.0.0...v3.0.1](https://github.com/openai/openai-java/compare/v3.0.0...v3.0.1) - -### Bug Fixes - -* **client:** fix verbosity parameter location in Responses ([c4200c3](https://github.com/openai/openai-java/commit/c4200c3406be7a5726c0b66d077f8994bad1ab66)) -* **responses:** remove incorrect verbosity builder method ([76286de](https://github.com/openai/openai-java/commit/76286dea43fdde63aa2f25e14f0f65f362ae121c)) -* **responses:** remove more references to incorrect verbosity location ([1f56089](https://github.com/openai/openai-java/commit/1f56089d28ca7ef88c3ea632dc3757ccb596cae0)) - - -### Chores - -* update @stainless-api/prism-cli to v5.15.0 ([61263de](https://github.com/openai/openai-java/commit/61263de7d22b9b385be2bf3194a17767d64e1641)) -* update delegation tests ([060ec4c](https://github.com/openai/openai-java/commit/060ec4c77f9f9470ca13074815ba186ee47daeef)) - -## 3.0.0 (2025-08-08) - -Full Changelog: [v2.20.1...v3.0.0](https://github.com/openai/openai-java/compare/v2.20.1...v3.0.0) - -### Features - -* **api:** adds GPT-5 and new API features: platform.openai.com/docs/guides/gpt-5 ([fa34d24](https://github.com/openai/openai-java/commit/fa34d242f44d2329c16cd0862c13f17a5764cace)) -* **api:** manual updates ([089a075](https://github.com/openai/openai-java/commit/089a075c2cc10469c8eb6714004e65e292b07267)) -* **client:** support new unified Azure URL scheme ([#554](https://github.com/openai/openai-java/issues/554)) ([9aacff0](https://github.com/openai/openai-java/commit/9aacff0ee4030250941b749cbffab683323b0e33)) - - -### Bug Fixes - -* **functions:** add accidentally removed arguments method ([696dfb1](https://github.com/openai/openai-java/commit/696dfb1da6a9ae7b962f5beeafd35c1cd74a6f11)) - - -### Chores - -* **example:** fix run example comment ([42fe3d9](https://github.com/openai/openai-java/commit/42fe3d965e6e6f0724c1a0d93101cac04902a547)) -* increase max gradle JVM heap to 8GB ([87afac0](https://github.com/openai/openai-java/commit/87afac0530148f22194721cc0a285bd41f817a57)) -* **internal:** add async lock helper ([1a75cea](https://github.com/openai/openai-java/commit/1a75ceaf7f526ddd7f1f14ff551939fec4242926)) - - -### Documentation - -* more prominently call out examples ([d601c1a](https://github.com/openai/openai-java/commit/d601c1a1942182fe6fa9ea052b0028654356e738)) -* multiple image editing ([a64f375](https://github.com/openai/openai-java/commit/a64f375dbfe11adf0119f55a70efd238693ffcdf)) - -## 2.20.1 (2025-07-31) - -Full Changelog: [v2.20.0...v2.20.1](https://github.com/openai/openai-java/compare/v2.20.0...v2.20.1) - -### Bug Fixes - -* **client:** r8 support ([aa76f63](https://github.com/openai/openai-java/commit/aa76f638ca761ef63b336ee3e960f7302b4ec9dc)) - - -### Chores - -* **internal:** bump ci test timeout ([0ea80f0](https://github.com/openai/openai-java/commit/0ea80f0f4e914919e95c6914e907617bfadea369)) -* **internal:** reduce proguard ci logging ([876aa8f](https://github.com/openai/openai-java/commit/876aa8fa7b801ff0ed62ff933088bead3f7d5d66)) - -## 2.20.0 (2025-07-30) - -Full Changelog: [v2.19.2...v2.20.0](https://github.com/openai/openai-java/compare/v2.19.2...v2.20.0) - -### Features - -* add retryable exception ([4916163](https://github.com/openai/openai-java/commit/4916163ef5e9d06b137341373ab3eb4cc7e3038b)) -* **api:** manual updates ([c4f9a92](https://github.com/openai/openai-java/commit/c4f9a921b63366b3abf3d502c895ec2bfed5329a)) -* **client:** ensure compat with proguard ([0d4db65](https://github.com/openai/openai-java/commit/0d4db656adbbdced4d7d9493cf176045e38d3b89)) - -## 2.19.2 (2025-07-28) - -Full Changelog: [v2.19.1...v2.19.2](https://github.com/openai/openai-java/compare/v2.19.1...v2.19.2) - -### Bug Fixes - -* **client:** some bad `_additionalBodyProperties` serialization ([ae900c6](https://github.com/openai/openai-java/commit/ae900c6e6bd37de7ba084e753b38705baed9c56a)) - -## 2.19.1 (2025-07-24) - -Full Changelog: [v2.19.0...v2.19.1](https://github.com/openai/openai-java/compare/v2.19.0...v2.19.1) - -### Bug Fixes - -* **client:** accidental mutability of some classes ([8f377c4](https://github.com/openai/openai-java/commit/8f377c400550b7f99f8b91b59caf92c9274f174f)) - - -### Chores - -* **internal:** remove unnecessary `[...]` in `[@see](https://github.com/see)` ([ba7945f](https://github.com/openai/openai-java/commit/ba7945f92514c41c5ebb367272082d6658f06ad4)) -* **internal:** simplify handling of deployment models ([#556](https://github.com/openai/openai-java/issues/556)) ([2c7e661](https://github.com/openai/openai-java/commit/2c7e661877d07372ad7e54f788d665a459b18fba)) - - -### Documentation - -* more code comments ([2110f40](https://github.com/openai/openai-java/commit/2110f40666a81e08ad2f493773fe1f2ca4a562b2)) - -## 2.19.0 (2025-07-23) - -Full Changelog: [v2.18.2...v2.19.0](https://github.com/openai/openai-java/compare/v2.18.2...v2.19.0) - -### Features - -* **client:** support base64 embeddings and use as default ([#519](https://github.com/openai/openai-java/issues/519)) ([12b0ff7](https://github.com/openai/openai-java/commit/12b0ff75cf2a3bc93cf5c41adbbf2b5097a8e941)) - - -### Documentation - -* fix missing readme comment ([720ed2c](https://github.com/openai/openai-java/commit/720ed2cff555977efa00043b3f424920811ce339)) - -## 2.18.2 (2025-07-22) - -Full Changelog: [v2.18.1...v2.18.2](https://github.com/openai/openai-java/compare/v2.18.1...v2.18.2) - -### Bug Fixes - -* **client:** support structured outputs in async requests ([#548](https://github.com/openai/openai-java/issues/548)). ([#550](https://github.com/openai/openai-java/issues/550)) ([b9d52cf](https://github.com/openai/openai-java/commit/b9d52cf6e03c886dcdd5e0da3f16ea436220f09c)) - -## 2.18.1 (2025-07-22) - -Full Changelog: [v2.18.0...v2.18.1](https://github.com/openai/openai-java/compare/v2.18.0...v2.18.1) - -### Bug Fixes - -* actually add system properties ([09bb653](https://github.com/openai/openai-java/commit/09bb653a31e6cf89ddac952c776ded8f77903128)) - - -### Documentation - -* fix readme link ([d98571c](https://github.com/openai/openai-java/commit/d98571c70ebf646497dd1139b13848882261af8f)) - -## 2.18.0 (2025-07-22) - -Full Changelog: [v2.17.0...v2.18.0](https://github.com/openai/openai-java/compare/v2.17.0...v2.18.0) - -### Features - -* **client:** add `{QueryParams,Headers}#put(String, JsonValue)` methods ([1973f9a](https://github.com/openai/openai-java/commit/1973f9a7049505a27a7ec908549254f192d74be0)) -* **client:** allow configuring env via system properties ([5f8deb3](https://github.com/openai/openai-java/commit/5f8deb34ebe2982dee1aa6fd1bb1a08122a80a8d)) - - -### Chores - -* **api:** event shapes more accurate ([b7ba592](https://github.com/openai/openai-java/commit/b7ba592a4b0ebdcf53719017afb064227136d59d)) - -## 2.17.0 (2025-07-21) - -Full Changelog: [v2.16.0...v2.17.0](https://github.com/openai/openai-java/compare/v2.16.0...v2.17.0) - -### Features - -* **client:** add https config options ([3f74519](https://github.com/openai/openai-java/commit/3f745195fa5d72ee72653adbd8087915c0db2fa5)) -* **client:** allow setting additional multipart body props ([220503e](https://github.com/openai/openai-java/commit/220503efc745bd1c74c02f1d4d6d3305198bf942)) - - -### Chores - -* **internal:** refactor delegating from client to options ([e89596d](https://github.com/openai/openai-java/commit/e89596d624fd77fdef750fb65a9ca5c6497e76cb)) - -## 2.16.0 (2025-07-17) - -Full Changelog: [v2.15.0...v2.16.0](https://github.com/openai/openai-java/compare/v2.15.0...v2.16.0) - -### Features - -* **client:** publish GraalVM metadata files ([#534](https://github.com/openai/openai-java/issues/534)) ([e6b4fe0](https://github.com/openai/openai-java/commit/e6b4fe0f8690d9b513ab2b33c7bec685397b5438)) - -## 2.15.0 (2025-07-17) - -Full Changelog: [v2.14.0...v2.15.0](https://github.com/openai/openai-java/compare/v2.14.0...v2.15.0) - -### Features - -* **client:** add `ResponseAccumulator` ([#391](https://github.com/openai/openai-java/issues/391)) ([77f54fd](https://github.com/openai/openai-java/commit/77f54fdea8bf0a609f90ec511977531bffc1a9b1)) - - -### Bug Fixes - -* **client:** ensure error handling always occurs ([a00c39b](https://github.com/openai/openai-java/commit/a00c39b9b1e06a15fa3a0b2b495adfff86cddd10)) - - -### Chores - -* **client:** remove non-existent method ([2d185ba](https://github.com/openai/openai-java/commit/2d185ba387569d90ffffa07adf3337ffce918e3e)) -* **internal:** Add CONTRIBUTING.md for SDK developers ([608947c](https://github.com/openai/openai-java/commit/608947cd875167c5aa2beb65cf98f47050914b71)) -* **internal:** allow running specific example from cli ([3239c2d](https://github.com/openai/openai-java/commit/3239c2de360864456786043a2a3ffb1a71ac0a45)) - -## 2.14.0 (2025-07-16) - -Full Changelog: [v2.13.1...v2.14.0](https://github.com/openai/openai-java/compare/v2.13.1...v2.14.0) - -### Features - -* **api:** manual updates ([d3dd5be](https://github.com/openai/openai-java/commit/d3dd5be0c6797f7f7fb7935df27b7ad67177f6ea)) - - -### Bug Fixes - -* **internal:** add back addAssistantMessage ([e27b476](https://github.com/openai/openai-java/commit/e27b476b2c4e8287407b40bc2e683c33af992c43)) -* **internal:** add back addAssistantMessage ([d363245](https://github.com/openai/openai-java/commit/d363245365a618bfd75e05f905af4eda90d24e96)) - - -### Chores - -* **api:** update realtime specs ([dd24c50](https://github.com/openai/openai-java/commit/dd24c500f029db5c1d38e9659eafb3bcd4d6fe99)) -* **ci:** bump `actions/setup-java` to v4 ([e5112cd](https://github.com/openai/openai-java/commit/e5112cdb3d411357886c334b15cc3de62e2fc9c3)) - -## 2.13.1 (2025-07-15) - -Full Changelog: [v2.13.0...v2.13.1](https://github.com/openai/openai-java/compare/v2.13.0...v2.13.1) - -### Chores - -* **api:** update realtime specs, build config ([babbf87](https://github.com/openai/openai-java/commit/babbf8720e342239d176077eab554039446b30c9)) - -## 2.13.0 (2025-07-15) - -Full Changelog: [v2.12.4...v2.13.0](https://github.com/openai/openai-java/compare/v2.12.4...v2.13.0) - -### Features - -* **client:** support completions streaming structured outputs ([#528](https://github.com/openai/openai-java/issues/528)) ([2c8917b](https://github.com/openai/openai-java/commit/2c8917bf8352fab263f736387890fd06c2af5c11)) - -## 2.12.4 (2025-07-11) - -Full Changelog: [v2.12.3...v2.12.4](https://github.com/openai/openai-java/compare/v2.12.3...v2.12.4) - -### Chores - -* **api:** specification cleanup ([6fc0efd](https://github.com/openai/openai-java/commit/6fc0efdb8735f8bb4d51631f195634bbb14ea3c4)) -* **internal:** manual updates ([53059a7](https://github.com/openai/openai-java/commit/53059a72d301bc3bd7d65ab31609e8509505b2f7)) - -## 2.12.3 (2025-07-11) - -Full Changelog: [v2.12.2...v2.12.3](https://github.com/openai/openai-java/compare/v2.12.2...v2.12.3) - -### Documentation - -* add file + completions example (closes [#483](https://github.com/openai/openai-java/issues/483)) ([4a826ec](https://github.com/openai/openai-java/commit/4a826ec0fbc1b520a0ffa1478ed41779fb0448fc)) -* add image editing examples (closes [#453](https://github.com/openai/openai-java/issues/453)) ([6fa09ce](https://github.com/openai/openai-java/commit/6fa09ce13b53ca5f242a5482e38cc9d5e8e2d633)) - -## 2.12.2 (2025-07-10) - -Full Changelog: [v2.12.1...v2.12.2](https://github.com/openai/openai-java/compare/v2.12.1...v2.12.2) - -### Documentation - -* add batch processing examples ([#462](https://github.com/openai/openai-java/issues/462)) ([#476](https://github.com/openai/openai-java/issues/476)) ([d910267](https://github.com/openai/openai-java/commit/d910267a97748ce1a193712da03011a65e21277c)) - -## 2.12.1 (2025-07-08) - -Full Changelog: [v2.12.0...v2.12.1](https://github.com/openai/openai-java/compare/v2.12.0...v2.12.1) - -### Chores - -* **ci:** ensure docs generation always succeeds ([54de202](https://github.com/openai/openai-java/commit/54de202443c8dd3c112bc0521a29649f87acb7c9)) - -## 2.12.0 (2025-07-01) - -Full Changelog: [v2.11.0...v2.12.0](https://github.com/openai/openai-java/compare/v2.11.0...v2.12.0) - -### Features - -* support new schema constraints for structured outputs ([#520](https://github.com/openai/openai-java/issues/520)) ([5c41ac5](https://github.com/openai/openai-java/commit/5c41ac5f1c8ed986e887e06adc3da73ec7e6b5e5)) - - -### Bug Fixes - -* **ci:** correct conditional ([a8c7a16](https://github.com/openai/openai-java/commit/a8c7a16184376d0dcfc8dd6f954c303c02888b40)) -* **client:** don't close client on `withOptions` usage when original is gc'd ([e0890e3](https://github.com/openai/openai-java/commit/e0890e398aef9a8b6c14aba23b0b2a3d802ced8f)) - - -### Chores - -* **ci:** only run for pushes and fork pull requests ([8dc0179](https://github.com/openai/openai-java/commit/8dc0179eeb96772c73e035668904201a86e245c5)) - - -### Documentation - -* fix readme typoe ([#521](https://github.com/openai/openai-java/issues/521)) ([eb83a83](https://github.com/openai/openai-java/commit/eb83a83d5b32376497dbad8b74b15347a69ce1dd)) - - -### Refactors - -* **internal:** minor `ClientOptionsTest` change ([a7379a2](https://github.com/openai/openai-java/commit/a7379a239d4f93fe631224df81787fdec08d14bd)) - -## 2.11.0 (2025-06-27) - -Full Changelog: [v2.10.0...v2.11.0](https://github.com/openai/openai-java/compare/v2.10.0...v2.11.0) - -### Features - -* **api:** add realtime data models ([38d8e89](https://github.com/openai/openai-java/commit/38d8e893a15a9d9c2619ed28ed83cf149a8203a8)) - - -### Chores - -* add deploymentModel ([60ffc59](https://github.com/openai/openai-java/commit/60ffc59870c76d72a75e16897146663c46c3d0c7)) - -## 2.10.0 (2025-06-26) - -Full Changelog: [v2.9.1...v2.10.0](https://github.com/openai/openai-java/compare/v2.9.1...v2.10.0) - -### Features - -* **api:** webhook and deep research support ([79859a1](https://github.com/openai/openai-java/commit/79859a13346bceec6b6ebd9c32a984dcc0e7b2ed)) - - -### Bug Fixes - -* **ci:** release-doctor — report correct token name ([da7f492](https://github.com/openai/openai-java/commit/da7f492db2a39a7c025e3320bcf79fda6a0702bd)) -* **client:** fix webhooks errors ([8051535](https://github.com/openai/openai-java/commit/8051535acfe621614716bc874ae73c31df121b76)) - - -### Chores - -* **api:** remove unsupported property ([2102d96](https://github.com/openai/openai-java/commit/2102d962596fb31067aa85c88515c318448e42c0)) -* **client:** sync structured outputs features ([cb5c638](https://github.com/openai/openai-java/commit/cb5c638863d56577e6bae9e0787b7fc4633428cb)) -* **docs:** update README to include links to docs on Webhooks ([5698e53](https://github.com/openai/openai-java/commit/5698e53e9f5666036eab58811bffc97e357d9dcb)) - -## 2.9.1 (2025-06-25) - -Full Changelog: [v2.9.0...v2.9.1](https://github.com/openai/openai-java/compare/v2.9.0...v2.9.1) - -### Chores - -* **internal:** add tests for breaking change detection ([b0a6eeb](https://github.com/openai/openai-java/commit/b0a6eebc67688d38769809efaef7ebc23f519969)) -* updated readme link ([c0992cd](https://github.com/openai/openai-java/commit/c0992cdf475ce4a7f5225d849affb1b449c37cf1)) - -## 2.9.0 (2025-06-23) - -Full Changelog: [v2.8.1...v2.9.0](https://github.com/openai/openai-java/compare/v2.8.1...v2.9.0) - -### Features - -* **api:** make model and inputs not required to create response ([87dd646](https://github.com/openai/openai-java/commit/87dd64658da6cec7564f3b571e15ec0e2db0660b)) -* **api:** update api shapes for usage and code interpreter ([c003f8d](https://github.com/openai/openai-java/commit/c003f8d34388f2a78f60dd3daae63495650c3038)) - - -### Bug Fixes - -* **client:** bump max requests per host to max requests (5 -> 64) ([a36d9f6](https://github.com/openai/openai-java/commit/a36d9f647dc82f8e39591179b87a128038ce7acb)) - -## 2.8.1 (2025-06-18) - -Full Changelog: [v2.8.0...v2.8.1](https://github.com/openai/openai-java/compare/v2.8.0...v2.8.1) - -### Bug Fixes - -* **client:** consider cognitiveservices.azure.com as azure ([#470](https://github.com/openai/openai-java/issues/470)) ([551bfc2](https://github.com/openai/openai-java/commit/551bfc20022d13326da79a73a4ca71fa4bfff437)) - -## 2.8.0 (2025-06-17) - -Full Changelog: [v2.7.0...v2.8.0](https://github.com/openai/openai-java/compare/v2.7.0...v2.8.0) - -### Features - -* **api:** add reusable prompt IDs ([0767a2b](https://github.com/openai/openai-java/commit/0767a2b50d853feff84748fed3eb6cf544bec6fb)) -* **api:** manual updates ([ec235f7](https://github.com/openai/openai-java/commit/ec235f7f311ca1866ae8a05e9a622ab588062071)) -* **client:** implement per-endpoint base URL support ([c87f1af](https://github.com/openai/openai-java/commit/c87f1af80b1f3d898a5a1553be48ee87ea4e7b4f)) - - -### Bug Fixes - -* **client:** update StructuredResponse with Prompt details ([a47219b](https://github.com/openai/openai-java/commit/a47219b0247dcb4d25b3bf0f33ba6b392c61cd38)) -* **internal:** run formatter ([5757aa6](https://github.com/openai/openai-java/commit/5757aa6af407d749a7bba6e1f0714eec850d4369)) -* **tests:** fix required prop in test ([e820c6f](https://github.com/openai/openai-java/commit/e820c6f115ff392b567abb355f11ce5acfcab537)) - - -### Chores - -* **ci:** enable for pull requests ([9c90b16](https://github.com/openai/openai-java/commit/9c90b16585ebe3ffc031e0df598a27b5b6a85bb8)) -* **internal:** codegen related update ([3597aee](https://github.com/openai/openai-java/commit/3597aee95ae1956afbe8bd62b5a6946dd62256b3)) -* run formatter ([426527b](https://github.com/openai/openai-java/commit/426527b76371e7e0a66e368b0ddbb8da806fae2b)) -* run formatter ([426527b](https://github.com/openai/openai-java/commit/426527b76371e7e0a66e368b0ddbb8da806fae2b)) -* run formatter ([899f79c](https://github.com/openai/openai-java/commit/899f79c88b9a79ada33982af0d2ee64f96445230)) - -## 2.7.0 (2025-06-10) - -Full Changelog: [v2.6.0...v2.7.0](https://github.com/openai/openai-java/compare/v2.6.0...v2.7.0) - -### Features - -* **api:** Add o3-pro model IDs ([48a685f](https://github.com/openai/openai-java/commit/48a685f51f2db7499d9e47d6641b80acb14155a8)) - -## 2.6.0 (2025-06-09) - -Full Changelog: [v2.5.0...v2.6.0](https://github.com/openai/openai-java/compare/v2.5.0...v2.6.0) - -### Features - -* **api:** Add tools and structured outputs to evals ([f9d593c](https://github.com/openai/openai-java/commit/f9d593c74e08686f28e99fe2b2cb033cc506e552)) - -## 2.5.0 (2025-06-06) - -Full Changelog: [v2.4.0...v2.5.0](https://github.com/openai/openai-java/compare/v2.4.0...v2.5.0) - -### Features - -* **client:** automatic schema generation and arg parsing for function calling ([#497](https://github.com/openai/openai-java/issues/497)) ([800dc8f](https://github.com/openai/openai-java/commit/800dc8fcf1e7109c419fb6125f6ad2822b6d6748)) - -## 2.4.0 (2025-06-03) - -Full Changelog: [v2.3.2...v2.4.0](https://github.com/openai/openai-java/compare/v2.3.2...v2.4.0) - -### Features - -* **api:** add new realtime and audio models, realtime session options ([898d2ad](https://github.com/openai/openai-java/commit/898d2ad33f780e060dff902b755f3456ae0c12ed)) - - -### Chores - -* **internal:** minor formatting change ([f68c491](https://github.com/openai/openai-java/commit/f68c491cb41e22a25d498b18919e8e7a657d753a)) - -## 2.3.2 (2025-06-02) - -Full Changelog: [v2.3.1...v2.3.2](https://github.com/openai/openai-java/compare/v2.3.1...v2.3.2) - -### Bug Fixes - -* **api:** Fix evals and code interpreter interfaces ([d7e2747](https://github.com/openai/openai-java/commit/d7e27475e917613beda0022725a1d9551ed2a278)) - -## 2.3.1 (2025-06-02) - -Full Changelog: [v2.3.0...v2.3.1](https://github.com/openai/openai-java/compare/v2.3.0...v2.3.1) - -### Bug Fixes - -* **client:** `hasNextPage` impl for some classes ([32e968f](https://github.com/openai/openai-java/commit/32e968f096ec8d16ef98f8152b729a5d82daea34)) - -## 2.3.0 (2025-05-29) - -Full Changelog: [v2.2.1...v2.3.0](https://github.com/openai/openai-java/compare/v2.2.1...v2.3.0) - -### Features - -* **api:** Config update for pakrym-stream-param ([55ae767](https://github.com/openai/openai-java/commit/55ae767021a1d03a2c8bc4184163acd56ee64d41)) - - -### Bug Fixes - -* **client:** add missing deployment model param ([#704](https://github.com/openai/openai-java/issues/704)) ([37aa563](https://github.com/openai/openai-java/commit/37aa563789f34de917758519d859f17d9c1a98fc)) -* **client:** correctly send streaming discriminator param ([b27559f](https://github.com/openai/openai-java/commit/b27559fa7d1c097ada40da12e55d1def372f5dce)) -* **client:** optional image deployment model param ([a507f84](https://github.com/openai/openai-java/commit/a507f8446a2270ee3e9c5e5295a9a57b59c633eb)) -* **client:** remove `@MustBeClosed` for future returning methods ([2988157](https://github.com/openai/openai-java/commit/2988157933dfe2ec7f9f2b626d0fa9eb184db27d)) -* **client:** return binary content from `get /containers/{container_id}/files/{file_id}/content` ([787e12b](https://github.com/openai/openai-java/commit/787e12b4ac3d33f46aa31c165241c26f927e92dc)) - -## 2.2.1 (2025-05-27) - -Full Changelog: [v2.2.0...v2.2.1](https://github.com/openai/openai-java/compare/v2.2.0...v2.2.1) - -### Bug Fixes - -* **client:** don't throw on absent error message ([0d1e325](https://github.com/openai/openai-java/commit/0d1e325ee02af89f713db9cc7fb360676d942d6d)) - -## 2.2.0 (2025-05-23) - -Full Changelog: [v2.1.0...v2.2.0](https://github.com/openai/openai-java/compare/v2.1.0...v2.2.0) - -### Features - -* **api:** remove deprecated endpoints from Java client ([7b5acb5](https://github.com/openai/openai-java/commit/7b5acb54d52352521e86e7e0f6f878ca67a7b53e)) - - -### Bug Fixes - -* **examples:** remove old examples ([8fe838c](https://github.com/openai/openai-java/commit/8fe838cdade6fb04aba70ae82bab0e81d061ca43)) - - -### Chores - -* **internal:** fix release workflows ([c66f725](https://github.com/openai/openai-java/commit/c66f7258d8df4000b1013aa35140bef50de852fe)) - -## 2.1.0 (2025-05-22) - -Full Changelog: [v2.0.0...v2.1.0](https://github.com/openai/openai-java/compare/v2.0.0...v2.1.0) - -### Features - -* **api:** new streaming helpers for background responses ([a82279d](https://github.com/openai/openai-java/commit/a82279dfafef8a6a6276de104a5b58cffac63559)) - - -### Bug Fixes - -* **internal:** fix issues with new items in structured responses ([931f7b8](https://github.com/openai/openai-java/commit/931f7b8ce3a83dfbbbd46d34bf99a66fa7e888e3)) -* **tests:** fix file test ([a82adfd](https://github.com/openai/openai-java/commit/a82adfd42bbb06da2c3c18f12cafd6b8ee38cc85)) - -## 2.0.0 (2025-05-21) - -Full Changelog: [v1.6.1...v2.0.0](https://github.com/openai/openai-java/compare/v1.6.1...v2.0.0) - -### ⚠ BREAKING CHANGES - -* **client:** change precision of some numeric types -* **client:** extract auto pagination to shared classes -* **client:** **Migration:** - If you were referencing the `AutoPager` class on a specific `*Page` or `*PageAsync` type, then you should instead reference the shared `AutoPager` and `AutoPagerAsync` types, under the `core` package - - `AutoPagerAsync` now has different usage. You can call `.subscribe(...)` on the returned object instead to get called back each page item. You can also call `onCompleteFuture()` to get a future that completes when all items have been processed. Finally, you can call `.close()` on the returned object to stop auto-paginating early - - If you were referencing `getNextPage` or `getNextPageParams`: - - Swap to `nextPage()` and `nextPageParams()` - - Note that these both now return non-optional types (use `hasNextPage()` before calling these, since they will throw if it's impossible to get another page) - -### Features - -* **api:** Add reinforcement fine-tuning api support ([3a9fcbb](https://github.com/openai/openai-java/commit/3a9fcbb2d47a6b106d963a4243c255d55123ff9c)) -* **api:** further updates for evals API ([2b9d5bc](https://github.com/openai/openai-java/commit/2b9d5bc92d4e67cfc5b48343bd999ccbe87ca2e7)) -* **api:** manual updates ([005a643](https://github.com/openai/openai-java/commit/005a6439977311990dca20e75783657e90aa3898)) -* **api:** responses x eval api ([66327c5](https://github.com/openai/openai-java/commit/66327c540652f63147158fc9ae8ffdd5e75cbca4)) -* **api:** Updating Assistants and Evals API schemas ([02c6df6](https://github.com/openai/openai-java/commit/02c6df6457c3e03a8ae87d8b895a4838809947f3)) -* **client:** allow providing some params positionally ([1c6e875](https://github.com/openai/openai-java/commit/1c6e8759bf7e6b8a7e3b245c5a2365edf2388fca)) -* **client:** extract auto pagination to shared classes ([855d571](https://github.com/openai/openai-java/commit/855d571da1cc772b31493f6a36032934772c3757)) -* **client:** type safe structured outputs ([#463](https://github.com/openai/openai-java/issues/463)) ([e123fdd](https://github.com/openai/openai-java/commit/e123fdd3f75980b7edea84eaf6f6c101cb9a2ea2)) - - -### Bug Fixes - -* add missing `deploymentModel` params ([d9af1fb](https://github.com/openai/openai-java/commit/d9af1fbe5309ae7da0522895596573fc36162387)) -* **client:** properly support srt and vtt in audio transcriptions. ([#472](https://github.com/openai/openai-java/issues/472)) ([1e5bf3d](https://github.com/openai/openai-java/commit/1e5bf3d36cb100d1b1ad8ac328b99cc50d16e4da)) -* merge conflict ([bf7e961](https://github.com/openai/openai-java/commit/bf7e961819911f28f5ad0aaa03cda05ccfa5dbed)) -* missing validity ([301a38a](https://github.com/openai/openai-java/commit/301a38adfa5782238e407f9ea22dd9635baa4e4b)) - - -### Chores - -* **docs:** grammar improvements ([13b0fbc](https://github.com/openai/openai-java/commit/13b0fbc79ec365433ac33ccd7c5fef3e9b858fae)) -* **internal:** fix custom code ([567c86e](https://github.com/openai/openai-java/commit/567c86e958acf5898ee0be7547cfa0da34f07eb2)) - - -### Documentation - -* remove or fix invalid readme examples ([fa9f7fc](https://github.com/openai/openai-java/commit/fa9f7fc1e68b8754a50373c455cad45f59b9bda3)) - - -### Refactors - -* **client:** change precision of some numeric types ([291b0f4](https://github.com/openai/openai-java/commit/291b0f4ac12f61f31c40a80a46db2cffc9012a9a)) - -## 1.6.1 (2025-05-08) - -Full Changelog: [v1.6.0...v1.6.1](https://github.com/openai/openai-java/compare/v1.6.0...v1.6.1) - -### Chores - -* **internal:** remove flaky `-Xbackend-threads=0` option ([1aec858](https://github.com/openai/openai-java/commit/1aec858db61e87065fa5d3f7fba94f601f71b3ac)) - -## 1.6.0 (2025-05-02) - -Full Changelog: [v1.5.1...v1.6.0](https://github.com/openai/openai-java/compare/v1.5.1...v1.6.0) - -### Features - -* **api:** add image sizes, reasoning encryption ([a4a7d53](https://github.com/openai/openai-java/commit/a4a7d5390245ba11afe1cbd8665e0e39af3ca16f)) - - -### Chores - -* **internal:** update java toolchain ([eef415d](https://github.com/openai/openai-java/commit/eef415d067c9dd6ac6d4b8c825f4d068a6c4a63c)) - - -### Documentation - -* add `ImageGenerationExample` ([#457](https://github.com/openai/openai-java/issues/457)) ([286b7d5](https://github.com/openai/openai-java/commit/286b7d52d8cb917130579352a89afd5f8c839894)) - -## 1.5.1 (2025-04-27) - -Full Changelog: [v1.5.0...v1.5.1](https://github.com/openai/openai-java/compare/v1.5.0...v1.5.1) - -### Bug Fixes - -* **client:** add missing convenience methods ([616d69a](https://github.com/openai/openai-java/commit/616d69a27a914e30d6cb2c4fa96613bf64488742)) - - -### Chores - -* **ci:** only use depot for staging repos ([7835140](https://github.com/openai/openai-java/commit/78351404be50f6e535028a98d14d64257eeb2002)) -* **ci:** run on more branches and use depot runners ([8b7a805](https://github.com/openai/openai-java/commit/8b7a805083123a222ebc623e4c405d2f1ccf228b)) -* **internal:** java 17 -> 21 on ci ([9f690e4](https://github.com/openai/openai-java/commit/9f690e42c91642bcda690bd398803ba401958397)) -* **internal:** use `byteInputStream()` in tests ([616d69a](https://github.com/openai/openai-java/commit/616d69a27a914e30d6cb2c4fa96613bf64488742)) -* run formatter ([5e78fa5](https://github.com/openai/openai-java/commit/5e78fa544ddc7942795bf5055c2010f9b42b198e)) - - -### Documentation - -* add responses input file example ([#446](https://github.com/openai/openai-java/issues/446)) ([b94d404](https://github.com/openai/openai-java/commit/b94d4044ba764de789af3d19ac406ad8667c029d)) - -## 1.5.0 (2025-04-23) - -Full Changelog: [v1.4.1...v1.5.0](https://github.com/openai/openai-java/compare/v1.4.1...v1.5.0) - -### Features - -* **api:** adding new image model support ([545b900](https://github.com/openai/openai-java/commit/545b9004c09de82f1aa1ee12333d5fa7bb67ecd5)) - - -### Chores - -* **ci:** add timeout thresholds for CI jobs ([579da9b](https://github.com/openai/openai-java/commit/579da9b321ee3a6360c0c7aca39fb4ffbd12fc3b)) - -## 1.4.1 (2025-04-17) - -Full Changelog: [v1.4.0...v1.4.1](https://github.com/openai/openai-java/compare/v1.4.0...v1.4.1) - -### Bug Fixes - -* **internal:** release flow ([777a756](https://github.com/openai/openai-java/commit/777a7565f14d86c00611880ee143b522a9af2698)) -* **internal:** test compilation error ([544a4ce](https://github.com/openai/openai-java/commit/544a4cebb5b34a55354e06431dd4a966a5213aa2)) - -## 1.4.0 (2025-04-17) - -Full Changelog: [v1.3.1...v1.4.0](https://github.com/openai/openai-java/compare/v1.3.1...v1.4.0) - -### Features - -* **api:** add o3 and o4-mini model IDs ([069db4f](https://github.com/openai/openai-java/commit/069db4f94021cfc2f8d3a5a969453efae5f126a1)) - - -### Performance Improvements - -* **internal:** improve compilation+test speed ([ef38b5b](https://github.com/openai/openai-java/commit/ef38b5bfd278774e056d21a795845fb5c3a99f0a)) - - -### Documentation - -* explain http client customization ([da22f7d](https://github.com/openai/openai-java/commit/da22f7d3f717882c555fbb6626ec842fc953def4)) -* explain jackson compat in readme ([6bc1dbd](https://github.com/openai/openai-java/commit/6bc1dbd2d95d2fb235bb9506a766b9f083017bc2)) - -## 1.3.1 (2025-04-16) - -Full Changelog: [v1.3.0...v1.3.1](https://github.com/openai/openai-java/compare/v1.3.0...v1.3.1) - -### Documentation - -* **client:** update jackson compat error message ([e928c2d](https://github.com/openai/openai-java/commit/e928c2d9d607a40d363297e2b675a3ffc48a3cea)) -* update documentation links to be more uniform ([e9bb6bf](https://github.com/openai/openai-java/commit/e9bb6bf7b8f42e1bed10d6029d957b06a0c149e5)) - -## 1.3.0 (2025-04-14) - -Full Changelog: [v1.2.0...v1.3.0](https://github.com/openai/openai-java/compare/v1.2.0...v1.3.0) - -### Features - -* **api:** adding gpt-4.1 family of model IDs ([cdddc6a](https://github.com/openai/openai-java/commit/cdddc6a4b7447a75983cd4eede5759f2594a4a59)) - - -### Chores - -* **internal:** reduce CI branch coverage ([ac1f4e9](https://github.com/openai/openai-java/commit/ac1f4e909381ac8d93256b90417d119d062c87c4)) - -## 1.2.0 (2025-04-09) - -Full Changelog: [v1.1.1...v1.2.0](https://github.com/openai/openai-java/compare/v1.1.1...v1.2.0) - -### Features - -* **client:** make pagination robust to missing data ([cbccde5](https://github.com/openai/openai-java/commit/cbccde5bbbea40289a7143d40ce5e8c7ac7643ff)) - - -### Documentation - -* add comments for page methods ([cbccde5](https://github.com/openai/openai-java/commit/cbccde5bbbea40289a7143d40ce5e8c7ac7643ff)) - - -### Refactors - -* **client:** deduplicate page response classes ([#433](https://github.com/openai/openai-java/issues/433)) ([cbccde5](https://github.com/openai/openai-java/commit/cbccde5bbbea40289a7143d40ce5e8c7ac7643ff)) -* **client:** migrate pages to builder pattern ([#435](https://github.com/openai/openai-java/issues/435)) ([8cb8878](https://github.com/openai/openai-java/commit/8cb8878becd07e31844f981bafd147c630606c07)) - -## 1.1.1 (2025-04-09) - -Full Changelog: [v1.1.0...v1.1.1](https://github.com/openai/openai-java/compare/v1.1.0...v1.1.1) - -### Bug Fixes - -* **client:** bump to better jackson version ([#432](https://github.com/openai/openai-java/issues/432)) ([b4ec1d1](https://github.com/openai/openai-java/commit/b4ec1d17e9cace4971d330b945925a299a04aa38)) - - -### Chores - -* **internal:** expand CI branch coverage ([#429](https://github.com/openai/openai-java/issues/429)) ([7ecece7](https://github.com/openai/openai-java/commit/7ecece7d4cd6ed495ca4fd2daa1f7d726954695a)) - -## 1.1.0 (2025-04-09) - -Full Changelog: [v1.0.0...v1.1.0](https://github.com/openai/openai-java/compare/v1.0.0...v1.1.0) - -### Features - -* **client:** support setting base URL via env var ([#427](https://github.com/openai/openai-java/issues/427)) ([d462b34](https://github.com/openai/openai-java/commit/d462b3476e032ea02fa45c4afde19e1b62455224)) - -## 1.0.0 (2025-04-09) - -Full Changelog: [v0.45.0...v1.0.0](https://github.com/openai/openai-java/compare/v0.45.0...v1.0.0) - -### Chores - -* workaround build errors ([6c6faa0](https://github.com/openai/openai-java/commit/6c6faa0e8273f10ed9d85378f4cb9d2ef8fc360c)) - - -### Documentation - -* remove beta readme note ([829fb0a](https://github.com/openai/openai-java/commit/829fb0a8a307659e00defc3a6c39e72b7cf4dab7)) - -## 0.45.0 (2025-04-09) - -Full Changelog: [v0.44.5...v0.45.0](https://github.com/openai/openai-java/compare/v0.44.5...v0.45.0) - -### Features - -* **api:** Add evalapi to sdk ([b567998](https://github.com/openai/openai-java/commit/b56799843d71a81b8d99fae6fb04c0dff731afce)) - - -### Bug Fixes - -* **client:** trim '/' and empty character in base URL ([#424](https://github.com/openai/openai-java/issues/424)) ([37370df](https://github.com/openai/openai-java/commit/37370df673921c01a511dab2f87e0fe62107a151)) - - -### Chores - -* add missing `deploymentModel` ([acb132e](https://github.com/openai/openai-java/commit/acb132e45467fd74f5860c54d93a66ad8e1216a3)) -* **tests:** improve enum examples ([#416](https://github.com/openai/openai-java/issues/416)) ([a698758](https://github.com/openai/openai-java/commit/a69875817d67a60a612df14bf3ea06352e2fa265)) - -## 0.44.5 (2025-04-08) - -Full Changelog: [v0.44.4...v0.44.5](https://github.com/openai/openai-java/compare/v0.44.4...v0.44.5) - -### Bug Fixes - -* **client:** fix some bad identifiers ([#413](https://github.com/openai/openai-java/issues/413)) ([e567213](https://github.com/openai/openai-java/commit/e56721365c94ae68daf307f49eeb00e151f67c94)) - -## 0.44.4 (2025-04-07) - -Full Changelog: [v0.44.3...v0.44.4](https://github.com/openai/openai-java/compare/v0.44.3...v0.44.4) - -### Chores - -* **internal:** only run examples workflow in main repo ([#410](https://github.com/openai/openai-java/issues/410)) ([058008a](https://github.com/openai/openai-java/commit/058008a7901d476097bb93171c38924880024a25)) - -## 0.44.3 (2025-04-06) - -Full Changelog: [v0.44.2...v0.44.3](https://github.com/openai/openai-java/compare/v0.44.2...v0.44.3) - -### Bug Fixes - -* **client:** return `Optional<T>` instead of `Optional` ([#407](https://github.com/openai/openai-java/issues/407)) ([73eee4f](https://github.com/openai/openai-java/commit/73eee4fcf4859a48bb16c02dbcbc46adb9c691b1)) - - -### Chores - -* **internal:** add more `streamHandler` tests ([#404](https://github.com/openai/openai-java/issues/404)) ([a29b341](https://github.com/openai/openai-java/commit/a29b341b228c8cb28c9cfc18521a15697ee18649)) -* **internal:** swap from `getNullable` to `getOptional` ([#406](https://github.com/openai/openai-java/issues/406)) ([32b54f9](https://github.com/openai/openai-java/commit/32b54f95a356922fa0b3f1c5bddfefab19dde7a7)) - - -### Documentation - -* add comments to `JsonField` classes ([73eee4f](https://github.com/openai/openai-java/commit/73eee4fcf4859a48bb16c02dbcbc46adb9c691b1)) -* document how to forcibly omit required field ([a51c184](https://github.com/openai/openai-java/commit/a51c1840dd41682a4f9e7025058e0b6a1b8e7205)) -* swap examples used in readme ([#408](https://github.com/openai/openai-java/issues/408)) ([a51c184](https://github.com/openai/openai-java/commit/a51c1840dd41682a4f9e7025058e0b6a1b8e7205)) - -## 0.44.2 (2025-04-04) - -Full Changelog: [v0.44.1...v0.44.2](https://github.com/openai/openai-java/compare/v0.44.1...v0.44.2) - -### Bug Fixes - -* **client:** support responses API for Azure ([#387](https://github.com/openai/openai-java/issues/387)) ([f7f09aa](https://github.com/openai/openai-java/commit/f7f09aa1a3dd77f5565083ece85f8056b53e2e54)) - -## 0.44.1 (2025-04-04) - -Full Changelog: [v0.44.0...v0.44.1](https://github.com/openai/openai-java/compare/v0.44.0...v0.44.1) - -### Bug Fixes - -* **client:** accumulation of tool call functions ([#382](https://github.com/openai/openai-java/issues/382)) ([#399](https://github.com/openai/openai-java/issues/399)) ([943e6fb](https://github.com/openai/openai-java/commit/943e6fbd65a5f318ebbb7895bdd8c68f6d8babe4)) - -## 0.44.0 (2025-04-04) - -Full Changelog: [v0.43.0...v0.44.0](https://github.com/openai/openai-java/compare/v0.43.0...v0.44.0) - -### Features - -* **api:** manual updates ([331ec66](https://github.com/openai/openai-java/commit/331ec66baf6add46ec79ba56842f31065dffff33)) - - -### Bug Fixes - -* **client:** translate streaming `IOException` into custom exception ([#397](https://github.com/openai/openai-java/issues/397)) ([bc5c577](https://github.com/openai/openai-java/commit/bc5c57721fd7115800d7a9fd2e38631e695caa25)) - - -### Performance Improvements - -* **client:** cached parsed type in `HttpResponseFor` ([#395](https://github.com/openai/openai-java/issues/395)) ([259b75a](https://github.com/openai/openai-java/commit/259b75a9e3a3f6de2e123b171bd739facdecd819)) - -## 0.43.0 (2025-04-02) - -Full Changelog: [v0.42.0...v0.43.0](https://github.com/openai/openai-java/compare/v0.42.0...v0.43.0) - -### Features - -* **api:** manual updates ([9679525](https://github.com/openai/openai-java/commit/967952553d5fd2e7f47cd7c82fac45cc9dcef43e)) -* **client:** expose request body setter and getter ([#392](https://github.com/openai/openai-java/issues/392)) ([eaa0bc9](https://github.com/openai/openai-java/commit/eaa0bc96ba8898e064709a571e97d6b99f478597)) - - -### Chores - -* **internal:** codegen related update ([#389](https://github.com/openai/openai-java/issues/389)) ([b0e9d31](https://github.com/openai/openai-java/commit/b0e9d316bde7866f0d6c9381a5bec5a6667f46f6)) - -## 0.42.0 (2025-04-02) - -Full Changelog: [v0.41.1...v0.42.0](https://github.com/openai/openai-java/compare/v0.41.1...v0.42.0) - -### Features - -* **api:** manual updates ([0440105](https://github.com/openai/openai-java/commit/0440105162ce52cd187ce8ab8d5d1dc20682a4ed)) -* **client:** add enum validation method ([a641218](https://github.com/openai/openai-java/commit/a6412183ccea1ac3e9105793372693d5ec8c6d72)) -* **client:** make union deserialization more robust ([#385](https://github.com/openai/openai-java/issues/385)) ([a641218](https://github.com/openai/openai-java/commit/a6412183ccea1ac3e9105793372693d5ec8c6d72)) - - -### Chores - -* **client:** remove unnecessary json state from some query param classes ([a641218](https://github.com/openai/openai-java/commit/a6412183ccea1ac3e9105793372693d5ec8c6d72)) -* **internal:** add invalid json deserialization tests ([a641218](https://github.com/openai/openai-java/commit/a6412183ccea1ac3e9105793372693d5ec8c6d72)) -* **internal:** add json roundtripping tests ([a641218](https://github.com/openai/openai-java/commit/a6412183ccea1ac3e9105793372693d5ec8c6d72)) - -## 0.41.1 (2025-04-01) - -Full Changelog: [v0.41.0...v0.41.1](https://github.com/openai/openai-java/compare/v0.41.0...v0.41.1) - -### Chores - -* Remove deprecated/unused remote spec feature ([4d3b56e](https://github.com/openai/openai-java/commit/4d3b56eb9f0e9f180c1304b66c3b8fe2e999e75f)) - -## 0.41.0 (2025-03-31) - -Full Changelog: [v0.40.1...v0.41.0](https://github.com/openai/openai-java/compare/v0.40.1...v0.41.0) - -### Features - -* **client:** improve some method names ([#379](https://github.com/openai/openai-java/issues/379)) ([895f99a](https://github.com/openai/openai-java/commit/895f99acaee6f8e38165c72da1de18e3d7682321)) - - -### Bug Fixes - -* **client:** limit json deserialization coercion ([#377](https://github.com/openai/openai-java/issues/377)) ([5234cf9](https://github.com/openai/openai-java/commit/5234cf94a540191ae051e3123b7d1be088655100)) - -## 0.40.1 (2025-03-28) - -Full Changelog: [v0.40.0...v0.40.1](https://github.com/openai/openai-java/compare/v0.40.0...v0.40.1) - -### Bug Fixes - -* **client:** don't call `validate()` during deserialization if we don't have to ([#372](https://github.com/openai/openai-java/issues/372)) ([1dae9bf](https://github.com/openai/openai-java/commit/1dae9bfe33d1cdd78bf47d47c62c1db0c4e5ca53)) - - -### Documentation - -* add comment on response header methods ([#374](https://github.com/openai/openai-java/issues/374)) ([80bba20](https://github.com/openai/openai-java/commit/80bba200247fa7620cbd63a44f452c2ad3d83a87)) -* document request IDs ([3e2fec3](https://github.com/openai/openai-java/commit/3e2fec36597a15ab56960f4f40096dc779013cca)) - -## 0.40.0 (2025-03-27) - -Full Changelog: [v0.39.0...v0.40.0](https://github.com/openai/openai-java/compare/v0.39.0...v0.40.0) - -### Features - -* **api:** add `get /responses/{response_id}/input_items` endpoint ([#367](https://github.com/openai/openai-java/issues/367)) ([c569175](https://github.com/openai/openai-java/commit/c569175e0427273707d0bee2535da0bf616e9b7c)) -* **client:** add new responses endpoint ([#369](https://github.com/openai/openai-java/issues/369)) ([f15b5ee](https://github.com/openai/openai-java/commit/f15b5eeb2bab3534daa41b56c2f7b05cd5791c97)) - - -### Bug Fixes - -* deploymentModel arg ([139c062](https://github.com/openai/openai-java/commit/139c06287a82a80a06968b0b8826d9c2c5116dde)) - -## 0.39.0 (2025-03-27) - -Full Changelog: [v0.38.0...v0.39.0](https://github.com/openai/openai-java/compare/v0.38.0...v0.39.0) - -### Features - -* **api:** add `get /chat/completions` endpoint ([#364](https://github.com/openai/openai-java/issues/364)) ([8591689](https://github.com/openai/openai-java/commit/85916892043caeb1cca862d18820aaaae0788514)) - - -### Bug Fixes - -* add missing `deploymentModel` ([40c568f](https://github.com/openai/openai-java/commit/40c568f3113553c91ab85d911b5340aa28e41a91)) - -## 0.38.0 (2025-03-27) - -Full Changelog: [v0.37.0...v0.38.0](https://github.com/openai/openai-java/compare/v0.37.0...v0.38.0) - -### Features - -* **client:** add chat completion streaming helper ([#354](https://github.com/openai/openai-java/issues/354)) ([561c085](https://github.com/openai/openai-java/commit/561c0853b8a06814dba873e942629dff050b325d)) - - -### Bug Fixes - -* **client:** map deserialization bug ([caa79a2](https://github.com/openai/openai-java/commit/caa79a267a79845eee3a49b22bcbe66849d9cf4e)) - - -### Chores - -* add hash of OpenAPI spec/config inputs to .stats.yml ([d27646c](https://github.com/openai/openai-java/commit/d27646c179082f6bcba9b5df6b333134968adc95)) -* **api:** updates to supported Voice IDs ([#361](https://github.com/openai/openai-java/issues/361)) ([fd0d45a](https://github.com/openai/openai-java/commit/fd0d45a6f74e6571f1553231a69621db5720580f)) -* **internal:** delete unused methods and annotations ([#362](https://github.com/openai/openai-java/issues/362)) ([caa79a2](https://github.com/openai/openai-java/commit/caa79a267a79845eee3a49b22bcbe66849d9cf4e)) - -## 0.37.0 (2025-03-25) - -Full Changelog: [v0.36.0...v0.37.0](https://github.com/openai/openai-java/compare/v0.36.0...v0.37.0) - -### Features - -* **client:** support a lower jackson version ([#357](https://github.com/openai/openai-java/issues/357)) ([13a3c67](https://github.com/openai/openai-java/commit/13a3c672ef093f4a0e9110ce716086f4a3ea4329)) -* **client:** throw on incompatible jackson version ([13a3c67](https://github.com/openai/openai-java/commit/13a3c672ef093f4a0e9110ce716086f4a3ea4329)) - - -### Chores - -* **internal:** fix example formatting ([#348](https://github.com/openai/openai-java/issues/348)) ([44a7df9](https://github.com/openai/openai-java/commit/44a7df9af13ab14947fd50b37a7d26b1d9c5d0df)) -* **internal:** remove unnecessary import ([#349](https://github.com/openai/openai-java/issues/349)) ([661a906](https://github.com/openai/openai-java/commit/661a9060183a645b9ec7f9687fa0786adb224283)) - - -### Documentation - -* minor readme tweak ([#351](https://github.com/openai/openai-java/issues/351)) ([28a1116](https://github.com/openai/openai-java/commit/28a111615345011335e73f2894f1f54672493cdf)) -* responses image url example ([d84abd4](https://github.com/openai/openai-java/commit/d84abd426d220b1c248bc31cf9f47dfeb9e25509)) -* update readme exception docs ([#350](https://github.com/openai/openai-java/issues/350)) ([b441223](https://github.com/openai/openai-java/commit/b441223dc8c26d7fc023614f6b15610b8f7af35d)) - -## 0.36.0 (2025-03-21) - -Full Changelog: [v0.35.1...v0.36.0](https://github.com/openai/openai-java/compare/v0.35.1...v0.36.0) - -### ⚠ BREAKING CHANGES - -* **client:** refactor exception structure and methods ([#336](https://github.com/openai/openai-java/issues/336)) - -### Features - -* **api:** new models for TTS, STT, + new audio features for Realtime ([#340](https://github.com/openai/openai-java/issues/340)) ([630d63c](https://github.com/openai/openai-java/commit/630d63c5751dee259e2263e57deed3780e363234)) -* **api:** o1-pro now available through the API ([#337](https://github.com/openai/openai-java/issues/337)) ([93a7949](https://github.com/openai/openai-java/commit/93a79492bb960cbf0691a4139cf9acadafb8a7a2)) - - -### Bug Fixes - -* add missing deployment models ([0f5c072](https://github.com/openai/openai-java/commit/0f5c0727d9507c2103cd3c0fcfffd1032219448a)) -* **client:** compilation error in adding streaming discriminator ([#342](https://github.com/openai/openai-java/issues/342)) ([f26276e](https://github.com/openai/openai-java/commit/f26276eb97cf36dad03c6782ad8f1bb5f5434384)) -* **client:** remove duplicate types ([#341](https://github.com/openai/openai-java/issues/341)) ([e6b3e76](https://github.com/openai/openai-java/commit/e6b3e766b5e10117adae557e162b9daa3cf0a50f)) - - -### Chores - -* **client:** refactor exception structure and methods ([#336](https://github.com/openai/openai-java/issues/336)) ([552fcf2](https://github.com/openai/openai-java/commit/552fcf26b56912c6322319de0673d13c2885ae4d)) -* **internal:** add missing release please block ([#335](https://github.com/openai/openai-java/issues/335)) ([3312a39](https://github.com/openai/openai-java/commit/3312a3945e4c34b4073b7c5a0735a61baf22f8af)) -* **internal:** make multipart assertions more robust ([badd931](https://github.com/openai/openai-java/commit/badd931f4b959905ca81c816cf91e030c56ea842)) -* **internal:** remove unnecessary `assertNotNull` calls ([badd931](https://github.com/openai/openai-java/commit/badd931f4b959905ca81c816cf91e030c56ea842)) -* **internal:** version bump ([#333](https://github.com/openai/openai-java/issues/333)) ([7f09373](https://github.com/openai/openai-java/commit/7f0937367f01b10ee0eaa18e66c238b484b80608)) - - -### Documentation - -* refine comments on multipart params ([#343](https://github.com/openai/openai-java/issues/343)) ([badd931](https://github.com/openai/openai-java/commit/badd931f4b959905ca81c816cf91e030c56ea842)) - -## 0.35.1 (2025-03-18) - -Full Changelog: [v0.35.0...v0.35.1](https://github.com/openai/openai-java/compare/v0.35.0...v0.35.1) - -### Bug Fixes - -* **api:** correct some Responses types ([#328](https://github.com/openai/openai-java/issues/328)) ([efc79c0](https://github.com/openai/openai-java/commit/efc79c002003f3beaf74c2c3d13aada6235481e2)) -* **client:** support kotlin 1.8 runtime ([#330](https://github.com/openai/openai-java/issues/330)) ([5179a4e](https://github.com/openai/openai-java/commit/5179a4e4ea67797477cfdb9141e6d39eab9abd6a)) -* **types:** improve responses type names ([#332](https://github.com/openai/openai-java/issues/332)) ([517c500](https://github.com/openai/openai-java/commit/517c500d74e7d8c0f340b2607a574d8096390877)) - - -### Chores - -* **internal:** add back release workflow ([7893465](https://github.com/openai/openai-java/commit/7893465dbd929e290a2e46dfc877c3ef8a889056)) -* **internal:** codegen related update ([#327](https://github.com/openai/openai-java/issues/327)) ([7030355](https://github.com/openai/openai-java/commit/7030355dc8e511647e7a6221143ca94426ac24bf)) -* **internal:** refactor enum query param serialization ([#331](https://github.com/openai/openai-java/issues/331)) ([c5ef44d](https://github.com/openai/openai-java/commit/c5ef44dbf1c894f63bf213db391d09f5a800f825)) - - -### Documentation - -* responses conversation example ([fde5110](https://github.com/openai/openai-java/commit/fde5110a014a73e6e5e98fdb49e82506f04c4463)) -* show function calling conversation ([#227](https://github.com/openai/openai-java/issues/227)) ([ff7905a](https://github.com/openai/openai-java/commit/ff7905a22b217b370452e7a978b9153ae7487ebd)) - -## 0.35.0 (2025-03-18) - -Full Changelog: [v0.34.1...v0.35.0](https://github.com/openai/openai-java/compare/v0.34.1...v0.35.0) - -### Features - -* **client:** don't require params for some service methods ([#325](https://github.com/openai/openai-java/issues/325)) ([3ed7cf8](https://github.com/openai/openai-java/commit/3ed7cf88c11b95003b5962f94f848af3511f0525)) - - -### Chores - -* **internal:** add generated comment ([#318](https://github.com/openai/openai-java/issues/318)) ([44a46b5](https://github.com/openai/openai-java/commit/44a46b5e6651a3cf38f4b5321020a9fa52c5976c)) -* **internal:** add some tests for union classes ([#326](https://github.com/openai/openai-java/issues/326)) ([bd92f57](https://github.com/openai/openai-java/commit/bd92f577231430115d4976a3f4740ef8f09baa07)) -* **internal:** delete duplicate tests ([f95f8bc](https://github.com/openai/openai-java/commit/f95f8bc083cebbfeef127b62d8c5dbaffa2083ed)) -* **internal:** generate more tests ([a05b899](https://github.com/openai/openai-java/commit/a05b899d056538f47a238cac0e6357ce2688861a)) -* **internal:** make test classes internal ([#317](https://github.com/openai/openai-java/issues/317)) ([f9a25b4](https://github.com/openai/openai-java/commit/f9a25b4be4daa5184b9d19896f4e2009285759be)) -* **internal:** refactor query param serialization impl and tests ([#322](https://github.com/openai/openai-java/issues/322)) ([93558fc](https://github.com/openai/openai-java/commit/93558fcecc463b7d6a4f976c2a7889b1c691dc52)) -* **internal:** refactor some test assertions ([f95f8bc](https://github.com/openai/openai-java/commit/f95f8bc083cebbfeef127b62d8c5dbaffa2083ed)) -* **internal:** reformat some tests ([#324](https://github.com/openai/openai-java/issues/324)) ([a05b899](https://github.com/openai/openai-java/commit/a05b899d056538f47a238cac0e6357ce2688861a)) -* **internal:** remove CI condition ([#310](https://github.com/openai/openai-java/issues/310)) ([1cb3294](https://github.com/openai/openai-java/commit/1cb3294f74fa75bca443aaa6f0f3d9127ed7ea14)) -* **internal:** rename `getPathParam` ([#323](https://github.com/openai/openai-java/issues/323)) ([f95f8bc](https://github.com/openai/openai-java/commit/f95f8bc083cebbfeef127b62d8c5dbaffa2083ed)) -* **internal:** reorder some params methodsc ([f95f8bc](https://github.com/openai/openai-java/commit/f95f8bc083cebbfeef127b62d8c5dbaffa2083ed)) -* **internal:** update release workflows ([2b0d392](https://github.com/openai/openai-java/commit/2b0d392b57acc03b393c1052e39326606d9ad2b0)) - - -### Documentation - -* add `build` method comments ([#321](https://github.com/openai/openai-java/issues/321)) ([31a8e9e](https://github.com/openai/openai-java/commit/31a8e9e507d0242098fc280ad03cb40ab92dcf83)) -* deduplicate and refine comments ([#313](https://github.com/openai/openai-java/issues/313)) ([3e0b2f5](https://github.com/openai/openai-java/commit/3e0b2f5ebea908879f2215bb648027d60e491374)) -* image url example ([39695e4](https://github.com/openai/openai-java/commit/39695e4702c10171e02fb426bc66db61599c365a)) - -## 0.34.1 (2025-03-11) - -Full Changelog: [v0.34.0...v0.34.1](https://github.com/openai/openai-java/compare/v0.34.0...v0.34.1) - -### Bug Fixes - -* **responses:** correct computer use enum value ([#298](https://github.com/openai/openai-java/issues/298)) ([5ad3f2a](https://github.com/openai/openai-java/commit/5ad3f2a947bd67ce9260b0f25afa4c675d91ebdd)) -* **responses:** correct reasoning output type ([#300](https://github.com/openai/openai-java/issues/300)) ([77572c6](https://github.com/openai/openai-java/commit/77572c64b8712ea61f789fd42fb51a535a1512d0)) - -## 0.34.0 (2025-03-11) - -Full Changelog: [v0.33.0...v0.34.0](https://github.com/openai/openai-java/compare/v0.33.0...v0.34.0) - -### ⚠ BREAKING CHANGES - -* **client:** move classes into subpackages and shorten names ([#294](https://github.com/openai/openai-java/issues/294)) - -### Features - -* **api:** add /v1/responses and built-in tools ([#296](https://github.com/openai/openai-java/issues/296)) ([3216ffa](https://github.com/openai/openai-java/commit/3216ffa635b2d5ee337a9e62abef88f3faf3735e)) - - -### Chores - -* add `deploymentModel` to new endpoints ([2d98165](https://github.com/openai/openai-java/commit/2d981657dca3782cd03f2b19118ec01835dd6490)) -* **client:** move classes into subpackages and shorten names ([#294](https://github.com/openai/openai-java/issues/294)) ([1a65445](https://github.com/openai/openai-java/commit/1a65445fbed70d1f1cde1d5e6e9db299fff3dbb3)) -* **internal:** add `.kotlin` to `.gitignore` ([#285](https://github.com/openai/openai-java/issues/285)) ([46c9b3a](https://github.com/openai/openai-java/commit/46c9b3af9d2593b679fa359df4123516a36f5c25)) -* **internal:** don't use `JvmOverloads` in interfaces ([9b04bb9](https://github.com/openai/openai-java/commit/9b04bb90bdacc38e926560e72244a677ced99991)) -* **internal:** reenable warnings as errors ([#288](https://github.com/openai/openai-java/issues/288)) ([9b04bb9](https://github.com/openai/openai-java/commit/9b04bb90bdacc38e926560e72244a677ced99991)) -* **internal:** use `getOrNull` instead of `orElse(null)` ([#287](https://github.com/openai/openai-java/issues/287)) ([8eeec84](https://github.com/openai/openai-java/commit/8eeec8405630759ffd7c02b30d4dd78b0d7df4d7)) - - -### Documentation - -* document `JsonValue` construction in readme ([#292](https://github.com/openai/openai-java/issues/292)) ([4453173](https://github.com/openai/openai-java/commit/4453173cf4916bd880be12b20bfbba23cd2370d2)) -* fix examples ([0dfd4b1](https://github.com/openai/openai-java/commit/0dfd4b17e36ab12c9b37cc0a2f45170a89cea8ea)) -* make URL purpose clearer in readme ([#289](https://github.com/openai/openai-java/issues/289)) ([88df036](https://github.com/openai/openai-java/commit/88df03664adae72f9d1fb9318a11ce73aa2c7b1e)) -* responses examples ([589ea32](https://github.com/openai/openai-java/commit/589ea32fcdd3b1effcf3860d005987415eaab48e)) -* revise readme docs about nested params ([#291](https://github.com/openai/openai-java/issues/291)) ([d3df21f](https://github.com/openai/openai-java/commit/d3df21f3f9dac58e896817c9619ab0c6e83419b7)) - -## 0.33.0 (2025-03-06) - -Full Changelog: [v0.32.0...v0.33.0](https://github.com/openai/openai-java/compare/v0.32.0...v0.33.0) - -### Features - -* **client:** detect binary incompatible jackson versions ([#282](https://github.com/openai/openai-java/issues/282)) ([10eca3f](https://github.com/openai/openai-java/commit/10eca3f728726b0022d7f851a3784548764ede6c)) - - -### Chores - -* **ci:** run more examples ([4815776](https://github.com/openai/openai-java/commit/48157762da46b6bca6169a79adbfd7c07a701496)) - -## 0.32.0 (2025-03-06) - -Full Changelog: [v0.31.1...v0.32.0](https://github.com/openai/openai-java/compare/v0.31.1...v0.32.0) - -### Features - -* **client:** accept `InputStream` and `Path` for file params ([3fda365](https://github.com/openai/openai-java/commit/3fda365a9d1b228ec4799a57137a288c25441dc7)) -* **client:** accept `InputStream` and `Path` for file params ([#277](https://github.com/openai/openai-java/issues/277)) ([04f2d3c](https://github.com/openai/openai-java/commit/04f2d3c1042187fe2b52ec132ff3a0529f5b1316)) - - -### Documentation - -* document file uploads in readme ([#279](https://github.com/openai/openai-java/issues/279)) ([96e4969](https://github.com/openai/openai-java/commit/96e4969a322da35f6ac13324f69d9170c7280aff)) - -## 0.31.1 (2025-03-05) - -Full Changelog: [v0.31.0...v0.31.1](https://github.com/openai/openai-java/compare/v0.31.0...v0.31.1) - -### Bug Fixes - -* **api:** add missing file rank enum + more metadata ([#276](https://github.com/openai/openai-java/issues/276)) ([e92512f](https://github.com/openai/openai-java/commit/e92512f551df43f994ec6a29cfb7ef918e203324)) - - -### Chores - -* **client:** expose `Optional`, not nullable, from `ClientOptions` ([#274](https://github.com/openai/openai-java/issues/274)) ([c029310](https://github.com/openai/openai-java/commit/c029310f6f31d5a78767585a9f4ece4ba076fe2e)) - - -### Documentation - -* add audio transcription example ([2c6a1aa](https://github.com/openai/openai-java/commit/2c6a1aa334dec5625a771ddd40452a7ffe32439b)) -* embeddings example ([#263](https://github.com/openai/openai-java/issues/263)) ([e1b68de](https://github.com/openai/openai-java/commit/e1b68de090359c4272435b2236fd021d616331a2)) -* note required fields in `builder` javadoc ([#272](https://github.com/openai/openai-java/issues/272)) ([603b5c9](https://github.com/openai/openai-java/commit/603b5c955ad383fa3ec358c91ce034cbbf7d1446)) - -## 0.31.0 (2025-03-04) - -Full Changelog: [v0.30.0...v0.31.0](https://github.com/openai/openai-java/compare/v0.30.0...v0.31.0) - -### Features - -* **client:** add file upload endpoints ([#268](https://github.com/openai/openai-java/issues/268)) ([456274d](https://github.com/openai/openai-java/commit/456274d2dc572ad4711d2fc3640c7e01aa08f4b8)) -* **client:** allow configuring timeouts granularly ([#266](https://github.com/openai/openai-java/issues/266)) ([c3bc6e4](https://github.com/openai/openai-java/commit/c3bc6e4fb9717c7f6146f864ce3cc2451619c9f0)) - - -### Chores - -* **internal:** refactor `ErrorHandlingTest` ([#264](https://github.com/openai/openai-java/issues/264)) ([2472f85](https://github.com/openai/openai-java/commit/2472f859b49f49cf14539e787cf15e8f863f5dac)) -* **internal:** run example files in CI ([#271](https://github.com/openai/openai-java/issues/271)) ([8da7851](https://github.com/openai/openai-java/commit/8da785184c3e039ea4b9d2b26c6d14b607291750)) - - -### Documentation - -* add raw response readme documentation ([#269](https://github.com/openai/openai-java/issues/269)) ([2839903](https://github.com/openai/openai-java/commit/28399031c60eed8899475c5d1d38677c2eaa2284)) -* update URLs from stainlessapi.com to stainless.com ([#259](https://github.com/openai/openai-java/issues/259)) ([b824bf3](https://github.com/openai/openai-java/commit/b824bf39a44251e15c7c8b5b14bc6cbf9133dff5)) - -## 0.30.0 (2025-02-27) - -Full Changelog: [v0.29.0...v0.30.0](https://github.com/openai/openai-java/compare/v0.29.0...v0.30.0) - -### Features - -* **api:** add gpt-4.5-preview ([#258](https://github.com/openai/openai-java/issues/258)) ([27d1e7f](https://github.com/openai/openai-java/commit/27d1e7f6565ab00161d322bf04a8cb1e70c31694)) - - -### Chores - -* **client:** use deep identity methods for primitive array types ([#255](https://github.com/openai/openai-java/issues/255)) ([fac8678](https://github.com/openai/openai-java/commit/fac86783373355488b81a7a1452bc8ba2a74066f)) -* **internal:** add async service tests ([#253](https://github.com/openai/openai-java/issues/253)) ([147872a](https://github.com/openai/openai-java/commit/147872a570403c78059fb785d9860003a5187583)) -* **internal:** improve sync service tests ([147872a](https://github.com/openai/openai-java/commit/147872a570403c78059fb785d9860003a5187583)) -* **internal:** refactor `ServiceParamsTest` ([#257](https://github.com/openai/openai-java/issues/257)) ([9cb1929](https://github.com/openai/openai-java/commit/9cb19297c372976fa331d5945c028017392b2d5d)) - - -### Documentation - -* readme parameter tweaks ([147872a](https://github.com/openai/openai-java/commit/147872a570403c78059fb785d9860003a5187583)) - -## 0.29.0 (2025-02-26) - -Full Changelog: [v0.28.0...v0.29.0](https://github.com/openai/openai-java/compare/v0.28.0...v0.29.0) - -### Features - -* **client:** allow omitting params object when none required ([#249](https://github.com/openai/openai-java/issues/249)) ([e77a6c3](https://github.com/openai/openai-java/commit/e77a6c35a1940bd6f1ef37f08a524974b28f17ac)) - - -### Bug Fixes - -* **client:** add missing `@JvmStatic` ([#252](https://github.com/openai/openai-java/issues/252)) ([06231c2](https://github.com/openai/openai-java/commit/06231c26727f09fd2065f2ebe9670b8149fcee84)) - - -### Chores - -* **internal:** remove unused variable ([#251](https://github.com/openai/openai-java/issues/251)) ([b41bc4e](https://github.com/openai/openai-java/commit/b41bc4ebbe38a216e1276e0b15fd3fe54fe37353)) - - -### Documentation - -* switch to `.list()` without arguments in examples ([d1480f1](https://github.com/openai/openai-java/commit/d1480f1c85c0e2704c2095298525401b76cec2e5)) - -## 0.28.0 (2025-02-24) - -Full Changelog: [v0.27.0...v0.28.0](https://github.com/openai/openai-java/compare/v0.27.0...v0.28.0) - -### Features - -* **api:** add latest stable/preview version helper methods ([#226](https://github.com/openai/openai-java/issues/226)) ([9766b7c](https://github.com/openai/openai-java/commit/9766b7c93928c9837fa13cbab5969a883ccec22a)) - - -### Documentation - -* add source file links to readme ([#247](https://github.com/openai/openai-java/issues/247)) ([d9b67d7](https://github.com/openai/openai-java/commit/d9b67d7ef7552112774039acf951a582c3eeefea)) - -## 0.27.0 (2025-02-24) - -Full Changelog: [v0.26.1...v0.27.0](https://github.com/openai/openai-java/compare/v0.26.1...v0.27.0) - -### Features - -* docs: moderations example ([#245](https://github.com/openai/openai-java/issues/245)) ([3108fee](https://github.com/openai/openai-java/commit/3108feeb0fd17cce70d77fb3c6e858ea53f465e6)) - -## 0.26.1 (2025-02-21) - -Full Changelog: [v0.26.0...v0.26.1](https://github.com/openai/openai-java/compare/v0.26.0...v0.26.1) - -### Documentation - -* add immutability explanation to readme ([#243](https://github.com/openai/openai-java/issues/243)) ([5826fb0](https://github.com/openai/openai-java/commit/5826fb0fafa06c647a520f82847319a32ddcbbbb)) - -## 0.26.0 (2025-02-20) - -Full Changelog: [v0.25.0...v0.26.0](https://github.com/openai/openai-java/compare/v0.25.0...v0.26.0) - -### Features - -* **client:** add an `AsyncStreamResponse#onCompleteFuture()` method ([#239](https://github.com/openai/openai-java/issues/239)) ([9aeddf8](https://github.com/openai/openai-java/commit/9aeddf88f724c3f6dbb648f539d4daaa82f3fa8f)) - - -### Bug Fixes - -* **client:** mark some request bodies as optional ([#242](https://github.com/openai/openai-java/issues/242)) ([e3c5d67](https://github.com/openai/openai-java/commit/e3c5d679a1be7f5857ad321eb23fc566759e3083)) -* **client:** prevent `IOException` when closing stream early ([#241](https://github.com/openai/openai-java/issues/241)) ([1e174e3](https://github.com/openai/openai-java/commit/1e174e3e255f679ec4785c1fe0a2b5794e99c802)) - - -### Chores - -* **docs:** add faq to readme ([#240](https://github.com/openai/openai-java/issues/240)) ([6bb4122](https://github.com/openai/openai-java/commit/6bb4122014424d9efaf1b0b7628495bf17ec22e6)) -* **internal:** remove unnecessary non-null asserts in tests ([e3c5d67](https://github.com/openai/openai-java/commit/e3c5d679a1be7f5857ad321eb23fc566759e3083)) -* **internal:** use `assertNotNull` in tests for type narrowing ([e3c5d67](https://github.com/openai/openai-java/commit/e3c5d679a1be7f5857ad321eb23fc566759e3083)) - - -### Documentation - -* add more documentation to `AsyncStreamResponse` ([9aeddf8](https://github.com/openai/openai-java/commit/9aeddf88f724c3f6dbb648f539d4daaa82f3fa8f)) -* add stream cancellation example ([ddeabe0](https://github.com/openai/openai-java/commit/ddeabe054d02ade542a2555f45b819b090ce1a08)) -* remove unnecessary catch clauses in readme ([#238](https://github.com/openai/openai-java/issues/238)) ([8c86b99](https://github.com/openai/openai-java/commit/8c86b997c5a84d74a71df7f7c5c4a863718f779a)) -* remove unnecessary checked exception signatures ([e26ee05](https://github.com/openai/openai-java/commit/e26ee0569c6cb7289d35b920695b12e9826d8f93)) -* use `onCompleteFuture()` in examples ([c244f17](https://github.com/openai/openai-java/commit/c244f17207f48414437d0558255a91af40f9a647)) - -## 0.25.0 (2025-02-20) - -Full Changelog: [v0.24.1...v0.25.0](https://github.com/openai/openai-java/compare/v0.24.1...v0.25.0) - -### Features - -* **client:** get rid of annoying checked exceptions ([#236](https://github.com/openai/openai-java/issues/236)) ([4c60942](https://github.com/openai/openai-java/commit/4c6094218ed32bc8fc669703e2f1d94b318c7307)) - - -### Chores - -* **ci:** update gradle actions to v4 ([#234](https://github.com/openai/openai-java/issues/234)) ([fbcf865](https://github.com/openai/openai-java/commit/fbcf865056c37a022fd905147e1763b96d2ec26a)) - -## 0.24.1 (2025-02-20) - -Full Changelog: [v0.24.0...v0.24.1](https://github.com/openai/openai-java/compare/v0.24.0...v0.24.1) - -### Bug Fixes - -* **client:** add missing `streamHandlerExecutor` method ([#230](https://github.com/openai/openai-java/issues/230)) ([d53a08a](https://github.com/openai/openai-java/commit/d53a08a02d256b702b53734e99d25c7394a8f5db)) - - -### Chores - -* **docs:** add binary responses info to readme ([#231](https://github.com/openai/openai-java/issues/231)) ([6ae25b4](https://github.com/openai/openai-java/commit/6ae25b4c6e7ee2186b905fb68ee05cb5ad470174)) -* **docs:** add streaming info to readme ([d53a08a](https://github.com/openai/openai-java/commit/d53a08a02d256b702b53734e99d25c7394a8f5db)) -* **docs:** reorganize readme ([#228](https://github.com/openai/openai-java/issues/228)) ([7d92206](https://github.com/openai/openai-java/commit/7d92206374def33c43591e59f33ecc558e4ecf2f)) -* **internal:** get rid of configuration cache ([#233](https://github.com/openai/openai-java/issues/233)) ([d95c380](https://github.com/openai/openai-java/commit/d95c380af1cb3cdb1a94fbd2c65bfaf4d0bf5805)) - -## 0.24.0 (2025-02-18) - -Full Changelog: [v0.23.1...v0.24.0](https://github.com/openai/openai-java/compare/v0.23.1...v0.24.0) - -### Features - -* **client:** support `JsonField#asX()` for known values ([#225](https://github.com/openai/openai-java/issues/225)) ([31c0663](https://github.com/openai/openai-java/commit/31c06634ead5ffcd54e0a9208e39ac9880df6574)) -* **client:** update enum `asX` methods ([#224](https://github.com/openai/openai-java/issues/224)) ([b06a749](https://github.com/openai/openai-java/commit/b06a7496f016b3e7541d9f4e5082ada4a1a5b39d)) - - -### Chores - -* **internal:** make body class constructors private ([7c6739c](https://github.com/openai/openai-java/commit/7c6739c254ef5a06020fbdbfb6b1d470377e34fc)) -* **internal:** make body classes for multipart requests ([7c6739c](https://github.com/openai/openai-java/commit/7c6739c254ef5a06020fbdbfb6b1d470377e34fc)) -* **internal:** misc formatting changes ([7c6739c](https://github.com/openai/openai-java/commit/7c6739c254ef5a06020fbdbfb6b1d470377e34fc)) -* **internal:** optimize build and test perf ([fc6bcd7](https://github.com/openai/openai-java/commit/fc6bcd742b042e9e8338cc7c8bceb6b1e3be6b38)) -* **internal:** rename internal body classes ([7c6739c](https://github.com/openai/openai-java/commit/7c6739c254ef5a06020fbdbfb6b1d470377e34fc)) -* **internal:** update formatter ([#220](https://github.com/openai/openai-java/issues/220)) ([fc6bcd7](https://github.com/openai/openai-java/commit/fc6bcd742b042e9e8338cc7c8bceb6b1e3be6b38)) -* **internal:** update some formatting in `Values.kt` ([31c0663](https://github.com/openai/openai-java/commit/31c06634ead5ffcd54e0a9208e39ac9880df6574)) -* **internal:** use better test example values ([#222](https://github.com/openai/openai-java/issues/222)) ([7c6739c](https://github.com/openai/openai-java/commit/7c6739c254ef5a06020fbdbfb6b1d470377e34fc)) - -## 0.23.1 (2025-02-15) - -Full Changelog: [v0.23.0...v0.23.1](https://github.com/openai/openai-java/compare/v0.23.0...v0.23.1) - -### Bug Fixes - -* add missing argument ([5a6d2a2](https://github.com/openai/openai-java/commit/5a6d2a21be7bffabe335da4d13b6d2813c17ba7b)) - -## 0.23.0 (2025-02-14) - -Full Changelog: [v0.22.1...v0.23.0](https://github.com/openai/openai-java/compare/v0.22.1...v0.23.0) - -### Features - -* **api:** add support for storing chat completions ([#216](https://github.com/openai/openai-java/issues/216)) ([68a7883](https://github.com/openai/openai-java/commit/68a7883782574f1af0d724c1d838fd70a99f2958)) - -## 0.22.1 (2025-02-12) - -Full Changelog: [v0.22.0...v0.22.1](https://github.com/openai/openai-java/compare/v0.22.0...v0.22.1) - -### Documentation - -* function calling example ([#213](https://github.com/openai/openai-java/issues/213)) ([89700ec](https://github.com/openai/openai-java/commit/89700ecff1ec8e0d952bc7c77fcc3e2dd20b8a63)) - -## 0.22.0 (2025-02-06) - -Full Changelog: [v0.21.1...v0.22.0](https://github.com/openai/openai-java/compare/v0.21.1...v0.22.0) - -### Features - -* **api:** Add more new Azure service versions ([#208](https://github.com/openai/openai-java/issues/208)) ([a117892](https://github.com/openai/openai-java/commit/a11789220599540173f09d6cc9583365abe5f4e0)) -* **pagination:** avoid fetching when has_more: false ([#209](https://github.com/openai/openai-java/issues/209)) ([183b132](https://github.com/openai/openai-java/commit/183b132bba24beb90168fa77df84a93f0ea92fbe)) - - -### Bug Fixes - -* **api:** add missing `@MustBeClosed` annotations ([#205](https://github.com/openai/openai-java/issues/205)) ([0a60b9a](https://github.com/openai/openai-java/commit/0a60b9a40ad7f97ed51be3f6a70d674a6a9f1854)) -* **api:** add missing reasoning effort + model enums ([#207](https://github.com/openai/openai-java/issues/207)) ([8eb2394](https://github.com/openai/openai-java/commit/8eb2394b4ea937b19720d97dae84ed56660845c0)) -* **api:** switch `CompletableFuture<Void>` to `CompletableFuture` ([0a60b9a](https://github.com/openai/openai-java/commit/0a60b9a40ad7f97ed51be3f6a70d674a6a9f1854)) -* **client:** add missing validation calls on response ([0a60b9a](https://github.com/openai/openai-java/commit/0a60b9a40ad7f97ed51be3f6a70d674a6a9f1854)) -* **client:** always provide a body for `PATCH` methods ([0a60b9a](https://github.com/openai/openai-java/commit/0a60b9a40ad7f97ed51be3f6a70d674a6a9f1854)) -* deploymentModel arg ([3ab4110](https://github.com/openai/openai-java/commit/3ab41105d8b3fbb3db24ee96e825611f27713bb2)) - - -### Chores - -* **internal:** minor formatting/style changes ([0a60b9a](https://github.com/openai/openai-java/commit/0a60b9a40ad7f97ed51be3f6a70d674a6a9f1854)) -* **internal:** rename some tests ([0a60b9a](https://github.com/openai/openai-java/commit/0a60b9a40ad7f97ed51be3f6a70d674a6a9f1854)) - -## 0.21.1 (2025-02-05) - -Full Changelog: [v0.21.0...v0.21.1](https://github.com/openai/openai-java/compare/v0.21.0...v0.21.1) - -### Bug Fixes - -* **api/types:** correct audio duration & role types ([#199](https://github.com/openai/openai-java/issues/199)) ([5b57a0d](https://github.com/openai/openai-java/commit/5b57a0df88804deed4486d0271f0e62c1ea8c130)) - -## 0.21.0 (2025-02-05) - -Full Changelog: [v0.20.0...v0.21.0](https://github.com/openai/openai-java/compare/v0.20.0...v0.21.0) - -### Features - -* **api:** add file content endpoint ([#198](https://github.com/openai/openai-java/issues/198)) ([3dd469f](https://github.com/openai/openai-java/commit/3dd469f393b1c33348e6e709687d328154d0aa84)) -* **client:** send client-side timeout headers ([#196](https://github.com/openai/openai-java/issues/196)) ([03706d4](https://github.com/openai/openai-java/commit/03706d4a1f37936e83cb97dd53d815ce12933061)) - - -### Bug Fixes - -* add deploymentModel ([38e173d](https://github.com/openai/openai-java/commit/38e173d262dae86658355c69052a135398192d80)) - -## 0.20.0 (2025-01-31) - -Full Changelog: [v0.19.0...v0.20.0](https://github.com/openai/openai-java/compare/v0.19.0...v0.20.0) - -### Features - -* **api:** add o3-mini ([#192](https://github.com/openai/openai-java/issues/192)) ([e10c532](https://github.com/openai/openai-java/commit/e10c532340e9d1022db2927678a5223d1d8c6f5b)) - - -### Bug Fixes - -* **types:** correct metadata type + other fixes ([e10c532](https://github.com/openai/openai-java/commit/e10c532340e9d1022db2927678a5223d1d8c6f5b)) - -## 0.19.0 (2025-01-30) - -Full Changelog: [v0.18.1...v0.19.0](https://github.com/openai/openai-java/compare/v0.18.1...v0.19.0) - -### Features - -* **client:** helpers for discriminated classes with one required prop ([#189](https://github.com/openai/openai-java/issues/189)) ([adbf4b0](https://github.com/openai/openai-java/commit/adbf4b0dd8d978586842e97ba628f8cf4e3484de)) - - -### Documentation - -* fix incorrect additional properties info ([#190](https://github.com/openai/openai-java/issues/190)) ([3d443f7](https://github.com/openai/openai-java/commit/3d443f7e545036484b571f1893aa058725ca57f6)) -* update breaking change expectations ([ee4ee2b](https://github.com/openai/openai-java/commit/ee4ee2b876ac5e956fbd35a4e10ed4f21668ae03)) - -## 0.18.1 (2025-01-29) - -Full Changelog: [v0.18.0...v0.18.1](https://github.com/openai/openai-java/compare/v0.18.0...v0.18.1) - -### Bug Fixes - -* **client:** don't leak responses when retrying ([#185](https://github.com/openai/openai-java/issues/185)) ([a13f967](https://github.com/openai/openai-java/commit/a13f967d4406cb447b14260c5435f77d91b6b1be)) - -## 0.18.0 (2025-01-29) - -Full Changelog: [v0.17.0...v0.18.0](https://github.com/openai/openai-java/compare/v0.17.0...v0.18.0) - -### Features - -* **client:** helpers for discriminated union variants with one required prop ([#182](https://github.com/openai/openai-java/issues/182)) ([ec756b9](https://github.com/openai/openai-java/commit/ec756b9788629dfc36bb56d59d9f17f4d0d8cc35)) - - -### Chores - -* **internal:** improve `RetryingHttpClientTest` ([#180](https://github.com/openai/openai-java/issues/180)) ([b7ebe5d](https://github.com/openai/openai-java/commit/b7ebe5d44b2797618905614b51a27b73906e4271)) -* **internal:** simplify object construction ([#183](https://github.com/openai/openai-java/issues/183)) ([3d5a59d](https://github.com/openai/openai-java/commit/3d5a59dccc425e351a365f9dbdf2ae52244086ae)) - - -### Documentation - -* simpliy param construction ([2c2ccbc](https://github.com/openai/openai-java/commit/2c2ccbc83a053e525ad0d8df1506de5be4fda46c)) - -## 0.17.0 (2025-01-29) - -Full Changelog: [v0.16.0...v0.17.0](https://github.com/openai/openai-java/compare/v0.16.0...v0.17.0) - -### Features - -* **client:** add `_queryParams` and `_headers` methods ([#177](https://github.com/openai/openai-java/issues/177)) ([2d67005](https://github.com/openai/openai-java/commit/2d67005735b554440ed0578de6a182a73b129ffa)) - - -### Refactors - -* **internal:** extract request preparation logic ([2d67005](https://github.com/openai/openai-java/commit/2d67005735b554440ed0578de6a182a73b129ffa)) - -## 0.16.0 (2025-01-28) - -Full Changelog: [v0.15.1...v0.16.0](https://github.com/openai/openai-java/compare/v0.15.1...v0.16.0) - -### Features - -* **client:** add some more builder helpers ([#173](https://github.com/openai/openai-java/issues/173)) ([f314e68](https://github.com/openai/openai-java/commit/f314e68915560703970c9acc16e96030202de9d1)) - - -### Chores - -* **internal:** shorten `model` method impl ([f314e68](https://github.com/openai/openai-java/commit/f314e68915560703970c9acc16e96030202de9d1)) - - -### Documentation - -* mark more methods as deprecated ([f314e68](https://github.com/openai/openai-java/commit/f314e68915560703970c9acc16e96030202de9d1)) -* more examples and cleanup ([#159](https://github.com/openai/openai-java/issues/159)) ([fa2a1fc](https://github.com/openai/openai-java/commit/fa2a1fc2983131bac40988049dd3b0e7c730442c)) - -## 0.15.1 (2025-01-27) - -Full Changelog: [v0.15.0...v0.15.1](https://github.com/openai/openai-java/compare/v0.15.0...v0.15.1) - -### Documentation - -* builder, enum, and union comments ([#171](https://github.com/openai/openai-java/issues/171)) ([37acbbd](https://github.com/openai/openai-java/commit/37acbbd239d6b540a461084240bc266ad0491e9c)) - -## 0.15.0 (2025-01-27) - -Full Changelog: [v0.14.1...v0.15.0](https://github.com/openai/openai-java/compare/v0.14.1...v0.15.0) - -### Features - -* **client:** add `close` method ([#164](https://github.com/openai/openai-java/issues/164)) ([f32975f](https://github.com/openai/openai-java/commit/f32975f523bcab55faa54568982b884ba7d1d381)) - - -### Bug Fixes - -* **client:** make some classes and constructors non-public ([#169](https://github.com/openai/openai-java/issues/169)) ([20fb5a1](https://github.com/openai/openai-java/commit/20fb5a1eef19b59c9dd152f132e2a980d20b039d)) - - -### Chores - -* **internal:** remove some unnecessary `constructor` keywords ([20fb5a1](https://github.com/openai/openai-java/commit/20fb5a1eef19b59c9dd152f132e2a980d20b039d)) - - -### Documentation - -* `async` and `sync` method comments ([#167](https://github.com/openai/openai-java/issues/167)) ([6f11e5d](https://github.com/openai/openai-java/commit/6f11e5d88a70631f18b86c7f24e91042330f39ec)) -* add client documentation ([#166](https://github.com/openai/openai-java/issues/166)) ([4344883](https://github.com/openai/openai-java/commit/434488395fb95e59933242113b5d14b610ef5ec5)) - -## 0.14.1 (2025-01-25) - -Full Changelog: [v0.14.0...v0.14.1](https://github.com/openai/openai-java/compare/v0.14.0...v0.14.1) - -### Bug Fixes - -* **client:** async streaming flakiness ([#162](https://github.com/openai/openai-java/issues/162)) ([247c05a](https://github.com/openai/openai-java/commit/247c05a70fecad0bc1498d5aa56e13310f36eb96)) - - -### Chores - -* add max retries to test ([#160](https://github.com/openai/openai-java/issues/160)) ([7c4a4e0](https://github.com/openai/openai-java/commit/7c4a4e034c5edaea804435972f558df6a9326220)) -* **internal:** fix release ([#163](https://github.com/openai/openai-java/issues/163)) ([987fa44](https://github.com/openai/openai-java/commit/987fa4409a86636bbe87fee77522a1659e263f3b)) - -## 0.14.0 (2025-01-24) - -Full Changelog: [v0.13.0...v0.14.0](https://github.com/openai/openai-java/compare/v0.13.0...v0.14.0) - -### ⚠ BREAKING CHANGES - -* **client:** better union variant method and variable names ([#157](https://github.com/openai/openai-java/issues/157)) - -### Features - -* **client:** better union variant method and variable names ([#157](https://github.com/openai/openai-java/issues/157)) ([da5bce5](https://github.com/openai/openai-java/commit/da5bce5d00af53d7297133af09352a7176c2f83e)) - - -### Bug Fixes - -* examples ([3473781](https://github.com/openai/openai-java/commit/3473781ca26d25531f368485291f9972e600631b)) - - -### Chores - -* **internal:** swap `checkNotNull` to `checkRequired` ([#156](https://github.com/openai/openai-java/issues/156)) ([d6f65f7](https://github.com/openai/openai-java/commit/d6f65f7c0e25adbce97b22f7a649f6c3eaeb61ed)) - - -### Documentation - -* move up requirements section ([#154](https://github.com/openai/openai-java/issues/154)) ([48fc646](https://github.com/openai/openai-java/commit/48fc646957ad4ff69c93b40d59ea9d5e8a22eece)) -* update readme ([#152](https://github.com/openai/openai-java/issues/152)) ([293dc47](https://github.com/openai/openai-java/commit/293dc47b242e204b6c6e419002dbb560cb455169)) - -## 0.13.0 (2025-01-22) - -Full Changelog: [v0.12.0...v0.13.0](https://github.com/openai/openai-java/compare/v0.12.0...v0.13.0) - -### Features - -* **api:** update enum values, comments, examples, and constants ([#149](https://github.com/openai/openai-java/issues/149)) ([4bfa305](https://github.com/openai/openai-java/commit/4bfa3055d017aa23cc8cc41827012dc773cbf508)) - - -### Bug Fixes - -* **examples:** remove now unneeded role param ([045f141](https://github.com/openai/openai-java/commit/045f141a7956d13a2ac35af30e64c5160252ee6b)) - -## 0.12.0 (2025-01-22) - -Full Changelog: [v0.11.10...v0.12.0](https://github.com/openai/openai-java/compare/v0.11.10...v0.12.0) - -### Features - -* **client:** make it easy to roundtrip messages ([#148](https://github.com/openai/openai-java/issues/148)) ([f4a1617](https://github.com/openai/openai-java/commit/f4a1617148ffc276a324ed9a59654091f57222d2)) - - -### Bug Fixes - -* **client:** bad assistants v2 deserialization ([#146](https://github.com/openai/openai-java/issues/146)) ([59d6de8](https://github.com/openai/openai-java/commit/59d6de8cf5857a4b46eeece4f3c8d930d67103d6)) - -## 0.11.10 (2025-01-21) - -Full Changelog: [v0.11.9...v0.11.10](https://github.com/openai/openai-java/compare/v0.11.9...v0.11.10) - -### Bug Fixes - -* **client:** add missing default headers ([#145](https://github.com/openai/openai-java/issues/145)) ([18d5270](https://github.com/openai/openai-java/commit/18d5270326561ca8e5f10b5a671da1d30ced5993)) - -## 0.11.9 (2025-01-21) - -Full Changelog: [v0.11.8...v0.11.9](https://github.com/openai/openai-java/compare/v0.11.8...v0.11.9) - -### Bug Fixes - -* **client:** make service impl constructors internal ([#141](https://github.com/openai/openai-java/issues/141)) ([da35557](https://github.com/openai/openai-java/commit/da35557895e233dd5e490e139043faad92173782)) - -## 0.11.8 (2025-01-17) - -Full Changelog: [v0.11.7...v0.11.8](https://github.com/openai/openai-java/compare/v0.11.7...v0.11.8) - -### Documentation - -* fix javadoc.io link ([ba07770](https://github.com/openai/openai-java/commit/ba07770369a44a7487a7a7fae9e85da6600204ce)) -* fix javadoc.io link again ([0d2b8ce](https://github.com/openai/openai-java/commit/0d2b8ce0894ae592047e6014ff82876060152ee7)) - -## 0.11.7 (2025-01-17) - -Full Changelog: [v0.11.6...v0.11.7](https://github.com/openai/openai-java/compare/v0.11.6...v0.11.7) - -### Chores - -* **internal:** upgrade kotlin compiler and gradle ([#132](https://github.com/openai/openai-java/issues/132)) ([61a0b0d](https://github.com/openai/openai-java/commit/61a0b0debfd50646fc9fe310b5decc2e891f48d0)) - - -### Documentation - -* add javadoc.io badge ([#135](https://github.com/openai/openai-java/issues/135)) ([e905ce5](https://github.com/openai/openai-java/commit/e905ce509aabe1b9db9519b6ff77a79fc95434e1)) -* add more documentation ([#134](https://github.com/openai/openai-java/issues/134)) ([893eafc](https://github.com/openai/openai-java/commit/893eafcb367b4ea96331c6deccb71c865eb67d4b)) - -## 0.11.6 (2025-01-17) - -Full Changelog: [v0.11.5...v0.11.6](https://github.com/openai/openai-java/compare/v0.11.5...v0.11.6) - -### Chores - -* **internal:** move `StreamResponse` method ([#131](https://github.com/openai/openai-java/issues/131)) ([5888e39](https://github.com/openai/openai-java/commit/5888e398597b68a520b4bb3953d96403023331fd)) -* **internal:** refactor streaming implementation ([#129](https://github.com/openai/openai-java/issues/129)) ([d2831ec](https://github.com/openai/openai-java/commit/d2831ec587d37a2c2d51332f5f2f62ba3dd1181d)) - -## 0.11.5 (2025-01-16) - -Full Changelog: [v0.11.4...v0.11.5](https://github.com/openai/openai-java/compare/v0.11.4...v0.11.5) - -### Bug Fixes - -* **internal:** publishing error ([73e22ea](https://github.com/openai/openai-java/commit/73e22eae2e905919172ab4d7e3b18b44d435205e)) - -## 0.11.4 (2025-01-16) - -Full Changelog: [v0.11.3...v0.11.4](https://github.com/openai/openai-java/compare/v0.11.3...v0.11.4) - -### Chores - -* **internal:** add and tweak check functions ([#117](https://github.com/openai/openai-java/issues/117)) ([627cb56](https://github.com/openai/openai-java/commit/627cb568af9ff28a570de4d9ebae04a2ba5c46d7)) -* **internal:** extract a `checkRequired` function ([#113](https://github.com/openai/openai-java/issues/113)) ([b63b2b1](https://github.com/openai/openai-java/commit/b63b2b159bd6c9d01d22a64980a13bfcc3f64863)) -* **internal:** fix tests ([61ada05](https://github.com/openai/openai-java/commit/61ada05fe8d4a3509fc59c6626611e5dbc308aff)) -* **internal:** remove space ([#125](https://github.com/openai/openai-java/issues/125)) ([27bfcec](https://github.com/openai/openai-java/commit/27bfcec6deccf7d000a305e630b4eda012154222)) -* **internal:** remove unused gradle task ([#121](https://github.com/openai/openai-java/issues/121)) ([0b4e59a](https://github.com/openai/openai-java/commit/0b4e59abac5343abe8cda697864fe8afa9fe1774)) -* **internal:** tweak client options nullability handling ([627cb56](https://github.com/openai/openai-java/commit/627cb568af9ff28a570de4d9ebae04a2ba5c46d7)) -* simplify examples involving lists ([#118](https://github.com/openai/openai-java/issues/118)) ([557c071](https://github.com/openai/openai-java/commit/557c0713590c7e0556dd68e77e4179fde8923c86)) -* simplify examples involving unions ([#119](https://github.com/openai/openai-java/issues/119)) ([7c7795c](https://github.com/openai/openai-java/commit/7c7795c852c09bca6ab23b22435fd7846730e95c)) -* **types:** rename vector store chunking strategy ([#116](https://github.com/openai/openai-java/issues/116)) ([387935f](https://github.com/openai/openai-java/commit/387935fa16873ae252522aa926d3ed701186a292)) - - -### Documentation - -* don't mention a non-existent SDK ([#120](https://github.com/openai/openai-java/issues/120)) ([23eb658](https://github.com/openai/openai-java/commit/23eb6584b4ba7dfd8e5a9147d815ab01e364726e)) - -## 0.11.3 (2025-01-14) - -Full Changelog: [v0.11.2...v0.11.3](https://github.com/openai/openai-java/compare/v0.11.2...v0.11.3) - -### Bug Fixes - -* **streaming:** support assistants ([#106](https://github.com/openai/openai-java/issues/106)) ([bebfa9c](https://github.com/openai/openai-java/commit/bebfa9c39172655e76c7c3fea45757eef705e931)) - - -### Chores - -* **internal:** fix up root `build.gradle.kts` formatting ([#109](https://github.com/openai/openai-java/issues/109)) ([54a806f](https://github.com/openai/openai-java/commit/54a806fa6bdd9ff4ef0957324cc36380241c6b82)) -* **internal:** remove unused Gradle imports ([#110](https://github.com/openai/openai-java/issues/110)) ([22502eb](https://github.com/openai/openai-java/commit/22502eb53d52a35237ea364d5d8c89bc1ced62bd)) -* **internal:** remove unused or unnecessary Gradle imports ([#111](https://github.com/openai/openai-java/issues/111)) ([8d95893](https://github.com/openai/openai-java/commit/8d95893e22b7f55bc65bad3cafcb0bf78569fd83)) -* **tests:** add more tests for streaming ([#108](https://github.com/openai/openai-java/issues/108)) ([5dec143](https://github.com/openai/openai-java/commit/5dec143db64f4efd3c1f3f1cd55d1fdee280d695)) - - -### Documentation - -* publish dokka javadoc ([#112](https://github.com/openai/openai-java/issues/112)) ([5521ffc](https://github.com/openai/openai-java/commit/5521ffc83b4a2adae49e9a226c5c745e64bbbc56)) - -## 0.11.2 (2025-01-10) - -Full Changelog: [v0.11.1...v0.11.2](https://github.com/openai/openai-java/compare/v0.11.1...v0.11.2) - -### Bug Fixes - -* **client:** add some missing `validate()` calls ([#101](https://github.com/openai/openai-java/issues/101)) ([dec2d6b](https://github.com/openai/openai-java/commit/dec2d6b25cccc2547e576c8658116d2bba12f100)) - - -### Chores - -* **internal:** refactor `validate` methods ([dec2d6b](https://github.com/openai/openai-java/commit/dec2d6b25cccc2547e576c8658116d2bba12f100)) - -## 0.11.1 (2025-01-09) - -Full Changelog: [v0.11.0...v0.11.1](https://github.com/openai/openai-java/compare/v0.11.0...v0.11.1) - -### Chores - -* **internal:** add some missing newlines between methods ([#100](https://github.com/openai/openai-java/issues/100)) ([afc2998](https://github.com/openai/openai-java/commit/afc2998ac124a26fe3ec92207f5ff4c9614ff673)) -* **internal:** spec update ([#97](https://github.com/openai/openai-java/issues/97)) ([0cff792](https://github.com/openai/openai-java/commit/0cff79271c63be46f5502a138ce1ad67a146724f)) - - -### Documentation - -* update some builder method javadocs ([#99](https://github.com/openai/openai-java/issues/99)) ([192965a](https://github.com/openai/openai-java/commit/192965abf73b9868d808c407bfc9fb73a507def7)) - -## 0.11.0 (2025-01-08) - -Full Changelog: [v0.10.0...v0.11.0](https://github.com/openai/openai-java/compare/v0.10.0...v0.11.0) - -### Features - -* **client:** add more builder convenience methods for lists ([#96](https://github.com/openai/openai-java/issues/96)) ([9ee703b](https://github.com/openai/openai-java/commit/9ee703b13e8c467a71e7787d420a131bc1910e4f)) - - -### Documentation - -* **readme:** fix misplaced period ([#94](https://github.com/openai/openai-java/issues/94)) ([c6242ba](https://github.com/openai/openai-java/commit/c6242bad2b917fb419d9a69ad65cebbda9b56b51)) - -## 0.10.0 (2025-01-08) - -Full Changelog: [v0.9.1...v0.10.0](https://github.com/openai/openai-java/compare/v0.9.1...v0.10.0) - -### Features - -* **client:** add various convenience setters to models ([#91](https://github.com/openai/openai-java/issues/91)) ([9b3eb17](https://github.com/openai/openai-java/commit/9b3eb17270075587ac9c2701b0e41a7debf17bec)) -* **client:** allow passing null or optional for nullable fields ([#84](https://github.com/openai/openai-java/issues/84)) ([8a8f2f9](https://github.com/openai/openai-java/commit/8a8f2f9ac5f6555c372a81acc196b3ab04fd9555)) -* **client:** allow setting arbitrary JSON for top-level body params ([9b3eb17](https://github.com/openai/openai-java/commit/9b3eb17270075587ac9c2701b0e41a7debf17bec)) -* **client:** expose getters for `JsonField` of body params ([9b3eb17](https://github.com/openai/openai-java/commit/9b3eb17270075587ac9c2701b0e41a7debf17bec)) - - -### Bug Fixes - -* **client:** consistently throw on omitting required fields ([9b3eb17](https://github.com/openai/openai-java/commit/9b3eb17270075587ac9c2701b0e41a7debf17bec)) -* **client:** convert `JsonField` containing list type to mutable in builder ([9b3eb17](https://github.com/openai/openai-java/commit/9b3eb17270075587ac9c2701b0e41a7debf17bec)) - - -### Documentation - -* add params class javadocs ([#90](https://github.com/openai/openai-java/issues/90)) ([9a33c1c](https://github.com/openai/openai-java/commit/9a33c1cf22e30e1878d739acfab4258321c6a9f8)) - - -### Styles - -* **internal:** explicitly add some method return types ([9b3eb17](https://github.com/openai/openai-java/commit/9b3eb17270075587ac9c2701b0e41a7debf17bec)) -* **internal:** move headers and query params setters below others ([9b3eb17](https://github.com/openai/openai-java/commit/9b3eb17270075587ac9c2701b0e41a7debf17bec)) -* **internal:** simplify existing convenience setters on params ([9b3eb17](https://github.com/openai/openai-java/commit/9b3eb17270075587ac9c2701b0e41a7debf17bec)) - -## 0.9.1 (2025-01-06) - -Full Changelog: [v0.9.0...v0.9.1](https://github.com/openai/openai-java/compare/v0.9.0...v0.9.1) - -### Styles - -* **internal:** sort fields ([#82](https://github.com/openai/openai-java/issues/82)) ([219b48f](https://github.com/openai/openai-java/commit/219b48f7c6ff25eae8a9a082f8193c41aa18d0ac)) - -## 0.9.0 (2025-01-03) - -Full Changelog: [v0.8.1...v0.9.0](https://github.com/openai/openai-java/compare/v0.8.1...v0.9.0) - -### ⚠ BREAKING CHANGES - -* **client:** switch query params objects to use `QueryParams` ([#64](https://github.com/openai/openai-java/issues/64)) - -### Features - -* **client:** add beta endpoints ([#79](https://github.com/openai/openai-java/issues/79)) ([8584a20](https://github.com/openai/openai-java/commit/8584a2029ec5402b205ce485e96702da0a692b76)) -* **client:** put body field in params, add more convenience methods, and add missing docs ([#77](https://github.com/openai/openai-java/issues/77)) ([0c74350](https://github.com/openai/openai-java/commit/0c74350f0e5d1f0a30ae9b27c50a306ca081b1a7)) - - -### Chores - -* bump license year ([#74](https://github.com/openai/openai-java/issues/74)) ([769175d](https://github.com/openai/openai-java/commit/769175d3c42b6679e8ea91847e1fba32ab76d9a6)) - - -### Documentation - -* add some missing javadocs ([#78](https://github.com/openai/openai-java/issues/78)) ([d153ef9](https://github.com/openai/openai-java/commit/d153ef99dff3a201bf5674ee4154f3a3d276f608)) - - -### Refactors - -* **client:** switch query params objects to use `QueryParams` ([#64](https://github.com/openai/openai-java/issues/64)) ([4e9c3eb](https://github.com/openai/openai-java/commit/4e9c3eb9351f308ed3d842bd4aa2d860c23d568e)) -* **internal:** use constructor to deserialize json ([#66](https://github.com/openai/openai-java/issues/66)) ([27389cd](https://github.com/openai/openai-java/commit/27389cd377ce9a109a4aa25f78f70c36ca62de14)) - -## 0.8.1 (2024-12-21) - -Full Changelog: [v0.8.0...v0.8.1](https://github.com/openai/openai-java/compare/v0.8.0...v0.8.1) - -### Chores - -* **docs:** add example project ([#59](https://github.com/openai/openai-java/issues/59)) ([045c7ba](https://github.com/openai/openai-java/commit/045c7badc319be2df3fac123df3daafc61b40473)) -* **docs:** fix code block language ([#61](https://github.com/openai/openai-java/issues/61)) ([4301693](https://github.com/openai/openai-java/commit/4301693dac3c53e80225a91087ddb890e1419f76)) -* **docs:** update readme ([#58](https://github.com/openai/openai-java/issues/58)) ([ef3dcd5](https://github.com/openai/openai-java/commit/ef3dcd543892f092899dcc57b1788ea8d07f6de4)) -* format example ([892bb69](https://github.com/openai/openai-java/commit/892bb697138f56c2e9783c1a413db5873385cc9b)) -* **internal:** spec update ([#55](https://github.com/openai/openai-java/issues/55)) ([768138f](https://github.com/openai/openai-java/commit/768138fcc6d6101efc08b8ebc001d45f8d6a96a1)) -* update parameter examples in tests and docs ([#57](https://github.com/openai/openai-java/issues/57)) ([afe3e0e](https://github.com/openai/openai-java/commit/afe3e0e2591818bcc8cfb14bb6a956a0d1d3fff0)) - - -### Documentation - -* add note about feedback ([1a5517f](https://github.com/openai/openai-java/commit/1a5517f823a04e4523c0a4b45482f223048e0c31)) - -## 0.8.0 (2024-12-17) - -Full Changelog: [v0.7.5...v0.8.0](https://github.com/openai/openai-java/compare/v0.7.5...v0.8.0) - -### Features - -* **api:** new o1 and GPT-4o models + preference fine-tuning ([#46](https://github.com/openai/openai-java/issues/46)) ([4f2fac5](https://github.com/openai/openai-java/commit/4f2fac59587836e6a34ed4b313589abbf8153963)) - - -### Chores - -* **internal:** spec update ([#48](https://github.com/openai/openai-java/issues/48)) ([777165c](https://github.com/openai/openai-java/commit/777165c5344891ae7816be6606d9413550a578b5)) - -## 0.7.5 (2024-12-13) - -Full Changelog: [v0.7.4...v0.7.5](https://github.com/openai/openai-java/compare/v0.7.4...v0.7.5) - -### Chores - -* **internal:** remove unused and expand used wildcard imports ([#43](https://github.com/openai/openai-java/issues/43)) ([39bfc4e](https://github.com/openai/openai-java/commit/39bfc4e4a15ce52c029ed31253afff9d9de36cc1)) -* **internal:** remove unused and expand used wildcard imports ([#44](https://github.com/openai/openai-java/issues/44)) ([7f7e131](https://github.com/openai/openai-java/commit/7f7e1313bde6827cd9067b712f3d7992ddeeaa6f)) -* **test:** use `JsonValue` instead of `JsonString` ([#41](https://github.com/openai/openai-java/issues/41)) ([8d2dd03](https://github.com/openai/openai-java/commit/8d2dd030899ad807a4712e00a33426c7484bcab5)) - -## 0.7.4 (2024-12-12) - -Full Changelog: [v0.7.3...v0.7.4](https://github.com/openai/openai-java/compare/v0.7.3...v0.7.4) - -### Chores - -* **test:** remove unused imports ([#39](https://github.com/openai/openai-java/issues/39)) ([1ce3035](https://github.com/openai/openai-java/commit/1ce303537ed133fea41a7d4dbd2ebf9e53c8f594)) - -## 0.7.3 (2024-12-11) - -Full Changelog: [v0.7.2...v0.7.3](https://github.com/openai/openai-java/compare/v0.7.2...v0.7.3) - -### Chores - -* **internal:** remove unused imports ([#38](https://github.com/openai/openai-java/issues/38)) ([021177f](https://github.com/openai/openai-java/commit/021177f995fb11e9a17ebf3950e0d46591e3c354)) - - -### Styles - -* **internal:** make enum value definitions less verbose ([#35](https://github.com/openai/openai-java/issues/35)) ([1effd49](https://github.com/openai/openai-java/commit/1effd49f5c1585c54e46454945df3fe2314ef05d)) -* **internal:** move enum identity methods to bottom of class ([#37](https://github.com/openai/openai-java/issues/37)) ([7a9d27a](https://github.com/openai/openai-java/commit/7a9d27a7ef5d59f78479e1af83a980eb52097fcc)) - -## 0.7.2 (2024-12-11) - -Full Changelog: [v0.7.1...v0.7.2](https://github.com/openai/openai-java/compare/v0.7.1...v0.7.2) - -### Chores - -* update example values in tests and docs ([#33](https://github.com/openai/openai-java/issues/33)) ([e74f2b5](https://github.com/openai/openai-java/commit/e74f2b571857879b6a40351c572ab063eb1f18f5)) - -## 0.7.1 (2024-12-09) - -Full Changelog: [v0.7.0...v0.7.1](https://github.com/openai/openai-java/compare/v0.7.0...v0.7.1) - -### Chores - -* **internal:** configure sonatype ([#30](https://github.com/openai/openai-java/issues/30)) ([5d7816a](https://github.com/openai/openai-java/commit/5d7816afb9cf70189aa04dfd18a8f77f25094dcf)) - -## 0.7.0 (2024-12-04) - -Full Changelog: [v0.6.0...v0.7.0](https://github.com/openai/openai-java/compare/v0.6.0...v0.7.0) - -### Features - -* **api:** updates ([#29](https://github.com/openai/openai-java/issues/29)) ([a3122af](https://github.com/openai/openai-java/commit/a3122af22767760b4f73880815d138e7493e381c)) - - -### Chores - -* bump openapi url ([#28](https://github.com/openai/openai-java/issues/28)) ([24d8461](https://github.com/openai/openai-java/commit/24d8461a14cb0a5b831cd821a129f995a3988856)) - - -### Documentation - -* add missing parameter to code snippet ([#26](https://github.com/openai/openai-java/issues/26)) ([8e7421f](https://github.com/openai/openai-java/commit/8e7421faa2ef8a6fd17757080f49bb5e1c0606c3)) - -## 0.6.0 (2024-11-27) - -Full Changelog: [v0.5.1...v0.6.0](https://github.com/openai/openai-java/compare/v0.5.1...v0.6.0) - -### ⚠ BREAKING CHANGES - -* **client:** remove duplicated classes - -### Features - -* derive gpg release key's id via gpg itself ([#25](https://github.com/openai/openai-java/issues/25)) ([6aad041](https://github.com/openai/openai-java/commit/6aad041b56bc39ee8e9c48e48738081652bf4ed2)) - - -### Bug Fixes - -* **client:** remove duplicated classes ([8a8f11f](https://github.com/openai/openai-java/commit/8a8f11fc20c415877f1f673ec0be3948126d1c11)) - -## 0.5.1 (2024-11-26) - -Full Changelog: [v0.5.0...v0.5.1](https://github.com/openai/openai-java/compare/v0.5.0...v0.5.1) - -### Chores - -* **internal:** update example values ([#21](https://github.com/openai/openai-java/issues/21)) ([2270e67](https://github.com/openai/openai-java/commit/2270e676a013d9c00012757b86d9d86010c09a20)) - -## 0.5.0 (2024-11-25) - -Full Changelog: [v0.4.0...v0.5.0](https://github.com/openai/openai-java/compare/v0.4.0...v0.5.0) - -### Features - -* **client:** add logging when debug env is set ([#18](https://github.com/openai/openai-java/issues/18)) ([017aae7](https://github.com/openai/openai-java/commit/017aae7a1795fe933e0ea9e8ee2c8d059c6746f4)) - - -### Documentation - -* add note that we're in alpha ([#19](https://github.com/openai/openai-java/issues/19)) ([d49cc28](https://github.com/openai/openai-java/commit/d49cc28f0a621df658a3c83a880735ebd7cc1acc)) -* **readme:** add Microsoft Azure section ([#17](https://github.com/openai/openai-java/issues/17)) ([8f8165f](https://github.com/openai/openai-java/commit/8f8165fd33780e3ee0609df7e7e171c8e7f10029)) -* swap example from `.completions()` to `.chat().completions()` ([#20](https://github.com/openai/openai-java/issues/20)) ([f0423a7](https://github.com/openai/openai-java/commit/f0423a7e9e20d5c1e528077fbb4e87baa822079a)) - - -### Styles - -* **internal:** reorder some params methods and improve consistency of implementations ([#15](https://github.com/openai/openai-java/issues/15)) ([8592cda](https://github.com/openai/openai-java/commit/8592cdad178325e3a8994ef44e854ee5b4853c45)) - -## 0.4.0 (2024-11-21) - -Full Changelog: [v0.3.0...v0.4.0](https://github.com/openai/openai-java/compare/v0.3.0...v0.4.0) - -### Features - -* **azure:** Add HttpRequest.Builder extension methods ([#9](https://github.com/openai/openai-java/issues/9)) ([097c7c9](https://github.com/openai/openai-java/commit/097c7c91d23ff3bafdb4c01baea0df9beeadcd74)) - - -### Bug Fixes - -* **azure:** add missing azure changes ([656d3b5](https://github.com/openai/openai-java/commit/656d3b5a6d1c2d68733d5139d3a2982b04009f2a)) - -## 0.3.0 (2024-11-20) - -Full Changelog: [v0.2.0...v0.3.0](https://github.com/openai/openai-java/compare/v0.2.0...v0.3.0) - -### Features - -* **api:** add gpt-4o-2024-11-20 model ([#13](https://github.com/openai/openai-java/issues/13)) ([3263126](https://github.com/openai/openai-java/commit/3263126a59cb63be0b6842fa16b0466feb71d44b)) - - -### Styles - -* **internal:** move identity methods to bottom of error class ([#12](https://github.com/openai/openai-java/issues/12)) ([f3ff42a](https://github.com/openai/openai-java/commit/f3ff42a3c4d3821949af7ad43e03dac8b061825b)) -* **internal:** reduce verbosity of identity methods ([#10](https://github.com/openai/openai-java/issues/10)) ([9ef03ed](https://github.com/openai/openai-java/commit/9ef03eda541a878b4ef9df0c3845a63e1f9cc44d)) - -## 0.2.0 (2024-11-20) - -Full Changelog: [v0.1.0...v0.2.0](https://github.com/openai/openai-java/compare/v0.1.0...v0.2.0) - -### Features - -* **client:** add async streaming methods ([#6](https://github.com/openai/openai-java/issues/6)) ([f805972](https://github.com/openai/openai-java/commit/f805972d9cafdf3ad8a974e660c62587e2b65c06)) -* initial commit ([fa016ee](https://github.com/openai/openai-java/commit/fa016ee58dba10add81cefddbdf1483bfa24d058)) - - -### Performance Improvements - -* **tests:** remove unused dependencies ([#3](https://github.com/openai/openai-java/issues/3)) ([4c94984](https://github.com/openai/openai-java/commit/4c949841e4eed67b82bfe1f40370a0a3db8f2d43)) - - -### Chores - -* **deps:** bump jackson to 2.18.1 ([#7](https://github.com/openai/openai-java/issues/7)) ([9262ca7](https://github.com/openai/openai-java/commit/9262ca7a55c2bdb3dff69f9df328376e23bb11df)) -* **internal:** spec update ([#5](https://github.com/openai/openai-java/issues/5)) ([0df36a4](https://github.com/openai/openai-java/commit/0df36a497f88407e35ca79bacb72f30f2d1350da)) - - -### Documentation - -* bump models in example snippets to gpt-4o ([#4](https://github.com/openai/openai-java/issues/4)) ([359c100](https://github.com/openai/openai-java/commit/359c10065f9615a73e30573b1dea80d5027288a6)) - -## 0.1.0 (2024-11-08) - -Full Changelog: [v0.0.1...v0.1.0](https://github.com/openai/openai-java/compare/v0.0.1...v0.1.0) - -### ⚠ BREAKING CHANGES - -* **client:** simplify structure of strings with presets -* **client:** replace multimaps with custom types -* **client:** add/rename methods for headers/query params -* **client:** rename header and query params builder methods -* **client:** union and builder method naming conflicts -* **client:** don't generate default variant field/method names with underscores - -### Features - -* add example ([ff05dec](https://github.com/openai/openai-java/commit/ff05dec4c50a23498218ad1b3f7850aaf59e3998)) -* add SSE and many other major updates ([6eb3f62](https://github.com/openai/openai-java/commit/6eb3f62e530d5b98e1a46164a680798d1c4299db)) -* **api:** add chatgpt-4o-latest model ([f0d7c9a](https://github.com/openai/openai-java/commit/f0d7c9ae3c51c85ede0b34b59c5f43270b4d907b)) -* **api:** add file search result details to run steps ([9ec089e](https://github.com/openai/openai-java/commit/9ec089e418ab71c19368c70a671fbef7fd3a9365)) -* **api:** add gpt-4o-audio-preview model for chat completions ([e81ac84](https://github.com/openai/openai-java/commit/e81ac8426a0d84fa52028bd6ee3daa54695945e5)) -* **api:** add new gpt-4o-mini models ([a5a855e](https://github.com/openai/openai-java/commit/a5a855e85ded4f483506f4d35aeef8aee43a3adc)) -* **api:** add new, expressive voices for Realtime and Audio in Chat Completions ([c4d5fbd](https://github.com/openai/openai-java/commit/c4d5fbd7707d1b1cd13a72b13c48a767f0fd95b1)) -* **api:** add o1 models ([b9db26a](https://github.com/openai/openai-java/commit/b9db26a0d021be09a4b201ba15570e049cb2939f)) -* **api:** add omni-moderation model ([5935c8c](https://github.com/openai/openai-java/commit/5935c8c91cfdb22f0d204f4a11541201657bcf65)) -* **api:** add support for predicted outputs ([a72d1ea](https://github.com/openai/openai-java/commit/a72d1eacfdd66d2e7ae43d345fc6d5c08ed45bcf)) -* **api:** add uploads endpoints ([9963139](https://github.com/openai/openai-java/commit/996313982969078f06f9af393dfb4c2f28dced76)) -* **api:** support storing chat completions, enabling evals and model distillation in the dashboard ([670e73f](https://github.com/openai/openai-java/commit/670e73f06813b9b56e424dafb98fec6d3a5249d2)) -* **api:** updates ([c818fda](https://github.com/openai/openai-java/commit/c818fda81b7919c6f253046252913920d827c2c3)) -* **client:** add `Headers` class ([339e93c](https://github.com/openai/openai-java/commit/339e93c34e573b114f2eee15f57b1baa42987d89)) -* **client:** add `Headers` class ([02b56b3](https://github.com/openai/openai-java/commit/02b56b36df73fe9678453af31fbd75e02f7d59bc)) -* **client:** add `QueryParams` class ([bf7b4a2](https://github.com/openai/openai-java/commit/bf7b4a2115acac93c0b13b0d85187ef06179263a)) -* **client:** add `User-Agent` header ([5bab5cc](https://github.com/openai/openai-java/commit/5bab5cc526b2781d1a4c6775803fc9ebe83e4ced)) -* **client:** add more endpoints ([48a86ca](https://github.com/openai/openai-java/commit/48a86caae55cafff11f162c0aef66801b04c6036)) -* **client:** add streaming ([e8fc6aa](https://github.com/openai/openai-java/commit/e8fc6aa620dddcde92a5aaedb7aa90ae1b3ac852)) -* **client:** add/rename methods for headers/query params ([80ca5d9](https://github.com/openai/openai-java/commit/80ca5d90b7295388a1e9db40b9dd57ceaca2e579)) -* **client:** added structured fields to errors ([ffc1d7a](https://github.com/openai/openai-java/commit/ffc1d7aff146e486fa307e60b39fe38f26cb6a57)) -* **client:** clean up resource leaks when the resource becomes phantom reachable ([3ab123c](https://github.com/openai/openai-java/commit/3ab123c55f24d59174f89ec5e2d3fc05656ae574)) -* **client:** improve binary return values ([40e6b7c](https://github.com/openai/openai-java/commit/40e6b7cd2576956d802422f052b7acf038134d27)) -* **client:** more additional body param setters ([07262da](https://github.com/openai/openai-java/commit/07262daa6840d39e87fd83e71fa95a89830175f1)) -* **client:** propagate headers/query params methods to client builders ([ed455e3](https://github.com/openai/openai-java/commit/ed455e353ac3b6b8fbedffeb3f6d9bc0521b2d81)) -* **client:** replace multimaps with custom types ([c92580f](https://github.com/openai/openai-java/commit/c92580fdee8777878f7cfa39aabfa91cfdd6d123)) -* **client:** send retry count header ([8058647](https://github.com/openai/openai-java/commit/8058647cf019c5c8721cdc11e482990d54a27d29)) -* **client:** set `X-Stainless-Runtime` header ([1576020](https://github.com/openai/openai-java/commit/157602059951cb48b1a8128650d6d47135a221c0)) -* **client:** simplify structure of strings with presets ([c6f3499](https://github.com/openai/openai-java/commit/c6f349985ec2e9a4e50d558aa0dc9e286beec606)) -* **client:** support error property ([aef3473](https://github.com/openai/openai-java/commit/aef347380dcd087c9186751d0cb85075d557bb81)) -* **client:** support union discriminators in deserialization ([fd0e4bd](https://github.com/openai/openai-java/commit/fd0e4bddc34d7f8080d58b6b184876defe43295e)) -* extract out `ImageModel`, `AudioModel`, `SpeechModel` ([7c23848](https://github.com/openai/openai-java/commit/7c23848e3b1b6ad8285a2681690463c96ccbd568)) -* make enums not nominal ([dce0b9e](https://github.com/openai/openai-java/commit/dce0b9e8e306d67d4dd80f96c9a5ae49c0490eb2)) -* updates ([4fbb12b](https://github.com/openai/openai-java/commit/4fbb12ba26202ec7ce987cc6e526ae37ad317e7d)) -* updates ([303b5f2](https://github.com/openai/openai-java/commit/303b5f2597ec12e3d42d5d2e99a8dd6cebe1e443)) -* updates ([#4](https://github.com/openai/openai-java/issues/4)) ([af9f9a2](https://github.com/openai/openai-java/commit/af9f9a2718b2710e0a0e0c514600e3833c1274d3)) -* **vector store:** improve chunking strategy type names ([1e5d0cd](https://github.com/openai/openai-java/commit/1e5d0cd558b977710779816931c0ebe73630c7cc)) - - -### Bug Fixes - -* **audio:** correct response_format translations type ([f84b960](https://github.com/openai/openai-java/commit/f84b960b3f16381339d9f0aea31efcae7967743c)) -* **client:** accidental double-wrapping with `RetryingHttpClient` ([c96911b](https://github.com/openai/openai-java/commit/c96911bcf018c6092e8418f004eaae7edceb7373)) -* **client:** add `@JvmOverloads` to `HttpClient` methods ([95344ef](https://github.com/openai/openai-java/commit/95344ef8e6a2cc4ebe66ad055cd40d5a626ea122)) -* **client:** correct types for transcriptions / translations ([5207123](https://github.com/openai/openai-java/commit/520712379713a5584b1e1e19ed1f558e11296c8c)) -* **client:** disallow reusing stream response ([6eb1979](https://github.com/openai/openai-java/commit/6eb197996ddf43c8c83178a9991e179f4dd6ffb3)) -* **client:** don't generate default variant field/method names with underscores ([c49334f](https://github.com/openai/openai-java/commit/c49334f0afe7dd14294057ab89caee5a6033a24d)) -* **client:** ensure constructed objects are immutable ([ef4d884](https://github.com/openai/openai-java/commit/ef4d884b2a588ef4783715f9892e166884de2b98)) -* **client:** ensure SSE `BufferedReader` gets closed ([685553f](https://github.com/openai/openai-java/commit/685553fe2baeb2aa5910420f91e52dd7f1d2ca43)) -* **client:** error class `toBuilder` not copying fields ([92b5889](https://github.com/openai/openai-java/commit/92b5889eae621f3a0631baf267728bea6f76ebb8)) -* **client:** escape keywords reserved in java, but not in kotlin, for the java sdk ([12e0cc6](https://github.com/openai/openai-java/commit/12e0cc6779a068ff4ebddd9c24b61ee4c4e2e6d3)) -* **client:** implement `hashCode` for `IsMissing` ([b841254](https://github.com/openai/openai-java/commit/b84125494eaddec9be09fb99565e08a37e642ae5)) -* **client:** naming of some variants ([3a764f2](https://github.com/openai/openai-java/commit/3a764f217901daff48327bbc420a3240b89c58ed)) -* **client:** naming of some variants ([881affb](https://github.com/openai/openai-java/commit/881affb889a401935e654c21b58fbf32623c4aca)) -* **client:** union and builder method naming conflicts ([3566be1](https://github.com/openai/openai-java/commit/3566be107efe17b175078a8263323e8fda46f77f)) -* **docs:** use correct putAdditionalProperty value ([babeb82](https://github.com/openai/openai-java/commit/babeb8279765a9cb723504bb7fa90cf3583e8574)) -* example for preset simplification ([#150](https://github.com/openai/openai-java/issues/150)) ([1c63b4b](https://github.com/openai/openai-java/commit/1c63b4bfeef3ee7da7503b90695c925268b055f0)) -* improve schema definitions ([6beee8a](https://github.com/openai/openai-java/commit/6beee8a45a0a4d223a79d65f9109a85717c62509)) -* **internal:** remove unnecessary error handler in client ([fe5be51](https://github.com/openai/openai-java/commit/fe5be514a8376791f845135cdd0ba8f3526c6056)) -* **internal:** remove unnecessary error handlers ([205ee00](https://github.com/openai/openai-java/commit/205ee00386acea1d9d3fea5ca8daadaa7d1fb153)) -* remove additionalBodyProperties from methods that don't support request bodies ([df81636](https://github.com/openai/openai-java/commit/df81636724f6cc92415ea6943f488e1f6e0c56af)) - - -### Chores - -* **ci:** bump prism mock server version ([16fcad2](https://github.com/openai/openai-java/commit/16fcad24cc484d1547c9d2bb94a77deb61b623ed)) -* **ci:** codeowners file ([0e29d12](https://github.com/openai/openai-java/commit/0e29d123be1658404828bbffa7b35a1501031f6d)) -* **ci:** run tests in CI ([7a8cd60](https://github.com/openai/openai-java/commit/7a8cd60add562cc099d4c44ea22f512d60a9ffd6)) -* **docs:** fix maxium typo ([c6258a2](https://github.com/openai/openai-java/commit/c6258a2f74aefbd97a0c43f5ca8fd4999d6c3475)) -* **internal:** delete unused function ([54eb041](https://github.com/openai/openai-java/commit/54eb0415e37598ed9b17f0d6fd3ec8d51f330b9e)) -* **internal:** omit unnecessary code ([e87d4ec](https://github.com/openai/openai-java/commit/e87d4eca8b4de770f7055ee6242666c32421ab3f)) -* **internal:** remove unnecessary `.buffered()` call ([2e43707](https://github.com/openai/openai-java/commit/2e4370738232c796d370988e95ed6a99e5fe1ad3)) -* **internal:** remove unnecessary `[@file](https://github.com/file):Suppress("OVERLOADS_INTERFACE")` ([0c219ed](https://github.com/openai/openai-java/commit/0c219edda523212d2460df8360ccd79763442e0d)) -* **internal:** remove unnecessary `[@file](https://github.com/file):Suppress("OVERLOADS_INTERFACE")` ([fbf13e1](https://github.com/openai/openai-java/commit/fbf13e114830c38de0652db237066ea9f9923fa9)) -* **internal:** remove unnecessary `[@file](https://github.com/file):Suppress("OVERLOADS_INTERFACE")` ([b8ab775](https://github.com/openai/openai-java/commit/b8ab7759736a611eceb0717e7a459386a9246d5e)) -* **internal:** remove unused test file ([24d08bb](https://github.com/openai/openai-java/commit/24d08bb4e10bce76c9b9cc2dd69a2acf89ee1335)) -* **internal:** remove useless `[@file](https://github.com/file):JvmSynthetic` ([046092d](https://github.com/openai/openai-java/commit/046092d8b8fc67bf2a2c267b9559be767174c0af)) -* **internal:** update spec link ([a3b99f8](https://github.com/openai/openai-java/commit/a3b99f80f03d2b262e0a2d466c9ceef1efbe5cbe)) -* **internal:** update spec url ([6d8a32d](https://github.com/openai/openai-java/commit/6d8a32d32396bec8941a8f4a021d593a9bf6613e)) -* sync openapi url ([1868ddd](https://github.com/openai/openai-java/commit/1868ddd67b3735fd46d9c236e468771532d9865d)) -* **tests:** add tests for services ([c58ba71](https://github.com/openai/openai-java/commit/c58ba718a77ab92724ee1e30576fe045b264925a)) -* **tests:** update prism version ([f7cb198](https://github.com/openai/openai-java/commit/f7cb19834c7fb1a89d1a5a34241037f95433d683)) -* **types:** define FilePurpose enum ([e2c15b1](https://github.com/openai/openai-java/commit/e2c15b12f2c0e3bb91b0cc4287676c4223980514)) -* unknown commit message ([6eb1979](https://github.com/openai/openai-java/commit/6eb197996ddf43c8c83178a9991e179f4dd6ffb3)) -* unknown commit message ([c6f3499](https://github.com/openai/openai-java/commit/c6f349985ec2e9a4e50d558aa0dc9e286beec606)) -* unknown commit message ([92b5889](https://github.com/openai/openai-java/commit/92b5889eae621f3a0631baf267728bea6f76ebb8)) -* unknown commit message ([07262da](https://github.com/openai/openai-java/commit/07262daa6840d39e87fd83e71fa95a89830175f1)) -* unknown commit message ([c92580f](https://github.com/openai/openai-java/commit/c92580fdee8777878f7cfa39aabfa91cfdd6d123)) -* unknown commit message ([c6089f1](https://github.com/openai/openai-java/commit/c6089f14f4317f224de4996d0e0c59042c733738)) -* unknown commit message ([a72d1ea](https://github.com/openai/openai-java/commit/a72d1eacfdd66d2e7ae43d345fc6d5c08ed45bcf)) -* unknown commit message ([80ca5d9](https://github.com/openai/openai-java/commit/80ca5d90b7295388a1e9db40b9dd57ceaca2e579)) -* unknown commit message ([4fd6c23](https://github.com/openai/openai-java/commit/4fd6c23c05fe8f16bd9648f2bb2db81e4ffa7b7c)) -* unknown commit message ([ed455e3](https://github.com/openai/openai-java/commit/ed455e353ac3b6b8fbedffeb3f6d9bc0521b2d81)) -* unknown commit message ([bf7b4a2](https://github.com/openai/openai-java/commit/bf7b4a2115acac93c0b13b0d85187ef06179263a)) -* unknown commit message ([02b56b3](https://github.com/openai/openai-java/commit/02b56b36df73fe9678453af31fbd75e02f7d59bc)) -* unknown commit message ([93141d4](https://github.com/openai/openai-java/commit/93141d47a05c71148459877d0baee76ae1a6e2f8)) -* unknown commit message ([ef4d884](https://github.com/openai/openai-java/commit/ef4d884b2a588ef4783715f9892e166884de2b98)) -* unknown commit message ([505c349](https://github.com/openai/openai-java/commit/505c349f3aa299235437ce1e836ce7249db3e082)) -* unknown commit message ([54eb041](https://github.com/openai/openai-java/commit/54eb0415e37598ed9b17f0d6fd3ec8d51f330b9e)) -* unknown commit message ([44ab47a](https://github.com/openai/openai-java/commit/44ab47af71058241516a6998c0fcfc9e84db7074)) -* unknown commit message ([c4d5fbd](https://github.com/openai/openai-java/commit/c4d5fbd7707d1b1cd13a72b13c48a767f0fd95b1)) -* unknown commit message ([3ab123c](https://github.com/openai/openai-java/commit/3ab123c55f24d59174f89ec5e2d3fc05656ae574)) -* unknown commit message ([685553f](https://github.com/openai/openai-java/commit/685553fe2baeb2aa5910420f91e52dd7f1d2ca43)) -* unknown commit message ([d86694a](https://github.com/openai/openai-java/commit/d86694a85e2afb3179970e8e269f4e8c5c4f4801)) -* unknown commit message ([2e43707](https://github.com/openai/openai-java/commit/2e4370738232c796d370988e95ed6a99e5fe1ad3)) -* unknown commit message ([c96911b](https://github.com/openai/openai-java/commit/c96911bcf018c6092e8418f004eaae7edceb7373)) -* unknown commit message ([5bab5cc](https://github.com/openai/openai-java/commit/5bab5cc526b2781d1a4c6775803fc9ebe83e4ced)) -* unknown commit message ([1576020](https://github.com/openai/openai-java/commit/157602059951cb48b1a8128650d6d47135a221c0)) -* unknown commit message ([48a86ca](https://github.com/openai/openai-java/commit/48a86caae55cafff11f162c0aef66801b04c6036)) -* unknown commit message ([b841254](https://github.com/openai/openai-java/commit/b84125494eaddec9be09fb99565e08a37e642ae5)) -* unknown commit message ([aef3473](https://github.com/openai/openai-java/commit/aef347380dcd087c9186751d0cb85075d557bb81)) -* unknown commit message ([734939c](https://github.com/openai/openai-java/commit/734939c9668d8a431d1554752e1fe48a77180166)) -* unknown commit message ([95344ef](https://github.com/openai/openai-java/commit/95344ef8e6a2cc4ebe66ad055cd40d5a626ea122)) -* unknown commit message ([0c219ed](https://github.com/openai/openai-java/commit/0c219edda523212d2460df8360ccd79763442e0d)) -* unknown commit message ([046092d](https://github.com/openai/openai-java/commit/046092d8b8fc67bf2a2c267b9559be767174c0af)) -* unknown commit message ([f0bc243](https://github.com/openai/openai-java/commit/f0bc243a7836cdf17c479ac569c102fbc361de6d)) -* unknown commit message ([86e3988](https://github.com/openai/openai-java/commit/86e39880b82056625a3b91a5412b7b298777a54f)) -* unknown commit message ([b8ab775](https://github.com/openai/openai-java/commit/b8ab7759736a611eceb0717e7a459386a9246d5e)) -* unknown commit message ([2d98a2c](https://github.com/openai/openai-java/commit/2d98a2cc9298d35195569b391e6bead608cf9ad6)) -* unknown commit message ([c58ba71](https://github.com/openai/openai-java/commit/c58ba718a77ab92724ee1e30576fe045b264925a)) -* unknown commit message ([881affb](https://github.com/openai/openai-java/commit/881affb889a401935e654c21b58fbf32623c4aca)) -* unknown commit message ([0b8b5a8](https://github.com/openai/openai-java/commit/0b8b5a8d01b40eab8c4ad106fa921011490fc1a0)) -* unknown commit message ([a804776](https://github.com/openai/openai-java/commit/a804776306e32cea48ac739506d5abfa940fb528)) -* unknown commit message ([e8fc6aa](https://github.com/openai/openai-java/commit/e8fc6aa620dddcde92a5aaedb7aa90ae1b3ac852)) -* unknown commit message ([fd0e4bd](https://github.com/openai/openai-java/commit/fd0e4bddc34d7f8080d58b6b184876defe43295e)) -* unknown commit message ([3566be1](https://github.com/openai/openai-java/commit/3566be107efe17b175078a8263323e8fda46f77f)) -* unknown commit message ([fe5be51](https://github.com/openai/openai-java/commit/fe5be514a8376791f845135cdd0ba8f3526c6056)) -* unknown commit message ([205ee00](https://github.com/openai/openai-java/commit/205ee00386acea1d9d3fea5ca8daadaa7d1fb153)) -* unknown commit message ([e87d4ec](https://github.com/openai/openai-java/commit/e87d4eca8b4de770f7055ee6242666c32421ab3f)) -* unknown commit message ([b8509fb](https://github.com/openai/openai-java/commit/b8509fb3e890fb04169e38eed53ae53e065e285c)) -* unknown commit message ([f8eceaa](https://github.com/openai/openai-java/commit/f8eceaac33a5e7ff8c1b6709a340cdfd4340f7b9)) -* unknown commit message ([3989402](https://github.com/openai/openai-java/commit/3989402436c2861ff3bfeba3ca9acb42dbabf97c)) -* unknown commit message ([c49334f](https://github.com/openai/openai-java/commit/c49334f0afe7dd14294057ab89caee5a6033a24d)) -* unknown commit message ([c6e40de](https://github.com/openai/openai-java/commit/c6e40de655bd30d0b1f14e3af1fd1ff1dfed89ae)) -* unknown commit message ([12e0cc6](https://github.com/openai/openai-java/commit/12e0cc6779a068ff4ebddd9c24b61ee4c4e2e6d3)) -* unknown commit message ([9ec34a8](https://github.com/openai/openai-java/commit/9ec34a8db82f710beff43591dbf1e6e74b87346e)) -* unknown commit message ([670e73f](https://github.com/openai/openai-java/commit/670e73f06813b9b56e424dafb98fec6d3a5249d2)) -* unknown commit message ([5207123](https://github.com/openai/openai-java/commit/520712379713a5584b1e1e19ed1f558e11296c8c)) -* unknown commit message ([8058647](https://github.com/openai/openai-java/commit/8058647cf019c5c8721cdc11e482990d54a27d29)) -* unknown commit message ([6d8a32d](https://github.com/openai/openai-java/commit/6d8a32d32396bec8941a8f4a021d593a9bf6613e)) -* unknown commit message ([b9db26a](https://github.com/openai/openai-java/commit/b9db26a0d021be09a4b201ba15570e049cb2939f)) -* unknown commit message ([ffc1d7a](https://github.com/openai/openai-java/commit/ffc1d7aff146e486fa307e60b39fe38f26cb6a57)) -* unknown commit message ([5d05171](https://github.com/openai/openai-java/commit/5d0517135e5d2b404e81fad598865df188aaed57)) -* unknown commit message ([1e5d0cd](https://github.com/openai/openai-java/commit/1e5d0cd558b977710779816931c0ebe73630c7cc)) -* unknown commit message ([b72a723](https://github.com/openai/openai-java/commit/b72a7235865640e600ebaa3c8a739392c24c944d)) -* unknown commit message ([df81636](https://github.com/openai/openai-java/commit/df81636724f6cc92415ea6943f488e1f6e0c56af)) -* unknown commit message ([babeb82](https://github.com/openai/openai-java/commit/babeb8279765a9cb723504bb7fa90cf3583e8574)) -* unknown commit message ([e2c15b1](https://github.com/openai/openai-java/commit/e2c15b12f2c0e3bb91b0cc4287676c4223980514)) -* unknown commit message ([1868ddd](https://github.com/openai/openai-java/commit/1868ddd67b3735fd46d9c236e468771532d9865d)) -* unknown commit message ([16fcad2](https://github.com/openai/openai-java/commit/16fcad24cc484d1547c9d2bb94a77deb61b623ed)) -* unknown commit message ([0e29d12](https://github.com/openai/openai-java/commit/0e29d123be1658404828bbffa7b35a1501031f6d)) -* unknown commit message ([c818fda](https://github.com/openai/openai-java/commit/c818fda81b7919c6f253046252913920d827c2c3)) -* unknown commit message ([dce0b9e](https://github.com/openai/openai-java/commit/dce0b9e8e306d67d4dd80f96c9a5ae49c0490eb2)) -* unknown commit message ([7c23848](https://github.com/openai/openai-java/commit/7c23848e3b1b6ad8285a2681690463c96ccbd568)) -* unknown commit message ([7a8cd60](https://github.com/openai/openai-java/commit/7a8cd60add562cc099d4c44ea22f512d60a9ffd6)) -* unknown commit message ([40e6b7c](https://github.com/openai/openai-java/commit/40e6b7cd2576956d802422f052b7acf038134d27)) -* unknown commit message ([24d08bb](https://github.com/openai/openai-java/commit/24d08bb4e10bce76c9b9cc2dd69a2acf89ee1335)) -* unknown commit message ([f7cb198](https://github.com/openai/openai-java/commit/f7cb19834c7fb1a89d1a5a34241037f95433d683)) -* unknown commit message ([a5a855e](https://github.com/openai/openai-java/commit/a5a855e85ded4f483506f4d35aeef8aee43a3adc)) -* unknown commit message ([303b5f2](https://github.com/openai/openai-java/commit/303b5f2597ec12e3d42d5d2e99a8dd6cebe1e443)) -* update repo name ([11c62f2](https://github.com/openai/openai-java/commit/11c62f225705c5314cb4044f9a0ac2dfa878ee14)) -* use headless jdk for containers ([b72a723](https://github.com/openai/openai-java/commit/b72a7235865640e600ebaa3c8a739392c24c944d)) - - -### Documentation - -* adjust additional properties example ([5d05171](https://github.com/openai/openai-java/commit/5d0517135e5d2b404e81fad598865df188aaed57)) - - -### Styles - -* **client:** disable formatting for java boilerplate ([c6e40de](https://github.com/openai/openai-java/commit/c6e40de655bd30d0b1f14e3af1fd1ff1dfed89ae)) -* **client:** make toString methods consistent ([0b8b5a8](https://github.com/openai/openai-java/commit/0b8b5a8d01b40eab8c4ad106fa921011490fc1a0)) -* **client:** move equals, hashCode, and toString to the bottom of entity files ([9ec34a8](https://github.com/openai/openai-java/commit/9ec34a8db82f710beff43591dbf1e6e74b87346e)) -* **internal:** improve `OkHttpClient` formatting ([70f673c](https://github.com/openai/openai-java/commit/70f673cc64082ee7218377dc3439cc1aef404aa3)) -* **internal:** improve `OkHttpClient` formatting ([86e3988](https://github.com/openai/openai-java/commit/86e39880b82056625a3b91a5412b7b298777a54f)) -* **internal:** improve `RetryingHttpClient` formatting ([734939c](https://github.com/openai/openai-java/commit/734939c9668d8a431d1554752e1fe48a77180166)) -* **internal:** improve terseness of handlers ([3989402](https://github.com/openai/openai-java/commit/3989402436c2861ff3bfeba3ca9acb42dbabf97c)) -* **internal:** improve terseness of Properties.kt ([f8eceaa](https://github.com/openai/openai-java/commit/f8eceaac33a5e7ff8c1b6709a340cdfd4340f7b9)) -* **internal:** make `getOrThrow` terse and consistent ([44ab47a](https://github.com/openai/openai-java/commit/44ab47af71058241516a6998c0fcfc9e84db7074)) -* **internal:** move Handlers.kt and HttpRequestBodies.kt to core ([b8509fb](https://github.com/openai/openai-java/commit/b8509fb3e890fb04169e38eed53ae53e065e285c)) -* **internal:** rename `streamingResponse` to `streamResponse` ([d86694a](https://github.com/openai/openai-java/commit/d86694a85e2afb3179970e8e269f4e8c5c4f4801)) -* **internal:** simplify client build method ([f0bc243](https://github.com/openai/openai-java/commit/f0bc243a7836cdf17c479ac569c102fbc361de6d)) -* **internal:** update comment formatting ([2d98a2c](https://github.com/openai/openai-java/commit/2d98a2cc9298d35195569b391e6bead608cf9ad6)) -* **internal:** use `if` and `if-else` instead of `when` idiomatically ([a804776](https://github.com/openai/openai-java/commit/a804776306e32cea48ac739506d5abfa940fb528)) - - -### Refactors - -* **client:** http request methods ([c6089f1](https://github.com/openai/openai-java/commit/c6089f14f4317f224de4996d0e0c59042c733738)) -* **client:** rename header and query params builder methods ([4fd6c23](https://github.com/openai/openai-java/commit/4fd6c23c05fe8f16bd9648f2bb2db81e4ffa7b7c)) -* **internal:** inline `MoreExecutors` usage ([505c349](https://github.com/openai/openai-java/commit/505c349f3aa299235437ce1e836ce7249db3e082)) -* **internal:** polish `ClientOptions` ([13c9038](https://github.com/openai/openai-java/commit/13c90382eb033c19724039f8bf143757f38f5df0)) -* **internal:** polish `ClientOptions` ([93141d4](https://github.com/openai/openai-java/commit/93141d47a05c71148459877d0baee76ae1a6e2f8)) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 000a814bd..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,276 +0,0 @@ -# Contributing to OpenAI Java SDK - -## Setting up the environment - -This repository uses [Gradle](https://gradle.org/) with Kotlin DSL for building and dependency -management. The framework-neutral SDK requires Java 8, while development requires JDK 21 for the -Kotlin toolchain. See the [Java version support policy](docs/version-support-policy.md) for -artifact-level runtime, framework, lifecycle, and release rules. - -## Project structure - -The SDK's primary artifacts are: - -- `openai-java-core` - - Contains core SDK logic - - Does not depend on [OkHttp](https://square.github.io/okhttp) - - Exposes [`OpenAIClient`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClient.kt), [`OpenAIClientAsync`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsync.kt), [`OpenAIClientImpl`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientImpl.kt), and [`OpenAIClientAsyncImpl`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsyncImpl.kt), all of which can work with any HTTP client -- `openai-java-client-okhttp` - - Depends on [OkHttp](https://square.github.io/okhttp) - - Exposes [`OpenAIOkHttpClient`](openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClient.kt) and [`OpenAIOkHttpClientAsync`](openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClientAsync.kt), which provide a way to construct [`OpenAIClientImpl`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientImpl.kt) and [`OpenAIClientAsyncImpl`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsyncImpl.kt), respectively, using OkHttp -- `openai-java` - - Depends on and exposes the APIs of both `openai-java-core` and `openai-java-client-okhttp` - - Does not have its own logic -- `openai-java-bedrock` - - Adds optional Amazon Bedrock authentication and credential-provider integration - -The retired Spring Boot 2 starter is not part of the active build. Its final source remains available -in the [`v4.45.0` tag](https://github.com/openai/openai-java/tree/v4.45.0/openai-java-spring-boot-starter), -and its lifecycle history and consumer migration path are documented in the -[Spring Boot 2 EOL decision](docs/spring-boot-2-eol.md). - -`openai-java-runtime-compatibility` is a non-published fixture that exercises representative -behavior for each supported artifact on an isolated runtime classpath. Its JVM matrix and each -artifact's eligibility on a given JVM come from `gradle/version-support.properties`. - -## Modifying or adding code - -Most of the SDK is generated code. Modifications to code will be persisted between generations, but may -result in merge conflicts between manual patches and changes from the generator. The generator will never -modify the contents of the `openai-java-example/` directory. - -## Adding and running examples - -All files in the `openai-java-example/` directory are not modified by the generator and can be freely edited or added to. - -```java -// openai-java-example/src/main/java/com/openai/example/YourExample.java -package com.openai.example; - -public class YourExample { - public static void main(String[] args) { - // ... - } -} -``` - -```sh -$ ./gradlew :openai-java-example:run -PmainClass=com.openai.example.YourExample -``` - -## Using the repository from source - -If you'd like to use the repository from source, you can either [install from git](https://jitpack.io/) or link to a cloned repository. - -To use a local version of this library from source in another project, you can publish it to your local Maven repository: - -```sh -$ ./gradlew publishToMavenLocal -``` - -> [!NOTE] -> For now, to publish locally, you'll need to comment out the line for `signAllPublications()` here: `buildSrc/src/main/kotlin/openai.publish.gradle.kts` - -Then in your project's `build.gradle.kts` or `pom.xml`, reference the locally published version: - - - -```kotlin -implementation("com.openai:openai-java:2.9.1") -``` - -```xml - - com.openai - openai-java - 2.9.1 - -``` - - - -Alternatively, you can build and install the JAR files directly: - -```sh -$ ./gradlew build -``` - -JAR files will be available in each module's `build/libs/` directory. - -## Running tests - -Most tests require [our mock server](https://github.com/stoplightio/prism) to be running against the OpenAPI spec to work. - -The test script will automatically start the mock server for you (if it's not already running) and run the tests against it: - -```sh -$ ./scripts/test -``` - -You can also manually start the mock server if you want to run tests repeatedly: - -```sh -$ ./scripts/mock -``` - -Then run the tests: - -```sh -$ ./scripts/test - -``` - -### Test configuration - -- Tests run in parallel for better performance -- Mock server runs on `localhost:4010` -- You can disable mock server tests with `SKIP_MOCK_TESTS=true` -- You can target a custom API URL with `TEST_API_BASE_URL=` - -### Testing framework - -The project uses: - -- **JUnit 5** for test framework -- **Mockito** for mocking -- **AssertJ** for fluent assertions -- **WireMock** for HTTP service mocking -- **Custom TestServerExtension** for mock server management - -## Linting and formatting - -This repository uses [Spotless](https://github.com/diffplug/spotless) with Palantir Java Format for code formatting and various linting tools. - -To check formatting and run lints: - -```sh -$ ./scripts/lint -``` - -This will compile all modules and run static analysis checks. - -To fix all formatting issues automatically: - -```sh -$ ./scripts/format -``` - -You can also check formatting directly with Gradle: - -```sh -$ ./gradlew spotlessCheck # Check formatting -``` - -## Building - -To build all modules: - -```sh -$ ./gradlew build -``` - -To build a specific module: - -```sh -$ ./gradlew :openai-java-core:build -``` - -## Adding and running examples - -All files in the `openai-java-example/` directory are not modified by the generator and can be freely edited or added to. - -```java -// add an example to openai-java-example/src/main/java/com/openai/example/.java - -package com.openai.example; - -public class YourExample { - public static void main(String[] args) { - // ... - } -} -``` - -## Publishing and releases - -Changes made to this repository via the automated release PR pipeline should publish to Maven Central automatically. If -the changes aren't made through the automated pipeline, you may want to make releases manually. - -### Publish with a GitHub workflow - -The [`Create releases` workflow](https://www.github.com/openai/openai-java/actions/workflows/create-releases.yml) -publishes new releases automatically. To recover a failed Maven Central publication, run that workflow manually from -`main` with the existing GitHub release tag. - -Before retrying, check Central Portal and confirm that the version has no existing deployment. Maven Central releases are -immutable, so do not upload the same version while an earlier deployment is still processing. The workflow verifies the -exact release source, runs the runtime compatibility matrix, and waits for every expected artifact to become public. - -The workflow requires the GitHub `publish` environment to be configured. - -The `publish` environment must have these environment secrets: - -- `OPENAI_SONATYPE_USERNAME` - The username from a Central Portal user token -- `OPENAI_SONATYPE_PASSWORD` - The password from a Central Portal user token -- `OPENAI_SONATYPE_GPG_SIGNING_KEY` - The ASCII-armored GPG private key used for signing artifacts -- `OPENAI_SONATYPE_GPG_SIGNING_PASSWORD` - The GPG key passphrase - -To rotate credentials, generate a new Central Portal user token and update `OPENAI_SONATYPE_USERNAME` and -`OPENAI_SONATYPE_PASSWORD`. If rotating the signing key, generate a passphrase-protected GPG key and publish the public -key: - -```sh -$ gpg --quick-gen-key "OpenAI Maven Central " rsa4096 sign 0 -$ gpg --list-secret-keys --keyid-format LONG -$ gpg --armor --export-secret-keys KEY_ID > openai-sonatype-signing-key.asc -$ gpg --keyserver keyserver.ubuntu.com --send-keys KEY_ID -``` - -The `0` makes the key non-expiring. `KEY_ID` is the value after the slash on the `sec` line from -`gpg --list-secret-keys`, for example `42B825E73825CCEB` in `sec rsa4096/42B825E73825CCEB`. The GPG email does not need -to match the Central Portal token account. - -```sh -$ gh secret set OPENAI_SONATYPE_USERNAME --env publish --repo openai/openai-java -$ gh secret set OPENAI_SONATYPE_PASSWORD --env publish --repo openai/openai-java -$ gh secret set OPENAI_SONATYPE_GPG_SIGNING_KEY --env publish --repo openai/openai-java < openai-sonatype-signing-key.asc -$ gh secret set OPENAI_SONATYPE_GPG_SIGNING_PASSWORD --env publish --repo openai/openai-java -``` - -After the rotated secrets work, revoke the old Central Portal token and remove any old repository-level copies of the -`OPENAI_SONATYPE_*` secrets. - -### Publish manually - -The GitHub workflow is preferred because it validates the immutable release identity and requires a Central Portal check -before retrying. If you need to publish directly as a last resort, first confirm in Central Portal that the version has no -existing deployment, then run: - -```sh -$ ./gradlew publishAndReleaseToMavenCentral \ - -PmavenCentralUsername="$SONATYPE_USERNAME" \ - -PmavenCentralPassword="$SONATYPE_PASSWORD" \ - --no-configuration-cache -``` - -This requires the following environment variables to be set: - -- `SONATYPE_USERNAME` - The username from a Central Portal user token -- `SONATYPE_PASSWORD` - The password from a Central Portal user token -- `GPG_SIGNING_KEY` - Your ASCII-armored GPG private key for signing artifacts -- `GPG_SIGNING_PASSWORD` - Your GPG key passphrase - -## Development tools - -### Available gradle tasks - -Some useful Gradle tasks: - -```sh -$ ./gradlew tasks # List all available tasks -$ ./gradlew build # Build all modules -$ ./gradlew test # Run all tests -$ ./gradlew spotlessApply # Format code -$ ./gradlew publishToMavenLocal # Publish to local Maven repository -$ ./gradlew dependencies # Show dependency tree -``` diff --git a/LICENSE b/LICENSE deleted file mode 100644 index cbb5bb26e..000000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2026 OpenAI - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md deleted file mode 100644 index 92a2c5cad..000000000 --- a/README.md +++ /dev/null @@ -1,2040 +0,0 @@ -# OpenAI Java API Library - - - -[![Maven Central](https://img.shields.io/maven-central/v/com.openai/openai-java)](https://central.sonatype.com/artifact/com.openai/openai-java/4.49.0) -[![javadoc](https://javadoc.io/badge2/com.openai/openai-java/4.49.0/javadoc.svg)](https://javadoc.io/doc/com.openai/openai-java/4.49.0) - - - -The OpenAI Java SDK provides convenient access to the [OpenAI REST API](https://platform.openai.com/docs) from applications written in Java. - - - -The REST API documentation can be found on [platform.openai.com](https://platform.openai.com/docs). Javadocs are available on [javadoc.io](https://javadoc.io/doc/com.openai/openai-java/4.49.0). - - - -## Installation - - - -### Gradle - -```kotlin -implementation("com.openai:openai-java:4.49.0") -``` - -### Maven - -```xml - - com.openai - openai-java - 4.49.0 - -``` - - - -## Requirements - -The framework-neutral SDK artifacts require Java 8 or later. Runtime floors and lifecycle states -are declared per artifact in the [Java version support policy](docs/version-support-policy.md). - -## Usage - -> [!TIP] -> See the [`openai-java-example`](openai-java-example/src/main/java/com/openai/example) directory for complete and runnable examples! - -The primary API for interacting with OpenAI models is the [Responses API](https://platform.openai.com/docs/api-reference/responses). You can generate text from the model with the code below. - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.responses.Response; -import com.openai.models.responses.ResponseCreateParams; - -// Configures using the `OPENAI_API_KEY`, `OPENAI_ORG_ID` and `OPENAI_PROJECT_ID` environment variables -OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - -ResponseCreateParams params = ResponseCreateParams.builder() - .input("Say this is a test") - .model(ChatModel.GPT_5_2) - .build(); -Response response = client.responses().create(params); -``` - -The previous standard (supported indefinitely) for generating text is the [Chat Completions API](https://platform.openai.com/docs/api-reference/chat). You can use that API to generate text from the model with the code below. - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletion; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -// Configures using the `openai.apiKey`, `openai.adminKey`, `openai.orgId`, `openai.projectId`, `openai.webhookSecret` and `openai.baseUrl` system properties -// Or configures using the `OPENAI_API_KEY`, `OPENAI_ADMIN_KEY`, `OPENAI_ORG_ID`, `OPENAI_PROJECT_ID`, `OPENAI_WEBHOOK_SECRET` and `OPENAI_BASE_URL` environment variables -OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - -ChatCompletionCreateParams params = ChatCompletionCreateParams.builder() - .addUserMessage("Say this is a test") - .model(ChatModel.GPT_5_2) - .build(); -ChatCompletion chatCompletion = client.chat().completions().create(params); -``` - -## Amazon Bedrock - -Use the optional `openai-java-bedrock` artifact to call OpenAI-compatible APIs on Amazon Bedrock -with normal AWS credentials: - - - -```kotlin -implementation("com.openai:openai-java-bedrock:4.49.0") -``` - - - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.BedrockOpenAIOkHttpClient; - -// Uses the standard AWS credential chain, including environment credentials, -// ~/.aws/credentials, AWS_PROFILE, workload roles, and instance metadata. -OpenAIClient client = BedrockOpenAIOkHttpClient.builder() - .awsRegion("us-east-1") - .build(); -``` - -Requests are signed with fresh AWS credentials on every attempt. Existing -`AWS_BEARER_TOKEN_BEDROCK` bearer credentials remain supported as a compatibility fallback. See -the [Amazon Bedrock guide](bedrock.md) for named profiles, temporary credentials, custom credential -providers, async streaming, precedence rules, and security guidance. - -## Client configuration - -Configure the client using system properties or environment variables: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; - -// Configures using the `openai.apiKey`, `openai.adminKey`, `openai.orgId`, `openai.projectId`, `openai.webhookSecret` and `openai.baseUrl` system properties -// Or configures using the `OPENAI_API_KEY`, `OPENAI_ADMIN_KEY`, `OPENAI_ORG_ID`, `OPENAI_PROJECT_ID`, `OPENAI_WEBHOOK_SECRET` and `OPENAI_BASE_URL` environment variables -OpenAIClient client = OpenAIOkHttpClient.fromEnv(); -``` - -Or manually: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; - -OpenAIClient client = OpenAIOkHttpClient.builder() - .apiKey("My API Key") - .adminApiKey("My Admin API Key") - .build(); -``` - -Or using a combination of the two approaches: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; - -OpenAIClient client = OpenAIOkHttpClient.builder() - // Configures using the `openai.apiKey`, `openai.adminKey`, `openai.orgId`, `openai.projectId`, `openai.webhookSecret` and `openai.baseUrl` system properties - // Or configures using the `OPENAI_API_KEY`, `OPENAI_ADMIN_KEY`, `OPENAI_ORG_ID`, `OPENAI_PROJECT_ID`, `OPENAI_WEBHOOK_SECRET` and `OPENAI_BASE_URL` environment variables - .fromEnv() - .apiKey("My API Key") - .build(); -``` - -See this table for the available options: - -| Setter | System property | Environment variable | Required | Default value | -| --------------- | ---------------------- | ----------------------- | -------- | ----------------------------- | -| `apiKey` | `openai.apiKey` | `OPENAI_API_KEY` | false | - | -| `adminApiKey` | `openai.adminKey` | `OPENAI_ADMIN_KEY` | false | - | -| `organization` | `openai.orgId` | `OPENAI_ORG_ID` | false | - | -| `project` | `openai.projectId` | `OPENAI_PROJECT_ID` | false | - | -| `webhookSecret` | `openai.webhookSecret` | `OPENAI_WEBHOOK_SECRET` | false | - | -| `baseUrl` | `openai.baseUrl` | `OPENAI_BASE_URL` | true | `"https://api.openai.com/v1"` | - -System properties take precedence over environment variables. - -> [!TIP] -> Don't create more than one client in the same application. Each client has a connection pool and -> thread pools, which are more efficient to share between requests. - -### Modifying configuration - -To temporarily use a modified client configuration, while reusing the same connection and thread pools, call `withOptions()` on any client or service: - -```java -import com.openai.client.OpenAIClient; - -OpenAIClient clientWithOptions = client.withOptions(optionsBuilder -> { - optionsBuilder.baseUrl("https://example.com"); - optionsBuilder.maxRetries(42); -}); -``` - -The `withOptions()` method does not affect the original client or service. - -### Workload identity authentication - -Workload identity authentication allows applications running in cloud environments (Kubernetes, Azure, GCP) to authenticate using short-lived tokens issued by the cloud provider, instead of long-lived API keys. - -#### Basic setup - -```java -import com.openai.auth.*; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; - -SubjectTokenProvider provider = K8sServiceAccountTokenProvider.builder().build(); - -WorkloadIdentity workloadIdentity = WorkloadIdentity.builder() - .identityProviderId("your-identity-provider-id") - .serviceAccountId("your-service-account-id") - .provider(provider) - .build(); - -OpenAIClient client = OpenAIOkHttpClient.builder() - .workloadIdentity(workloadIdentity) - .build(); -``` - -#### Kubernetes service account token provider - -```java -// Use default token path (/var/run/secrets/kubernetes.io/serviceaccount/token) -SubjectTokenProvider provider = K8sServiceAccountTokenProvider.builder().build(); -``` - -```java -// Or specify a custom token path -SubjectTokenProvider provider = K8sServiceAccountTokenProvider.builder() - .tokenPath("/custom/path/to/token") - .build(); -``` - -#### Azure Managed Identity provider - -```java -import com.openai.auth.*; - -// Use defaults (resource: https://management.azure.com/, api-version: 2018-02-01) -SubjectTokenProvider provider = AzureManagedIdentityTokenProvider.builder() - .build(); -``` - -```java -import com.openai.auth.*; - -// Or customize -SubjectTokenProvider provider = AzureManagedIdentityTokenProvider.builder() - .resource("https://management.azure.com/") - .apiVersion("2018-02-01") - .build(); -``` - -#### GCP ID token provider - -```java -import com.openai.auth.*; - -SubjectTokenProvider provider = GcpIdTokenProvider.builder() - .build(); -``` - -```java -import com.openai.auth.*; - -// Or customize the audience -SubjectTokenProvider provider = GcpIdTokenProvider.builder() - .audience("https://api.openai.com/v1") - .build(); -``` - -## Requests and responses - -To send a request to the OpenAI API, build an instance of some `Params` class and pass it to the corresponding client method. When the response is received, it will be deserialized into an instance of a Java class. - -For example, `client.chat().completions().create(...)` should be called with an instance of `ChatCompletionCreateParams`, and it will return an instance of `ChatCompletion`. - -## Immutability - -Each class in the SDK has an associated [builder](https://blogs.oracle.com/javamagazine/post/exploring-joshua-blochs-builder-design-pattern-in-java) or factory method for constructing it. - -Each class is [immutable](https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html) once constructed. If the class has an associated builder, then it has a `toBuilder()` method, which can be used to convert it back to a builder for making a modified copy. - -Because each class is immutable, builder modification will _never_ affect already built class instances. - -## Asynchronous execution - -The default client is synchronous. To switch to asynchronous execution, call the `async()` method: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletion; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import java.util.concurrent.CompletableFuture; - -// Configures using the `openai.apiKey`, `openai.adminKey`, `openai.orgId`, `openai.projectId`, `openai.webhookSecret` and `openai.baseUrl` system properties -// Or configures using the `OPENAI_API_KEY`, `OPENAI_ADMIN_KEY`, `OPENAI_ORG_ID`, `OPENAI_PROJECT_ID`, `OPENAI_WEBHOOK_SECRET` and `OPENAI_BASE_URL` environment variables -OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - -ChatCompletionCreateParams params = ChatCompletionCreateParams.builder() - .addUserMessage("Say this is a test") - .model(ChatModel.GPT_5_2) - .build(); -CompletableFuture chatCompletion = client.async().chat().completions().create(params); -``` - -Or create an asynchronous client from the beginning: - -```java -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletion; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import java.util.concurrent.CompletableFuture; - -// Configures using the `openai.apiKey`, `openai.adminKey`, `openai.orgId`, `openai.projectId`, `openai.webhookSecret` and `openai.baseUrl` system properties -// Or configures using the `OPENAI_API_KEY`, `OPENAI_ADMIN_KEY`, `OPENAI_ORG_ID`, `OPENAI_PROJECT_ID`, `OPENAI_WEBHOOK_SECRET` and `OPENAI_BASE_URL` environment variables -OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - -ChatCompletionCreateParams params = ChatCompletionCreateParams.builder() - .addUserMessage("Say this is a test") - .model(ChatModel.GPT_5_2) - .build(); -CompletableFuture chatCompletion = client.chat().completions().create(params); -``` - -The asynchronous client supports the same options as the synchronous one, except most methods return `CompletableFuture`s. - -## Streaming - -The SDK defines methods that return response "chunk" streams, where each chunk can be individually processed as soon as it arrives instead of waiting on the full response. Streaming methods generally correspond to [SSE](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) or [JSONL](https://jsonlines.org) responses. - -Some of these methods may have streaming and non-streaming variants, but a streaming method will always have a `Streaming` suffix in its name, even if it doesn't have a non-streaming variant. - -These streaming methods return [`StreamResponse`](openai-java-core/src/main/kotlin/com/openai/core/http/StreamResponse.kt) for synchronous clients: - -```java -import com.openai.core.http.StreamResponse; -import com.openai.models.chat.completions.ChatCompletionChunk; - -try (StreamResponse streamResponse = client.chat().completions().createStreaming(params)) { - streamResponse.stream().forEach(chunk -> { - System.out.println(chunk); - }); - System.out.println("No more chunks!"); -} -``` - -Or [`AsyncStreamResponse`](openai-java-core/src/main/kotlin/com/openai/core/http/AsyncStreamResponse.kt) for asynchronous clients: - -```java -import com.openai.core.http.AsyncStreamResponse; -import com.openai.models.chat.completions.ChatCompletionChunk; -import java.util.Optional; - -client.async().chat().completions().createStreaming(params).subscribe(chunk -> { - System.out.println(chunk); -}); - -// If you need to handle errors or completion of the stream -client.async().chat().completions().createStreaming(params).subscribe(new AsyncStreamResponse.Handler<>() { - @Override - public void onNext(ChatCompletionChunk chunk) { - System.out.println(chunk); - } - - @Override - public void onComplete(Optional error) { - if (error.isPresent()) { - System.out.println("Something went wrong!"); - throw new RuntimeException(error.get()); - } else { - System.out.println("No more chunks!"); - } - } -}); - -// Or use futures -client.async().chat().completions().createStreaming(params) - .subscribe(chunk -> { - System.out.println(chunk); - }) - .onCompleteFuture() - .whenComplete((unused, error) -> { - if (error != null) { - System.out.println("Something went wrong!"); - throw new RuntimeException(error); - } else { - System.out.println("No more chunks!"); - } - }); -``` - -Async streaming uses a dedicated per-client cached thread pool [`Executor`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html) to stream without blocking the current thread. This default is suitable for most purposes. - -To use a different `Executor`, configure the subscription using the `executor` parameter: - -```java -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -Executor executor = Executors.newFixedThreadPool(4); -client.async().chat().completions().createStreaming(params).subscribe( - chunk -> System.out.println(chunk), executor -); -``` - -Or configure the client globally using the `streamHandlerExecutor` method: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import java.util.concurrent.Executors; - -OpenAIClient client = OpenAIOkHttpClient.builder() - .fromEnv() - .streamHandlerExecutor(Executors.newFixedThreadPool(4)) - .build(); -``` - -### Streaming helpers - -The SDK provides conveniences for streamed chat completions. A -[`ChatCompletionAccumulator`](openai-java-core/src/main/kotlin/com/openai/helpers/ChatCompletionAccumulator.kt) -can record the stream of chat completion chunks in the response as they are processed and accumulate -a [`ChatCompletion`](openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletion.kt) -object similar to that which would have been returned by the non-streaming API. - -For a synchronous response add a -[`Stream.peek()`](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#peek-java.util.function.Consumer-) -call to the stream pipeline to accumulate each chunk: - -```java -import com.openai.core.http.StreamResponse; -import com.openai.helpers.ChatCompletionAccumulator; -import com.openai.models.chat.completions.ChatCompletion; -import com.openai.models.chat.completions.ChatCompletionChunk; - -ChatCompletionAccumulator chatCompletionAccumulator = ChatCompletionAccumulator.create(); - -try (StreamResponse streamResponse = - client.chat().completions().createStreaming(createParams)) { - streamResponse.stream() - .peek(chatCompletionAccumulator::accumulate) - .flatMap(completion -> completion.choices().stream()) - .flatMap(choice -> choice.delta().content().stream()) - .forEach(System.out::print); -} - -ChatCompletion chatCompletion = chatCompletionAccumulator.chatCompletion(); -``` - -For an asynchronous response, add the `ChatCompletionAccumulator` to the `subscribe()` call: - -```java -import com.openai.helpers.ChatCompletionAccumulator; -import com.openai.models.chat.completions.ChatCompletion; - -ChatCompletionAccumulator chatCompletionAccumulator = ChatCompletionAccumulator.create(); - -client.chat() - .completions() - .createStreaming(createParams) - .subscribe(chunk -> chatCompletionAccumulator.accumulate(chunk).choices().stream() - .flatMap(choice -> choice.delta().content().stream()) - .forEach(System.out::print)) - .onCompleteFuture() - .join(); - -ChatCompletion chatCompletion = chatCompletionAccumulator.chatCompletion(); -``` - -The SDK provides conveniences for streamed responses. A -[`ResponseAccumulator`](openai-java-core/src/main/kotlin/com/openai/helpers/ResponseAccumulator.kt) -can record the stream of response events as they are processed and accumulate a -[`Response`](openai-java-core/src/main/kotlin/com/openai/models/responses/Response.kt) -object similar to that which would have been returned by the non-streaming API. - -For a synchronous response add a -[`Stream.peek()`](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#peek-java.util.function.Consumer-) -call to the stream pipeline to accumulate each event: - -```java -import com.openai.core.http.StreamResponse; -import com.openai.helpers.ResponseAccumulator; -import com.openai.models.responses.Response; -import com.openai.models.responses.ResponseStreamEvent; - -ResponseAccumulator responseAccumulator = ResponseAccumulator.create(); - -try (StreamResponse streamResponse = - client.responses().createStreaming(createParams)) { - streamResponse.stream() - .peek(responseAccumulator::accumulate) - .flatMap(event -> event.outputTextDelta().stream()) - .forEach(textEvent -> System.out.print(textEvent.delta())); -} - -Response response = responseAccumulator.response(); -``` - -For an asynchronous response, add the `ResponseAccumulator` to the `subscribe()` call: - -```java -import com.openai.helpers.ResponseAccumulator; -import com.openai.models.responses.Response; - -ResponseAccumulator responseAccumulator = ResponseAccumulator.create(); - -client.responses() - .createStreaming(createParams) - .subscribe(event -> responseAccumulator.accumulate(event) - .outputTextDelta().ifPresent(textEvent -> System.out.print(textEvent.delta()))) - .onCompleteFuture() - .join(); - -Response response = responseAccumulator.response(); -``` - -## Structured outputs with JSON schemas - -Open AI [Structured Outputs](https://platform.openai.com/docs/guides/structured-outputs?api-mode=chat) -is a feature that ensures that the model will always generate responses that adhere to a supplied -[JSON schema](https://json-schema.org/overview/what-is-jsonschema). - -A JSON schema can be defined by creating a -[`ResponseFormatJsonSchema`](openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatJsonSchema.kt) -and setting it on the input parameters. However, for greater convenience, a JSON schema can instead -be derived automatically from the structure of an arbitrary Java class. The JSON content from the -response will then be converted automatically to an instance of that Java class. A full, working -example of the use of Structured Outputs with arbitrary Java classes can be seen in -[`StructuredOutputsExample`](openai-java-example/src/main/java/com/openai/example/StructuredOutputsExample.java). - -Java classes can contain fields declared to be instances of other classes and can use collections -(see [Defining JSON schema properties](#defining-json-schema-properties) for more details): - -```java -class Person { - public String name; - public int birthYear; -} - -class Book { - public String title; - public Person author; - public int publicationYear; -} - -class BookList { - public List books; -} -``` - -Pass the top-level class—`BookList` in this example—to `responseFormat(Class)` when building the -parameters and then access an instance of `BookList` from the generated message content in the -response: - -```java -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import com.openai.models.chat.completions.StructuredChatCompletionCreateParams; - -StructuredChatCompletionCreateParams params = ChatCompletionCreateParams.builder() - .addUserMessage("List some famous late twentieth century novels.") - .model(ChatModel.GPT_5_2) - .responseFormat(BookList.class) - .build(); - -client.chat().completions().create(params).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .flatMap(bookList -> bookList.books.stream()) - .forEach(book -> System.out.println(book.title + " by " + book.author.name)); -``` - -You can start building the parameters with an instance of -[`ChatCompletionCreateParams.Builder`](openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParams.kt) -or -[`StructuredChatCompletionCreateParams.Builder`](openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletionCreateParams.kt). -If you start with the former (which allows for more compact code) the builder type will change to -the latter when `ChatCompletionCreateParams.Builder.responseFormat(Class)` is called. - -If a field in a class is optional and does not require a defined value, you can represent this using -the [`java.util.Optional`](https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html) class. -It is up to the AI model to decide whether to provide a value for that field or leave it empty. - -```java -import java.util.Optional; - -class Book { - public String title; - public Person author; - public int publicationYear; - public Optional isbn; -} -``` - -Generic type information for fields is retained in the class's metadata, but _generic type erasure_ -applies in other scopes. While, for example, a JSON schema defining an array of books can be derived -from the `BookList.books` field with type `List`, a valid JSON schema cannot be derived from a -local variable of that same type, so the following will _not_ work: - -```java -List books = new ArrayList<>(); - -StructuredChatCompletionCreateParams> params = ChatCompletionCreateParams.builder() - .responseFormat(books.getClass()) - // ... - .build(); -``` - -If an error occurs while converting a JSON response to an instance of a Java class, the error -message will include the JSON response to assist in diagnosis. For instance, if the response is -truncated, the JSON data will be incomplete and cannot be converted to a class instance. If your -JSON response may contain sensitive information, avoid logging it directly, or ensure that you -redact any sensitive details from the error message. - -### Local JSON schema validation - -Structured Outputs supports a -[subset](https://platform.openai.com/docs/guides/structured-outputs#supported-schemas) of the JSON -Schema language. Schemas are generated automatically from classes to align with this subset. -However, due to the inherent structure of the classes, the generated schema may still violate -certain OpenAI schema restrictions, such as exceeding the maximum nesting depth or utilizing -unsupported data types. - -To facilitate compliance, the method `responseFormat(Class)` performs a validation check on the -schema derived from the specified class. This validation ensures that all restrictions are adhered -to. If any issues are detected, an exception will be thrown, providing a detailed message outlining -the reasons for the validation failure. - -- **Local Validation**: The validation process occurs locally, meaning no requests are sent to the - remote AI model. If the schema passes local validation, it is likely to pass remote validation as - well. -- **Remote Validation**: The remote AI model will conduct its own validation upon receiving the JSON - schema in the request. -- **Version Compatibility**: There may be instances where local validation fails while remote - validation succeeds. This can occur if the SDK version is outdated compared to the restrictions - enforced by the remote AI model. -- **Disabling Local Validation**: If you encounter compatibility issues and wish to bypass local - validation, you can disable it by passing - [`JsonSchemaLocalValidation.NO`](openai-java-core/src/main/kotlin/com/openai/core/JsonSchemaLocalValidation.kt) - to the `responseFormat(Class, JsonSchemaLocalValidation)` method when building the parameters. - (The default value for this parameter is `JsonSchemaLocalValidation.YES`.) - -```java -import com.openai.core.JsonSchemaLocalValidation; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import com.openai.models.chat.completions.StructuredChatCompletionCreateParams; - -StructuredChatCompletionCreateParams params = ChatCompletionCreateParams.builder() - .addUserMessage("List some famous late twentieth century novels.") - .model(ChatModel.GPT_5_2) - .responseFormat(BookList.class, JsonSchemaLocalValidation.NO) - .build(); -``` - -By following these guidelines, you can ensure that your structured outputs conform to the necessary -schema requirements and minimize the risk of remote validation errors. - -### Usage with the Responses API - -_Structured Outputs_ are also supported for the Responses API. The usage is the same as described -except where the Responses API differs slightly from the Chat Completions API. Pass the top-level -class to `text(Class)` when building the parameters and then access an instance of the class from -the generated message content in the response. - -You can start building the parameters with an instance of -[`ResponseCreateParams.Builder`](openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreateParams.kt) -or -[`StructuredResponseCreateParams.Builder`](openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseCreateParams.kt). -If you start with the former (which allows for more compact code) the builder type will change to -the latter when `ResponseCreateParams.Builder.text(Class)` is called. - -For a full example of the usage of _Structured Outputs_ with the Responses API, see -[`ResponsesStructuredOutputsExample`](openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsExample.java). - -Instead of using `ResponseCreateParams.text(Class)`, you can build a -[`StructuredResponseTextConfig`](openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseTextConfig.kt) -and set it on the `ResponseCreateParams` using the `text(StructuredResponseTextConfig)` method. -Similar to using `ResponseCreateParams`, you can start with a `ResponseTextConfig.Builder` and its -`format(Class)` method will change it to a `StructuredResponseTextConfig.Builder`. This also -allows you to set the `verbosity` configuration parameter on the text configuration before adding it -to the `ResponseCreateParams`. - -For a full example of the usage of _Structured Outputs_ with the `ResponseTextConfig` and its -`verbosity` parameter, see -[`ResponsesStructuredOutputsVerbosityExample`](openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsVerbosityExample.java). - -### Usage with streaming - -_Structured Outputs_ can also be used with [Streaming](#streaming) and the Chat Completions API. As -responses are returned in "chunks", the full response must first be accumulated to concatenate the -JSON strings that can then be converted into instances of the arbitrary Java class. Normal streaming -operations can be performed while accumulating the JSON strings. - -Use the [`ChatCompletionAccumulator`](openai-java-core/src/main/kotlin/com/openai/helpers/ChatCompletionAccumulator.kt) -as described in the section on [Streaming helpers](#streaming-helpers) to accumulate the JSON -strings. Once accumulated, use `ChatCompletionAccumulator.chatCompletion(Class)` to convert the -accumulated `ChatCompletion` into a -[`StructuredChatCompletion`](openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletion.kt). -The `StructuredChatCompletion` can then automatically deserialize the JSON strings into instances of -your Java class. - -For a full example of the usage of _Structured Outputs_ with Streaming and the Chat Completions API, -see -[`StructuredOutputsStreamingExample`](openai-java-example/src/main/java/com/openai/example/StructuredOutputsStreamingExample.java). - -With the Responses API, accumulate events while streaming using the -[`ResponseAccumulator`](openai-java-core/src/main/kotlin/com/openai/helpers/ResponseAccumulator.kt). -Once accumulated, use `ResponseAccumulator.response(Class)` to convert the accumulated `Response` -into a -[`StructuredResponse`](openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponse.kt). -The [`StructuredResponse`] can then automatically deserialize the JSON strings into instances of -your Java class. - -For a full example of the usage of _Structured Outputs_ with Streaming and the Responses API, see -[`ResponsesStructuredOutputsStreamingExample`](openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsStreamingExample.java). - -### Defining JSON schema properties - -When a JSON schema is derived from your Java classes, all properties represented by `public` fields -or `public` getter methods are included in the schema by default. Non-`public` fields and getter -methods are _not_ included by default. You can exclude `public`, or include non-`public` fields or -getter methods, by using the `@JsonIgnore` or `@JsonProperty` annotations respectively (see -[Annotating classes and JSON schemas](#annotating-classes-and-json-schemas) for details). - -If you do not want to define `public` fields, you can define `private` fields and corresponding -`public` getter methods. For example, a `private` field `myValue` with a `public` getter method -`getMyValue()` will result in a `"myValue"` property being included in the JSON schema. If you -prefer not to use the conventional Java "get" prefix for the name of the getter method, then you -_must_ annotate the getter method with the `@JsonProperty` annotation and the full method name will -be used as the property name. You do not have to define any corresponding setter methods if you do -not need them. - -Each of your classes _must_ define at least one property to be included in the JSON schema. A -validation error will occur if any class contains no fields or getter methods from which schema -properties can be derived. This may occur if, for example: - -- There are no fields or getter methods in the class. -- All fields and getter methods are `public`, but all are annotated with `@JsonIgnore`. -- All fields and getter methods are non-`public`, but none are annotated with `@JsonProperty`. -- A field or getter method is declared with a `Map` type. A `Map` is treated like a separate class - with no named properties, so it will result in an empty `"properties"` field in the JSON schema. - If you need arbitrary key/value data, model it as a list of entry objects with named fields so the - generated schema still has concrete property names. - -### Annotating classes and JSON schemas - -You can use annotations to add further information to the JSON schema derived from your Java -classes, or to control which fields or getter methods will be included in the schema. Details from -annotations captured in the JSON schema may be used by the AI model to improve its response. The SDK -supports the use of [Jackson Databind](https://github.com/FasterXML/jackson-databind) annotations. - -```java -import com.fasterxml.jackson.annotation.JsonClassDescription; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; - -class Person { - @JsonPropertyDescription("The first name and surname of the person") - public String name; - public int birthYear; - @JsonPropertyDescription("The year the person died, or 'present' if the person is living.") - public String deathYear; -} - -@JsonClassDescription("The details of one published book") -class Book { - public String title; - public Person author; - @JsonPropertyDescription("The year in which the book was first published.") - public int publicationYear; - @JsonIgnore public String genre; -} - -class BookList { - public List books; -} -``` - -- Use `@JsonClassDescription` to add a detailed description to a class. -- Use `@JsonPropertyDescription` to add a detailed description to a field or getter method of a - class. -- Use `@JsonIgnore` to exclude a `public` field or getter method of a class from the generated JSON - schema. -- Use `@JsonProperty` to include a non-`public` field or getter method of a class in the generated - JSON schema. - -If you use `@JsonProperty(required = false)`, the `false` value will be ignored. OpenAI JSON schemas -must mark all properties as _required_, so the schema generated from your Java classes will respect -that restriction and ignore any annotation that would violate it. - -You can also use [OpenAPI Swagger 2](https://swagger.io/specification/v2/) -[`@Schema`](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Annotations#schema) and -[`@ArraySchema`](https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Annotations#arrayschema) -annotations. These allow type-specific constraints to be added to your schema properties. You can -learn more about the supported constraints in the OpenAI documentation on -[Supported properties](https://platform.openai.com/docs/guides/structured-outputs#supported-properties). - -```java -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.media.ArraySchema; - -class Article { - @ArraySchema(minItems = 1, maxItems = 10) - public List authors; - - @Schema(pattern = "^[A-Za-z ]+$") - public String title; - - @Schema(format = "date") - public String publicationDate; - - @Schema(minimum = "1") - public int pageCount; -} -``` - -Local validation will check that you have not used any unsupported constraint keywords. However, the -values of the constraints are _not_ validated locally. For example, if you use a value for the -`"format"` constraint of a string property that is not in the list of -[supported format names](https://platform.openai.com/docs/guides/structured-outputs#supported-properties), -then local validation will pass, but the AI model may report an error. - -If you use both Jackson and Swagger annotations to set the same schema field, the Jackson annotation -will take precedence. In the following example, the description of `myProperty` will be set to -"Jackson description"; "Swagger description" will be ignored: - -```java -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import io.swagger.v3.oas.annotations.media.Schema; - -class MyObject { - @Schema(description = "Swagger description") - @JsonPropertyDescription("Jackson description") - public String myProperty; -} -``` - -## Function calling with JSON schemas - -OpenAI [Function Calling](https://platform.openai.com/docs/guides/function-calling?api-mode=chat) -lets you integrate external functions directly into the language model's responses. Instead of -producing plain text, the model can output instructions (with parameters) for calling a function -when appropriate. You define a [JSON schema](https://json-schema.org/overview/what-is-jsonschema) -for functions, and the model uses it to decide when and how to trigger these calls, enabling more -interactive, data-driven applications. - -A JSON schema describing a function's parameters can be defined via the API by building a -[`ChatCompletionTool`](openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionTool.kt) -containing a -[`FunctionDefinition`](openai-java-core/src/main/kotlin/com/openai/models/FunctionDefinition.kt) -and then using `addTool` to set it on the input parameters. The response from the AI model may then -contain requests to call your functions, detailing the functions' names and their parameter values -as JSON data that conforms to the JSON schema from the function definition. You can then parse the -parameter values from this JSON, invoke your functions, and pass your functions' results back to the -AI model. A full, working example of _Function Calling_ using the low-level API can be seen in -[`FunctionCallingRawExample`](openai-java-example/src/main/java/com/openai/example/FunctionCallingRawExample.java). - -However, for greater convenience, the SDK can derive a function and its parameters automatically -from the structure of an arbitrary Java class: the class's name provides the function name, and the -class's fields define the function's parameters. When the AI model responds with the parameter -values in JSON form, you can then easily convert that JSON to an instance of your Java class and -use the parameter values to invoke your custom function. A full, working example of the use of -_Function Calling_ with Java classes to define function parameters can be seen in -[`FunctionCallingExample`](openai-java-example/src/main/java/com/openai/example/FunctionCallingExample.java). - -Like for [Structured Outputs](#structured-outputs-with-json-schemas), Java classes can contain -fields declared to be instances of other classes and can use collections (see -[Defining JSON schema properties](#defining-json-schema-properties) for more details). Optionally, -annotations can be used to set the descriptions of the function (class) and its parameters (fields) -to assist the AI model in understanding the purpose of the function and the possible values of its -parameters. - -```java -import com.fasterxml.jackson.annotation.JsonClassDescription; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; - -@JsonClassDescription("Gets the quality of the given SDK.") -static class GetSdkQuality { - @JsonPropertyDescription("The name of the SDK.") - public String name; - - public SdkQuality execute() { - return new SdkQuality( - name, name.contains("OpenAI") ? "It's robust and polished!" : "*shrug*"); - } -} - -static class SdkQuality { - public String quality; - - public SdkQuality(String name, String evaluation) { - quality = name + ": " + evaluation; - } -} - -@JsonClassDescription("Gets the review score (out of 10) for the named SDK.") -static class GetSdkScore { - public String name; - - public int execute() { - return name.contains("OpenAI") ? 10 : 3; - } -} -``` - -When your functions are defined, add them to the input parameters using `addTool(Class)` and then -call them if requested to do so in the AI model's response. `Function.arguments(Class)` can be -used to parse a function's parameters in JSON form to an instance of your function-defining class. -The fields of that instance will be set to the values of the parameters to the function call. - -After calling the function, use `ChatCompletionToolMessageParam.Builder.contentAsJson(Object)` to -pass the function's result back to the AI model. The method will convert the result to JSON form -for consumption by the model. The `Object` can be any object, including simple `String` instances -and boxed primitive types. - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.*; -import java.util.Collection; - -OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - -ChatCompletionCreateParams.Builder createParamsBuilder = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .maxCompletionTokens(2048) - .addTool(GetSdkQuality.class) - .addTool(GetSdkScore.class) - .addUserMessage("How good are the following SDKs and what do reviewers say: " - + "OpenAI Java SDK, Unknown Company SDK."); - -client.chat().completions().create(createParamsBuilder.build()).choices().stream() - .map(ChatCompletion.Choice::message) - // Add each assistant message onto the builder so that we keep track of the - // conversation for asking a follow-up question later. - .peek(createParamsBuilder::addMessage) - .flatMap(message -> { - message.content().ifPresent(System.out::println); - return message.toolCalls().stream().flatMap(Collection::stream); - }) - .forEach(toolCall -> { - Object result = callFunction(toolCall.function()); - // Add the tool call result to the conversation. - createParamsBuilder.addMessage(ChatCompletionToolMessageParam.builder() - .toolCallId(toolCall.id()) - .contentAsJson(result) - .build()); - }); - -// Ask a follow-up question about the function call result. -createParamsBuilder.addUserMessage("Why do you say that?"); -client.chat().completions().create(createParamsBuilder.build()).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println); - -static Object callFunction(ChatCompletionMessageToolCall.Function function) { - switch (function.name()) { - case "GetSdkQuality": - return function.arguments(GetSdkQuality.class).execute(); - case "GetSdkScore": - return function.arguments(GetSdkScore.class).execute(); - default: - throw new IllegalArgumentException("Unknown function: " + function.name()); - } -} -``` - -In the code above, an `execute()` method encapsulates each function's logic. However, there is no -requirement to follow that pattern. You are free to implement your function's logic in any way that -best suits your use case. The pattern above is only intended to _suggest_ that a suitable pattern -may make the process of function calling simpler to understand and implement. - -### Usage with the Responses API - -_Function Calling_ is also supported for the Responses API. The usage is the same as described -except where the Responses API differs slightly from the Chat Completions API. Pass the top-level -class to `addTool(Class)` when building the parameters. In the response, look for -[`RepoonseOutputItem`](openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputItem.kt) -instances that are function calls. Parse the parameters to each function call to an instance of the -class using -[`ResponseFunctionToolCall.arguments(Class)`](openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCall.kt). -Finally, pass the result of each call back to the model. - -For a full example of the usage of _Function Calling_ with the Responses API using the low-level -API to define and parse function parameters, see -[`ResponsesFunctionCallingRawExample`](openai-java-example/src/main/java/com/openai/example/ResponsesFunctionCallingRawExample.java). - -For a full example of the usage of _Function Calling_ with the Responses API using Java classes to -define and parse function parameters, see -[`ResponsesFunctionCallingExample`](openai-java-example/src/main/java/com/openai/example/ResponsesFunctionCallingExample.java). - -### Local function JSON schema validation - -Like for _Structured Outputs_, you can perform local validation to check that the JSON schema -derived from your function class respects the restrictions imposed by OpenAI on such schemas. Local -validation is enabled by default, but it can be disabled by adding `JsonSchemaLocalValidation.NO` to -the call to `addTool`. - -```java -ChatCompletionCreateParams.Builder createParamsBuilder = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .maxCompletionTokens(2048) - .addTool(GetSdkQuality.class, JsonSchemaLocalValidation.NO) - .addTool(GetSdkScore.class, JsonSchemaLocalValidation.NO) - .addUserMessage("How good are the following SDKs and what do reviewers say: " - + "OpenAI Java SDK, Unknown Company SDK."); -``` - -See [Local JSON schema validation](#local-json-schema-validation) for more details on local schema -validation and under what circumstances you might want to disable it. - -### Annotating function classes - -You can use annotations to add further information about functions to the JSON schemas that are -derived from your function classes, or to control which fields or getter methods will be used as -parameters to the function. Details from annotations captured in the JSON schema may be used by the -AI model to improve its response. The SDK supports the use of -[Jackson Databind](https://github.com/FasterXML/jackson-databind) annotations. - -- Use `@JsonClassDescription` to add a description to a function class detailing when and how to use - that function. -- Use `@JsonTypeName` to set the function name to something other than the simple name of the class, - which is used by default. -- Use `@JsonPropertyDescription` to add a detailed description to function parameter (a field or - getter method of a function class). -- Use `@JsonIgnore` to exclude a `public` field or getter method of a class from the generated JSON - schema for a function's parameters. -- Use `@JsonProperty` to include a non-`public` field or getter method of a class in the generated - JSON schema for a function's parameters. - -OpenAI provides some -[Best practices for defining functions](https://platform.openai.com/docs/guides/function-calling#best-practices-for-defining-functions) -that may help you to understand how to use the above annotations effectively for your functions. - -See also [Defining JSON schema properties](#defining-json-schema-properties) for more details on how -to use fields and getter methods and combine access modifiers and annotations to define the -parameters of your functions. The same rules apply to function classes and to the structured output -classes described in that section. - -## File uploads - -The SDK defines methods that accept files. - -To upload a file, pass a [`Path`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html): - -```java -import com.openai.models.files.FileCreateParams; -import com.openai.models.files.FileObject; -import com.openai.models.files.FilePurpose; -import java.nio.file.Paths; - -FileCreateParams params = FileCreateParams.builder() - .purpose(FilePurpose.FINE_TUNE) - .file(Paths.get("input.jsonl")) - .build(); -FileObject fileObject = client.files().create(params); -``` - -Or an arbitrary [`InputStream`](https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html): - -```java -import com.openai.models.files.FileCreateParams; -import com.openai.models.files.FileObject; -import com.openai.models.files.FilePurpose; -import java.net.URL; - -FileCreateParams params = FileCreateParams.builder() - .purpose(FilePurpose.FINE_TUNE) - .file(new URL("https://example.com/input.jsonl").openStream()) - .build(); -FileObject fileObject = client.files().create(params); -``` - -Or a `byte[]` array: - -```java -import com.openai.models.files.FileCreateParams; -import com.openai.models.files.FileObject; -import com.openai.models.files.FilePurpose; - -FileCreateParams params = FileCreateParams.builder() - .purpose(FilePurpose.FINE_TUNE) - .file("content".getBytes()) - .build(); -FileObject fileObject = client.files().create(params); -``` - -Note that when passing a non-`Path` its filename is unknown so it will not be included in the request. To manually set a filename, pass a [`MultipartField`](openai-java-core/src/main/kotlin/com/openai/core/Values.kt): - -```java -import com.openai.core.MultipartField; -import com.openai.models.files.FileCreateParams; -import com.openai.models.files.FileObject; -import com.openai.models.files.FilePurpose; -import java.io.InputStream; -import java.net.URL; - -FileCreateParams params = FileCreateParams.builder() - .purpose(FilePurpose.FINE_TUNE) - .file(MultipartField.builder() - .value(new URL("https://example.com/input.jsonl").openStream()) - .filename("input.jsonl") - .build()) - .build(); -FileObject fileObject = client.files().create(params); -``` - -## Webhook Verification - -Verifying webhook signatures is _optional but encouraged_. - -For more information about webhooks, see [the API docs](https://platform.openai.com/docs/guides/webhooks). - -### Parsing webhook payloads - -For most use cases, you will likely want to verify the webhook and parse the payload at the same time. To achieve this, we provide the method `client.webhooks().unwrap()`, which parses a webhook request and verifies that it was sent by OpenAI. This method will throw an exception if the signature is invalid. - -Note that the `body` parameter must be the raw JSON string sent from the server (do not parse it first). The `.unwrap()` method will parse this JSON for you into an event object after verifying the webhook was sent from OpenAI. - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.http.Headers; -import com.openai.models.webhooks.UnwrapWebhookEvent; -import java.util.Optional; - -OpenAIClient client = OpenAIOkHttpClient.fromEnv(); // OPENAI_WEBHOOK_SECRET env var used by default - -public void handleWebhook(String body, Map headers) { - try { - Headers headersList = Headers.builder() - .putAll(headers) - .build(); - - UnwrapWebhookEvent event = client.webhooks().unwrap(body, headersList, Optional.empty()); - - if (event.isResponseCompletedWebhookEvent()) { - System.out.println("Response completed: " + event.asResponseCompletedWebhookEvent().data()); - } else if (event.isResponseFailed()) { - System.out.println("Response failed: " + event.asResponseFailed().data()); - } else { - System.out.println("Unhandled event type: " + event.getClass().getSimpleName()); - } - } catch (Exception e) { - System.err.println("Invalid webhook signature: " + e.getMessage()); - // Handle invalid signature - } -} -``` - -### Verifying webhook payloads directly - -In some cases, you may want to verify the webhook separately from parsing the payload. If you prefer to handle these steps separately, we provide the method `client.webhooks().verifySignature()` to _only verify_ the signature of a webhook request. Like `.unwrap()`, this method will throw an exception if the signature is invalid. - -Note that the `body` parameter must be the raw JSON string sent from the server (do not parse it first). You will then need to parse the body after verifying the signature. - -```java -import com.fasterxml.jackson.databind.ObjectMapper; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.http.Headers; -import com.openai.models.webhooks.WebhookVerificationParams; -import java.util.Optional; - -OpenAIClient client = OpenAIOkHttpClient.fromEnv(); // OPENAI_WEBHOOK_SECRET env var used by default -ObjectMapper objectMapper = new ObjectMapper(); - -public void handleWebhook(String body, Map headers) { - try { - Headers headersList = Headers.builder() - .putAll(headers) - .build(); - - client.webhooks().verifySignature( - WebhookVerificationParams.builder() - .payload(body) - .headers(headersList) - .build() - ); - - // Parse the body after verification - Map event = objectMapper.readValue(body, Map.class); - System.out.println("Verified event: " + event); - } catch (Exception e) { - System.err.println("Invalid webhook signature: " + e.getMessage()); - // Handle invalid signature - } -} -``` - -## Binary responses - -The SDK defines methods that return binary responses, which are used for API responses that shouldn't necessarily be parsed, like non-JSON data. - -These methods return [`HttpResponse`](openai-java-core/src/main/kotlin/com/openai/core/http/HttpResponse.kt): - -```java -import com.openai.core.http.HttpResponse; -import com.openai.models.files.FileContentParams; - -HttpResponse response = client.files().content("file_id"); -``` - -To save the response content to a file, use the [`Files.copy(...)`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#copy-java.io.InputStream-java.nio.file.Path-java.nio.file.CopyOption...-) method: - -```java -import com.openai.core.http.HttpResponse; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; - -try (HttpResponse response = client.files().content(params)) { - Files.copy( - response.body(), - Paths.get(path), - StandardCopyOption.REPLACE_EXISTING - ); -} catch (Exception e) { - System.out.println("Something went wrong!"); - throw new RuntimeException(e); -} -``` - -Or transfer the response content to any [`OutputStream`](https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html): - -```java -import com.openai.core.http.HttpResponse; -import java.nio.file.Files; -import java.nio.file.Paths; - -try (HttpResponse response = client.files().content(params)) { - response.body().transferTo(Files.newOutputStream(Paths.get(path))); -} catch (Exception e) { - System.out.println("Something went wrong!"); - throw new RuntimeException(e); -} -``` - -## Raw responses - -The SDK defines methods that deserialize responses into instances of Java classes. However, these methods don't provide access to the response headers, status code, or the raw response body. - -To access this data, prefix any HTTP method call on a client or service with `withRawResponse()`: - -```java -import com.openai.core.http.Headers; -import com.openai.core.http.HttpResponseFor; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletion; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -ChatCompletionCreateParams params = ChatCompletionCreateParams.builder() - .addUserMessage("Say this is a test") - .model(ChatModel.GPT_5_2) - .build(); -HttpResponseFor chatCompletion = client.chat().completions().withRawResponse().create(params); - -int statusCode = chatCompletion.statusCode(); -Headers headers = chatCompletion.headers(); -``` - -You can still deserialize the response into an instance of a Java class if needed: - -```java -import com.openai.models.chat.completions.ChatCompletion; - -ChatCompletion parsedChatCompletion = chatCompletion.parse(); -``` - -### Request IDs - -> For more information on debugging requests, see [the API docs](https://platform.openai.com/docs/api-reference/debugging-requests). - -When using raw responses, you can access the `x-request-id` response header using the `requestId()` method: - -```java -import com.openai.core.http.HttpResponseFor; -import com.openai.models.chat.completions.ChatCompletion; -import java.util.Optional; - -HttpResponseFor chatCompletion = client.chat().completions().withRawResponse().create(params); -Optional requestId = chatCompletion.requestId(); -``` - -This can be used to quickly log failing requests and report them back to OpenAI. - -## Error handling - -The SDK throws custom unchecked exception types: - -- [`OpenAIServiceException`](openai-java-core/src/main/kotlin/com/openai/errors/OpenAIServiceException.kt): Base class for HTTP errors. See this table for which exception subclass is thrown for each HTTP status code: - - | Status | Exception | - | ------ | ---------------------------------------------------------------------------------------------------------------------- | - | 400 | [`BadRequestException`](openai-java-core/src/main/kotlin/com/openai/errors/BadRequestException.kt) | - | 401 | [`UnauthorizedException`](openai-java-core/src/main/kotlin/com/openai/errors/UnauthorizedException.kt) | - | 403 | [`PermissionDeniedException`](openai-java-core/src/main/kotlin/com/openai/errors/PermissionDeniedException.kt) | - | 404 | [`NotFoundException`](openai-java-core/src/main/kotlin/com/openai/errors/NotFoundException.kt) | - | 422 | [`UnprocessableEntityException`](openai-java-core/src/main/kotlin/com/openai/errors/UnprocessableEntityException.kt) | - | 429 | [`RateLimitException`](openai-java-core/src/main/kotlin/com/openai/errors/RateLimitException.kt) | - | 5xx | [`InternalServerException`](openai-java-core/src/main/kotlin/com/openai/errors/InternalServerException.kt) | - | others | [`UnexpectedStatusCodeException`](openai-java-core/src/main/kotlin/com/openai/errors/UnexpectedStatusCodeException.kt) | - - [`SseException`](openai-java-core/src/main/kotlin/com/openai/errors/SseException.kt) is thrown for errors encountered during [SSE streaming](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) after a successful initial HTTP response. - -- [`OpenAIIoException`](openai-java-core/src/main/kotlin/com/openai/errors/OpenAIIoException.kt): I/O networking errors. - -- [`OpenAIRetryableException`](openai-java-core/src/main/kotlin/com/openai/errors/OpenAIRetryableException.kt): Generic error indicating a failure that could be retried by the client. - -- [`OpenAIInvalidDataException`](openai-java-core/src/main/kotlin/com/openai/errors/OpenAIInvalidDataException.kt): Failure to interpret successfully parsed data. For example, when accessing a property that's supposed to be required, but the API unexpectedly omitted it from the response. - -- [`OpenAIException`](openai-java-core/src/main/kotlin/com/openai/errors/OpenAIException.kt): Base class for all exceptions. Most errors will result in one of the previously mentioned ones, but completely generic errors may be thrown using the base class. - -## Pagination - -The SDK defines methods that return a paginated lists of results. It provides convenient ways to access the results either one page at a time or item-by-item across all pages. - -### Auto-pagination - -To iterate through all results across all pages, use the `autoPager()` method, which automatically fetches more pages as needed. - -When using the synchronous client, the method returns an [`Iterable`](https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html) - -```java -import com.openai.models.finetuning.jobs.FineTuningJob; -import com.openai.models.finetuning.jobs.JobListPage; - -JobListPage page = client.fineTuning().jobs().list(); - -// Process as an Iterable -for (FineTuningJob job : page.autoPager()) { - System.out.println(job); -} - -// Process as a Stream -page.autoPager() - .stream() - .limit(50) - .forEach(job -> System.out.println(job)); -``` - -When using the asynchronous client, the method returns an [`AsyncStreamResponse`](openai-java-core/src/main/kotlin/com/openai/core/http/AsyncStreamResponse.kt): - -```java -import com.openai.core.http.AsyncStreamResponse; -import com.openai.models.finetuning.jobs.FineTuningJob; -import com.openai.models.finetuning.jobs.JobListPageAsync; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -CompletableFuture pageFuture = client.async().fineTuning().jobs().list(); - -pageFuture.thenRun(page -> page.autoPager().subscribe(job -> { - System.out.println(job); -})); - -// If you need to handle errors or completion of the stream -pageFuture.thenRun(page -> page.autoPager().subscribe(new AsyncStreamResponse.Handler<>() { - @Override - public void onNext(FineTuningJob job) { - System.out.println(job); - } - - @Override - public void onComplete(Optional error) { - if (error.isPresent()) { - System.out.println("Something went wrong!"); - throw new RuntimeException(error.get()); - } else { - System.out.println("No more!"); - } - } -})); - -// Or use futures -pageFuture.thenRun(page -> page.autoPager() - .subscribe(job -> { - System.out.println(job); - }) - .onCompleteFuture() - .whenComplete((unused, error) -> { - if (error != null) { - System.out.println("Something went wrong!"); - throw new RuntimeException(error); - } else { - System.out.println("No more!"); - } - })); -``` - -### Manual pagination - -To access individual page items and manually request the next page, use the `items()`, -`hasNextPage()`, and `nextPage()` methods: - -```java -import com.openai.models.finetuning.jobs.FineTuningJob; -import com.openai.models.finetuning.jobs.JobListPage; - -JobListPage page = client.fineTuning().jobs().list(); -while (true) { - for (FineTuningJob job : page.items()) { - System.out.println(job); - } - - if (!page.hasNextPage()) { - break; - } - - page = page.nextPage(); -} -``` - -## Logging - -Enable logging by setting the `OPENAI_LOG` environment variable to `info`: - -```sh -export OPENAI_LOG=info -``` - -Or to `debug` for more verbose logging: - -```sh -export OPENAI_LOG=debug -``` - -Or configure the client manually using the `logLevel` method: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.LogLevel; - -OpenAIClient client = OpenAIOkHttpClient.builder() - .fromEnv() - .logLevel(LogLevel.INFO) - .build(); -``` - -## ProGuard and R8 - -Although the SDK uses reflection, it is still usable with [ProGuard](https://github.com/Guardsquare/proguard) and [R8](https://developer.android.com/topic/performance/app-optimization/enable-app-optimization) because `openai-java-core` is published with a [configuration file](openai-java-core/src/main/resources/META-INF/proguard/openai-java-core.pro) containing [keep rules](https://www.guardsquare.com/manual/configuration/usage). - -ProGuard and R8 should automatically detect and use the published rules, but you can also manually copy the keep rules if necessary. - -## GraalVM - -Although the SDK uses reflection, it is still usable in [GraalVM](https://www.graalvm.org) because `openai-java-core` is published with [reachability metadata](https://www.graalvm.org/latest/reference-manual/native-image/metadata/). - -GraalVM should automatically detect and use the published metadata, but [manual configuration](https://www.graalvm.org/jdk24/reference-manual/native-image/overview/BuildConfiguration/) is also available. - -## Spring Boot - -> [!WARNING] -> `openai-java-spring-boot-starter` targets Spring Boot 2.7 and is OpenAI EOL as of 2026-07-27. -> Version 4.45.0 is the final supported, tested, and published release. The artifact remains -> downloadable but receives no fixes, testing, or compatibility support, and its source is no -> longer part of the active build. See the -> [Spring Boot 2 EOL decision and migration path](docs/spring-boot-2-eol.md). New Spring -> applications should depend on `openai-java` directly and provide an `OpenAIClient` bean until a -> supported, generation-specific integration is available. - -Existing Spring Boot 2 users can refer to the -[`v4.45.0` Spring Boot documentation](https://github.com/openai/openai-java/blob/v4.45.0/README.md#spring-boot) -for the final legacy configuration and usage instructions. - -## Jackson - -The SDK depends on [Jackson](https://github.com/FasterXML/jackson) for JSON serialization/deserialization. It is compatible with version 2.13.4 or higher, but depends on version 2.18.9 by default. - -The SDK throws an exception if it detects an incompatible Jackson version at runtime (e.g. if the default version was overridden in your Maven or Gradle config). - -If the SDK threw an exception, but you're _certain_ the version is compatible, then disable the version check using the `checkJacksonVersionCompatibility` on [`OpenAIOkHttpClient`](openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClient.kt) or [`OpenAIOkHttpClientAsync`](openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClientAsync.kt). - -> [!CAUTION] -> We make no guarantee that the SDK works correctly when the Jackson version check is disabled. - -Also note that there are bugs in older Jackson versions that can affect the SDK. We don't work around all Jackson bugs ([example](https://github.com/FasterXML/jackson-databind/issues/3240)) and expect users to upgrade Jackson for those instead. - -## Microsoft Azure - -To use this library with [Azure OpenAI](https://learn.microsoft.com/azure/ai-services/openai/overview), use the same -OpenAI client builder but with the Azure-specific configuration. - -```java -OpenAIClient client = OpenAIOkHttpClient.builder() - // Gets the API key and endpoint from the `AZURE_OPENAI_KEY` and `OPENAI_BASE_URL` environment variables, respectively - .fromEnv() - // Set the Azure Entra ID - .credential(BearerTokenCredential.create(AuthenticationUtil.getBearerTokenSupplier( - new DefaultAzureCredentialBuilder().build(), "https://cognitiveservices.azure.com/.default"))) - .build(); -``` - -See the complete Azure OpenAI example in the [`openai-java-example`](openai-java-example/src/main/java/com/openai/example/AzureEntraIdExample.java) directory. The other examples in the directory also work with Azure as long as the client is configured to use it. - -### Optional: URL path mode configuration - -The [`ClientOptions`](openai-java-core/src/main/kotlin/com/openai/core/ClientOptions.kt) can be configured to treat Azure OpenAI endpoint URLs differently, depending on your service setup. The default value is [`AzureUrlPathMode.AUTO`](openai-java-core/src/main/kotlin/com/openai/azure/AzureUrlPathMode.kt). To customize the SDK behavior, each value does the following: -- `AzureUrlPathMode.LEGACY`: forces the deployment or model name into the path. -- `AzureUrlPathMode.UNIFIED`: for newer endpoints ending in `/openai/v1` the service behaviour matches OpenAI's, therefore [`AzureOpenAIServiceVersion`](openai-java-core/src/main/kotlin/com/openai/azure/AzureOpenAIServiceVersion.kt) becomes optional and the model is passed in the request object. -- `AzureUrlPathMode.AUTO`: automatically detects the path mode based on the base URL. Default value. - -## Network options - -### Retries - -The SDK automatically retries 2 times by default, with a short exponential backoff between requests. - -Only the following error types are retried: - -- Connection errors (for example, due to a network connectivity problem) -- 408 Request Timeout -- 409 Conflict -- 429 Rate Limit -- 5xx Internal - -The API may also explicitly instruct the SDK to retry or not retry a request. - -To set a custom number of retries, configure the client using the `maxRetries` method: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; - -OpenAIClient client = OpenAIOkHttpClient.builder() - .fromEnv() - .maxRetries(4) - .build(); -``` - -### Timeouts - -Requests time out after 10 minutes by default. - -To set a custom timeout, configure the method call using the `timeout` method: - -```java -import com.openai.models.chat.completions.ChatCompletion; - -ChatCompletion chatCompletion = client.chat().completions().create( - params, RequestOptions.builder().timeout(Duration.ofSeconds(30)).build() -); -``` - -Or configure the default for all method calls at the client level: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import java.time.Duration; - -OpenAIClient client = OpenAIOkHttpClient.builder() - .fromEnv() - .timeout(Duration.ofSeconds(30)) - .build(); -``` - -### Proxies - -To route requests through a proxy, configure the client using the `proxy` method: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import java.net.InetSocketAddress; -import java.net.Proxy; - -OpenAIClient client = OpenAIOkHttpClient.builder() - .fromEnv() - .proxy(new Proxy( - Proxy.Type.HTTP, new InetSocketAddress( - "https://example.com", 8080 - ) - )) - .build(); -``` - -If the proxy responds with `407 Proxy Authentication Required`, supply credentials by also configuring `proxyAuthenticator`: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.http.ProxyAuthenticator; - -OpenAIClient client = OpenAIOkHttpClient.builder() - .fromEnv() - .proxy(...) - // Or a custom implementation of `ProxyAuthenticator`. - .proxyAuthenticator(ProxyAuthenticator.basic("username", "password")) - .build(); -``` - -### Connection pooling - -To customize the underlying OkHttp connection pool, configure the client using the `maxIdleConnections` and `keepAliveDuration` methods: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import java.time.Duration; - -OpenAIClient client = OpenAIOkHttpClient.builder() - .fromEnv() - // If `maxIdleConnections` is set, then `keepAliveDuration` must be set, and vice versa. - .maxIdleConnections(10) - .keepAliveDuration(Duration.ofMinutes(2)) - .build(); -``` - -If both options are unset, OkHttp's default connection pool settings are used. - -### HTTPS - -> [!NOTE] -> Most applications should not call these methods, and instead use the system defaults. The defaults include -> special optimizations that can be lost if the implementations are modified. - -To configure how HTTPS connections are secured, configure the client using the `sslSocketFactory`, `trustManager`, and `hostnameVerifier` methods: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; - -OpenAIClient client = OpenAIOkHttpClient.builder() - .fromEnv() - // If `sslSocketFactory` is set, then `trustManager` must be set, and vice versa. - .sslSocketFactory(yourSSLSocketFactory) - .trustManager(yourTrustManager) - .hostnameVerifier(yourHostnameVerifier) - .build(); -``` - -#### Mutual TLS with native JSSE - -API-key authenticated HTTP requests can use mTLS without a dedicated SDK API. Build an -`SSLContext` using Java's native JSSE APIs and pass it through the existing OkHttp TLS hooks. - -To opt in, follow the -[OpenAI Mutual TLS Beta Program](https://help.openai.com/en/articles/10876024-openai-mutual-tls-beta-program) -guide to upload a CA certificate and activate it for your project or organization before -configuring the client. - -Certificate-chain support is a separate mTLS beta capability that is available by request. Contact -your Account Director or OpenAI Support to enable it. When it is enabled, the PKCS#12 key store must -contain the client private key and the complete certificate chain: the leaf certificate first, -followed by every required intermediate certificate. Without certificate-chain support, the client -leaf certificate must be directly signed by an active CA certificate that you uploaded to OpenAI. - -Keep server trust separate from the client identity. Initializing `TrustManagerFactory` with a null -`KeyStore` retains the JVM's normal server-trust configuration. - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import java.io.InputStream; -import java.net.URI; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.security.KeyStore; -import java.util.Arrays; -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; -import javax.net.ssl.TrustManagerFactory; -import javax.net.ssl.X509TrustManager; - -String apiKey = System.getProperty("openai.apiKey"); -if (apiKey == null) { - apiKey = System.getenv("OPENAI_API_KEY"); -} -if (apiKey == null || apiKey.isEmpty()) { - throw new IllegalStateException( - "openai.apiKey or OPENAI_API_KEY must be set for OpenAI mTLS"); -} -String baseUrl = System.getProperty("openai.baseUrl"); -if (baseUrl == null) { - baseUrl = System.getenv("OPENAI_BASE_URL"); -} -if (baseUrl == null) { - baseUrl = "https://mtls.api.openai.com/v1"; -} else if (baseUrl.isEmpty()) { - throw new IllegalStateException( - "openai.baseUrl or OPENAI_BASE_URL must not be empty for OpenAI mTLS"); -} -URI baseUri; -try { - baseUri = URI.create(baseUrl); -} catch (IllegalArgumentException ignored) { - // URI parse exceptions include the rejected value, which may contain credentials. - throw new IllegalStateException("OpenAI mTLS requires a valid HTTPS base URL"); -} -if (!"https".equalsIgnoreCase(baseUri.getScheme()) || baseUri.getRawAuthority() == null) { - throw new IllegalStateException("OpenAI mTLS requires a valid HTTPS base URL"); -} -String organization = System.getProperty("openai.orgId"); -if (organization == null) { - organization = System.getenv("OPENAI_ORG_ID"); -} -String project = System.getProperty("openai.projectId"); -if (project == null) { - project = System.getenv("OPENAI_PROJECT_ID"); -} - -String keyStorePath = System.getenv("OPENAI_MTLS_KEYSTORE"); -String keyStorePassword = System.getenv("OPENAI_MTLS_KEYSTORE_PASSWORD"); -if (keyStorePath == null || keyStorePath.isEmpty()) { - throw new IllegalStateException("OPENAI_MTLS_KEYSTORE must be set"); -} -if (keyStorePassword == null || keyStorePassword.isEmpty()) { - throw new IllegalStateException("OPENAI_MTLS_KEYSTORE_PASSWORD must be set"); -} - -char[] password = keyStorePassword.toCharArray(); -KeyStore clientKeyStore = KeyStore.getInstance("PKCS12"); -KeyManagerFactory keyManagers = - KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); -try { - try (InputStream input = Files.newInputStream(Paths.get(keyStorePath))) { - clientKeyStore.load(input, password); - } - keyManagers.init(clientKeyStore, password); -} finally { - Arrays.fill(password, '\0'); -} - -TrustManagerFactory trustManagers = - TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); -trustManagers.init((KeyStore) null); -X509TrustManager trustManager = Arrays.stream(trustManagers.getTrustManagers()) - .filter(X509TrustManager.class::isInstance) - .map(X509TrustManager.class::cast) - .findFirst() - .orElseThrow(() -> new IllegalStateException( - "The default TrustManagerFactory did not provide an X509TrustManager")); - -SSLContext sslContext = SSLContext.getInstance("TLS"); -sslContext.init(keyManagers.getKeyManagers(), new TrustManager[] {trustManager}, null); - -OpenAIClient client = OpenAIOkHttpClient.builder() - // Set the OpenAI credential explicitly so an Azure key cannot be selected accidentally. - .apiKey(apiKey) - // Preserve the organization and project scope selected by normal SDK configuration. - .organization(organization) - .project(project) - .baseUrl(baseUrl) - // Avoid presenting the client identity to a redirect target. - .followRedirects(false) - .sslSocketFactory(sslContext.getSocketFactory()) - .trustManager(trustManager) - .build(); -``` - -Set `openai.baseUrl` or `OPENAI_BASE_URL` to `https://mtls-eu.api.openai.com/v1` for EU Data -Residency, or to an appropriate custom mTLS gateway. If neither is set, the recipe uses -`https://mtls.api.openai.com/v1`. The SDK does not inspect or rewrite that URL. To rotate the client -identity, build a new `SSLContext`, HTTP transport, and SDK client, then close the old client. This -recipe applies to ordinary HTTP API-key traffic; it does not add certificate-only authentication or -Realtime/WebSocket mTLS support. - -See the complete, compilable -[`MutualTlsExample`](openai-java-example/src/main/java/com/openai/example/MutualTlsExample.java). - -### Custom HTTP client - -The SDK consists of three artifacts: - -- `openai-java-core` - - Contains core SDK logic - - Does not depend on [OkHttp](https://square.github.io/okhttp) - - Exposes [`OpenAIClient`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClient.kt), [`OpenAIClientAsync`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsync.kt), [`OpenAIClientImpl`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientImpl.kt), and [`OpenAIClientAsyncImpl`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsyncImpl.kt), all of which can work with any HTTP client -- `openai-java-client-okhttp` - - Depends on [OkHttp](https://square.github.io/okhttp) - - Exposes [`OpenAIOkHttpClient`](openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClient.kt) and [`OpenAIOkHttpClientAsync`](openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClientAsync.kt), which provide a way to construct [`OpenAIClientImpl`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientImpl.kt) and [`OpenAIClientAsyncImpl`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsyncImpl.kt), respectively, using OkHttp -- `openai-java` - - Depends on and exposes the APIs of both `openai-java-core` and `openai-java-client-okhttp` - - Does not have its own logic - -This structure allows replacing the SDK's default HTTP client without pulling in unnecessary dependencies. - -#### Customized [`OkHttpClient`](https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html) - -> [!TIP] -> Try the available [network options](#network-options) before replacing the default client. - -To use a customized `OkHttpClient`: - -1. Replace your [`openai-java` dependency](#installation) with `openai-java-core` -2. Copy `openai-java-client-okhttp`'s [`OkHttpClient`](openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OkHttpClient.kt) class into your code and customize it -3. Construct [`OpenAIClientImpl`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientImpl.kt) or [`OpenAIClientAsyncImpl`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsyncImpl.kt), similarly to [`OpenAIOkHttpClient`](openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClient.kt) or [`OpenAIOkHttpClientAsync`](openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClientAsync.kt), using your customized client - -### Completely custom HTTP client - -To use a completely custom HTTP client: - -1. Replace your [`openai-java` dependency](#installation) with `openai-java-core` -2. Write a class that implements the [`HttpClient`](openai-java-core/src/main/kotlin/com/openai/core/http/HttpClient.kt) interface -3. Construct [`OpenAIClientImpl`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientImpl.kt) or [`OpenAIClientAsyncImpl`](openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsyncImpl.kt), similarly to [`OpenAIOkHttpClient`](openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClient.kt) or [`OpenAIOkHttpClientAsync`](openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClientAsync.kt), using your new client class - -## Undocumented API functionality - -The SDK is typed for convenient usage of the documented API. However, it also supports working with undocumented or not yet supported parts of the API. - -### Parameters - -To set undocumented parameters, call the `putAdditionalHeader`, `putAdditionalQueryParam`, or `putAdditionalBodyProperty` methods on any `Params` class: - -```java -import com.openai.core.JsonValue; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -ChatCompletionCreateParams params = ChatCompletionCreateParams.builder() - .putAdditionalHeader("Secret-Header", "42") - .putAdditionalQueryParam("secret_query_param", "42") - .putAdditionalBodyProperty("secretProperty", JsonValue.from("42")) - .build(); -``` - -These can be accessed on the built object later using the `_additionalHeaders()`, `_additionalQueryParams()`, and `_additionalBodyProperties()` methods. - -To set undocumented parameters on _nested_ headers, query params, or body classes, call the `putAdditionalProperty` method on the nested class: - -```java -import com.openai.core.JsonValue; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -ChatCompletionCreateParams params = ChatCompletionCreateParams.builder() - .responseFormat(ChatCompletionCreateParams.ResponseFormat.builder() - .putAdditionalProperty("secretProperty", JsonValue.from("42")) - .build()) - .build(); -``` - -These properties can be accessed on the nested built object later using the `_additionalProperties()` method. - -To set a documented parameter or property to an undocumented or not yet supported _value_, pass a [`JsonValue`](openai-java-core/src/main/kotlin/com/openai/core/Values.kt) object to its setter: - -```java -import com.openai.core.JsonValue; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -ChatCompletionCreateParams params = ChatCompletionCreateParams.builder() - .messages(JsonValue.from(42)) - .model(ChatModel.GPT_5_2) - .build(); -``` - -The most straightforward way to create a [`JsonValue`](openai-java-core/src/main/kotlin/com/openai/core/Values.kt) is using its `from(...)` method: - -```java -import com.openai.core.JsonValue; -import java.util.List; -import java.util.Map; - -// Create primitive JSON values -JsonValue nullValue = JsonValue.from(null); -JsonValue booleanValue = JsonValue.from(true); -JsonValue numberValue = JsonValue.from(42); -JsonValue stringValue = JsonValue.from("Hello World!"); - -// Create a JSON array value equivalent to `["Hello", "World"]` -JsonValue arrayValue = JsonValue.from(List.of( - "Hello", "World" -)); - -// Create a JSON object value equivalent to `{ "a": 1, "b": 2 }` -JsonValue objectValue = JsonValue.from(Map.of( - "a", 1, - "b", 2 -)); - -// Create an arbitrarily nested JSON equivalent to: -// { -// "a": [1, 2], -// "b": [3, 4] -// } -JsonValue complexValue = JsonValue.from(Map.of( - "a", List.of( - 1, 2 - ), - "b", List.of( - 3, 4 - ) -)); -``` - -Normally a `Builder` class's `build` method will throw [`IllegalStateException`](https://docs.oracle.com/javase/8/docs/api/java/lang/IllegalStateException.html) if any required parameter or property is unset. - -To forcibly omit a required parameter or property, pass [`JsonMissing`](openai-java-core/src/main/kotlin/com/openai/core/Values.kt): - -```java -import com.openai.core.JsonMissing; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -ChatCompletionCreateParams params = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_5_4) - .messages(JsonMissing.of()) - .build(); -``` - -### Response properties - -To access undocumented response properties, call the `_additionalProperties()` method: - -```java -import com.openai.core.JsonValue; -import java.util.Map; - -Map additionalProperties = client.chat().completions().create(params)._additionalProperties(); -JsonValue secretPropertyValue = additionalProperties.get("secretProperty"); - -String result = secretPropertyValue.accept(new JsonValue.Visitor<>() { - @Override - public String visitNull() { - return "It's null!"; - } - - @Override - public String visitBoolean(boolean value) { - return "It's a boolean!"; - } - - @Override - public String visitNumber(Number value) { - return "It's a number!"; - } - - // Other methods include `visitMissing`, `visitString`, `visitArray`, and `visitObject` - // The default implementation of each unimplemented method delegates to `visitDefault`, which throws by default, but can also be overridden -}); -``` - -To access a property's raw JSON value, which may be undocumented, call its `_` prefixed method: - -```java -import com.openai.core.JsonField; -import com.openai.models.chat.completions.ChatCompletionMessageParam; -import java.util.Optional; - -JsonField> messages = client.chat().completions().create(params)._messages(); - -if (messages.isMissing()) { - // The property is absent from the JSON response -} else if (messages.isNull()) { - // The property was set to literal null -} else { - // Check if value was provided as a string - // Other methods include `asNumber()`, `asBoolean()`, etc. - Optional jsonString = messages.asString(); - - // Try to deserialize into a custom type - MyClass myObject = messages.asUnknown().orElseThrow().convert(MyClass.class); -} -``` - -### Response validation - -In rare cases, the API may return a response that doesn't match the expected type. For example, the SDK may expect a property to contain a `String`, but the API could return something else. - -By default, the SDK will not throw an exception in this case. It will throw [`OpenAIInvalidDataException`](openai-java-core/src/main/kotlin/com/openai/errors/OpenAIInvalidDataException.kt) only if you directly access the property. - -Validating the response is _not_ forwards compatible with new types from the API for existing fields. - -If you would still prefer to check that the response is completely well-typed upfront, then either call `validate()`: - -```java -import com.openai.models.chat.completions.ChatCompletion; - -ChatCompletion chatCompletion = client.chat().completions().create(params).validate(); -``` - -Or configure the method call to validate the response using the `responseValidation` method: - -```java -import com.openai.models.chat.completions.ChatCompletion; - -ChatCompletion chatCompletion = client.chat().completions().create( - params, RequestOptions.builder().responseValidation(true).build() -); -``` - -Or configure the default for all method calls at the client level: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; - -OpenAIClient client = OpenAIOkHttpClient.builder() - .fromEnv() - .responseValidation(true) - .build(); -``` - -## FAQ - -### Why don't you use plain `enum` classes? - -Java `enum` classes are not trivially [forwards compatible](https://www.stainless.com/blog/making-java-enums-forwards-compatible). Using them in the SDK could cause runtime exceptions if the API is updated to respond with a new enum value. - -### Why do you represent fields using `JsonField` instead of just plain `T`? - -Using `JsonField` enables a few features: - -- Allowing usage of [undocumented API functionality](#undocumented-api-functionality) -- Lazily [validating the API response against the expected shape](#response-validation) -- Representing absent vs explicitly null values - -### Why don't you use [`data` classes](https://kotlinlang.org/docs/data-classes.html)? - -It is not [backwards compatible to add new fields to a data class](https://kotlinlang.org/docs/api-guidelines-backward-compatibility.html#avoid-using-data-classes-in-your-api) and we don't want to introduce a breaking change every time we add a field to a class. - -### Why don't you use checked exceptions? - -Checked exceptions are widely considered a mistake in the Java programming language. In fact, they were omitted from Kotlin for this reason. - -Checked exceptions: - -- Are verbose to handle -- Encourage error handling at the wrong level of abstraction, where nothing can be done about the error -- Are tedious to propagate due to the [function coloring problem](https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function) -- Don't play well with lambdas (also due to the function coloring problem) - -## Semantic versioning - -This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backwards-incompatible changes may be released as minor versions: - -1. Changes to library internals which are technically public but not intended or documented for external use. _(Please open a GitHub issue to let us know if you are relying on such internals.)_ -2. Changes that we do not expect to impact the vast majority of users in practice. - -Those exceptions do not apply to raising a supported JVM or JDK API floor, changing an integration's -framework generation, removing a published artifact, or removing a transitive dependency that -consumers may rely on; those changes require a major release. Announcing EOL without removing or -changing the last available artifact may be a minor release. - -We take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience. - -We are keen for your feedback; please open an [issue](https://www.github.com/openai/openai-java/issues) with questions, bugs, or suggestions. diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 4adb0c54f..000000000 --- a/SECURITY.md +++ /dev/null @@ -1,29 +0,0 @@ -# Security Policy - -## Reporting Security Issues - -This SDK is generated by [Stainless Software Inc](http://stainless.com). Stainless takes security seriously, and encourages you to report any security vulnerability promptly so that appropriate action can be taken. - -To report a security issue, please contact the Stainless team at security@stainless.com. - -## Responsible Disclosure - -We appreciate the efforts of security researchers and individuals who help us maintain the security of -SDKs we generate. If you believe you have found a security vulnerability, please adhere to responsible -disclosure practices by allowing us a reasonable amount of time to investigate and address the issue -before making any information public. - -## Reporting Non-SDK Related Security Issues - -If you encounter security issues that are not directly related to SDKs but pertain to the services -or products provided by OpenAI, please follow the respective company's security reporting guidelines. - -### OpenAI Terms and Policies - -Our Security Policy can be found at [Security Policy URL](https://openai.com/policies/coordinated-vulnerability-disclosure-policy). - -Please contact disclosure@openai.com for any questions or concerns regarding the security of our services. - ---- - -Thank you for helping us keep the SDKs and systems they interact with secure. diff --git a/bedrock.md b/bedrock.md deleted file mode 100644 index ee85180fe..000000000 --- a/bedrock.md +++ /dev/null @@ -1,140 +0,0 @@ -# OpenAI on Amazon Bedrock - -The optional `openai-java-bedrock` artifact configures the standard OpenAI Java client for the -OpenAI-compatible Amazon Bedrock Mantle endpoint. It uses the AWS SDK for Java 2.x credential chain -and signs the final HTTP request with SigV4 on every attempt. - -## Installation - -Use this artifact instead of adding AWS dependencies to the base OpenAI package yourself. - - - -```kotlin -implementation("com.openai:openai-java-bedrock:4.49.0") -``` - -```xml - - com.openai - openai-java-bedrock - 4.49.0 - -``` - - - -## Standard AWS credentials - -Configure AWS credentials as you normally would, then provide the region: - -```java -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.BedrockOpenAIOkHttpClient; - -OpenAIClient client = BedrockOpenAIOkHttpClient.builder() - .awsRegion("us-east-1") - .build(); -``` - -The default AWS chain supports system properties, `AWS_ACCESS_KEY_ID`, -`AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`, `~/.aws/credentials`, `~/.aws/config`, -`AWS_PROFILE`, IAM Identity Center (SSO), assume-role and web-identity profiles, container -credentials, and instance-profile credentials. The SDK resolves fresh credentials and signs again -before every retry. - -Region resolution follows this order: - -1. `awsRegion(...)` -2. `AWS_REGION` -3. `AWS_DEFAULT_REGION` -4. the AWS SDK's default region provider chain - -Base URL resolution follows this order: - -1. `baseUrl(...)` -2. `AWS_BEDROCK_BASE_URL` -3. `https://bedrock-mantle.{region}.api.aws/openai/v1` - -The `bedrock-mantle` SigV4 service name is intentional. Bedrock's OpenAI-compatible route is -model-dependent: models such as `openai.gpt-5.5` use `/openai/v1`, while -`openai.gpt-oss-120b` uses `/v1`. The builder defaults to `/openai/v1`; configure the -model's documented route explicitly when it differs: - -```java -OpenAIClient client = BedrockOpenAIOkHttpClient.builder() - .awsRegion("us-east-1") - .baseUrl("https://bedrock-mantle.us-east-1.api.aws/v1") - .build(); -``` - -## Named profile - -```java -OpenAIClient client = BedrockOpenAIOkHttpClient.builder() - .awsRegion("us-east-1") - .awsProfile("production") - .build(); -``` - -## Explicit temporary credentials - -Prefer profiles and workload roles in production. Explicit credentials are useful for tests and -short-lived credentials obtained elsewhere: - -```java -OpenAIClient client = BedrockOpenAIOkHttpClient.builder() - .awsRegion("us-east-1") - .awsAccessKeyId(accessKeyId) - .awsSecretAccessKey(secretAccessKey) - .awsSessionToken(sessionToken) - .build(); -``` - -For refreshable credentials, pass an AWS SDK `AwsCredentialsProvider`: - -```java -OpenAIClient client = BedrockOpenAIOkHttpClient.builder() - .awsRegion("us-east-1") - .awsCredentialsProvider(credentialsProvider) - .build(); -``` - -## Bearer-token compatibility - -`AWS_BEARER_TOKEN_BEDROCK` remains supported for compatibility and takes precedence over the -default AWS chain. An explicit AWS credential mode takes precedence over that environment -variable. You can also provide a bearer credential directly: - -```java -OpenAIClient client = BedrockOpenAIOkHttpClient.builder() - .awsRegion("us-east-1") - .apiKey(bedrockBearerToken) - .build(); -``` - -Explicit bearer and AWS credential modes are mutually exclusive. - -## Async and streaming responses - -The same client configuration supports asynchronous and streaming calls: - -```java -OpenAIClientAsync client = BedrockOpenAIOkHttpClient.builder() - .awsRegion("us-east-1") - .build() - .async(); -``` - -Response streaming is supported. SigV4 request bodies must be replayable so the SDK can hash them -and safely retry; one-shot streaming request bodies are rejected before network I/O. Asynchronous -bearer-token and SigV4 authentication work runs on a dedicated client-owned executor by default; -pass `authenticationExecutor(...)` to use a caller-owned executor instead. - -## Security - -- Do not ship AWS credentials in browser or untrusted client applications. -- Prefer temporary credentials, roles, profiles, and workload identities over long-lived keys. -- Do not log access keys, secret keys, session tokens, bearer tokens, or signed authorization - headers. The SDK redacts `Authorization` and `X-Amz-Security-Token` from its HTTP logs. -- OpenAI workload identity federation and AWS Bedrock SigV4 are separate authentication systems. diff --git a/build.gradle.kts b/build.gradle.kts deleted file mode 100644 index 7cc3806e8..000000000 --- a/build.gradle.kts +++ /dev/null @@ -1,142 +0,0 @@ -import com.openai.gradle.GenerateVersionSupportMatrixTask -import com.openai.gradle.VersionSupportPolicy -import com.openai.gradle.VerifyVersionSupportPolicyTask -import org.gradle.api.plugins.JavaPluginExtension -import org.gradle.api.tasks.SourceSetContainer -import org.gradle.api.tasks.compile.JavaCompile -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - -buildscript { - dependencies { - constraints { - classpath("com.fasterxml.jackson.core:jackson-annotations:2.18.9") - classpath("com.fasterxml.jackson.core:jackson-core:2.18.9") - classpath("com.fasterxml.jackson.core:jackson-databind:2.18.9") - classpath("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.18.9") - classpath("com.fasterxml.jackson.module:jackson-module-kotlin:2.18.9") - } - } -} - -plugins { - id("org.jetbrains.dokka") version "2.1.0" -} - -val dokkaJacksonVersion = "2.18.9" - -repositories { - mavenCentral() -} - -allprojects { - group = "com.openai" - version = "4.49.0" // x-release-please-version - - // Dokka 2.1.0 depends on Jackson 2.15.3. Keep its isolated build-tool classpaths on a - // secure, internally aligned Jackson release without changing the SDK's published or - // compatibility-test dependency versions. - configurations.matching { it.name.startsWith("dokka") }.configureEach { - resolutionStrategy.eachDependency { - if ( - requested.group == "com.fasterxml.jackson" || - requested.group.startsWith("com.fasterxml.jackson.") - ) { - useVersion(dokkaJacksonVersion) - because("Dokka's build-only Jackson classpath must use a secure aligned release") - } - } - } -} - -subprojects { - // These are populated with dependencies by `buildSrc` scripts. - tasks.register("format") { - group = "Verification" - description = "Formats all source files." - } - tasks.register("lint") { - group = "Verification" - description = "Verifies all source files are formatted." - } -} - -subprojects { - apply(plugin = "org.jetbrains.dokka") -} - -val versionSupportFile = layout.projectDirectory.file("gradle/version-support.properties") -val versionSupport = VersionSupportPolicy.load(versionSupportFile.asFile) - -tasks.register("generateVersionSupportMatrix") { - group = "verification" - description = "Generates a CI runtime matrix from the version support policy." - - policyFile.set(versionSupportFile) - mode.set(providers.gradleProperty("versionSupportMatrix")) - outputFile.set(layout.buildDirectory.file("version-support-matrix.json")) -} - -tasks.register("verifyVersionSupportPolicy") { - group = "verification" - description = "Verifies published artifact runtime floors and lifecycle declarations." - - inputs.file(versionSupportFile) - dependsOn(versionSupport.artifacts.keys.map { ":$it:verifyVersionSupportPolicy" }) -} - -subprojects { - val artifactName = name - val artifactSupport = versionSupport.artifacts[artifactName] - - pluginManager.withPlugin("openai.publish") { - checkNotNull(artifactSupport) { - "$artifactName is published but missing from ${versionSupportFile.asFile}" - } - } - - if (artifactSupport != null) { - pluginManager.withPlugin("java") { - val java = extensions.getByType(JavaPluginExtension::class.java) - val mainSourceSet = extensions.getByType(SourceSetContainer::class.java).getByName("main") - val compileJava = tasks.named("compileJava") - - val verify = - tasks.register("verifyVersionSupportPolicy") { - group = "verification" - description = - "Verifies $artifactName against its declared version support policy." - - this.artifactName.set(artifactName) - runtimeFloor.set(artifactSupport.runtime) - lifecycle.set(artifactSupport.lifecycle.propertyValue) - requiredBuildJdk.set(versionSupport.buildJdk) - configuredBuildJdk.set(java.toolchain.languageVersion.map { it.asInt() }) - sourceCompatibility.set(java.sourceCompatibility.majorVersion.toInt()) - targetCompatibility.set(java.targetCompatibility.majorVersion.toInt()) - javaRelease.set(compileJava.flatMap { it.options.release }) - classFiles.from(mainSourceSet.output.classesDirs) - - dependsOn(tasks.named("classes")) - } - - pluginManager.withPlugin("org.jetbrains.kotlin.jvm") { - val compileKotlin = tasks.named("compileKotlin") - verify.configure { - kotlinJvmTarget.set( - compileKotlin.flatMap { it.compilerOptions.jvmTarget }.map { it.target } - ) - kotlinFreeCompilerArgs.set( - compileKotlin.flatMap { it.compilerOptions.freeCompilerArgs } - ) - } - } - } - } -} - -// Avoid race conditions between `dokkaJavadocCollector` and `dokkaJavadocJar` tasks -tasks.named("dokkaJavadocCollector").configure { - subprojects.flatMap { it.tasks } - .filter { it.project.name != "openai-java" && it.name == "dokkaJavadocJar" } - .forEach { mustRunAfter(it) } -} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts deleted file mode 100644 index b0b098c84..000000000 --- a/buildSrc/build.gradle.kts +++ /dev/null @@ -1,22 +0,0 @@ -plugins { - `kotlin-dsl` - kotlin("jvm") version "1.9.20" - id("com.vanniktech.maven.publish") version "0.28.0" -} - -repositories { - gradlePluginPortal() - mavenCentral() -} - -dependencies { - implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.20") - implementation("com.vanniktech:gradle-maven-publish-plugin:0.28.0") - - testImplementation(kotlin("test")) - testImplementation("org.junit.jupiter:junit-jupiter:5.9.3") -} - -tasks.test { - useJUnitPlatform() -} diff --git a/buildSrc/src/main/kotlin/com/openai/gradle/GenerateVersionSupportMatrixTask.kt b/buildSrc/src/main/kotlin/com/openai/gradle/GenerateVersionSupportMatrixTask.kt deleted file mode 100644 index 8596c16e0..000000000 --- a/buildSrc/src/main/kotlin/com/openai/gradle/GenerateVersionSupportMatrixTask.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.openai.gradle - -import org.gradle.api.DefaultTask -import org.gradle.api.file.RegularFileProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.CacheableTask -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputFile -import org.gradle.api.tasks.OutputFile -import org.gradle.api.tasks.PathSensitive -import org.gradle.api.tasks.PathSensitivity -import org.gradle.api.tasks.TaskAction - -@CacheableTask -abstract class GenerateVersionSupportMatrixTask : DefaultTask() { - @get:InputFile - @get:PathSensitive(PathSensitivity.RELATIVE) - abstract val policyFile: RegularFileProperty - - @get:Input abstract val mode: Property - - @get:OutputFile abstract val outputFile: RegularFileProperty - - @TaskAction - fun generate() { - val versions = VersionSupportPolicy.load(policyFile.get().asFile).runtimeMatrix(mode.get()) - val json = versions.joinToString(separator = "\",\"", prefix = "[\"", postfix = "\"]") - outputFile.get().asFile.apply { - parentFile.mkdirs() - writeText("$json\n") - } - } -} diff --git a/buildSrc/src/main/kotlin/com/openai/gradle/VerifyVersionSupportPolicyTask.kt b/buildSrc/src/main/kotlin/com/openai/gradle/VerifyVersionSupportPolicyTask.kt deleted file mode 100644 index f02dbfd5b..000000000 --- a/buildSrc/src/main/kotlin/com/openai/gradle/VerifyVersionSupportPolicyTask.kt +++ /dev/null @@ -1,100 +0,0 @@ -package com.openai.gradle - -import java.io.DataInputStream -import org.gradle.api.DefaultTask -import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.provider.ListProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputFiles -import org.gradle.api.tasks.PathSensitive -import org.gradle.api.tasks.PathSensitivity -import org.gradle.api.tasks.TaskAction -import org.gradle.work.DisableCachingByDefault - -@DisableCachingByDefault(because = "This verification task has no outputs") -abstract class VerifyVersionSupportPolicyTask : DefaultTask() { - @get:Input abstract val artifactName: Property - - @get:Input abstract val runtimeFloor: Property - - @get:Input abstract val lifecycle: Property - - @get:Input abstract val requiredBuildJdk: Property - - @get:Input abstract val configuredBuildJdk: Property - - @get:Input abstract val sourceCompatibility: Property - - @get:Input abstract val targetCompatibility: Property - - @get:Input abstract val javaRelease: Property - - @get:Input abstract val kotlinJvmTarget: Property - - @get:Input abstract val kotlinFreeCompilerArgs: ListProperty - - @get:InputFiles - @get:PathSensitive(PathSensitivity.RELATIVE) - abstract val classFiles: ConfigurableFileCollection - - @TaskAction - fun verify() { - val name = artifactName.get() - val floor = runtimeFloor.get() - val allowedLifecycles = setOf("active", "maintenance", "deprecated", "eol") - - check(lifecycle.get() in allowedLifecycles) { - "$name must declare one of ${allowedLifecycles.sorted()}, but declared '${lifecycle.get()}'" - } - check(configuredBuildJdk.get() == requiredBuildJdk.get()) { - "$name must build with JDK ${requiredBuildJdk.get()}" - } - check(sourceCompatibility.get() == floor) { - "$name source compatibility must be Java $floor" - } - check(targetCompatibility.get() == floor) { - "$name target compatibility must be Java $floor" - } - check(javaRelease.get() == floor) { - "$name Java compiler must enforce --release $floor" - } - - val expectedKotlinTarget = if (floor == 8) "1.8" else floor.toString() - check(kotlinJvmTarget.get() == expectedKotlinTarget) { - "$name Kotlin JVM target must be $expectedKotlinTarget" - } - val jdkReleaseArguments = - kotlinFreeCompilerArgs.get().filter { it.startsWith("-Xjdk-release=") } - check(jdkReleaseArguments == listOf("-Xjdk-release=$expectedKotlinTarget")) { - "$name Kotlin compiler must enforce exactly -Xjdk-release=$expectedKotlinTarget" - } - - val maximumClassMajorVersion = 44 + floor - val bytecodeErrors = - classFiles.asFileTree - .matching { include("**/*.class") } - .mapNotNull { classFile -> - DataInputStream(classFile.inputStream().buffered()).use { input -> - check(input.readInt() == 0xCAFEBABE.toInt()) { - "$classFile is not a valid JVM class file" - } - input.readUnsignedShort() - val classMajorVersion = input.readUnsignedShort() - if (classMajorVersion > maximumClassMajorVersion) { - "$classFile uses class-file version $classMajorVersion; $name permits " + - "at most $maximumClassMajorVersion (Java $floor)" - } else { - null - } - } - } - - check(bytecodeErrors.isEmpty()) { - bytecodeErrors.joinToString( - separator = "\n- ", - prefix = "Published bytecode exceeds its declared runtime floor:\n- ", - ) - } - } -} diff --git a/buildSrc/src/main/kotlin/com/openai/gradle/VersionSupportPolicy.kt b/buildSrc/src/main/kotlin/com/openai/gradle/VersionSupportPolicy.kt deleted file mode 100644 index af990380a..000000000 --- a/buildSrc/src/main/kotlin/com/openai/gradle/VersionSupportPolicy.kt +++ /dev/null @@ -1,166 +0,0 @@ -package com.openai.gradle - -import java.io.File -import java.io.Serializable -import java.util.Properties - -enum class ArtifactLifecycle(val propertyValue: String) { - ACTIVE("active"), - MAINTENANCE("maintenance"), - DEPRECATED("deprecated"), - EOL("eol"); - - val isSupported: Boolean - get() = this != EOL - - companion object { - fun parse(value: String, property: String): ArtifactLifecycle = - values().find { it.propertyValue == value } - ?: error( - "$property must be one of ${values().map { it.propertyValue }}, but was '$value'" - ) - } -} - -data class ArtifactSupport( - val runtime: Int, - val lifecycle: ArtifactLifecycle, -) : Serializable - -data class VersionSupportPolicy( - val buildJdk: Int, - val currentLts: Int, - val supportedLts: List, - val currentNonLts: Int, - val artifacts: Map, -) : Serializable { - private val supportedArtifacts = artifacts.filterValues { it.lifecycle.isSupported } - val minimumSupportedRuntime: Int = supportedArtifacts.values.minOf { it.runtime } - - fun runtimeFloor(projectName: String): Int = - artifacts[projectName]?.runtime ?: minimumSupportedRuntime - - fun runtimeMatrix(mode: String): List { - val supportedArtifactFloors = - supportedArtifacts.values.map(ArtifactSupport::runtime) - return when (mode) { - "pull-request" -> supportedArtifactFloors + currentLts - "full" -> supportedLts + currentNonLts - else -> - error( - "Unknown version support matrix '$mode'; expected 'pull-request' or 'full'" - ) - } - .distinct() - .sorted() - } - - companion object { - private val requiredKeys = - setOf( - "build.jdk", - "test.current-lts", - "test.supported-lts", - "test.current-non-lts", - ) - private val artifactKey = Regex("""artifact\.(.+)\.(runtime|lifecycle)""") - - fun load(file: File): VersionSupportPolicy { - check(file.isFile) { "Version support policy does not exist: $file" } - - val properties = Properties().apply { file.inputStream().use(::load) } - val unknownKeys = - properties.stringPropertyNames().filterNot { key -> - key in requiredKeys || artifactKey.matches(key) - } - check(unknownKeys.isEmpty()) { - "Unknown version support properties in $file: ${unknownKeys.sorted()}" - } - - val missingKeys = requiredKeys.filterNot(properties::containsKey) - check(missingKeys.isEmpty()) { - "Missing version support properties in $file: ${missingKeys.sorted()}" - } - - val artifactNames = - properties - .stringPropertyNames() - .mapNotNull { artifactKey.matchEntire(it)?.groupValues?.get(1) } - .toSortedSet() - check(artifactNames.isNotEmpty()) { "No artifact policies declared in $file" } - - val artifacts = - artifactNames.associateWith { name -> - val runtime = properties.requiredInt("artifact.$name.runtime", file) - val lifecycleProperty = "artifact.$name.lifecycle" - val lifecycle = - ArtifactLifecycle.parse( - properties.required(lifecycleProperty, file), - lifecycleProperty, - ) - ArtifactSupport(runtime = runtime, lifecycle = lifecycle) - } - check(artifacts.values.any { it.lifecycle.isSupported }) { - "At least one artifact in $file must have a supported lifecycle" - } - - val buildJdk = properties.requiredInt("build.jdk", file) - val currentLts = properties.requiredInt("test.current-lts", file) - val supportedLts = - properties - .required("test.supported-lts", file) - .split(',') - .map { value -> - value.trim().toIntOrNull() - ?: error("test.supported-lts contains invalid JVM '$value' in $file") - } - val currentNonLts = properties.requiredInt("test.current-non-lts", file) - - check(buildJdk > 0) { "build.jdk must be positive" } - check(supportedLts.isNotEmpty() && supportedLts.all { it > 0 }) { - "test.supported-lts must contain positive JVM versions" - } - check(supportedLts == supportedLts.distinct().sorted()) { - "test.supported-lts must contain unique JVMs in ascending order" - } - check(currentLts in supportedLts) { - "test.current-lts ($currentLts) must appear in test.supported-lts" - } - check(currentNonLts > currentLts) { - "test.current-non-lts ($currentNonLts) must be newer than current LTS $currentLts" - } - artifacts.forEach { (name, support) -> - check(support.runtime > 0) { "$name must declare a positive runtime floor" } - check(support.runtime <= buildJdk) { - "$name requires Java ${support.runtime}, newer than build JDK $buildJdk" - } - check(!support.lifecycle.isSupported || support.runtime in supportedLts) { - "$name has supported runtime floor ${support.runtime}, which is absent from " + - "test.supported-lts" - } - } - - return VersionSupportPolicy( - buildJdk = buildJdk, - currentLts = currentLts, - supportedLts = supportedLts, - currentNonLts = currentNonLts, - artifacts = artifacts, - ) - } - - private fun Properties.required( - key: String, - file: File, - ): String = - getProperty(key)?.trim()?.takeIf(String::isNotEmpty) - ?: error("Required version support property '$key' is missing or empty in $file") - - private fun Properties.requiredInt( - key: String, - file: File, - ): Int = - required(key, file).toIntOrNull() - ?: error("Version support property '$key' must be an integer in $file") - } -} diff --git a/buildSrc/src/main/kotlin/openai.java.gradle.kts b/buildSrc/src/main/kotlin/openai.java.gradle.kts deleted file mode 100644 index 38e72eab6..000000000 --- a/buildSrc/src/main/kotlin/openai.java.gradle.kts +++ /dev/null @@ -1,135 +0,0 @@ -import com.openai.gradle.VersionSupportPolicy -import org.gradle.api.tasks.testing.logging.TestExceptionFormat - -plugins { - `java-library` -} - -repositories { - mavenCentral() -} - -val versionSupportPolicy = - VersionSupportPolicy.load(rootProject.file("gradle/version-support.properties")) -val runtimeFloor = versionSupportPolicy.runtimeFloor(project.name) - -java { - toolchain { - languageVersion.set(JavaLanguageVersion.of(versionSupportPolicy.buildJdk)) - } - - sourceCompatibility = JavaVersion.toVersion(runtimeFloor) - targetCompatibility = JavaVersion.toVersion(runtimeFloor) -} - -tasks.withType().configureEach { - options.compilerArgs.add("-Werror") - options.release.set(runtimeFloor) -} - -tasks.named("jar") { - manifest { - attributes(mapOf( - "Implementation-Title" to project.name, - "Implementation-Version" to project.version - )) - } -} - -tasks.withType().configureEach { - useJUnitPlatform() - - // Run tests in parallel to some degree. - maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1) - forkEvery = 100 - - testLogging { - exceptionFormat = TestExceptionFormat.FULL - } -} - -val palantir by configurations.creating -dependencies { - // Palantir is an isolated build tool and must use the internally aligned Jackson line it was - // built against. This does not affect any published or runtime dependency configuration. - palantir(platform("com.fasterxml.jackson:jackson-bom:2.21.5")) - palantir("com.palantir.javaformat:palantir-java-format:2.96.0") -} - -fun registerPalantir( - name: String, - description: String, -) { - val javaName = "${name}Java" - tasks.register(javaName) { - group = "Verification" - this.description = description - - classpath = palantir - mainClass = "com.palantir.javaformat.java.Main" - - // Avoid an `IllegalAccessError` on Java 9+. - jvmArgs( - "--add-exports", "jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", - "--add-exports", "jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", - "--add-exports", "jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED", - "--add-exports", "jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", - "--add-exports", "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED", - ) - - // Use paths relative to the current module. - val argumentFile = - project.layout.buildDirectory.file("palantir-$name-args.txt").get().asFile - val lastRunTimeFile = - project.layout.buildDirectory.file("palantir-$name-last-run.txt").get().asFile - - // Read the time when this task was last executed for this module (if ever). - val lastRunTime = lastRunTimeFile.takeIf { it.exists() }?.readText()?.toLongOrNull() ?: 0L - - // Use a `fileTree` relative to the module's source directory. - val javaFiles = project.fileTree("src") { include("**/*.java") } - - // Determine if any files need to be formatted or linted and continue only if there is at least - // one file. - onlyIf { javaFiles.any { it.lastModified() > lastRunTime } } - - inputs.files(javaFiles) - - doFirst { - // Create the argument file and set the preferred formatting style. - argumentFile.parentFile.mkdirs() - argumentFile.writeText("--palantir\n") - - if (name == "lint") { - // For lint, do a dry run, so no files are modified. Set the exit code to 1 (instead of - // the default 0) if any files need to be formatted, indicating that linting has failed. - argumentFile.appendText("--dry-run\n") - argumentFile.appendText("--set-exit-if-changed\n") - } else { - // `--dry-run` and `--replace` (for in-place formatting) are mutually exclusive. - argumentFile.appendText("--replace\n") - } - - // Write the modified files to the argument file. - javaFiles.filter { it.lastModified() > lastRunTime } - .forEach { argumentFile.appendText("${it.absolutePath}\n") } - } - - doLast { - // Record the last execution time for later up-to-date checking. - lastRunTimeFile.writeText(System.currentTimeMillis().toString()) - } - - // Pass the argument file using the @ symbol - args = listOf("@${argumentFile.absolutePath}") - - outputs.upToDateWhen { javaFiles.none { it.lastModified() > lastRunTime } } - } - - tasks.named(name) { - dependsOn(tasks.named(javaName)) - } -} - -registerPalantir(name = "format", description = "Formats all Java source files.") -registerPalantir(name = "lint", description = "Verifies all Java source files are formatted.") diff --git a/buildSrc/src/main/kotlin/openai.kotlin.gradle.kts b/buildSrc/src/main/kotlin/openai.kotlin.gradle.kts deleted file mode 100644 index 33c864220..000000000 --- a/buildSrc/src/main/kotlin/openai.kotlin.gradle.kts +++ /dev/null @@ -1,115 +0,0 @@ -import com.openai.gradle.VersionSupportPolicy -import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.dsl.KotlinVersion - -plugins { - id("openai.java") - kotlin("jvm") -} - -repositories { - mavenCentral() -} - -val versionSupportPolicy = - VersionSupportPolicy.load(rootProject.file("gradle/version-support.properties")) -val runtimeFloor = versionSupportPolicy.runtimeFloor(project.name) -val kotlinJvmTarget = if (runtimeFloor == 8) "1.8" else runtimeFloor.toString() - -kotlin { - jvmToolchain { - languageVersion.set(JavaLanguageVersion.of(versionSupportPolicy.buildJdk)) - } - - compilerOptions { - freeCompilerArgs = listOf( - "-Xjvm-default=all", - "-Xjdk-release=$kotlinJvmTarget", - // Suppress deprecation warnings because we may still reference and test deprecated members. - // TODO: Replace with `-Xsuppress-warning=DEPRECATION` once we use Kotlin compiler 2.1.0+. - "-nowarn", - ) - jvmTarget.set(JvmTarget.fromTarget(kotlinJvmTarget)) - languageVersion.set(KotlinVersion.KOTLIN_1_8) - apiVersion.set(KotlinVersion.KOTLIN_1_8) - coreLibrariesVersion = "1.8.0" - } -} - -tasks.withType().configureEach { - systemProperty("junit.jupiter.execution.parallel.enabled", true) - systemProperty("junit.jupiter.execution.parallel.mode.default", "concurrent") - - // `SKIP_MOCK_TESTS` affects which tests run so it must be added as input for proper cache invalidation. - inputs.property("skipMockTests", System.getenv("SKIP_MOCK_TESTS")).optional(true) -} - -val ktfmt by configurations.creating -dependencies { - ktfmt("com.facebook:ktfmt:0.61") -} - -fun registerKtfmt( - name: String, - description: String, -) { - val kotlinName = "${name}Kotlin" - tasks.register(kotlinName) { - group = "Verification" - this.description = description - - classpath = ktfmt - mainClass = "com.facebook.ktfmt.cli.Main" - - // Use paths relative to the current module. - val argumentFile = project.layout.buildDirectory.file("ktfmt-$name-args.txt").get().asFile - val lastRunTimeFile = - project.layout.buildDirectory.file("ktfmt-$name-last-run.txt").get().asFile - - // Read the time when this task was last executed for this module (if ever). - val lastRunTime = lastRunTimeFile.takeIf { it.exists() }?.readText()?.toLongOrNull() ?: 0L - - // Use a `fileTree` relative to the module's source directory. - val kotlinFiles = project.fileTree("src") { include("**/*.kt") } - - // Determine if any files need to be formatted or linted and continue only if there is at least - // one file (otherwise Ktfmt will fail). - onlyIf { kotlinFiles.any { it.lastModified() > lastRunTime } } - - inputs.files(kotlinFiles) - - doFirst { - // Create the argument file and set the preferred formatting style. - argumentFile.parentFile.mkdirs() - argumentFile.writeText("--kotlinlang-style\n") - - if (name == "lint") { - // For lint, do a dry run, so no files are modified. Set the exit code to 1 (instead of - // the default 0) if any files need to be formatted, indicating that linting has failed. - argumentFile.appendText("--dry-run\n") - argumentFile.appendText("--set-exit-if-changed\n") - } - - // Write the modified files to the argument file. - kotlinFiles.filter { it.lastModified() > lastRunTime } - .forEach { argumentFile.appendText("${it.absolutePath}\n") } - } - - doLast { - // Record the last execution time for later up-to-date checking. - lastRunTimeFile.writeText(System.currentTimeMillis().toString()) - } - - // Pass the argument file using the @ symbol - args = listOf("@${argumentFile.absolutePath}") - - outputs.upToDateWhen { kotlinFiles.none { it.lastModified() > lastRunTime } } - } - - tasks.named(name) { - dependsOn(tasks.named(kotlinName)) - } -} - -registerKtfmt(name = "format", description = "Formats all Kotlin source files.") -registerKtfmt(name = "lint", description = "Verifies all Kotlin source files are formatted.") diff --git a/buildSrc/src/main/kotlin/openai.publish.gradle.kts b/buildSrc/src/main/kotlin/openai.publish.gradle.kts deleted file mode 100644 index c645c2ed9..000000000 --- a/buildSrc/src/main/kotlin/openai.publish.gradle.kts +++ /dev/null @@ -1,72 +0,0 @@ -import com.vanniktech.maven.publish.JavadocJar -import com.vanniktech.maven.publish.KotlinJvm -import com.vanniktech.maven.publish.MavenPublishBaseExtension -import com.vanniktech.maven.publish.SonatypeHost - -plugins { - id("com.vanniktech.maven.publish") -} - -publishing { - repositories { - if (project.hasProperty("publishLocal")) { - maven { - name = "LocalFileSystem" - url = uri("${rootProject.layout.buildDirectory.get()}/local-maven-repo") - } - } - } -} - -repositories { - gradlePluginPortal() - mavenCentral() -} - -extra["signingInMemoryKey"] = System.getenv("GPG_SIGNING_KEY") -extra["signingInMemoryKeyId"] = System.getenv("GPG_SIGNING_KEY_ID") -extra["signingInMemoryKeyPassword"] = System.getenv("GPG_SIGNING_PASSWORD") - -configure { - if (!project.hasProperty("publishLocal")) { - signAllPublications() - publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL) - } - - coordinates(project.group.toString(), project.name, project.version.toString()) - configure( - KotlinJvm( - javadocJar = JavadocJar.Dokka("dokkaJavadoc"), - sourcesJar = true, - ) - ) - - pom { - name.set("OpenAI API") - description.set("The OpenAI REST API. Please see https://platform.openai.com/docs/api-reference\nfor more details.") - url.set("https://platform.openai.com/docs") - - licenses { - license { - name.set("Apache-2.0") - } - } - - developers { - developer { - name.set("OpenAI") - email.set("support@openai.com") - } - } - - scm { - connection.set("scm:git:git://github.com/openai/openai-java.git") - developerConnection.set("scm:git:git://github.com/openai/openai-java.git") - url.set("https://github.com/openai/openai-java") - } - } -} - -tasks.withType().configureEach { - isZip64 = true -} diff --git a/buildSrc/src/main/kotlin/openai.wiremock-test.gradle.kts b/buildSrc/src/main/kotlin/openai.wiremock-test.gradle.kts deleted file mode 100644 index c49deb7dd..000000000 --- a/buildSrc/src/main/kotlin/openai.wiremock-test.gradle.kts +++ /dev/null @@ -1,43 +0,0 @@ -plugins { - java -} - -// WireMock 3 and Jetty 12 require Java 17 at test runtime even though the SDK targets Java 8. -listOf(configurations.testCompileClasspath, configurations.testRuntimeClasspath).forEach { - it.configure { - attributes.attribute( - org.gradle.api.attributes.java.TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, - 17, - ) - } -} - -dependencies { - constraints { - testImplementation("com.google.guava:guava:33.6.0-jre") { - because("WireMock's transitive Guava 31.1-jre has known temporary-file vulnerabilities") - } - testImplementation("commons-fileupload:commons-fileupload:1.6.0") { - because("WireMock's transitive 1.4 release has known denial-of-service vulnerabilities") - } - testImplementation("org.xmlunit:xmlunit-core:2.11.0") { - because("2.11.0 includes the fix for CVE-2024-31573 in this test-only dependency") - } - testImplementation("commons-io:commons-io:2.22.0") { - because("WireMock's transitive Commons IO version has a resource-exhaustion vulnerability") - } - testImplementation("com.jayway.jsonpath:json-path:2.10.0") { - because("WireMock's transitive JSONPath version has a stack-overflow vulnerability") - } - testImplementation("org.apache.commons:commons-lang3:3.18.0") { - because("WireMock's transitive 3.12.0 release is vulnerable to uncontrolled recursion") - } - testImplementation("com.github.jknack:handlebars:4.5.3") { - because("WireMock's transitive 4.3.1 dependency is affected by CVE-2026-55760") - } - } - - testImplementation(platform("org.eclipse.jetty:jetty-bom:12.0.36")) - testImplementation(platform("org.eclipse.jetty.ee10:jetty-ee10-bom:12.0.36")) - testImplementation("org.wiremock:wiremock-jetty12:3.13.2") -} diff --git a/buildSrc/src/test/kotlin/com/openai/gradle/VersionSupportPolicyTest.kt b/buildSrc/src/test/kotlin/com/openai/gradle/VersionSupportPolicyTest.kt deleted file mode 100644 index 500d7ed3e..000000000 --- a/buildSrc/src/test/kotlin/com/openai/gradle/VersionSupportPolicyTest.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.openai.gradle - -import java.nio.file.Path -import kotlin.io.path.writeText -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertFailsWith -import kotlin.test.assertTrue -import org.junit.jupiter.api.io.TempDir - -class VersionSupportPolicyTest { - @TempDir lateinit var temporaryDirectory: Path - - @Test - fun `matrices include supported artifact floors and exclude EOL floors`() { - val policy = - loadPolicy( - """ - build.jdk=21 - test.current-lts=25 - test.supported-lts=8,11,17,21,25 - test.current-non-lts=26 - artifact.java-8.runtime=8 - artifact.java-8.lifecycle=active - artifact.java-17.runtime=17 - artifact.java-17.lifecycle=maintenance - artifact.eol.runtime=11 - artifact.eol.lifecycle=eol - """ - ) - - assertEquals(listOf(8, 17, 25), policy.runtimeMatrix("pull-request")) - assertEquals(listOf(8, 11, 17, 21, 25, 26), policy.runtimeMatrix("full")) - } - - @Test - fun `Java properties syntax has one validated interpretation`() { - val policy = - loadPolicy( - """ - build.jdk : 21 - test.current-lts = 25 - test.supported-lts = 8,11,17,21,\ - 25 - test.current-non-lts = 26 - artifact.core.runtime = 8 - artifact.core.lifecycle = active - """ - ) - - assertEquals(listOf(8, 11, 17, 21, 25), policy.supportedLts) - } - - @Test - fun `unknown properties fail closed`() { - val error = - assertFailsWith { - loadPolicy( - """ - build.jdk=21 - test.current-lts=25 - test.supported-lts=8,11,17,21,25 - test.current-non-lts=26 - test.minimum=8 - artifact.core.runtime=8 - artifact.core.lifecycle=active - """ - ) - } - - assertTrue(error.message.orEmpty().contains("Unknown version support properties")) - } - - private fun loadPolicy(contents: String): VersionSupportPolicy { - val policyFile = temporaryDirectory.resolve("version-support.properties") - policyFile.writeText(contents.trimIndent()) - return VersionSupportPolicy.load(policyFile.toFile()) - } -} diff --git a/docs/spring-boot-2-eol.md b/docs/spring-boot-2-eol.md deleted file mode 100644 index e319bb73c..000000000 --- a/docs/spring-boot-2-eol.md +++ /dev/null @@ -1,63 +0,0 @@ -# Spring Boot 2 starter end-of-life - -**Status:** Accepted 2026-07-27 - -## Decision - -`com.openai:openai-java-spring-boot-starter` targets Spring Boot 2.7 and is OpenAI EOL effective -2026-07-27. Version 4.45.0 is its final supported, tested, and published OpenAI SDK release. That -release remains downloadable, but no later starter versions will be published and it receives no -fixes, testing, or compatibility support. - -Spring ended public OSS support for Boot 2 with -[2.7.18 on 2023-11-23](https://spring.io/blog/2023/11/23/spring-boot-2-7-18-available-now/). -The policy's maximum six-month grace period therefore ended 2024-05-23. Commercial maintenance does -not satisfy the repository's OSS-support admission rule, and the upstream gap is already much -longer than the permitted grace period. - -Declaring the unchanged starter EOL is a minor release. Removing the artifact, raising its Java -floor, or changing the same coordinate to a newer Spring generation would require a SemVer major. -A future supported Spring integration must use generation-specific coordinates and independently -pass the policy's 12-month admission gate. - -## History and source removal - -The starter was introduced in SDK 2.18.0 after -[an external request](https://github.com/openai/openai-java/issues/480) for Spring Boot -`application.properties` and `application.yml` support. It was a customer-facing convenience -artifact, not a test fixture: it bound `openai.*` configuration, created an injectable -`OpenAIClient` bean, and allowed applications to customize the client builder. - -The starter's source was removed from the active build after its final release. Keeping that source -on the default branch did not verify 4.45.0: the module depended on the current checkout's -`openai-java` project and therefore compiled and tested an unpublished, changing combination of the -current SDK with Spring Boot 2.7.18. It also kept the EOL Spring dependency graph active for -repository security scanning. - -Removing the active source does not withdraw the released artifact. Version 4.45.0 remains on Maven -Central, and its exact implementation and tests remain available in the -[`v4.45.0` source tag](https://github.com/openai/openai-java/tree/v4.45.0/openai-java-spring-boot-starter). -The tagged -[`v4.45.0` README](https://github.com/openai/openai-java/blob/v4.45.0/README.md#spring-boot) -preserves its final installation and configuration instructions. - -## Consumer migration - -Applications that cannot leave Boot 2 may pin the starter to 4.45.0, but do so without OpenAI or -upstream OSS security support. The preferred path is: - -1. Follow Spring's [Boot 3 migration guide](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide): - upgrade to the latest 2.7 release first, move to Java 17 and Spring Framework 6, and migrate - affected Java EE imports to Jakarta EE. -2. Remove `openai-java-spring-boot-starter`. -3. Depend on `com.openai:openai-java` and provide a normal application-owned `OpenAIClient` bean. - -```java -@Bean -OpenAIClient openAIClient() { - return OpenAIOkHttpClient.fromEnv(); -} -``` - -This keeps Spring's dependency platform authoritative and avoids pretending that a Boot 2 -auto-configuration artifact supports Boot 3 or later. diff --git a/docs/version-support-policy.md b/docs/version-support-policy.md deleted file mode 100644 index 1640df974..000000000 --- a/docs/version-support-policy.md +++ /dev/null @@ -1,88 +0,0 @@ -# Java version support policy - -This policy governs the OpenAI Java SDK's supported JVMs, framework integrations, and -material runtime dependencies. Compatibility is declared per published artifact, not inferred -from the JDK used to build the repository. Dependency-specific decisions belong in short ADRs -that apply this policy. - -## Compatibility contract - -- Every artifact declares its runtime and bytecode/API floor and lifecycle state in - [`gradle/version-support.properties`](../gradle/version-support.properties). Framework - generations and tested ranges belong in the relevant artifact documentation or ADR. -- A newer build JDK must not silently raise the consumer runtime floor. -- The framework-neutral core evolves independently from optional integrations. An integration may - require a newer JVM only when it uses a separate, generation-specific artifact. - -## Admission and retirement - -- Do not add support for a runtime, framework, or major dependency generation with fewer than - **12 months of expected public OSS security maintenance** remaining. Commercial-only maintenance - does not count. -- An already-supported generation enters maintenance during its final 12 months: critical fixes and - migration help only, with no feature expansion. -- At upstream EOL, retire support or grant a documented grace period of **up to six months**. State - the exact end date and the limits of supporting software that no longer receives upstream fixes. -- After the grace period, the generation is OpenAI EOL. Old artifacts may remain downloadable, but - availability is not support. -- Security risk may shorten timelines. It does not turn a breaking change into a compatible one. - -## Framework and dependency ownership - -- Use separate coordinates for materially incompatible framework generations. Do not span them - with reflection or hidden runtime branching. -- The consuming application's framework platform or BOM is authoritative. Do not force isolated - framework components outside its supported dependency graph. -- OpenAI owns core implementation dependencies. Consumers own their application platform. - Optional integration dependencies are shared: OpenAI declares and tests the range; consumers - choose the version through their platform. - -## Release treatment - -| Change | Default release | -| --- | --- | -| Fix or dependency update within the supported contract | Patch | -| Add a new, explicit integration artifact | Minor | -| Move an existing generation to maintenance, deprecate it, or declare it EOL while leaving its last release available | Minor | -| Raise an artifact's JVM/API floor; change its framework generation; remove an artifact; or remove a transitive dependency consumers may rely on | Major | -| Urgent security-driven incompatible change | Major by default; security changes timing, not compatibility | - -## Required proof - -- **Every PR:** verify every published artifact's declared JVM floor, compiler API floor, and - emitted bytecode; run each supported artifact's isolated consumer smoke test on its runtime floor - and the current LTS; check public API compatibility; and run the normal build, test, and - dependency-compatibility suites. -- **Nightly and before release:** run every supported artifact's isolated consumer smoke test on - every compatible supported LTS and use the current non-LTS JDK as a forward-compatibility signal. -- **Quarterly and before GA:** review upstream lifecycles and revalidate the 12-month admission gate, - generated metadata, dependency ownership, and migration plan. -- Any material runtime, framework, or dependency-generation change requires an ADR covering - lifecycle evidence, affected artifacts, consumer resolution, migration, SemVer treatment, final - compatible release, and verification. - -## Current decisions - -| Surface | Decision | Next action | -| --- | --- | --- | -| Framework-neutral artifacts | Keep Java 8 through SDK v4. | Raise the floor only in an SDK major; first prefer replacing or isolating a constraining dependency. | -| Retired Spring Boot 2 starter | OpenAI EOL as of 2026-07-27; 4.45.0 is the final supported and published release, and its source is no longer in the active build. | Keep the final artifact and tagged source available; follow the [Spring Boot 2 EOL decision](spring-boot-2-eol.md); publish no later versions. | -| Potential Spring Boot 4 integration | Candidate Java 17 integration using a new generation-specific artifact. | Pass the admission gate and Spring ADR before implementation. | - -Do not publish an OpenAI Java BOM until independently versioned artifacts or demonstrated consumer -resolution failures create a real alignment need. Add an optional integration only when it passes -the lifecycle gate, solves substantial repeated work for SDK users, and has a named owner and funded -compatibility matrix. - -## Supporting rationale - -- Direct AI SDK peers such as [Anthropic Java](https://github.com/anthropics/anthropic-sdk-java#requirements) - and [Google Gen AI Java](https://github.com/googleapis/java-genai/blob/main/pom.xml) retain a Java 8 - core floor. -- [Google Cloud Java](https://github.com/googleapis/java-datastore#supported-java-versions) treats - raising the JVM floor as a SemVer-major boundary. -- The [AWS SDK maintenance policy](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html) - demonstrates explicit, time-bounded support beyond an upstream dependency's EOL. -- [Jackson](https://github.com/FasterXML/jackson-databind#jdk) and - [Spring Boot](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide) - use major generations for JVM, package, namespace, and framework compatibility boundaries. diff --git a/gradle.properties b/gradle.properties deleted file mode 100644 index e2e40f0e7..000000000 --- a/gradle.properties +++ /dev/null @@ -1,22 +0,0 @@ -org.gradle.caching=true -org.gradle.configuration-cache=true -org.gradle.parallel=true -org.gradle.daemon=false -# Keep the existing Dokka task graph and generated Javadoc links stable. Migrate to Dokka's V2 -# task/aggregation model and K2 analysis as separate documentation-pipeline changes. -org.jetbrains.dokka.experimental.gradle.pluginMode=V1Enabled -org.jetbrains.dokka.experimental.tryK2=false -# These options improve our compilation and test performance. They are inherited by the Kotlin daemon. -org.gradle.jvmargs=\ - -Xms2g \ - -Xmx8g \ - -XX:+UseParallelGC \ - -XX:InitialCodeCacheSize=256m \ - -XX:ReservedCodeCacheSize=1G \ - -XX:MetaspaceSize=512m \ - -XX:MaxMetaspaceSize=2G \ - -XX:TieredStopAtLevel=1 \ - -XX:GCTimeRatio=4 \ - -XX:CICompilerCount=4 \ - -XX:+OptimizeStringConcat \ - -XX:+UseStringDeduplication diff --git a/gradle/version-support.properties b/gradle/version-support.properties deleted file mode 100644 index ce6cec66c..000000000 --- a/gradle/version-support.properties +++ /dev/null @@ -1,17 +0,0 @@ -# Repository toolchain. This may be newer than any published artifact's runtime floor. -build.jdk=21 - -# JVMs exercised by consumer-facing compatibility smoke tests. -test.current-lts=25 -test.supported-lts=8,11,17,21,25 -test.current-non-lts=26 - -# Published artifacts must declare a runtime floor and lifecycle. -artifact.openai-java.runtime=8 -artifact.openai-java.lifecycle=active -artifact.openai-java-bedrock.runtime=8 -artifact.openai-java-bedrock.lifecycle=active -artifact.openai-java-client-okhttp.runtime=8 -artifact.openai-java-client-okhttp.lifecycle=active -artifact.openai-java-core.runtime=8 -artifact.openai-java-core.lifecycle=active diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index a4b76b9530d66f5e68d973ea569d8e19de379189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index cea7a793a..000000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew deleted file mode 100755 index f3b75f3b0..000000000 --- a/gradlew +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, -# and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be -# treated as '${Hostname}' itself on the command line. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index 9d21a2183..000000000 --- a/gradlew.bat +++ /dev/null @@ -1,94 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/openai-java-bedrock/build.gradle.kts b/openai-java-bedrock/build.gradle.kts deleted file mode 100644 index 46bab640e..000000000 --- a/openai-java-bedrock/build.gradle.kts +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id("openai.kotlin") - id("openai.wiremock-test") - id("openai.publish") -} - -dependencies { - api(project(":openai-java-client-okhttp")) - - // Keep AWS dependencies isolated to this optional Bedrock artifact. - api(platform("software.amazon.awssdk:bom:2.46.8")) - api("software.amazon.awssdk:auth") - api("software.amazon.awssdk:regions") - - implementation("software.amazon.awssdk:http-client-spi") - implementation("com.squareup.okhttp3:okhttp:4.12.0") - - // Optional provider-chain branches loaded by the AWS SDK at runtime for web identity, - // assume-role, console login, and IAM Identity Center profiles. - runtimeOnly("software.amazon.awssdk:sts") { - exclude(group = "software.amazon.awssdk", module = "apache5-client") - exclude(group = "software.amazon.awssdk", module = "netty-nio-client") - } - runtimeOnly("software.amazon.awssdk:sso") { - exclude(group = "software.amazon.awssdk", module = "apache5-client") - exclude(group = "software.amazon.awssdk", module = "netty-nio-client") - } - runtimeOnly("software.amazon.awssdk:ssooidc") { - exclude(group = "software.amazon.awssdk", module = "apache5-client") - exclude(group = "software.amazon.awssdk", module = "netty-nio-client") - } - runtimeOnly("software.amazon.awssdk:signin") { - exclude(group = "software.amazon.awssdk", module = "apache5-client") - exclude(group = "software.amazon.awssdk", module = "netty-nio-client") - } - runtimeOnly("software.amazon.awssdk:url-connection-client") - - testImplementation(kotlin("test")) - // Keep WireMock's transitive Jackson runtime aligned on a secure release. - testImplementation(platform("com.fasterxml.jackson:jackson-bom:2.21.5")) - testImplementation("org.assertj:assertj-core:3.27.7") - testImplementation("org.junit.jupiter:junit-jupiter-api:5.9.3") - testImplementation("org.junit-pioneer:junit-pioneer:1.9.1") -} diff --git a/openai-java-bedrock/src/main/kotlin/com/openai/bedrock/BedrockAuth.kt b/openai-java-bedrock/src/main/kotlin/com/openai/bedrock/BedrockAuth.kt deleted file mode 100644 index f6a0e65dc..000000000 --- a/openai-java-bedrock/src/main/kotlin/com/openai/bedrock/BedrockAuth.kt +++ /dev/null @@ -1,472 +0,0 @@ -package com.openai.bedrock - -import com.openai.core.http.Headers -import com.openai.core.http.HttpRequest -import com.openai.core.http.HttpRequestAuthenticator -import com.openai.errors.OpenAIException -import java.io.ByteArrayOutputStream -import java.net.URI -import java.time.Clock -import java.util.concurrent.CompletableFuture -import java.util.concurrent.Executor -import java.util.concurrent.ExecutorService -import java.util.concurrent.Executors -import java.util.concurrent.ThreadFactory -import java.util.concurrent.atomic.AtomicLong -import java.util.function.Supplier -import okhttp3.HttpUrl -import okhttp3.HttpUrl.Companion.toHttpUrl -import software.amazon.awssdk.auth.credentials.AwsBasicCredentials -import software.amazon.awssdk.auth.credentials.AwsCredentials -import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider -import software.amazon.awssdk.auth.credentials.AwsSessionCredentials -import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider -import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider -import software.amazon.awssdk.http.ContentStreamProvider -import software.amazon.awssdk.http.SdkHttpMethod -import software.amazon.awssdk.http.SdkHttpRequest -import software.amazon.awssdk.http.auth.aws.signer.AwsV4HttpSigner -import software.amazon.awssdk.http.auth.spi.signer.HttpSigner -import software.amazon.awssdk.http.auth.spi.signer.SignRequest -import software.amazon.awssdk.identity.spi.AwsCredentialsIdentity -import software.amazon.awssdk.regions.Region -import software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain - -internal const val BEDROCK_SERVICE = "bedrock-mantle" -internal const val ENV_BEARER_TOKEN = "AWS_BEARER_TOKEN_BEDROCK" -internal const val ENV_BASE_URL = "AWS_BEDROCK_BASE_URL" - -internal data class BedrockConfiguration( - val baseUrl: String, - val authenticator: HttpRequestAuthenticator, -) - -internal data class BedrockAuthOptions( - val awsRegion: String?, - val baseUrl: String?, - val apiKey: String?, - val tokenProvider: Supplier?, - val awsAccessKeyId: String?, - val awsSecretAccessKey: String?, - val awsSessionToken: String?, - val awsProfile: String?, - val awsCredentialsProvider: AwsCredentialsProvider?, - val skipAuth: Boolean, - val clock: Clock, - val authenticationExecutor: Executor?, -) - -internal fun BedrockAuthOptions.resolve( - getenv: (String) -> String? = System::getenv, - regionProvider: () -> Region? = { - try { - DefaultAwsRegionProviderChain.builder().build().region - } catch (_: RuntimeException) { - null - } - }, -): BedrockConfiguration { - val normalizedRegion = normalize("awsRegion", awsRegion) - val normalizedBaseUrl = normalize("baseUrl", baseUrl) - val normalizedApiKey = normalize("apiKey", apiKey) - val normalizedProfile = normalize("awsProfile", awsProfile) - - if (apiKey != null && normalizedApiKey == null) { - throw OpenAIException("The Bedrock bearer credential must not be empty.") - } - if (tokenProvider != null && apiKey != null) { - throw OpenAIException( - "The `apiKey` and `bedrockTokenProvider` options are mutually exclusive. Configure only one." - ) - } - if (awsProfile != null && normalizedProfile == null) { - throw OpenAIException("The Bedrock AWS `awsProfile` must not be empty.") - } - - val staticCredentials = resolveStaticCredentials() - val awsModeCount = - listOf(staticCredentials != null, normalizedProfile != null, awsCredentialsProvider != null) - .count { it } - if (awsModeCount > 1) { - throw OpenAIException( - "Bedrock authentication is ambiguous. Configure exactly one explicit AWS mode: static credentials, profile, or credential provider." - ) - } - - val explicitBearer = normalizedApiKey != null || tokenProvider != null - val explicitAws = awsModeCount == 1 - if (explicitBearer && explicitAws) { - throw OpenAIException( - "Bearer and AWS credential authentication are mutually exclusive. Configure exactly one explicit mode: bearer credential, static AWS credentials, profile, or credential provider." - ) - } - if (skipAuth && (explicitBearer || explicitAws)) { - throw OpenAIException( - "Bedrock authentication is ambiguous. `skipAuth` cannot be combined with bearer or AWS credentials." - ) - } - - val environmentBaseUrl = normalizeEnvironment(getenv(ENV_BASE_URL)) - val resolvedRegion by lazy { - normalizedRegion - ?: normalizeEnvironment(getenv("AWS_REGION")) - ?: normalizeEnvironment(getenv("AWS_DEFAULT_REGION")) - ?: regionProvider()?.id() - } - val resolvedBaseUrl = - normalizedBaseUrl - ?: environmentBaseUrl - ?: resolvedRegion?.let { "https://bedrock-mantle.$it.api.aws/openai/v1" } - ?: throw OpenAIException( - "Bedrock requires an AWS region. Pass `awsRegion` to the builder, or set `AWS_REGION` or `AWS_DEFAULT_REGION`." - ) - val normalizedResolvedBaseUrl = normalizeBaseUrl(resolvedBaseUrl) - val resolvedAuthenticationExecutor by lazy { - authenticationExecutor ?: newAuthenticationExecutor() - } - val ownsAuthenticationExecutor = authenticationExecutor == null - - if (skipAuth) { - return BedrockConfiguration( - normalizedResolvedBaseUrl, - NoAuthAuthenticator(normalizedResolvedBaseUrl), - ) - } - - val bearerSupplier = - when { - tokenProvider != null -> tokenProvider - normalizedApiKey != null -> Supplier { normalizedApiKey } - !explicitAws && normalizeEnvironment(getenv(ENV_BEARER_TOKEN)) != null -> - Supplier { - normalizeEnvironment(getenv(ENV_BEARER_TOKEN)) - ?: throw OpenAIException( - "Could not find credentials for Bedrock. Set `AWS_BEARER_TOKEN_BEDROCK` or configure AWS credential authentication." - ) - } - else -> null - } - - if (bearerSupplier != null) { - return BedrockConfiguration( - normalizedResolvedBaseUrl, - BearerAuthenticator( - normalizedResolvedBaseUrl, - bearerSupplier, - resolvedAuthenticationExecutor, - ownsAuthenticationExecutor, - ), - ) - } - - val region = - resolvedRegion - ?: throw OpenAIException( - "Bedrock requires an AWS region. Pass `awsRegion` to the builder, or set `AWS_REGION` or `AWS_DEFAULT_REGION`." - ) - val (credentialsProvider, ownsCredentialsProvider) = - when { - staticCredentials != null -> AwsCredentialsProvider { staticCredentials } to false - normalizedProfile != null -> - ProfileCredentialsProvider.create(normalizedProfile) to true - awsCredentialsProvider != null -> awsCredentialsProvider to false - else -> DefaultCredentialsProvider.builder().build() to true - } - - return BedrockConfiguration( - normalizedResolvedBaseUrl, - SigV4Authenticator( - baseUrl = normalizedResolvedBaseUrl, - region = Region.of(region), - credentialsProvider = credentialsProvider, - ownsCredentialsProvider = ownsCredentialsProvider, - defaultChain = !explicitAws, - clock = clock, - authenticationExecutor = resolvedAuthenticationExecutor, - ownsAuthenticationExecutor = ownsAuthenticationExecutor, - ), - ) -} - -private fun newAuthenticationExecutor(): ExecutorService = - Executors.newCachedThreadPool( - object : ThreadFactory { - private val threadFactory = Executors.defaultThreadFactory() - private val count = AtomicLong(0) - - override fun newThread(runnable: Runnable): Thread = - threadFactory.newThread(runnable).also { - it.name = "openai-bedrock-authentication-thread-${count.getAndIncrement()}" - } - } - ) - -private fun BedrockAuthOptions.resolveStaticCredentials(): AwsCredentials? { - val hasAccessKey = awsAccessKeyId != null - val hasSecretKey = awsSecretAccessKey != null - if (hasAccessKey != hasSecretKey || (awsSessionToken != null && !hasAccessKey)) { - throw OpenAIException( - "Static AWS credentials require both `awsAccessKeyId` and `awsSecretAccessKey`. An `awsSessionToken` may only be used with both." - ) - } - if (!hasAccessKey) return null - - val accessKey = awsAccessKeyId!!.trim() - val secretKey = awsSecretAccessKey!!.trim() - if (accessKey.isEmpty() || secretKey.isEmpty()) { - throw OpenAIException( - "Static AWS credentials require non-empty `awsAccessKeyId` and `awsSecretAccessKey` values." - ) - } - val sessionToken = awsSessionToken?.trim() - if (awsSessionToken != null && sessionToken.isNullOrEmpty()) { - throw OpenAIException("A static AWS `awsSessionToken` must not be empty when provided.") - } - - return if (sessionToken == null) AwsBasicCredentials.create(accessKey, secretKey) - else AwsSessionCredentials.create(accessKey, secretKey, sessionToken) -} - -private fun normalize(name: String, value: String?): String? { - val normalized = value?.trim()?.takeIf { it.isNotEmpty() } - if (value != null && normalized == null && (name == "awsRegion" || name == "baseUrl")) { - throw OpenAIException("The Bedrock `$name` must not be empty.") - } - return normalized -} - -private fun normalizeEnvironment(value: String?): String? = - value?.trim()?.takeIf { it.isNotEmpty() } - -private fun normalizeBaseUrl(value: String): String = - try { - value.toHttpUrl().toString().removeSuffix("/") - } catch (cause: IllegalArgumentException) { - throw OpenAIException("The Bedrock `baseUrl` must be a valid HTTP URL.", cause) - } - -private abstract class OriginBoundAuthenticator(baseUrl: String) : HttpRequestAuthenticator { - private val origin = baseUrl.toHttpUrl().origin() - - protected fun resolvedUrl(request: HttpRequest): HttpUrl { - val url = request.resolveUrl() - if (url.origin() != origin) { - throw OpenAIException( - "Bedrock provider authentication cannot be used with a request to a different origin." - ) - } - return url - } -} - -private class NoAuthAuthenticator(baseUrl: String) : OriginBoundAuthenticator(baseUrl) { - override fun authenticate(request: HttpRequest): HttpRequest { - resolvedUrl(request) - return request - } -} - -private abstract class AsyncOriginBoundAuthenticator( - baseUrl: String, - private val authenticationExecutor: Executor, - private val ownsAuthenticationExecutor: Boolean, -) : OriginBoundAuthenticator(baseUrl) { - override fun authenticateAsync(request: HttpRequest): CompletableFuture = - CompletableFuture.supplyAsync({ authenticate(request) }, authenticationExecutor) - - protected fun closeAuthenticationExecutor() { - if (ownsAuthenticationExecutor) { - (authenticationExecutor as? ExecutorService)?.shutdown() - } - } -} - -private class BearerAuthenticator( - baseUrl: String, - private val tokenProvider: Supplier, - authenticationExecutor: Executor, - ownsAuthenticationExecutor: Boolean, -) : AsyncOriginBoundAuthenticator(baseUrl, authenticationExecutor, ownsAuthenticationExecutor) { - override fun authenticate(request: HttpRequest): HttpRequest { - resolvedUrl(request) - assertNoAuthorization(request.headers) - val token = - try { - tokenProvider.get() - } catch (cause: RuntimeException) { - throw OpenAIException("Failed to resolve a bearer credential for Bedrock.", cause) - } - if (token.isNullOrBlank()) { - throw OpenAIException( - "The Bedrock bearer credential provider must return a non-empty string." - ) - } - return request.toBuilder().replaceHeaders("Authorization", "Bearer $token").build() - } - - override fun close() = closeAuthenticationExecutor() -} - -private class SigV4Authenticator( - baseUrl: String, - private val region: Region, - private val credentialsProvider: AwsCredentialsProvider, - private val ownsCredentialsProvider: Boolean, - private val defaultChain: Boolean, - private val clock: Clock, - authenticationExecutor: Executor, - ownsAuthenticationExecutor: Boolean, -) : AsyncOriginBoundAuthenticator(baseUrl, authenticationExecutor, ownsAuthenticationExecutor) { - private val signer = AwsV4HttpSigner.create() - - override fun authenticate(request: HttpRequest): HttpRequest { - val url = resolvedUrl(request) - validateCanonicalRegion(url) - assertNoAuthorization(request.headers) - if (request.body?.repeatable() == false) { - throw OpenAIException( - "Bedrock SigV4 authentication requires a replayable request body. Buffer the body before sending or use bearer authentication." - ) - } - - val preparedRequest = - request - .toBuilder() - .removeAllHeaders( - setOf( - "Authorization", - "X-Amz-Date", - "X-Amz-Security-Token", - "X-Amz-Content-Sha256", - ) - ) - .apply { - request.body?.contentType()?.let { contentType -> - if (request.headers.values("Content-Type").isEmpty()) { - putHeader("Content-Type", contentType) - } - } - } - .build() - val bodyBytes = - preparedRequest.body?.let { body -> - ByteArrayOutputStream().use { output -> - body.writeTo(output) - output.toByteArray() - } - } - val awsRequest = preparedRequest.toAwsRequest(url.toUri()) - val credentials = resolveCredentials() - val signed = - signer.sign { signRequest: SignRequest.Builder -> - signRequest - .identity(credentials) - .request(awsRequest) - .apply { - if (bodyBytes != null) { - payload(ContentStreamProvider.fromByteArray(bodyBytes)) - } - } - .putProperty(AwsV4HttpSigner.SERVICE_SIGNING_NAME, BEDROCK_SERVICE) - .putProperty(AwsV4HttpSigner.REGION_NAME, region.id()) - .putProperty(HttpSigner.SIGNING_CLOCK, clock) - } - - return preparedRequest.toBuilder().headers(signed.request().headers()).build() - } - - override fun close() { - var failure: Throwable? = null - if (ownsCredentialsProvider) { - try { - (credentialsProvider as? AutoCloseable)?.close() - } catch (cause: Throwable) { - failure = cause - } - } - try { - closeAuthenticationExecutor() - } catch (cause: Throwable) { - val previousFailure = failure - if (previousFailure == null) { - failure = cause - } else if (cause !== previousFailure) { - previousFailure.addSuppressed(cause) - } - } - failure?.let { throw it } - } - - private fun resolveCredentials(): AwsCredentials { - val credentials = - try { - credentialsProvider.resolveCredentials() - } catch (cause: RuntimeException) { - val message = - if (defaultChain) - "Could not find credentials for Bedrock. Pass AWS credentials to the builder or configure the default AWS credential chain." - else - "Failed to resolve AWS credentials for Bedrock. Verify your AWS profile, environment variables, or runtime identity configuration and try again." - throw OpenAIException(message, cause) - } - if ( - credentials.accessKeyId().isNullOrBlank() || - credentials.secretAccessKey().isNullOrBlank() || - (credentials is AwsSessionCredentials && credentials.sessionToken().isBlank()) - ) { - throw OpenAIException( - "Failed to resolve AWS credentials for Bedrock. Verify your AWS profile, environment variables, or runtime identity configuration and try again." - ) - } - return credentials - } - - private fun validateCanonicalRegion(url: HttpUrl) { - val canonicalRegion = - Regex("^bedrock-mantle\\.([a-z0-9-]+)\\.api\\.aws$", RegexOption.IGNORE_CASE) - .matchEntire(url.host) - ?.groupValues - ?.get(1) - if (canonicalRegion != null && canonicalRegion != region.id()) { - throw OpenAIException( - "The Bedrock endpoint region `$canonicalRegion` does not match the SigV4 region `${region.id()}`." - ) - } - } -} - -private fun HttpRequest.toAwsRequest(uri: URI): SdkHttpRequest { - val builder = - SdkHttpRequest.builder().uri(uri).method(SdkHttpMethod.fromValue(method.name)).apply { - this@toAwsRequest.headers.names().forEach { name -> - if (!name.equals("connection", ignoreCase = true)) { - this@toAwsRequest.headers.values(name).forEach { value -> - appendHeader(name, value) - } - } - } - } - return builder.build() -} - -private fun assertNoAuthorization(headers: Headers) { - if (headers.values("Authorization").isNotEmpty()) { - throw OpenAIException( - "Bedrock provider authentication cannot be combined with a custom `Authorization` header." - ) - } -} - -private fun HttpRequest.resolveUrl(): HttpUrl = - baseUrl - .toHttpUrl() - .newBuilder() - .apply { - pathSegments.forEach(::addPathSegment) - queryParams.keys().forEach { key -> - queryParams.values(key).forEach { value -> addQueryParameter(key, value) } - } - } - .build() - -private fun HttpUrl.origin(): String = "$scheme://$host:$port" diff --git a/openai-java-bedrock/src/main/kotlin/com/openai/client/okhttp/BedrockOpenAIOkHttpClient.kt b/openai-java-bedrock/src/main/kotlin/com/openai/client/okhttp/BedrockOpenAIOkHttpClient.kt deleted file mode 100644 index eead9cc9b..000000000 --- a/openai-java-bedrock/src/main/kotlin/com/openai/client/okhttp/BedrockOpenAIOkHttpClient.kt +++ /dev/null @@ -1,247 +0,0 @@ -package com.openai.client.okhttp - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.openai.bedrock.BedrockAuthOptions -import com.openai.bedrock.resolve -import com.openai.client.OpenAIClient -import com.openai.core.LogLevel -import com.openai.core.Sleeper -import com.openai.core.Timeout -import com.openai.core.http.Headers -import com.openai.core.http.ProxyAuthenticator -import com.openai.core.http.QueryParams -import java.net.Proxy -import java.time.Clock -import java.time.Duration -import java.util.Optional -import java.util.concurrent.Executor -import java.util.concurrent.ExecutorService -import java.util.function.Supplier -import javax.net.ssl.HostnameVerifier -import javax.net.ssl.SSLSocketFactory -import javax.net.ssl.X509TrustManager -import kotlin.jvm.optionals.getOrNull -import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider -import software.amazon.awssdk.regions.Region - -/** - * Builds an [OpenAIClient] configured for OpenAI-compatible APIs on Amazon Bedrock. - * - * By default, authentication follows the normal AWS credential provider chain, including - * environment variables, shared credentials and config files, named profiles, workload credentials, - * and instance metadata. Requests are signed with AWS SigV4 on every attempt. - */ -class BedrockOpenAIOkHttpClient private constructor() { - - companion object { - /** Returns a mutable builder for constructing a Bedrock client. */ - @JvmStatic fun builder() = Builder() - - /** Builds a client using the standard AWS credential and region provider chains. */ - @JvmStatic fun fromEnv(): OpenAIClient = builder().build() - } - - class Builder internal constructor() { - private val delegate = OpenAIOkHttpClient.builder().followRedirects(false) - - private var awsRegion: String? = null - private var baseUrl: String? = null - private var apiKey: String? = null - private var tokenProvider: Supplier? = null - private var awsAccessKeyId: String? = null - private var awsSecretAccessKey: String? = null - private var awsSessionToken: String? = null - private var awsProfile: String? = null - private var awsCredentialsProvider: AwsCredentialsProvider? = null - private var skipAuth: Boolean = false - private var clock: Clock = Clock.systemUTC() - private var authenticationExecutor: Executor? = null - - /** Sets the AWS region used for endpoint resolution and SigV4 signing. */ - fun awsRegion(awsRegion: String?) = apply { this.awsRegion = awsRegion } - - /** Sets the AWS region used for endpoint resolution and SigV4 signing. */ - fun awsRegion(awsRegion: Region) = awsRegion(awsRegion.id()) - - /** Alias for calling [awsRegion] with `awsRegion.orElse(null)`. */ - fun awsRegion(awsRegion: Optional) = awsRegion(awsRegion.getOrNull()) - - /** - * Overrides the Bedrock API root. Defaults to `AWS_BEDROCK_BASE_URL`, then the regional - * `https://bedrock-mantle.{region}.api.aws/openai/v1` endpoint. - */ - fun baseUrl(baseUrl: String?) = apply { this.baseUrl = baseUrl } - - /** Alias for calling [baseUrl] with `baseUrl.orElse(null)`. */ - fun baseUrl(baseUrl: Optional) = baseUrl(baseUrl.getOrNull()) - - /** Uses an explicit Bedrock bearer credential instead of AWS SigV4. */ - fun apiKey(apiKey: String?) = apply { this.apiKey = apiKey } - - /** Alias for calling [apiKey] with `apiKey.orElse(null)`. */ - fun apiKey(apiKey: Optional) = apiKey(apiKey.getOrNull()) - - /** Resolves a fresh Bedrock bearer credential before every request attempt. */ - fun bedrockTokenProvider(tokenProvider: Supplier) = apply { - this.tokenProvider = tokenProvider - } - - /** Sets an explicit AWS access key ID. Must be paired with [awsSecretAccessKey]. */ - fun awsAccessKeyId(awsAccessKeyId: String?) = apply { this.awsAccessKeyId = awsAccessKeyId } - - /** Sets an explicit AWS secret access key. Must be paired with [awsAccessKeyId]. */ - fun awsSecretAccessKey(awsSecretAccessKey: String?) = apply { - this.awsSecretAccessKey = awsSecretAccessKey - } - - /** Sets an optional session token for explicit temporary AWS credentials. */ - fun awsSessionToken(awsSessionToken: String?) = apply { - this.awsSessionToken = awsSessionToken - } - - /** Resolves AWS credentials from a named shared-config profile. */ - fun awsProfile(awsProfile: String?) = apply { this.awsProfile = awsProfile } - - /** - * Uses a custom, refreshable AWS credentials provider. The caller retains ownership of the - * provider and is responsible for closing it when it is no longer needed. - */ - fun awsCredentialsProvider(awsCredentialsProvider: AwsCredentialsProvider) = apply { - this.awsCredentialsProvider = awsCredentialsProvider - } - - /** - * Skips Bedrock authentication. This is intended for proxies or tests that authenticate - * requests outside this SDK. - */ - fun skipAuth(skipAuth: Boolean) = apply { this.skipAuth = skipAuth } - - fun dispatcherExecutorService(dispatcherExecutorService: ExecutorService?) = apply { - delegate.dispatcherExecutorService(dispatcherExecutorService) - } - - fun proxy(proxy: Proxy?) = apply { delegate.proxy(proxy) } - - fun proxyAuthenticator(proxyAuthenticator: ProxyAuthenticator?) = apply { - delegate.proxyAuthenticator(proxyAuthenticator) - } - - fun maxIdleConnections(maxIdleConnections: Int?) = apply { - delegate.maxIdleConnections(maxIdleConnections) - } - - fun keepAliveDuration(keepAliveDuration: Duration?) = apply { - delegate.keepAliveDuration(keepAliveDuration) - } - - fun sslSocketFactory(sslSocketFactory: SSLSocketFactory?) = apply { - delegate.sslSocketFactory(sslSocketFactory) - } - - fun trustManager(trustManager: X509TrustManager?) = apply { - delegate.trustManager(trustManager) - } - - fun hostnameVerifier(hostnameVerifier: HostnameVerifier?) = apply { - delegate.hostnameVerifier(hostnameVerifier) - } - - fun checkJacksonVersionCompatibility(check: Boolean) = apply { - delegate.checkJacksonVersionCompatibility(check) - } - - fun jsonMapper(jsonMapper: JsonMapper) = apply { delegate.jsonMapper(jsonMapper) } - - fun streamHandlerExecutor(streamHandlerExecutor: Executor) = apply { - delegate.streamHandlerExecutor(streamHandlerExecutor) - } - - /** - * Uses a caller-owned executor for blocking asynchronous Bedrock authentication work. - * - * By default, the client owns a dedicated cached thread pool and shuts it down when the - * client closes. - */ - fun authenticationExecutor(authenticationExecutor: Executor) = apply { - this.authenticationExecutor = authenticationExecutor - } - - fun sleeper(sleeper: Sleeper) = apply { delegate.sleeper(sleeper) } - - fun clock(clock: Clock) = apply { - this.clock = clock - delegate.clock(clock) - } - - fun responseValidation(responseValidation: Boolean) = apply { - delegate.responseValidation(responseValidation) - } - - fun timeout(timeout: Timeout) = apply { delegate.timeout(timeout) } - - fun timeout(timeout: Duration) = apply { delegate.timeout(timeout) } - - fun maxRetries(maxRetries: Int) = apply { delegate.maxRetries(maxRetries) } - - fun logLevel(logLevel: LogLevel) = apply { delegate.logLevel(logLevel) } - - fun headers(headers: Headers) = apply { delegate.headers(headers) } - - fun headers(headers: Map>) = apply { delegate.headers(headers) } - - fun putHeader(name: String, value: String) = apply { delegate.putHeader(name, value) } - - fun putHeaders(name: String, values: Iterable) = apply { - delegate.putHeaders(name, values) - } - - fun putAllHeaders(headers: Headers) = apply { delegate.putAllHeaders(headers) } - - fun replaceHeaders(name: String, value: String) = apply { - delegate.replaceHeaders(name, value) - } - - fun removeHeaders(name: String) = apply { delegate.removeHeaders(name) } - - fun queryParams(queryParams: QueryParams) = apply { delegate.queryParams(queryParams) } - - fun queryParams(queryParams: Map>) = apply { - delegate.queryParams(queryParams) - } - - fun putQueryParam(key: String, value: String) = apply { delegate.putQueryParam(key, value) } - - fun putQueryParams(key: String, values: Iterable) = apply { - delegate.putQueryParams(key, values) - } - - fun removeQueryParams(key: String) = apply { delegate.removeQueryParams(key) } - - /** Returns a standard OpenAI client configured for Amazon Bedrock. */ - fun build(): OpenAIClient { - val configuration = - BedrockAuthOptions( - awsRegion = awsRegion, - baseUrl = baseUrl, - apiKey = apiKey, - tokenProvider = tokenProvider, - awsAccessKeyId = awsAccessKeyId, - awsSecretAccessKey = awsSecretAccessKey, - awsSessionToken = awsSessionToken, - awsProfile = awsProfile, - awsCredentialsProvider = awsCredentialsProvider, - skipAuth = skipAuth, - clock = clock, - authenticationExecutor = authenticationExecutor, - ) - .resolve(::getEnv) - - return delegate - .baseUrl(configuration.baseUrl) - .httpRequestAuthenticator(configuration.authenticator) - .build() - } - - @JvmSynthetic internal fun getEnv(name: String): String? = System.getenv(name) - } -} diff --git a/openai-java-bedrock/src/test/kotlin/com/openai/bedrock/BedrockAuthTest.kt b/openai-java-bedrock/src/test/kotlin/com/openai/bedrock/BedrockAuthTest.kt deleted file mode 100644 index 3615cf5b5..000000000 --- a/openai-java-bedrock/src/test/kotlin/com/openai/bedrock/BedrockAuthTest.kt +++ /dev/null @@ -1,714 +0,0 @@ -package com.openai.bedrock - -import com.openai.core.http.HttpMethod -import com.openai.core.http.HttpRequest -import com.openai.core.http.HttpRequestBody -import com.openai.core.jsonMapper -import com.openai.errors.OpenAIException -import java.io.OutputStream -import java.nio.file.Files -import java.nio.file.Path -import java.time.Clock -import java.time.Instant -import java.time.ZoneOffset -import java.util.concurrent.Executor -import java.util.concurrent.Executors -import java.util.concurrent.atomic.AtomicInteger -import java.util.concurrent.atomic.AtomicReference -import java.util.function.Supplier -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.assertThatThrownBy -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.io.TempDir -import org.junit.jupiter.api.parallel.ResourceLock -import software.amazon.awssdk.auth.credentials.AwsBasicCredentials -import software.amazon.awssdk.auth.credentials.AwsCredentials -import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider -import software.amazon.awssdk.regions.Region - -internal class BedrockAuthTest { - - @Test - fun sigV4MatchesSharedFixture() { - val fixture = - javaClass.getResourceAsStream("/fixtures/bedrock/v1/sigv4.json").use { input -> - jsonMapper().readTree(input) - } - val credentials = fixture["credentials"] - val expected = fixture["expected"] - val requestFixture = fixture["request"] - val configuration = - options( - awsRegion = fixture["region"].asText(), - awsAccessKeyId = credentials["accessKeyId"].asText(), - awsSecretAccessKey = credentials["secretAccessKey"].asText(), - awsSessionToken = credentials["sessionToken"].asText(), - clock = - Clock.fixed(Instant.parse(fixture["signingDate"].asText()), ZoneOffset.UTC), - ) - .resolve(getenv = { null }, regionProvider = { null }) - - val signed = - configuration.authenticator.authenticate( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl("https://bedrock-mantle.us-east-1.api.aws/openai/v1") - .addPathSegment("responses") - .putHeader("Content-Type", requestFixture["contentType"].asText()) - .body(StringBody(requestFixture["body"].asText())) - .build() - ) - - assertThat(signed.headers.values("X-Amz-Date")).containsExactly(expected["date"].asText()) - assertThat(signed.headers.values("X-Amz-Content-Sha256")) - .containsExactly(expected["payloadHash"].asText()) - assertThat(signed.headers.values("X-Amz-Security-Token")) - .containsExactly(credentials["sessionToken"].asText()) - assertThat(signed.headers.values("Authorization")) - .containsExactly(expected["authorization"].asText()) - } - - @Test - @ResourceLock("aws-system-properties") - fun namedProfileReadsSharedCredentialsFile(@TempDir directory: Path) { - val credentialsFile = directory.resolve("credentials") - Files.write( - credentialsFile, - """ - [fixture] - aws_access_key_id = FILEACCESSKEY - aws_secret_access_key = filesecret - aws_session_token = file-session-token - """ - .trimIndent() - .toByteArray(), - ) - val previous = System.getProperty("aws.sharedCredentialsFile") - System.setProperty("aws.sharedCredentialsFile", credentialsFile.toString()) - - try { - val configuration = - options(awsRegion = "us-east-1", awsProfile = "fixture") - .resolve( - getenv = { name -> - if (name == ENV_BEARER_TOKEN) "ignored-environment-bearer" else null - }, - regionProvider = { null }, - ) - val signed = configuration.authenticator.authenticate(request()) - - assertThat(signed.headers.values("Authorization").single()) - .contains("Credential=FILEACCESSKEY/") - assertThat(signed.headers.values("X-Amz-Security-Token")) - .containsExactly("file-session-token") - } finally { - if (previous == null) System.clearProperty("aws.sharedCredentialsFile") - else System.setProperty("aws.sharedCredentialsFile", previous) - } - } - - @Test - @ResourceLock("aws-system-properties") - fun namedLoginSessionProfileLoadsSigninProvider(@TempDir directory: Path) { - val configFile = directory.resolve("config") - Files.write( - configFile, - """ - [profile fixture] - login_session = arn:aws:iam::012345678901:user/fixture - region = us-east-1 - """ - .trimIndent() - .toByteArray(), - ) - val previous = System.getProperty("aws.configFile") - System.setProperty("aws.configFile", configFile.toString()) - - try { - assertThat( - Class.forName( - "software.amazon.awssdk.services.signin.auth.LoginProfileCredentialsProviderFactory" - ) - ) - .isNotNull() - - val configuration = - options(awsRegion = "us-east-1", awsProfile = "fixture") - .resolve(getenv = { null }, regionProvider = { null }) - try { - val failure = - runCatching { configuration.authenticator.authenticate(request()) } - .exceptionOrNull() - - assertThat(failure).isInstanceOf(OpenAIException::class.java) - assertThat(failure!!.stackTraceToString()) - .contains("LoginProfileCredentialsProviderFactory") - } finally { - configuration.authenticator.close() - } - } finally { - if (previous == null) System.clearProperty("aws.configFile") - else System.setProperty("aws.configFile", previous) - } - } - - @Test - fun explicitAwsCredentialsTakePrecedenceOverEnvironmentBearer() { - val configuration = - options( - awsRegion = "us-east-1", - awsAccessKeyId = "AKIDEXAMPLE", - awsSecretAccessKey = "secret", - ) - .resolve( - getenv = { name -> - if (name == ENV_BEARER_TOKEN) "environment-token" else null - }, - regionProvider = { null }, - ) - - val signed = configuration.authenticator.authenticate(request()) - - assertThat(signed.headers.values("Authorization").single()).startsWith("AWS4-HMAC-SHA256") - } - - @Test - fun environmentBearerTakesPrecedenceOverDefaultChain() { - val configuration = - options(awsRegion = "us-east-1") - .resolve( - getenv = { name -> - if (name == ENV_BEARER_TOKEN) "environment-token" else null - }, - regionProvider = { null }, - ) - - val authenticated = configuration.authenticator.authenticate(request()) - - assertThat(authenticated.headers.values("Authorization")) - .containsExactly("Bearer environment-token") - } - - @Test - fun tokenProviderResolvesFreshCredentialsAndReportsInvalidResults() { - val calls = AtomicInteger() - val configuration = - options( - awsRegion = "us-east-1", - tokenProvider = Supplier { "token-${calls.incrementAndGet()}" }, - ) - .resolve(getenv = { null }, regionProvider = { null }) - - assertThat( - configuration.authenticator.authenticate(request()).headers.values("Authorization") - ) - .containsExactly("Bearer token-1") - assertThat( - configuration.authenticator.authenticate(request()).headers.values("Authorization") - ) - .containsExactly("Bearer token-2") - - val blankProvider = - options(awsRegion = "us-east-1", tokenProvider = Supplier { " " }) - .resolve(getenv = { null }, regionProvider = { null }) - assertThatThrownBy { blankProvider.authenticator.authenticate(request()) } - .isInstanceOf(OpenAIException::class.java) - .hasMessageContaining("non-empty string") - - val failingProvider = - options( - awsRegion = "us-east-1", - tokenProvider = Supplier { throw IllegalStateException("token failure") }, - ) - .resolve(getenv = { null }, regionProvider = { null }) - assertThatThrownBy { failingProvider.authenticator.authenticate(request()) } - .isInstanceOf(OpenAIException::class.java) - .hasMessageContaining("Failed to resolve a bearer credential") - .hasCauseInstanceOf(IllegalStateException::class.java) - } - - @Test - fun asyncAuthenticationUsesInjectedExecutorForBearerAndSigV4() { - val executor = - Executors.newSingleThreadExecutor { runnable -> - Thread(runnable, "bedrock-auth-test-thread") - } - val bearerThread = AtomicReference() - val credentialsThread = AtomicReference() - val bearerConfiguration = - options( - awsRegion = "us-east-1", - tokenProvider = - Supplier { - bearerThread.set(Thread.currentThread().name) - "token" - }, - authenticationExecutor = executor, - ) - .resolve(getenv = { null }, regionProvider = { null }) - val sigV4Configuration = - options( - awsRegion = "us-east-1", - awsCredentialsProvider = - AwsCredentialsProvider { - credentialsThread.set(Thread.currentThread().name) - AwsBasicCredentials.create("ACCESSKEY", "secret") - }, - authenticationExecutor = executor, - ) - .resolve(getenv = { null }, regionProvider = { null }) - - try { - bearerConfiguration.authenticator.authenticateAsync(request()).join() - sigV4Configuration.authenticator.authenticateAsync(request()).join() - bearerConfiguration.authenticator.close() - sigV4Configuration.authenticator.close() - - assertThat(bearerThread).hasValue("bedrock-auth-test-thread") - assertThat(credentialsThread).hasValue("bedrock-auth-test-thread") - assertThat(executor.isShutdown).isFalse() - } finally { - executor.shutdownNow() - } - } - - @Test - fun environmentBearerReportsWhenCredentialDisappears() { - val reads = AtomicInteger() - val configuration = - options(awsRegion = "us-east-1") - .resolve( - getenv = { name -> - if (name == ENV_BEARER_TOKEN && reads.getAndIncrement() == 0) { - "short-lived-token" - } else { - null - } - }, - regionProvider = { null }, - ) - - assertThatThrownBy { configuration.authenticator.authenticate(request()) } - .isInstanceOf(OpenAIException::class.java) - .hasMessageContaining("Failed to resolve a bearer credential") - .hasRootCauseMessage( - "Could not find credentials for Bedrock. Set `AWS_BEARER_TOKEN_BEDROCK` or configure AWS credential authentication." - ) - } - - @Test - fun endpointResolutionUsesExplicitThenEnvironmentThenRegionalDefault() { - val explicit = - options( - awsRegion = "us-east-1", - baseUrl = "https://explicit.example.com/openai/v1/", - apiKey = "token", - ) - .resolve( - getenv = { name -> - if (name == ENV_BASE_URL) "https://environment.example.com" else null - }, - regionProvider = { null }, - ) - val environment = - options(awsRegion = "us-east-1", apiKey = "token") - .resolve( - getenv = { name -> - if (name == ENV_BASE_URL) "https://environment.example.com/" else null - }, - regionProvider = { null }, - ) - val regional = - options(awsRegion = "us-east-1", apiKey = "token") - .resolve(getenv = { null }, regionProvider = { null }) - val awsRegionEnvironment = - options(apiKey = "token") - .resolve( - getenv = { name -> if (name == "AWS_REGION") "us-west-2" else null }, - regionProvider = { null }, - ) - val defaultRegionEnvironment = - options(apiKey = "token") - .resolve( - getenv = { name -> if (name == "AWS_DEFAULT_REGION") "eu-central-1" else null }, - regionProvider = { null }, - ) - val providerRegion = - options(apiKey = "token") - .resolve(getenv = { null }, regionProvider = { Region.of("ap-southeast-2") }) - - assertThat(explicit.baseUrl).isEqualTo("https://explicit.example.com/openai/v1") - assertThat(environment.baseUrl).isEqualTo("https://environment.example.com") - assertThat(regional.baseUrl).isEqualTo("https://bedrock-mantle.us-east-1.api.aws/openai/v1") - assertThat(awsRegionEnvironment.baseUrl) - .isEqualTo("https://bedrock-mantle.us-west-2.api.aws/openai/v1") - assertThat(defaultRegionEnvironment.baseUrl) - .isEqualTo("https://bedrock-mantle.eu-central-1.api.aws/openai/v1") - assertThat(providerRegion.baseUrl) - .isEqualTo("https://bedrock-mantle.ap-southeast-2.api.aws/openai/v1") - } - - @Test - fun explicitBaseUrlBearerModesDoNotResolveDefaultRegion() { - val configurations = - listOf( - options(baseUrl = "https://bedrock.example.com/openai/v1", apiKey = "token"), - options( - baseUrl = "https://bedrock.example.com/openai/v1", - tokenProvider = Supplier { "token" }, - ), - ) - - configurations.forEach { options -> - val configuration = - options.resolve( - getenv = { null }, - regionProvider = { error("default region provider must not be called") }, - ) - - assertThat(configuration.baseUrl).isEqualTo("https://bedrock.example.com/openai/v1") - } - } - - @Test - fun explicitBaseUrlSkipAuthDoesNotResolveDefaultRegion() { - val configuration = - options(baseUrl = "https://bedrock.example.com/openai/v1", skipAuth = true) - .resolve( - getenv = { null }, - regionProvider = { error("default region provider must not be called") }, - ) - - assertThat(configuration.baseUrl).isEqualTo("https://bedrock.example.com/openai/v1") - } - - @Test - fun skipAuthPassesThroughSameOriginAndRejectsDifferentOrigin() { - val configuration = - options(baseUrl = "https://bedrock.example.com/openai/v1", skipAuth = true) - .resolve(getenv = { null }, regionProvider = { null }) - val sameOrigin = - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl("https://bedrock.example.com/openai/v1") - .addPathSegment("responses") - .build() - val differentOrigin = - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl("https://other.example.com/openai/v1") - .addPathSegment("responses") - .build() - - assertThat(configuration.authenticator.authenticate(sameOrigin)).isSameAs(sameOrigin) - assertThatThrownBy { configuration.authenticator.authenticate(differentOrigin) } - .isInstanceOf(OpenAIException::class.java) - .hasMessageContaining("different origin") - } - - @Test - fun signingIncludesBodyContentTypeAndQueryParameters() { - val configuration = - options( - awsRegion = "us-east-1", - awsAccessKeyId = "AKIDEXAMPLE", - awsSecretAccessKey = "secret", - clock = Clock.fixed(Instant.parse("2026-06-01T12:34:56Z"), ZoneOffset.UTC), - ) - .resolve(getenv = { null }, regionProvider = { null }) - - fun signed(queryValue: String) = - configuration.authenticator.authenticate( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl("https://bedrock-mantle.us-east-1.api.aws/openai/v1") - .addPathSegment("responses") - .putQueryParam("preview", queryValue) - .body(StringBody("{}")) - .build() - ) - - val first = signed("one") - val second = signed("two") - - assertThat(first.headers.values("Content-Type")).containsExactly("application/json") - assertThat(first.headers.values("Authorization").single()) - .isNotEqualTo(second.headers.values("Authorization").single()) - } - - @Test - fun rejectsCustomAuthorizationHeader() { - val configuration = - options(awsRegion = "us-east-1", apiKey = "token") - .resolve(getenv = { null }, regionProvider = { null }) - val request = request().toBuilder().putHeader("Authorization", "Bearer custom").build() - - assertThatThrownBy { configuration.authenticator.authenticate(request) } - .isInstanceOf(OpenAIException::class.java) - .hasMessageContaining("custom `Authorization` header") - } - - @Test - fun rejectsCanonicalEndpointRegionMismatch() { - val configuration = - options( - awsRegion = "us-west-2", - baseUrl = "https://bedrock-mantle.us-east-1.api.aws/openai/v1", - awsAccessKeyId = "access", - awsSecretAccessKey = "secret", - ) - .resolve(getenv = { null }, regionProvider = { null }) - - assertThatThrownBy { configuration.authenticator.authenticate(request()) } - .isInstanceOf(OpenAIException::class.java) - .hasMessageContaining("does not match the SigV4 region") - } - - @Test - fun missingRegionIsActionable() { - assertThatThrownBy { - options(apiKey = "token").resolve(getenv = { null }, regionProvider = { null }) - } - .isInstanceOf(OpenAIException::class.java) - .hasMessageContaining("AWS region") - } - - @Test - fun rejectsPartialStaticCredentials() { - assertThatThrownBy { - options(awsRegion = "us-east-1", awsAccessKeyId = "access") - .resolve(getenv = { null }, regionProvider = { null }) - } - .isInstanceOf(OpenAIException::class.java) - .hasMessageContaining("both `awsAccessKeyId` and `awsSecretAccessKey`") - } - - @Test - fun rejectsConflictingExplicitAuthModes() { - assertThatThrownBy { - options( - awsRegion = "us-east-1", - apiKey = "bearer", - awsAccessKeyId = "access", - awsSecretAccessKey = "secret", - ) - .resolve(getenv = { null }, regionProvider = { null }) - } - .isInstanceOf(OpenAIException::class.java) - .hasMessageContaining("mutually exclusive") - } - - @Test - fun rejectsEmptyAndAmbiguousConfiguration() { - assertThatThrownBy { - options(awsRegion = "us-east-1", apiKey = " ") - .resolve(getenv = { null }, regionProvider = { null }) - } - .hasMessageContaining("bearer credential must not be empty") - assertThatThrownBy { - options( - awsRegion = "us-east-1", - apiKey = "token", - tokenProvider = Supplier { "token" }, - ) - .resolve(getenv = { null }, regionProvider = { null }) - } - .hasMessageContaining("mutually exclusive") - assertThatThrownBy { - options(awsRegion = "us-east-1", awsProfile = " ") - .resolve(getenv = { null }, regionProvider = { null }) - } - .hasMessageContaining("awsProfile") - assertThatThrownBy { - options( - awsRegion = "us-east-1", - awsAccessKeyId = "access", - awsSecretAccessKey = "secret", - awsProfile = "profile", - ) - .resolve(getenv = { null }, regionProvider = { null }) - } - .hasMessageContaining("exactly one explicit AWS mode") - assertThatThrownBy { - options(awsRegion = "us-east-1", apiKey = "token", skipAuth = true) - .resolve(getenv = { null }, regionProvider = { null }) - } - .hasMessageContaining("skipAuth") - assertThatThrownBy { - options( - awsRegion = "us-east-1", - awsAccessKeyId = " ", - awsSecretAccessKey = "secret", - ) - .resolve(getenv = { null }, regionProvider = { null }) - } - .hasMessageContaining("non-empty") - assertThatThrownBy { - options( - awsRegion = "us-east-1", - awsAccessKeyId = "access", - awsSecretAccessKey = "secret", - awsSessionToken = " ", - ) - .resolve(getenv = { null }, regionProvider = { null }) - } - .hasMessageContaining("awsSessionToken") - assertThatThrownBy { - options(awsRegion = " ", apiKey = "token") - .resolve(getenv = { null }, regionProvider = { null }) - } - .hasMessageContaining("awsRegion") - assertThatThrownBy { - options(baseUrl = "not a URL", apiKey = "token") - .resolve(getenv = { null }, regionProvider = { null }) - } - .hasMessageContaining("valid HTTP URL") - } - - @Test - fun credentialProviderFailuresAreActionableAndCallerOwnedProviderIsNotClosed() { - val failingConfiguration = - options( - awsRegion = "us-east-1", - awsCredentialsProvider = - AwsCredentialsProvider { throw IllegalStateException("credential failure") }, - ) - .resolve(getenv = { null }, regionProvider = { null }) - assertThatThrownBy { failingConfiguration.authenticator.authenticate(request()) } - .isInstanceOf(OpenAIException::class.java) - .hasMessageContaining("Failed to resolve AWS credentials") - .hasCauseInstanceOf(IllegalStateException::class.java) - - val emptyCredentials = - object : AwsCredentials { - override fun accessKeyId(): String = "" - - override fun secretAccessKey(): String = "" - } - val invalidConfiguration = - options( - awsRegion = "us-east-1", - awsCredentialsProvider = AwsCredentialsProvider { emptyCredentials }, - ) - .resolve(getenv = { null }, regionProvider = { null }) - assertThatThrownBy { invalidConfiguration.authenticator.authenticate(request()) } - .isInstanceOf(OpenAIException::class.java) - .hasMessageContaining("Failed to resolve AWS credentials") - - val closeableProvider = CloseableCredentialsProvider() - val closeableConfiguration = - options(awsRegion = "us-east-1", awsCredentialsProvider = closeableProvider) - .resolve(getenv = { null }, regionProvider = { null }) - closeableConfiguration.authenticator.authenticate(request()) - closeableConfiguration.authenticator.close() - - assertThat(closeableProvider.closed).isFalse() - } - - @Test - fun fatalCredentialResolutionFailuresAreNotWrapped() { - val bearerConfiguration = - options( - awsRegion = "us-east-1", - tokenProvider = Supplier { throw LinkageError("token linkage") }, - ) - .resolve(getenv = { null }, regionProvider = { null }) - val sigV4Configuration = - options( - awsRegion = "us-east-1", - awsCredentialsProvider = - AwsCredentialsProvider { throw LinkageError("credentials linkage") }, - ) - .resolve(getenv = { null }, regionProvider = { null }) - - try { - assertThatThrownBy { bearerConfiguration.authenticator.authenticate(request()) } - .isInstanceOf(LinkageError::class.java) - assertThatThrownBy { sigV4Configuration.authenticator.authenticate(request()) } - .isInstanceOf(LinkageError::class.java) - } finally { - bearerConfiguration.authenticator.close() - sigV4Configuration.authenticator.close() - } - } - - @Test - fun rejectsNonReplayableRequestBodyBeforeCredentialResolution() { - val configuration = - options( - awsRegion = "us-east-1", - awsAccessKeyId = "AKIDEXAMPLE", - awsSecretAccessKey = "secret", - ) - .resolve(getenv = { null }, regionProvider = { null }) - val request = request().toBuilder().body(StringBody("body", repeatable = false)).build() - - assertThatThrownBy { configuration.authenticator.authenticate(request) } - .isInstanceOf(OpenAIException::class.java) - .hasMessageContaining("replayable request body") - } - - private fun request(): HttpRequest = - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl("https://bedrock-mantle.us-east-1.api.aws/openai/v1") - .addPathSegment("responses") - .putHeader("Content-Type", "application/json") - .body(StringBody("{}")) - .build() - - private fun options( - awsRegion: String? = null, - baseUrl: String? = null, - apiKey: String? = null, - tokenProvider: Supplier? = null, - awsAccessKeyId: String? = null, - awsSecretAccessKey: String? = null, - awsSessionToken: String? = null, - awsProfile: String? = null, - awsCredentialsProvider: AwsCredentialsProvider? = null, - skipAuth: Boolean = false, - clock: Clock = Clock.systemUTC(), - authenticationExecutor: Executor? = null, - ) = - BedrockAuthOptions( - awsRegion = awsRegion, - baseUrl = baseUrl, - apiKey = apiKey, - tokenProvider = tokenProvider, - awsAccessKeyId = awsAccessKeyId, - awsSecretAccessKey = awsSecretAccessKey, - awsSessionToken = awsSessionToken, - awsProfile = awsProfile, - awsCredentialsProvider = awsCredentialsProvider, - skipAuth = skipAuth, - clock = clock, - authenticationExecutor = authenticationExecutor, - ) - - private class CloseableCredentialsProvider : AwsCredentialsProvider, AutoCloseable { - var closed = false - - override fun resolveCredentials(): AwsCredentials = - AwsBasicCredentials.create("CLOSEABLEACCESSKEY", "closeable-secret-key") - - override fun close() { - closed = true - } - } - - private class StringBody(value: String, private val repeatable: Boolean = true) : - HttpRequestBody { - private val bytes = value.toByteArray() - - override fun writeTo(outputStream: OutputStream) = outputStream.write(bytes) - - override fun contentType(): String = "application/json" - - override fun contentLength(): Long = bytes.size.toLong() - - override fun repeatable(): Boolean = repeatable - - override fun close() {} - } -} diff --git a/openai-java-bedrock/src/test/kotlin/com/openai/client/okhttp/BedrockOpenAIOkHttpClientTest.kt b/openai-java-bedrock/src/test/kotlin/com/openai/client/okhttp/BedrockOpenAIOkHttpClientTest.kt deleted file mode 100644 index 145c24bd6..000000000 --- a/openai-java-bedrock/src/test/kotlin/com/openai/client/okhttp/BedrockOpenAIOkHttpClientTest.kt +++ /dev/null @@ -1,211 +0,0 @@ -package com.openai.client.okhttp - -import com.github.tomakehurst.wiremock.client.WireMock.findAll -import com.github.tomakehurst.wiremock.client.WireMock.get -import com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor -import com.github.tomakehurst.wiremock.client.WireMock.okJson -import com.github.tomakehurst.wiremock.client.WireMock.serviceUnavailable -import com.github.tomakehurst.wiremock.client.WireMock.stubFor -import com.github.tomakehurst.wiremock.client.WireMock.temporaryRedirect -import com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo -import com.github.tomakehurst.wiremock.client.WireMock.verify -import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo -import com.github.tomakehurst.wiremock.junit5.WireMockTest -import com.github.tomakehurst.wiremock.stubbing.Scenario -import com.openai.core.LogLevel -import com.openai.core.Sleeper -import java.io.ByteArrayOutputStream -import java.io.PrintStream -import java.time.Clock -import java.time.Duration -import java.time.Instant -import java.time.ZoneOffset -import java.util.concurrent.CompletableFuture -import java.util.concurrent.atomic.AtomicInteger -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.assertThatThrownBy -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.parallel.ResourceLock -import software.amazon.awssdk.auth.credentials.AwsBasicCredentials -import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider - -@WireMockTest -@ResourceLock("https://github.com/wiremock/wiremock/issues/169") -internal class BedrockOpenAIOkHttpClientTest { - - @Test - fun retriesResolveFreshCredentialsAndSignAgain(wmRuntimeInfo: WireMockRuntimeInfo) { - stubRetryingModelsResponse() - val providerCalls = AtomicInteger() - val provider = rotatingProvider(providerCalls) - val client = client(wmRuntimeInfo.httpBaseUrl, provider) - - val models = client.models().list() - - assertThat(models.data()).isEmpty() - assertThat(providerCalls).hasValue(2) - verify(2, getRequestedFor(urlPathEqualTo("/models"))) - val requests = findAll(getRequestedFor(urlPathEqualTo("/models"))) - assertThat(requests[0].getHeader("Authorization")).contains("Credential=FIRSTACCESSKEY/") - assertThat(requests[1].getHeader("Authorization")).contains("Credential=SECONDACCESSKEY/") - client.close() - } - - @Test - fun asyncClientUsesTheSamePerAttemptSigningPath(wmRuntimeInfo: WireMockRuntimeInfo) { - stubRetryingModelsResponse() - val providerCalls = AtomicInteger() - val client = client(wmRuntimeInfo.httpBaseUrl, rotatingProvider(providerCalls)).async() - - val models = client.models().list().join() - - assertThat(models.data()).isEmpty() - assertThat(providerCalls).hasValue(2) - verify(2, getRequestedFor(urlPathEqualTo("/models"))) - client.close() - } - - @Test - fun bearerProviderResolvesFreshTokenOnEveryRetry(wmRuntimeInfo: WireMockRuntimeInfo) { - stubRetryingModelsResponse() - val providerCalls = AtomicInteger() - val client = - BedrockOpenAIOkHttpClient.builder() - .baseUrl(wmRuntimeInfo.httpBaseUrl) - .bedrockTokenProvider { "token-${providerCalls.incrementAndGet()}" } - .sleeper(NoopSleeper) - .maxRetries(1) - .build() - - val models = client.models().list() - - assertThat(models.data()).isEmpty() - assertThat(providerCalls).hasValue(2) - val requests = findAll(getRequestedFor(urlPathEqualTo("/models"))) - assertThat(requests.map { it.getHeader("Authorization") }) - .containsExactly("Bearer token-1", "Bearer token-2") - client.close() - } - - @Test - fun skipAuthSendsUnsignedRequests(wmRuntimeInfo: WireMockRuntimeInfo) { - stubFor( - get(urlPathEqualTo("/models")).willReturn(okJson("{\"object\":\"list\",\"data\":[]}")) - ) - val client = - BedrockOpenAIOkHttpClient.builder() - .baseUrl(wmRuntimeInfo.httpBaseUrl) - .skipAuth(true) - .maxRetries(0) - .build() - - val models = client.models().list() - - assertThat(models.data()).isEmpty() - assertThat( - findAll(getRequestedFor(urlPathEqualTo("/models"))) - .single() - .getHeader("Authorization") - ) - .isNull() - client.close() - } - - @Test - fun signedRequestsDoNotFollowRedirects(wmRuntimeInfo: WireMockRuntimeInfo) { - stubFor(get(urlPathEqualTo("/models")).willReturn(temporaryRedirect("/redirected-models"))) - stubFor( - get(urlPathEqualTo("/redirected-models")) - .willReturn(okJson("{\"object\":\"list\",\"data\":[]}")) - ) - val client = - client( - wmRuntimeInfo.httpBaseUrl, - AwsCredentialsProvider { - AwsBasicCredentials.create("ACCESSKEY", "fixture-secret-access-key") - }, - ) - - assertThatThrownBy { client.models().list() }.isInstanceOf(RuntimeException::class.java) - verify(1, getRequestedFor(urlPathEqualTo("/models"))) - verify(0, getRequestedFor(urlPathEqualTo("/redirected-models"))) - client.close() - } - - @Test - @ResourceLock("System.err") - fun debugLogsRedactAwsAuthorizationAndSessionToken(wmRuntimeInfo: WireMockRuntimeInfo) { - stubFor( - get(urlPathEqualTo("/models")).willReturn(okJson("{\"object\":\"list\",\"data\":[]}")) - ) - val originalError = System.err - val logOutput = ByteArrayOutputStream() - System.setErr(PrintStream(logOutput)) - - try { - val client = - BedrockOpenAIOkHttpClient.builder() - .baseUrl(wmRuntimeInfo.httpBaseUrl) - .awsRegion("us-east-1") - .awsAccessKeyId("LOGACCESSKEY") - .awsSecretAccessKey("log-secret-access-key") - .awsSessionToken("log-session-token") - .logLevel(LogLevel.DEBUG) - .maxRetries(0) - .build() - - client.models().list() - client.close() - } finally { - System.setErr(originalError) - } - - val logs = logOutput.toString("UTF-8") - assertThat(logs).contains("Authorization: ██") - assertThat(logs).contains("X-Amz-Security-Token: ██") - assertThat(logs).doesNotContain("LOGACCESSKEY") - assertThat(logs).doesNotContain("log-secret-access-key") - assertThat(logs).doesNotContain("log-session-token") - } - - private fun client(baseUrl: String, provider: AwsCredentialsProvider) = - BedrockOpenAIOkHttpClient.builder() - .baseUrl(baseUrl) - .awsRegion("us-east-1") - .awsCredentialsProvider(provider) - .clock(Clock.fixed(Instant.parse("2026-06-01T12:34:56Z"), ZoneOffset.UTC)) - .sleeper(NoopSleeper) - .maxRetries(1) - .build() - - private fun rotatingProvider(providerCalls: AtomicInteger) = AwsCredentialsProvider { - val accessKey = - if (providerCalls.getAndIncrement() == 0) "FIRSTACCESSKEY" else "SECONDACCESSKEY" - AwsBasicCredentials.create(accessKey, "fixture-secret-access-key") - } - - private fun stubRetryingModelsResponse() { - stubFor( - get(urlPathEqualTo("/models")) - .inScenario("retry") - .whenScenarioStateIs(Scenario.STARTED) - .willReturn(serviceUnavailable()) - .willSetStateTo("success") - ) - stubFor( - get(urlPathEqualTo("/models")) - .inScenario("retry") - .whenScenarioStateIs("success") - .willReturn(okJson("{\"object\":\"list\",\"data\":[]}")) - ) - } - - private object NoopSleeper : Sleeper { - override fun sleep(duration: Duration) {} - - override fun sleepAsync(duration: Duration): CompletableFuture = - CompletableFuture.completedFuture(null) - - override fun close() {} - } -} diff --git a/openai-java-bedrock/src/test/resources/fixtures/bedrock/v1/sigv4.json b/openai-java-bedrock/src/test/resources/fixtures/bedrock/v1/sigv4.json deleted file mode 100644 index 441c63499..000000000 --- a/openai-java-bedrock/src/test/resources/fixtures/bedrock/v1/sigv4.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$comment": "Uses AWS SigV4 documentation test credentials. These are public examples, not real AWS credentials.", - "signingDate": "2025-01-02T03:04:05.000Z", - "region": "us-east-1", - "service": "bedrock-mantle", - "credentials": { - "accessKeyId": "AKIDEXAMPLE", - "secretAccessKey": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", - "sessionToken": "fixture-session-token" - }, - "request": { - "method": "POST", - "url": "https://bedrock-mantle.us-east-1.api.aws/openai/v1/responses", - "body": "{\"model\":\"gpt-4o\",\"input\":\"hello\"}", - "contentType": "application/json" - }, - "expected": { - "date": "20250102T030405Z", - "payloadHash": "50329e51ad520f21b77bad0b01999930ff556cd1bf18434701251ba6c9f877bc", - "canonicalRequestHash": "1b69b17ef7548a7bf16a6ee749acfd44b7793e04216345dddd6cfaf4c01bfde5", - "authorization": "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20250102/us-east-1/bedrock-mantle/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date;x-amz-security-token, Signature=dc20c8fbe516daf0ccae7e5b7a78fc2936870413a9f1af6e1b2d44b970ce411f" - } -} diff --git a/openai-java-client-okhttp/build.gradle.kts b/openai-java-client-okhttp/build.gradle.kts deleted file mode 100644 index 9f10f7968..000000000 --- a/openai-java-client-okhttp/build.gradle.kts +++ /dev/null @@ -1,31 +0,0 @@ -plugins { - id("openai.kotlin") - id("openai.wiremock-test") - id("openai.publish") -} - -listOf(configurations.testCompileClasspath, configurations.testRuntimeClasspath).forEach { - it.configure { - resolutionStrategy.eachDependency { - if ( - requested.group == "com.fasterxml.jackson" || - requested.group.startsWith("com.fasterxml.jackson.") - ) { - useVersion("2.18.9") - because("test classpaths must use the SDK's secure published Jackson release") - } - } - } -} - -dependencies { - api(project(":openai-java-core")) - - implementation("com.squareup.okhttp3:okhttp:4.12.0") - - testImplementation(kotlin("test")) - testImplementation("org.assertj:assertj-core:3.27.7") - testImplementation(platform("com.fasterxml.jackson:jackson-bom:2.21.5")) - testImplementation("com.squareup.okhttp3:mockwebserver:4.12.0") - testImplementation("com.squareup.okhttp3:okhttp-tls:4.12.0") -} diff --git a/openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OkHttpClient.kt b/openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OkHttpClient.kt deleted file mode 100644 index 5a034f7bd..000000000 --- a/openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OkHttpClient.kt +++ /dev/null @@ -1,364 +0,0 @@ -package com.openai.client.okhttp - -import com.openai.core.RequestOptions -import com.openai.core.Timeout -import com.openai.core.http.Headers -import com.openai.core.http.HttpClient -import com.openai.core.http.HttpMethod -import com.openai.core.http.HttpRequest -import com.openai.core.http.HttpRequestBody -import com.openai.core.http.HttpResponse -import com.openai.core.http.ProxyAuthenticator -import com.openai.errors.OpenAIIoException -import java.io.IOException -import java.io.InputStream -import java.io.OutputStream -import java.net.Proxy -import java.time.Duration -import java.util.concurrent.CancellationException -import java.util.concurrent.CompletableFuture -import java.util.concurrent.ExecutorService -import java.util.concurrent.TimeUnit -import javax.net.ssl.HostnameVerifier -import javax.net.ssl.SSLSocketFactory -import javax.net.ssl.X509TrustManager -import kotlin.jvm.optionals.getOrNull -import okhttp3.Call -import okhttp3.Callback -import okhttp3.ConnectionPool -import okhttp3.Dispatcher -import okhttp3.HttpUrl -import okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.MediaType -import okhttp3.MediaType.Companion.toMediaType -import okhttp3.Request -import okhttp3.RequestBody -import okhttp3.RequestBody.Companion.toRequestBody -import okhttp3.Response -import okio.BufferedSink -import okio.buffer -import okio.sink - -class OkHttpClient -internal constructor(@JvmSynthetic internal val okHttpClient: okhttp3.OkHttpClient) : HttpClient { - - override fun execute(request: HttpRequest, requestOptions: RequestOptions): HttpResponse { - val call = newCall(request, requestOptions) - - return try { - call.execute().toHttpResponse() - } catch (e: IOException) { - throw OpenAIIoException("Request failed", e) - } finally { - request.body?.close() - } - } - - override fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture { - val future = CompletableFuture() - - val call = newCall(request, requestOptions) - call.enqueue( - object : Callback { - override fun onResponse(call: Call, response: Response) { - future.complete(response.toHttpResponse()) - } - - override fun onFailure(call: Call, e: IOException) { - future.completeExceptionally(OpenAIIoException("Request failed", e)) - } - } - ) - - future.whenComplete { _, e -> - if (e is CancellationException) { - call.cancel() - } - request.body?.close() - } - - return future - } - - override fun close() { - okHttpClient.dispatcher.executorService.shutdown() - okHttpClient.connectionPool.evictAll() - okHttpClient.cache?.close() - } - - private fun newCall(request: HttpRequest, requestOptions: RequestOptions): Call { - val clientBuilder = okHttpClient.newBuilder() - - requestOptions.timeout?.let { - clientBuilder - .connectTimeout(it.connect()) - .readTimeout(it.read()) - .writeTimeout(it.write()) - .callTimeout(it.request()) - } - - val client = clientBuilder.build() - return client.newCall(request.toRequest(client)) - } - - companion object { - @JvmStatic fun builder() = Builder() - } - - class Builder internal constructor() { - - private var timeout: Timeout = Timeout.default() - private var followRedirects: Boolean = true - private var proxy: Proxy? = null - private var proxyAuthenticator: ProxyAuthenticator? = null - private var maxIdleConnections: Int? = null - private var keepAliveDuration: Duration? = null - private var dispatcherExecutorService: ExecutorService? = null - private var sslSocketFactory: SSLSocketFactory? = null - private var trustManager: X509TrustManager? = null - private var hostnameVerifier: HostnameVerifier? = null - - fun timeout(timeout: Timeout) = apply { this.timeout = timeout } - - fun timeout(timeout: Duration) = timeout(Timeout.builder().request(timeout).build()) - - @JvmSynthetic - internal fun followRedirects(followRedirects: Boolean) = apply { - this.followRedirects = followRedirects - } - - fun proxy(proxy: Proxy?) = apply { this.proxy = proxy } - - fun proxyAuthenticator(proxyAuthenticator: ProxyAuthenticator?) = apply { - this.proxyAuthenticator = proxyAuthenticator - } - - /** - * Sets the maximum number of idle connections kept by the underlying [ConnectionPool]. - * - * If this is set, then [keepAliveDuration] must also be set. - * - * If unset, then OkHttp's default is used. - */ - fun maxIdleConnections(maxIdleConnections: Int?) = apply { - this.maxIdleConnections = maxIdleConnections - } - - /** - * Sets the keep-alive duration for idle connections in the underlying [ConnectionPool]. - * - * If this is set, then [maxIdleConnections] must also be set. - * - * If unset, then OkHttp's default is used. - */ - fun keepAliveDuration(keepAliveDuration: Duration?) = apply { - this.keepAliveDuration = keepAliveDuration - } - - fun dispatcherExecutorService(dispatcherExecutorService: ExecutorService?) = apply { - this.dispatcherExecutorService = dispatcherExecutorService - } - - fun sslSocketFactory(sslSocketFactory: SSLSocketFactory?) = apply { - this.sslSocketFactory = sslSocketFactory - } - - fun trustManager(trustManager: X509TrustManager?) = apply { - this.trustManager = trustManager - } - - fun hostnameVerifier(hostnameVerifier: HostnameVerifier?) = apply { - this.hostnameVerifier = hostnameVerifier - } - - fun build(): OkHttpClient = - OkHttpClient( - okhttp3.OkHttpClient.Builder() - // `RetryingHttpClient` handles retries if the user enabled them. - .retryOnConnectionFailure(false) - .followRedirects(followRedirects) - .followSslRedirects(followRedirects) - .connectTimeout(timeout.connect()) - .readTimeout(timeout.read()) - .writeTimeout(timeout.write()) - .callTimeout(timeout.request()) - .proxy(proxy) - .apply { - proxyAuthenticator?.let { auth -> - proxyAuthenticator { route, response -> - auth - .authenticate( - route?.proxy ?: Proxy.NO_PROXY, - response.request.toHttpRequest(), - response.toHttpResponse(), - ) - .getOrNull() - ?.toRequest(client = null) - } - } - - dispatcherExecutorService?.let { dispatcher(Dispatcher(it)) } - - val maxIdleConnections = maxIdleConnections - val keepAliveDuration = keepAliveDuration - if (maxIdleConnections != null && keepAliveDuration != null) { - connectionPool( - ConnectionPool( - maxIdleConnections, - keepAliveDuration.toNanos(), - TimeUnit.NANOSECONDS, - ) - ) - } else { - check((maxIdleConnections != null) == (keepAliveDuration != null)) { - "Both or none of `maxIdleConnections` and `keepAliveDuration` must be set, but only one was set" - } - } - - val sslSocketFactory = sslSocketFactory - val trustManager = trustManager - if (sslSocketFactory != null && trustManager != null) { - sslSocketFactory(sslSocketFactory, trustManager) - } else { - check((sslSocketFactory != null) == (trustManager != null)) { - "Both or none of `sslSocketFactory` and `trustManager` must be set, but only one was set" - } - } - - hostnameVerifier?.let(::hostnameVerifier) - } - .build() - .apply { - // We usually make all our requests to the same host so it makes sense to - // raise the per-host limit to the overall limit. - dispatcher.maxRequestsPerHost = dispatcher.maxRequests - } - ) - } -} - -private fun HttpRequest.toRequest(client: okhttp3.OkHttpClient?): Request { - var body: RequestBody? = body?.toRequestBody() - if (body == null && requiresBody(method)) { - body = "".toRequestBody() - } - - val builder = Request.Builder().url(toUrl()).method(method.name, body) - headers.names().forEach { name -> headers.values(name).forEach { builder.addHeader(name, it) } } - - if (client != null) { - if ( - !headers.names().contains("X-Stainless-Read-Timeout") && client.readTimeoutMillis != 0 - ) { - builder.addHeader( - "X-Stainless-Read-Timeout", - Duration.ofMillis(client.readTimeoutMillis.toLong()).seconds.toString(), - ) - } - if (!headers.names().contains("X-Stainless-Timeout") && client.callTimeoutMillis != 0) { - builder.addHeader( - "X-Stainless-Timeout", - Duration.ofMillis(client.callTimeoutMillis.toLong()).seconds.toString(), - ) - } - } - - return builder.build() -} - -/** `OkHttpClient` always requires a request body for some methods. */ -private fun requiresBody(method: HttpMethod): Boolean = - when (method) { - HttpMethod.POST, - HttpMethod.PUT, - HttpMethod.PATCH -> true - else -> false - } - -private fun HttpRequest.toUrl(): String { - val builder = baseUrl.toHttpUrl().newBuilder() - pathSegments.forEach(builder::addPathSegment) - queryParams.keys().forEach { key -> - queryParams.values(key).forEach { builder.addQueryParameter(key, it) } - } - - return builder.toString() -} - -private fun HttpRequestBody.toRequestBody(): RequestBody { - val mediaType = contentType()?.toMediaType() - val length = contentLength() - - return object : RequestBody() { - override fun contentType(): MediaType? = mediaType - - override fun contentLength(): Long = length - - override fun isOneShot(): Boolean = !repeatable() - - override fun writeTo(sink: BufferedSink) = writeTo(sink.outputStream()) - } -} - -private fun Request.toHttpRequest(): HttpRequest { - val builder = HttpRequest.builder().method(HttpMethod.valueOf(method)).baseUrl(url.toBaseUrl()) - url.pathSegments.forEach(builder::addPathSegment) - url.queryParameterNames.forEach { name -> - url.queryParameterValues(name).filterNotNull().forEach { builder.putQueryParam(name, it) } - } - headers.forEach { (name, value) -> builder.putHeader(name, value) } - body?.let { builder.body(it.toHttpRequestBody()) } - return builder.build() -} - -private fun HttpUrl.toBaseUrl(): String = buildString { - append(scheme).append("://").append(host) - if (port != HttpUrl.defaultPort(scheme)) { - append(":").append(port) - } -} - -private fun RequestBody.toHttpRequestBody(): HttpRequestBody { - val mediaType = contentType()?.toString() - val length = contentLength() - val isOneShot = isOneShot() - val source = this - return object : HttpRequestBody { - override fun contentType(): String? = mediaType - - override fun contentLength(): Long = length - - override fun repeatable(): Boolean = !isOneShot - - override fun writeTo(outputStream: OutputStream) { - val sink = outputStream.sink().buffer() - source.writeTo(sink) - sink.flush() - } - - override fun close() {} - } -} - -private fun Response.toHttpResponse(): HttpResponse { - val headers = headers.toHeaders() - - return object : HttpResponse { - override fun statusCode(): Int = code - - override fun headers(): Headers = headers - - override fun body(): InputStream = body!!.byteStream() - - override fun close() = body!!.close() - } -} - -private fun okhttp3.Headers.toHeaders(): Headers { - val headersBuilder = Headers.builder() - forEach { (name, value) -> headersBuilder.put(name, value) } - return headersBuilder.build() -} diff --git a/openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClient.kt b/openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClient.kt deleted file mode 100644 index e69222208..000000000 --- a/openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClient.kt +++ /dev/null @@ -1,481 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.client.okhttp - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.openai.auth.WorkloadIdentity -import com.openai.azure.AzureOpenAIServiceVersion -import com.openai.azure.AzureUrlPathMode -import com.openai.client.OpenAIClient -import com.openai.client.OpenAIClientImpl -import com.openai.core.ClientOptions -import com.openai.core.LogLevel -import com.openai.core.Sleeper -import com.openai.core.Timeout -import com.openai.core.http.AsyncStreamResponse -import com.openai.core.http.Headers -import com.openai.core.http.HttpClient -import com.openai.core.http.HttpRequestAuthenticator -import com.openai.core.http.ProxyAuthenticator -import com.openai.core.http.QueryParams -import com.openai.credential.Credential -import java.net.Proxy -import java.time.Clock -import java.time.Duration -import java.util.Optional -import java.util.concurrent.Executor -import java.util.concurrent.ExecutorService -import javax.net.ssl.HostnameVerifier -import javax.net.ssl.SSLSocketFactory -import javax.net.ssl.X509TrustManager -import kotlin.jvm.optionals.getOrNull - -/** - * A class that allows building an instance of [OpenAIClient] with [OkHttpClient] as the underlying - * [HttpClient]. - */ -class OpenAIOkHttpClient private constructor() { - - companion object { - - /** Returns a mutable builder for constructing an instance of [OpenAIClient]. */ - @JvmStatic fun builder() = Builder() - - /** - * Returns a client configured using system properties and environment variables. - * - * @see ClientOptions.Builder.fromEnv - */ - @JvmStatic fun fromEnv(): OpenAIClient = builder().fromEnv().build() - } - - /** A builder for [OpenAIOkHttpClient]. */ - class Builder internal constructor() { - - private var clientOptions: ClientOptions.Builder = ClientOptions.builder() - private var dispatcherExecutorService: ExecutorService? = null - private var followRedirects: Boolean = true - private var proxy: Proxy? = null - private var proxyAuthenticator: ProxyAuthenticator? = null - private var maxIdleConnections: Int? = null - private var keepAliveDuration: Duration? = null - private var sslSocketFactory: SSLSocketFactory? = null - private var trustManager: X509TrustManager? = null - private var hostnameVerifier: HostnameVerifier? = null - - /** - * The executor service to use for running HTTP requests. - * - * Defaults to OkHttp's - * [default executor service](https://github.com/square/okhttp/blob/ace792f443b2ffb17974f5c0d1cecdf589309f26/okhttp/src/commonJvmAndroid/kotlin/okhttp3/Dispatcher.kt#L98-L104). - * - * This class takes ownership of the executor service and shuts it down when closed. - */ - fun dispatcherExecutorService(dispatcherExecutorService: ExecutorService?) = apply { - this.dispatcherExecutorService = dispatcherExecutorService - } - - /** - * Configures whether the underlying transport follows redirects automatically. - * - * Defaults to true. - */ - fun followRedirects(followRedirects: Boolean) = apply { - this.followRedirects = followRedirects - } - - /** - * Alias for calling [Builder.dispatcherExecutorService] with - * `dispatcherExecutorService.orElse(null)`. - */ - fun dispatcherExecutorService(dispatcherExecutorService: Optional) = - dispatcherExecutorService(dispatcherExecutorService.getOrNull()) - - fun proxy(proxy: Proxy?) = apply { this.proxy = proxy } - - /** Alias for calling [Builder.proxy] with `proxy.orElse(null)`. */ - fun proxy(proxy: Optional) = proxy(proxy.getOrNull()) - - /** - * Provides credentials when an HTTP proxy responds with `407 Proxy Authentication - * Required`. - */ - fun proxyAuthenticator(proxyAuthenticator: ProxyAuthenticator?) = apply { - this.proxyAuthenticator = proxyAuthenticator - } - - /** - * Alias for calling [Builder.proxyAuthenticator] with `proxyAuthenticator.orElse(null)`. - */ - fun proxyAuthenticator(proxyAuthenticator: Optional) = - proxyAuthenticator(proxyAuthenticator.getOrNull()) - - /** - * The maximum number of idle connections kept by the underlying OkHttp connection pool. - * - * If this is set, then [keepAliveDuration] must also be set. - * - * If unset, then OkHttp's default is used. - */ - fun maxIdleConnections(maxIdleConnections: Int?) = apply { - this.maxIdleConnections = maxIdleConnections - } - - /** - * Alias for [Builder.maxIdleConnections]. - * - * This unboxed primitive overload exists for backwards compatibility. - */ - fun maxIdleConnections(maxIdleConnections: Int) = - maxIdleConnections(maxIdleConnections as Int?) - - /** - * Alias for calling [Builder.maxIdleConnections] with `maxIdleConnections.orElse(null)`. - */ - fun maxIdleConnections(maxIdleConnections: Optional) = - maxIdleConnections(maxIdleConnections.getOrNull()) - - /** - * The keep-alive duration for idle connections in the underlying OkHttp connection pool. - * - * If this is set, then [maxIdleConnections] must also be set. - * - * If unset, then OkHttp's default is used. - */ - fun keepAliveDuration(keepAliveDuration: Duration?) = apply { - this.keepAliveDuration = keepAliveDuration - } - - /** Alias for calling [Builder.keepAliveDuration] with `keepAliveDuration.orElse(null)`. */ - fun keepAliveDuration(keepAliveDuration: Optional) = - keepAliveDuration(keepAliveDuration.getOrNull()) - - /** - * The socket factory used to secure HTTPS connections. - * - * If this is set, then [trustManager] must also be set. - * - * If unset, then the system default is used. Most applications should not call this method, - * and instead use the system default. The default include special optimizations that can be - * lost if the implementation is modified. - */ - fun sslSocketFactory(sslSocketFactory: SSLSocketFactory?) = apply { - this.sslSocketFactory = sslSocketFactory - } - - /** Alias for calling [Builder.sslSocketFactory] with `sslSocketFactory.orElse(null)`. */ - fun sslSocketFactory(sslSocketFactory: Optional) = - sslSocketFactory(sslSocketFactory.getOrNull()) - - /** - * The trust manager used to secure HTTPS connections. - * - * If this is set, then [sslSocketFactory] must also be set. - * - * If unset, then the system default is used. Most applications should not call this method, - * and instead use the system default. The default include special optimizations that can be - * lost if the implementation is modified. - */ - fun trustManager(trustManager: X509TrustManager?) = apply { - this.trustManager = trustManager - } - - /** Alias for calling [Builder.trustManager] with `trustManager.orElse(null)`. */ - fun trustManager(trustManager: Optional) = - trustManager(trustManager.getOrNull()) - - /** - * The verifier used to confirm that response certificates apply to requested hostnames for - * HTTPS connections. - * - * If unset, then a default hostname verifier is used. - */ - fun hostnameVerifier(hostnameVerifier: HostnameVerifier?) = apply { - this.hostnameVerifier = hostnameVerifier - } - - /** Alias for calling [Builder.hostnameVerifier] with `hostnameVerifier.orElse(null)`. */ - fun hostnameVerifier(hostnameVerifier: Optional) = - hostnameVerifier(hostnameVerifier.getOrNull()) - - /** - * Whether to throw an exception if any of the Jackson versions detected at runtime are - * incompatible with the SDK's minimum supported Jackson version (2.13.4). - * - * Defaults to true. Use extreme caution when disabling this option. There is no guarantee - * that the SDK will work correctly when using an incompatible Jackson version. - */ - fun checkJacksonVersionCompatibility(checkJacksonVersionCompatibility: Boolean) = apply { - clientOptions.checkJacksonVersionCompatibility(checkJacksonVersionCompatibility) - } - - /** - * The Jackson JSON mapper to use for serializing and deserializing JSON. - * - * Defaults to [com.openai.core.jsonMapper]. The default is usually sufficient and rarely - * needs to be overridden. - */ - fun jsonMapper(jsonMapper: JsonMapper) = apply { clientOptions.jsonMapper(jsonMapper) } - - /** - * The executor to use for running [AsyncStreamResponse.Handler] callbacks. - * - * Defaults to a dedicated cached thread pool. - * - * This class takes ownership of the executor and shuts it down, if possible, when closed. - */ - fun streamHandlerExecutor(streamHandlerExecutor: Executor) = apply { - clientOptions.streamHandlerExecutor(streamHandlerExecutor) - } - - /** - * The interface to use for delaying execution, like during retries. - * - * This is primarily useful for using fake delays in tests. - * - * Defaults to real execution delays. - * - * This class takes ownership of the sleeper and closes it when closed. - */ - fun sleeper(sleeper: Sleeper) = apply { clientOptions.sleeper(sleeper) } - - /** - * The clock to use for operations that require timing, like retries. - * - * This is primarily useful for using a fake clock in tests. - * - * Defaults to [Clock.systemUTC]. - */ - fun clock(clock: Clock) = apply { clientOptions.clock(clock) } - - /** - * The base URL to use for every request. - * - * Defaults to the production environment: `https://api.openai.com/v1`. - */ - fun baseUrl(baseUrl: String?) = apply { clientOptions.baseUrl(baseUrl) } - - /** Alias for calling [Builder.baseUrl] with `baseUrl.orElse(null)`. */ - fun baseUrl(baseUrl: Optional) = baseUrl(baseUrl.getOrNull()) - - /** - * Whether to call `validate` on every response before returning it. - * - * Setting this to `true` is _not_ forwards compatible with new types from the API for - * existing fields. - * - * Defaults to false, which means the shape of the response will not be validated upfront. - * Instead, validation will only occur for the parts of the response that are accessed. - */ - fun responseValidation(responseValidation: Boolean) = apply { - clientOptions.responseValidation(responseValidation) - } - - /** - * Sets the maximum time allowed for various parts of an HTTP call's lifecycle, excluding - * retries. - * - * Defaults to [Timeout.default]. - */ - fun timeout(timeout: Timeout) = apply { clientOptions.timeout(timeout) } - - /** - * Sets the maximum time allowed for a complete HTTP call, not including retries. - * - * See [Timeout.request] for more details. - * - * For fine-grained control, pass a [Timeout] object. - */ - fun timeout(timeout: Duration) = apply { clientOptions.timeout(timeout) } - - /** - * The maximum number of times to retry failed requests, with a short exponential backoff - * between requests. - * - * Only the following error types are retried: - * - Connection errors (for example, due to a network connectivity problem) - * - 408 Request Timeout - * - 409 Conflict - * - 429 Rate Limit - * - 5xx Internal - * - * The API may also explicitly instruct the SDK to retry or not retry a request. - * - * Defaults to 2. - */ - fun maxRetries(maxRetries: Int) = apply { clientOptions.maxRetries(maxRetries) } - - /** - * The level at which to log request and response information. - * - * [fromEnv] will set the level from environment variables. See [LogLevel.fromEnv]. - * - * Defaults to [LogLevel.fromEnv]. - */ - fun logLevel(logLevel: LogLevel) = apply { clientOptions.logLevel(logLevel) } - - fun apiKey(apiKey: String?) = apply { clientOptions.apiKey(apiKey) } - - /** Alias for calling [Builder.apiKey] with `apiKey.orElse(null)`. */ - fun apiKey(apiKey: Optional) = apiKey(apiKey.getOrNull()) - - fun adminApiKey(adminApiKey: String?) = apply { clientOptions.adminApiKey(adminApiKey) } - - /** Alias for calling [Builder.adminApiKey] with `adminApiKey.orElse(null)`. */ - fun adminApiKey(adminApiKey: Optional) = adminApiKey(adminApiKey.getOrNull()) - - fun credential(credential: Credential) = apply { clientOptions.credential(credential) } - - /** Configures full-request authentication for an OpenAI-owned provider integration. */ - @JvmSynthetic - fun httpRequestAuthenticator(httpRequestAuthenticator: HttpRequestAuthenticator) = apply { - clientOptions.httpRequestAuthenticator(httpRequestAuthenticator) - } - - fun workloadIdentity(workloadIdentity: WorkloadIdentity?) = apply { - clientOptions.workloadIdentity(workloadIdentity) - } - - /** Alias for calling [Builder.workloadIdentity] with `workloadIdentity.orElse(null)`. */ - fun workloadIdentity(workloadIdentity: Optional) = - workloadIdentity(workloadIdentity.getOrNull()) - - fun azureServiceVersion(azureServiceVersion: AzureOpenAIServiceVersion) = apply { - clientOptions.azureServiceVersion(azureServiceVersion) - } - - fun azureUrlPathMode(azureUrlPathMode: AzureUrlPathMode) = apply { - clientOptions.azureUrlPathMode(azureUrlPathMode) - } - - fun organization(organization: String?) = apply { clientOptions.organization(organization) } - - /** Alias for calling [Builder.organization] with `organization.orElse(null)`. */ - fun organization(organization: Optional) = organization(organization.getOrNull()) - - fun project(project: String?) = apply { clientOptions.project(project) } - - /** Alias for calling [Builder.project] with `project.orElse(null)`. */ - fun project(project: Optional) = project(project.getOrNull()) - - fun webhookSecret(webhookSecret: String?) = apply { - clientOptions.webhookSecret(webhookSecret) - } - - /** Alias for calling [Builder.webhookSecret] with `webhookSecret.orElse(null)`. */ - fun webhookSecret(webhookSecret: Optional) = - webhookSecret(webhookSecret.getOrNull()) - - fun headers(headers: Headers) = apply { clientOptions.headers(headers) } - - fun headers(headers: Map>) = apply { - clientOptions.headers(headers) - } - - fun putHeader(name: String, value: String) = apply { clientOptions.putHeader(name, value) } - - fun putHeaders(name: String, values: Iterable) = apply { - clientOptions.putHeaders(name, values) - } - - fun putAllHeaders(headers: Headers) = apply { clientOptions.putAllHeaders(headers) } - - fun putAllHeaders(headers: Map>) = apply { - clientOptions.putAllHeaders(headers) - } - - fun replaceHeaders(name: String, value: String) = apply { - clientOptions.replaceHeaders(name, value) - } - - fun replaceHeaders(name: String, values: Iterable) = apply { - clientOptions.replaceHeaders(name, values) - } - - fun replaceAllHeaders(headers: Headers) = apply { clientOptions.replaceAllHeaders(headers) } - - fun replaceAllHeaders(headers: Map>) = apply { - clientOptions.replaceAllHeaders(headers) - } - - fun removeHeaders(name: String) = apply { clientOptions.removeHeaders(name) } - - fun removeAllHeaders(names: Set) = apply { clientOptions.removeAllHeaders(names) } - - fun queryParams(queryParams: QueryParams) = apply { clientOptions.queryParams(queryParams) } - - fun queryParams(queryParams: Map>) = apply { - clientOptions.queryParams(queryParams) - } - - fun putQueryParam(key: String, value: String) = apply { - clientOptions.putQueryParam(key, value) - } - - fun putQueryParams(key: String, values: Iterable) = apply { - clientOptions.putQueryParams(key, values) - } - - fun putAllQueryParams(queryParams: QueryParams) = apply { - clientOptions.putAllQueryParams(queryParams) - } - - fun putAllQueryParams(queryParams: Map>) = apply { - clientOptions.putAllQueryParams(queryParams) - } - - fun replaceQueryParams(key: String, value: String) = apply { - clientOptions.replaceQueryParams(key, value) - } - - fun replaceQueryParams(key: String, values: Iterable) = apply { - clientOptions.replaceQueryParams(key, values) - } - - fun replaceAllQueryParams(queryParams: QueryParams) = apply { - clientOptions.replaceAllQueryParams(queryParams) - } - - fun replaceAllQueryParams(queryParams: Map>) = apply { - clientOptions.replaceAllQueryParams(queryParams) - } - - fun removeQueryParams(key: String) = apply { clientOptions.removeQueryParams(key) } - - fun removeAllQueryParams(keys: Set) = apply { - clientOptions.removeAllQueryParams(keys) - } - - /** - * Updates configuration using system properties and environment variables. - * - * @see ClientOptions.Builder.fromEnv - */ - fun fromEnv() = apply { clientOptions.fromEnv() } - - /** - * Returns an immutable instance of [OpenAIClient]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): OpenAIClient = - OpenAIClientImpl( - clientOptions - .httpClient( - OkHttpClient.builder() - .timeout(clientOptions.timeout()) - .followRedirects(followRedirects) - .proxy(proxy) - .proxyAuthenticator(proxyAuthenticator) - .maxIdleConnections(maxIdleConnections) - .keepAliveDuration(keepAliveDuration) - .dispatcherExecutorService(dispatcherExecutorService) - .sslSocketFactory(sslSocketFactory) - .trustManager(trustManager) - .hostnameVerifier(hostnameVerifier) - .build() - ) - .build() - ) - } -} diff --git a/openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClientAsync.kt b/openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClientAsync.kt deleted file mode 100644 index b2977ccc3..000000000 --- a/openai-java-client-okhttp/src/main/kotlin/com/openai/client/okhttp/OpenAIOkHttpClientAsync.kt +++ /dev/null @@ -1,481 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.client.okhttp - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.openai.auth.WorkloadIdentity -import com.openai.azure.AzureOpenAIServiceVersion -import com.openai.azure.AzureUrlPathMode -import com.openai.client.OpenAIClientAsync -import com.openai.client.OpenAIClientAsyncImpl -import com.openai.core.ClientOptions -import com.openai.core.LogLevel -import com.openai.core.Sleeper -import com.openai.core.Timeout -import com.openai.core.http.AsyncStreamResponse -import com.openai.core.http.Headers -import com.openai.core.http.HttpClient -import com.openai.core.http.HttpRequestAuthenticator -import com.openai.core.http.ProxyAuthenticator -import com.openai.core.http.QueryParams -import com.openai.credential.Credential -import java.net.Proxy -import java.time.Clock -import java.time.Duration -import java.util.Optional -import java.util.concurrent.Executor -import java.util.concurrent.ExecutorService -import javax.net.ssl.HostnameVerifier -import javax.net.ssl.SSLSocketFactory -import javax.net.ssl.X509TrustManager -import kotlin.jvm.optionals.getOrNull - -/** - * A class that allows building an instance of [OpenAIClientAsync] with [OkHttpClient] as the - * underlying [HttpClient]. - */ -class OpenAIOkHttpClientAsync private constructor() { - - companion object { - - /** Returns a mutable builder for constructing an instance of [OpenAIClientAsync]. */ - @JvmStatic fun builder() = Builder() - - /** - * Returns a client configured using system properties and environment variables. - * - * @see ClientOptions.Builder.fromEnv - */ - @JvmStatic fun fromEnv(): OpenAIClientAsync = builder().fromEnv().build() - } - - /** A builder for [OpenAIOkHttpClientAsync]. */ - class Builder internal constructor() { - - private var clientOptions: ClientOptions.Builder = ClientOptions.builder() - private var dispatcherExecutorService: ExecutorService? = null - private var followRedirects: Boolean = true - private var proxy: Proxy? = null - private var proxyAuthenticator: ProxyAuthenticator? = null - private var maxIdleConnections: Int? = null - private var keepAliveDuration: Duration? = null - private var sslSocketFactory: SSLSocketFactory? = null - private var trustManager: X509TrustManager? = null - private var hostnameVerifier: HostnameVerifier? = null - - /** - * The executor service to use for running HTTP requests. - * - * Defaults to OkHttp's - * [default executor service](https://github.com/square/okhttp/blob/ace792f443b2ffb17974f5c0d1cecdf589309f26/okhttp/src/commonJvmAndroid/kotlin/okhttp3/Dispatcher.kt#L98-L104). - * - * This class takes ownership of the executor service and shuts it down when closed. - */ - fun dispatcherExecutorService(dispatcherExecutorService: ExecutorService?) = apply { - this.dispatcherExecutorService = dispatcherExecutorService - } - - /** - * Configures whether the underlying transport follows redirects automatically. - * - * Defaults to true. - */ - fun followRedirects(followRedirects: Boolean) = apply { - this.followRedirects = followRedirects - } - - /** - * Alias for calling [Builder.dispatcherExecutorService] with - * `dispatcherExecutorService.orElse(null)`. - */ - fun dispatcherExecutorService(dispatcherExecutorService: Optional) = - dispatcherExecutorService(dispatcherExecutorService.getOrNull()) - - fun proxy(proxy: Proxy?) = apply { this.proxy = proxy } - - /** Alias for calling [Builder.proxy] with `proxy.orElse(null)`. */ - fun proxy(proxy: Optional) = proxy(proxy.getOrNull()) - - /** - * Provides credentials when an HTTP proxy responds with `407 Proxy Authentication - * Required`. - */ - fun proxyAuthenticator(proxyAuthenticator: ProxyAuthenticator?) = apply { - this.proxyAuthenticator = proxyAuthenticator - } - - /** - * Alias for calling [Builder.proxyAuthenticator] with `proxyAuthenticator.orElse(null)`. - */ - fun proxyAuthenticator(proxyAuthenticator: Optional) = - proxyAuthenticator(proxyAuthenticator.getOrNull()) - - /** - * The maximum number of idle connections kept by the underlying OkHttp connection pool. - * - * If this is set, then [keepAliveDuration] must also be set. - * - * If unset, then OkHttp's default is used. - */ - fun maxIdleConnections(maxIdleConnections: Int?) = apply { - this.maxIdleConnections = maxIdleConnections - } - - /** - * Alias for [Builder.maxIdleConnections]. - * - * This unboxed primitive overload exists for backwards compatibility. - */ - fun maxIdleConnections(maxIdleConnections: Int) = - maxIdleConnections(maxIdleConnections as Int?) - - /** - * Alias for calling [Builder.maxIdleConnections] with `maxIdleConnections.orElse(null)`. - */ - fun maxIdleConnections(maxIdleConnections: Optional) = - maxIdleConnections(maxIdleConnections.getOrNull()) - - /** - * The keep-alive duration for idle connections in the underlying OkHttp connection pool. - * - * If this is set, then [maxIdleConnections] must also be set. - * - * If unset, then OkHttp's default is used. - */ - fun keepAliveDuration(keepAliveDuration: Duration?) = apply { - this.keepAliveDuration = keepAliveDuration - } - - /** Alias for calling [Builder.keepAliveDuration] with `keepAliveDuration.orElse(null)`. */ - fun keepAliveDuration(keepAliveDuration: Optional) = - keepAliveDuration(keepAliveDuration.getOrNull()) - - /** - * The socket factory used to secure HTTPS connections. - * - * If this is set, then [trustManager] must also be set. - * - * If unset, then the system default is used. Most applications should not call this method, - * and instead use the system default. The default include special optimizations that can be - * lost if the implementation is modified. - */ - fun sslSocketFactory(sslSocketFactory: SSLSocketFactory?) = apply { - this.sslSocketFactory = sslSocketFactory - } - - /** Alias for calling [Builder.sslSocketFactory] with `sslSocketFactory.orElse(null)`. */ - fun sslSocketFactory(sslSocketFactory: Optional) = - sslSocketFactory(sslSocketFactory.getOrNull()) - - /** - * The trust manager used to secure HTTPS connections. - * - * If this is set, then [sslSocketFactory] must also be set. - * - * If unset, then the system default is used. Most applications should not call this method, - * and instead use the system default. The default include special optimizations that can be - * lost if the implementation is modified. - */ - fun trustManager(trustManager: X509TrustManager?) = apply { - this.trustManager = trustManager - } - - /** Alias for calling [Builder.trustManager] with `trustManager.orElse(null)`. */ - fun trustManager(trustManager: Optional) = - trustManager(trustManager.getOrNull()) - - /** - * The verifier used to confirm that response certificates apply to requested hostnames for - * HTTPS connections. - * - * If unset, then a default hostname verifier is used. - */ - fun hostnameVerifier(hostnameVerifier: HostnameVerifier?) = apply { - this.hostnameVerifier = hostnameVerifier - } - - /** Alias for calling [Builder.hostnameVerifier] with `hostnameVerifier.orElse(null)`. */ - fun hostnameVerifier(hostnameVerifier: Optional) = - hostnameVerifier(hostnameVerifier.getOrNull()) - - /** - * Whether to throw an exception if any of the Jackson versions detected at runtime are - * incompatible with the SDK's minimum supported Jackson version (2.13.4). - * - * Defaults to true. Use extreme caution when disabling this option. There is no guarantee - * that the SDK will work correctly when using an incompatible Jackson version. - */ - fun checkJacksonVersionCompatibility(checkJacksonVersionCompatibility: Boolean) = apply { - clientOptions.checkJacksonVersionCompatibility(checkJacksonVersionCompatibility) - } - - /** - * The Jackson JSON mapper to use for serializing and deserializing JSON. - * - * Defaults to [com.openai.core.jsonMapper]. The default is usually sufficient and rarely - * needs to be overridden. - */ - fun jsonMapper(jsonMapper: JsonMapper) = apply { clientOptions.jsonMapper(jsonMapper) } - - /** - * The executor to use for running [AsyncStreamResponse.Handler] callbacks. - * - * Defaults to a dedicated cached thread pool. - * - * This class takes ownership of the executor and shuts it down, if possible, when closed. - */ - fun streamHandlerExecutor(streamHandlerExecutor: Executor) = apply { - clientOptions.streamHandlerExecutor(streamHandlerExecutor) - } - - /** - * The interface to use for delaying execution, like during retries. - * - * This is primarily useful for using fake delays in tests. - * - * Defaults to real execution delays. - * - * This class takes ownership of the sleeper and closes it when closed. - */ - fun sleeper(sleeper: Sleeper) = apply { clientOptions.sleeper(sleeper) } - - /** - * The clock to use for operations that require timing, like retries. - * - * This is primarily useful for using a fake clock in tests. - * - * Defaults to [Clock.systemUTC]. - */ - fun clock(clock: Clock) = apply { clientOptions.clock(clock) } - - /** - * The base URL to use for every request. - * - * Defaults to the production environment: `https://api.openai.com/v1`. - */ - fun baseUrl(baseUrl: String?) = apply { clientOptions.baseUrl(baseUrl) } - - /** Alias for calling [Builder.baseUrl] with `baseUrl.orElse(null)`. */ - fun baseUrl(baseUrl: Optional) = baseUrl(baseUrl.getOrNull()) - - /** - * Whether to call `validate` on every response before returning it. - * - * Setting this to `true` is _not_ forwards compatible with new types from the API for - * existing fields. - * - * Defaults to false, which means the shape of the response will not be validated upfront. - * Instead, validation will only occur for the parts of the response that are accessed. - */ - fun responseValidation(responseValidation: Boolean) = apply { - clientOptions.responseValidation(responseValidation) - } - - /** - * Sets the maximum time allowed for various parts of an HTTP call's lifecycle, excluding - * retries. - * - * Defaults to [Timeout.default]. - */ - fun timeout(timeout: Timeout) = apply { clientOptions.timeout(timeout) } - - /** - * Sets the maximum time allowed for a complete HTTP call, not including retries. - * - * See [Timeout.request] for more details. - * - * For fine-grained control, pass a [Timeout] object. - */ - fun timeout(timeout: Duration) = apply { clientOptions.timeout(timeout) } - - /** - * The maximum number of times to retry failed requests, with a short exponential backoff - * between requests. - * - * Only the following error types are retried: - * - Connection errors (for example, due to a network connectivity problem) - * - 408 Request Timeout - * - 409 Conflict - * - 429 Rate Limit - * - 5xx Internal - * - * The API may also explicitly instruct the SDK to retry or not retry a request. - * - * Defaults to 2. - */ - fun maxRetries(maxRetries: Int) = apply { clientOptions.maxRetries(maxRetries) } - - /** - * The level at which to log request and response information. - * - * [fromEnv] will set the level from environment variables. See [LogLevel.fromEnv]. - * - * Defaults to [LogLevel.fromEnv]. - */ - fun logLevel(logLevel: LogLevel) = apply { clientOptions.logLevel(logLevel) } - - fun apiKey(apiKey: String?) = apply { clientOptions.apiKey(apiKey) } - - /** Alias for calling [Builder.apiKey] with `apiKey.orElse(null)`. */ - fun apiKey(apiKey: Optional) = apiKey(apiKey.getOrNull()) - - fun adminApiKey(adminApiKey: String?) = apply { clientOptions.adminApiKey(adminApiKey) } - - /** Alias for calling [Builder.adminApiKey] with `adminApiKey.orElse(null)`. */ - fun adminApiKey(adminApiKey: Optional) = adminApiKey(adminApiKey.getOrNull()) - - fun credential(credential: Credential) = apply { clientOptions.credential(credential) } - - /** Configures full-request authentication for an OpenAI-owned provider integration. */ - @JvmSynthetic - fun httpRequestAuthenticator(httpRequestAuthenticator: HttpRequestAuthenticator) = apply { - clientOptions.httpRequestAuthenticator(httpRequestAuthenticator) - } - - fun workloadIdentity(workloadIdentity: WorkloadIdentity?) = apply { - clientOptions.workloadIdentity(workloadIdentity) - } - - /** Alias for calling [Builder.workloadIdentity] with `workloadIdentity.orElse(null)`. */ - fun workloadIdentity(workloadIdentity: Optional) = - workloadIdentity(workloadIdentity.getOrNull()) - - fun azureServiceVersion(azureServiceVersion: AzureOpenAIServiceVersion) = apply { - clientOptions.azureServiceVersion(azureServiceVersion) - } - - fun azureUrlPath(azureUrlPathMode: AzureUrlPathMode) = apply { - clientOptions.azureUrlPathMode(azureUrlPathMode) - } - - fun organization(organization: String?) = apply { clientOptions.organization(organization) } - - /** Alias for calling [Builder.organization] with `organization.orElse(null)`. */ - fun organization(organization: Optional) = organization(organization.getOrNull()) - - fun project(project: String?) = apply { clientOptions.project(project) } - - /** Alias for calling [Builder.project] with `project.orElse(null)`. */ - fun project(project: Optional) = project(project.getOrNull()) - - fun webhookSecret(webhookSecret: String?) = apply { - clientOptions.webhookSecret(webhookSecret) - } - - /** Alias for calling [Builder.webhookSecret] with `webhookSecret.orElse(null)`. */ - fun webhookSecret(webhookSecret: Optional) = - webhookSecret(webhookSecret.getOrNull()) - - fun headers(headers: Headers) = apply { clientOptions.headers(headers) } - - fun headers(headers: Map>) = apply { - clientOptions.headers(headers) - } - - fun putHeader(name: String, value: String) = apply { clientOptions.putHeader(name, value) } - - fun putHeaders(name: String, values: Iterable) = apply { - clientOptions.putHeaders(name, values) - } - - fun putAllHeaders(headers: Headers) = apply { clientOptions.putAllHeaders(headers) } - - fun putAllHeaders(headers: Map>) = apply { - clientOptions.putAllHeaders(headers) - } - - fun replaceHeaders(name: String, value: String) = apply { - clientOptions.replaceHeaders(name, value) - } - - fun replaceHeaders(name: String, values: Iterable) = apply { - clientOptions.replaceHeaders(name, values) - } - - fun replaceAllHeaders(headers: Headers) = apply { clientOptions.replaceAllHeaders(headers) } - - fun replaceAllHeaders(headers: Map>) = apply { - clientOptions.replaceAllHeaders(headers) - } - - fun removeHeaders(name: String) = apply { clientOptions.removeHeaders(name) } - - fun removeAllHeaders(names: Set) = apply { clientOptions.removeAllHeaders(names) } - - fun queryParams(queryParams: QueryParams) = apply { clientOptions.queryParams(queryParams) } - - fun queryParams(queryParams: Map>) = apply { - clientOptions.queryParams(queryParams) - } - - fun putQueryParam(key: String, value: String) = apply { - clientOptions.putQueryParam(key, value) - } - - fun putQueryParams(key: String, values: Iterable) = apply { - clientOptions.putQueryParams(key, values) - } - - fun putAllQueryParams(queryParams: QueryParams) = apply { - clientOptions.putAllQueryParams(queryParams) - } - - fun putAllQueryParams(queryParams: Map>) = apply { - clientOptions.putAllQueryParams(queryParams) - } - - fun replaceQueryParams(key: String, value: String) = apply { - clientOptions.replaceQueryParams(key, value) - } - - fun replaceQueryParams(key: String, values: Iterable) = apply { - clientOptions.replaceQueryParams(key, values) - } - - fun replaceAllQueryParams(queryParams: QueryParams) = apply { - clientOptions.replaceAllQueryParams(queryParams) - } - - fun replaceAllQueryParams(queryParams: Map>) = apply { - clientOptions.replaceAllQueryParams(queryParams) - } - - fun removeQueryParams(key: String) = apply { clientOptions.removeQueryParams(key) } - - fun removeAllQueryParams(keys: Set) = apply { - clientOptions.removeAllQueryParams(keys) - } - - /** - * Updates configuration using system properties and environment variables. - * - * @see ClientOptions.Builder.fromEnv - */ - fun fromEnv() = apply { clientOptions.fromEnv() } - - /** - * Returns an immutable instance of [OpenAIClientAsync]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): OpenAIClientAsync = - OpenAIClientAsyncImpl( - clientOptions - .httpClient( - OkHttpClient.builder() - .timeout(clientOptions.timeout()) - .followRedirects(followRedirects) - .proxy(proxy) - .proxyAuthenticator(proxyAuthenticator) - .maxIdleConnections(maxIdleConnections) - .keepAliveDuration(keepAliveDuration) - .dispatcherExecutorService(dispatcherExecutorService) - .sslSocketFactory(sslSocketFactory) - .trustManager(trustManager) - .hostnameVerifier(hostnameVerifier) - .build() - ) - .build() - ) - } -} diff --git a/openai-java-client-okhttp/src/test/kotlin/com/openai/client/okhttp/OkHttpClientTest.kt b/openai-java-client-okhttp/src/test/kotlin/com/openai/client/okhttp/OkHttpClientTest.kt deleted file mode 100644 index b202c83c6..000000000 --- a/openai-java-client-okhttp/src/test/kotlin/com/openai/client/okhttp/OkHttpClientTest.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.openai.client.okhttp - -import com.github.tomakehurst.wiremock.client.WireMock.* -import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo -import com.github.tomakehurst.wiremock.junit5.WireMockTest -import com.openai.core.http.HttpMethod -import com.openai.core.http.HttpRequest -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.parallel.ResourceLock - -@WireMockTest -@ResourceLock("https://github.com/wiremock/wiremock/issues/169") -internal class OkHttpClientTest { - - private lateinit var baseUrl: String - private lateinit var httpClient: OkHttpClient - - @BeforeEach - fun beforeEach(wmRuntimeInfo: WireMockRuntimeInfo) { - baseUrl = wmRuntimeInfo.httpBaseUrl - httpClient = OkHttpClient.builder().build() - } - - @Test - fun executeAsync_whenFutureCancelled_cancelsUnderlyingCall() { - stubFor(post(urlPathEqualTo("/something")).willReturn(ok())) - val responseFuture = - httpClient.executeAsync( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(baseUrl) - .addPathSegment("something") - .build() - ) - val call = httpClient.okHttpClient.dispatcher.runningCalls().single() - - responseFuture.cancel(false) - - // Should have cancelled the underlying call - assertThat(call.isCanceled()).isTrue() - } -} diff --git a/openai-java-client-okhttp/src/test/kotlin/com/openai/client/okhttp/OpenAIOkHttpClientNativeMutualTlsTest.kt b/openai-java-client-okhttp/src/test/kotlin/com/openai/client/okhttp/OpenAIOkHttpClientNativeMutualTlsTest.kt deleted file mode 100644 index 10a9a95ea..000000000 --- a/openai-java-client-okhttp/src/test/kotlin/com/openai/client/okhttp/OpenAIOkHttpClientNativeMutualTlsTest.kt +++ /dev/null @@ -1,165 +0,0 @@ -package com.openai.client.okhttp - -import com.openai.client.OpenAIClient -import com.openai.errors.OpenAIIoException -import java.io.ByteArrayInputStream -import java.io.ByteArrayOutputStream -import java.io.IOException -import java.security.KeyStore -import java.security.cert.X509Certificate -import javax.net.ssl.KeyManagerFactory -import javax.net.ssl.SSLContext -import javax.net.ssl.TrustManager -import javax.net.ssl.X509TrustManager -import okhttp3.mockwebserver.MockResponse -import okhttp3.mockwebserver.MockWebServer -import okhttp3.tls.HandshakeCertificates -import okhttp3.tls.HeldCertificate -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.assertThatThrownBy -import org.junit.jupiter.api.Test - -internal class OpenAIOkHttpClientNativeMutualTlsTest { - - private val clientRoot = - HeldCertificate.Builder().commonName("client root").certificateAuthority(2).build() - private val clientIntermediate = - HeldCertificate.Builder() - .commonName("client intermediate") - .certificateAuthority(1) - .signedBy(clientRoot) - .build() - private val clientLeaf = - HeldCertificate.Builder().commonName("client leaf").signedBy(clientIntermediate).build() - - @Test - fun nativeMutualTlsPresentsFullPkcs12Chain() { - mutuallyAuthenticatedServer().use { fixture -> - fixture.server.enqueue( - MockResponse() - .setHeader("Content-Type", "application/json") - .setBody("""{"object":"list","data":[]}""") - ) - val client = - nativeMutualTlsClient( - arrayOf(clientLeaf.certificate, clientIntermediate.certificate), - fixture.clientTrust.trustManager, - fixture.baseUrl, - ) - - try { - client.files().list() - } finally { - client.close() - } - - val request = fixture.server.takeRequest() - assertThat(request.path).isEqualTo("/v1/files") - assertThat(requireNotNull(request.handshake).peerCertificates) - .containsSubsequence(clientLeaf.certificate, clientIntermediate.certificate) - } - } - - @Test - fun nativeMutualTlsFailsClosedWhenIntermediateIsMissing() { - mutuallyAuthenticatedServer().use { fixture -> - fixture.server.enqueue( - MockResponse() - .setHeader("Content-Type", "application/json") - .setBody("""{"object":"list","data":[]}""") - ) - val client = - nativeMutualTlsClient( - arrayOf(clientLeaf.certificate), - fixture.clientTrust.trustManager, - fixture.baseUrl, - ) - - try { - assertThatThrownBy { client.files().list() } - .isInstanceOf(OpenAIIoException::class.java) - .hasCauseInstanceOf(IOException::class.java) - } finally { - client.close() - } - - assertThat(fixture.server.requestCount).isZero() - } - } - - private fun nativeMutualTlsClient( - chain: Array, - serverTrustManager: X509TrustManager, - baseUrl: String, - ): OpenAIClient { - val password = "test password".toCharArray() - val storedKeyStore = - KeyStore.getInstance("PKCS12").apply { - load(null, null) - setKeyEntry("client", clientLeaf.keyPair.private, password, chain) - } - val encodedKeyStore = - ByteArrayOutputStream().use { output -> - storedKeyStore.store(output, password) - output.toByteArray() - } - val loadedKeyStore = - KeyStore.getInstance("PKCS12").apply { - ByteArrayInputStream(encodedKeyStore).use { input -> load(input, password) } - } - val keyManagers = - KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()).apply { - init(loadedKeyStore, password) - } - val sslContext = - SSLContext.getInstance("TLS").apply { - init(keyManagers.keyManagers, arrayOf(serverTrustManager), null) - } - - return OpenAIOkHttpClient.builder() - .apiKey("test") - .baseUrl(baseUrl) - .followRedirects(false) - .sslSocketFactory(sslContext.socketFactory) - .trustManager(serverTrustManager) - .maxRetries(0) - .build() - } - - private fun mutuallyAuthenticatedServer(): MutualTlsServer { - val serverRoot = - HeldCertificate.Builder().commonName("server root").certificateAuthority(1).build() - val serverCertificate = - HeldCertificate.Builder() - .commonName("localhost") - .addSubjectAlternativeName("localhost") - .signedBy(serverRoot) - .build() - val serverIdentity = - HandshakeCertificates.Builder() - .heldCertificate(serverCertificate) - .addTrustedCertificate(clientRoot.certificate) - .build() - val clientTrust = - HandshakeCertificates.Builder().addTrustedCertificate(serverRoot.certificate).build() - val server = - MockWebServer().apply { - useHttps(serverIdentity.sslSocketFactory(), false) - requireClientAuth() - start() - } - return MutualTlsServer(server, clientTrust) - } - - private data class MutualTlsServer( - val server: MockWebServer, - val clientTrust: HandshakeCertificates, - ) : AutoCloseable { - val baseUrl: String - get() = server.url("/v1").toString().removeSuffix("/") - - override fun close() { - server.close() - } - } -} diff --git a/openai-java-core/build.gradle.kts b/openai-java-core/build.gradle.kts deleted file mode 100644 index a1ee2daa7..000000000 --- a/openai-java-core/build.gradle.kts +++ /dev/null @@ -1,150 +0,0 @@ -import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.tasks.Classpath -import org.gradle.process.CommandLineArgumentProvider - -abstract class JavaAgentArgumentProvider : CommandLineArgumentProvider { - @get:Classpath abstract val classpath: ConfigurableFileCollection - - override fun asArguments(): Iterable = - listOf("-javaagent:${classpath.singleFile.absolutePath}") -} - -plugins { - id("java") - id("openai.kotlin") - id("openai.wiremock-test") - id("openai.publish") -} - -val jacksonCompatibilityVersion = "2.14.0" -val jacksonPublishedVersion = "2.18.9" -val mockitoVersion = "5.14.2" -val mockitoAgent by configurations.creating { - isCanBeConsumed = false - isCanBeResolved = true - isVisible = false -} - -// Runtime classpath for `testJacksonCompatibility`: the same dependencies as -// `testRuntimeClasspath`, but forced to the older Jackson version that the SDK supports. -val jacksonCompatibilityRuntime by configurations.creating { - extendsFrom(configurations.testRuntimeClasspath.get()) - isCanBeConsumed = false - isCanBeResolved = true - attributes.attribute( - org.gradle.api.attributes.java.TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, - 17, - ) -} - -// Keep the normal test runtime on the same secure Jackson release that consumers receive. WireMock -// 3 requires newer Jackson APIs, so compatibility testing runs separately below. -configurations.testRuntimeClasspath.configure { - resolutionStrategy.eachDependency { - if ( - requested.group == "com.fasterxml.jackson" || - requested.group.startsWith("com.fasterxml.jackson.") - ) { - useVersion(jacksonPublishedVersion) - because("tests must exercise the SDK's secure published Jackson release") - } - } -} - -// Palantir, Dokka, and the normal test runtime have independently aligned Jackson classpaths. -configurations.matching { - it.name != configurations.testRuntimeClasspath.get().name && - it.name != "palantir" && - !it.name.startsWith("dokka") -}.configureEach { - resolutionStrategy { - // Compile and test against a lower Jackson version to ensure we're compatible with it. Note that - // we generally support 2.13.4, but test against 2.14.0 because 2.13.4 has some annoying (but - // niche) bugs (users should upgrade if they encounter them). We publish with a higher version - // (see below) to ensure users depend on a secure version by default. - force("com.fasterxml.jackson.core:jackson-core:$jacksonCompatibilityVersion") - force("com.fasterxml.jackson.core:jackson-databind:$jacksonCompatibilityVersion") - force("com.fasterxml.jackson.core:jackson-annotations:$jacksonCompatibilityVersion") - force("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jacksonCompatibilityVersion") - force("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonCompatibilityVersion") - force("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonCompatibilityVersion") - } -} - -dependencies { - api("com.fasterxml.jackson.core:jackson-core:$jacksonPublishedVersion") - api("com.fasterxml.jackson.core:jackson-databind:$jacksonPublishedVersion") - api("com.google.errorprone:error_prone_annotations:2.33.0") - api("io.swagger.core.v3:swagger-annotations:2.2.31") - - implementation("com.fasterxml.jackson.core:jackson-annotations:$jacksonPublishedVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jacksonPublishedVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonPublishedVersion") - implementation("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonPublishedVersion") - implementation("com.github.victools:jsonschema-generator:4.38.0") - implementation("com.github.victools:jsonschema-module-jackson:4.38.0") - implementation("com.github.victools:jsonschema-module-swagger-2:4.38.0") - - testImplementation(kotlin("test")) - testImplementation(project(":openai-java-client-okhttp")) - testImplementation(platform("com.fasterxml.jackson:jackson-bom:2.21.5")) - testImplementation("org.assertj:assertj-core:3.27.7") - testImplementation("org.junit.jupiter:junit-jupiter-api:5.9.3") - testImplementation("org.junit.jupiter:junit-jupiter-params:5.9.3") - testImplementation("org.junit-pioneer:junit-pioneer:1.9.1") - testImplementation("org.mockito:mockito-core:$mockitoVersion") - testImplementation("org.mockito:mockito-junit-jupiter:$mockitoVersion") - testImplementation("org.mockito.kotlin:mockito-kotlin:4.1.0") - testRuntimeOnly("org.slf4j:slf4j-nop:2.0.17") { - because("prevent SLF4J provider diagnostics from racing stderr assertions") - } - mockitoAgent("org.mockito:mockito-core:$mockitoVersion") { isTransitive = false } -} - -// Re-run the core and model tests against the older supported Jackson version. Service and -// WireMock-specific tests exercise HTTP plumbing and the mock server rather than Jackson -// compatibility, and WireMock 3 requires newer Jackson APIs. -val testJacksonCompatibility by tasks.registering(Test::class) { - group = "verification" - description = "Runs core and model tests against the older supported Jackson version." - testClassesDirs = sourceSets.test.get().output.classesDirs - classpath = - sourceSets.test.get().output + sourceSets.main.get().output + jacksonCompatibilityRuntime - shouldRunAfter(tasks.test) - exclude("**/services/**") - exclude("**/RetryingHttpClientTest*") - exclude("**/WireMockHandlebarsCompatibilityTest*") - systemProperty("junit.jupiter.execution.parallel.enabled", false) - systemProperty("expected.jackson.version", jacksonCompatibilityVersion) -} - -tasks.withType().configureEach { - jvmArgumentProviders.add( - objects.newInstance().apply { - classpath.from(mockitoAgent) - } - ) -} - -tasks.test { - systemProperty("expected.jackson.version", jacksonPublishedVersion) -} - -tasks.check { dependsOn(testJacksonCompatibility) } - -if (project.hasProperty("graalvmAgent")) { - java { - toolchain { - languageVersion.set(JavaLanguageVersion.of(21)) - vendor.set(JvmVendorSpec.GRAAL_VM) - } - } - - tasks.test { - maxParallelForks = 1 - forkEvery = 0 - jvmArgs( - "-agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image" - ) - } -} diff --git a/openai-java-core/src/apiCompatibility/dependencies.txt b/openai-java-core/src/apiCompatibility/dependencies.txt deleted file mode 100644 index 41755e4c6..000000000 --- a/openai-java-core/src/apiCompatibility/dependencies.txt +++ /dev/null @@ -1,9 +0,0 @@ -# Baseline-owned compile dependencies for restored generated tests. -org.jetbrains.kotlin:kotlin-stdlib:1.9.20 -org.jetbrains.kotlin:kotlin-test:1.9.20 -org.assertj:assertj-core:3.27.7 -org.junit.jupiter:junit-jupiter-api:5.9.3 -org.junit.jupiter:junit-jupiter-params:5.9.3 -org.mockito:mockito-core:5.14.2 -org.mockito.kotlin:mockito-kotlin:4.1.0 -org.wiremock:wiremock-jetty12:3.13.2 diff --git a/openai-java-core/src/apiCompatibility/excluded-generated-tests.txt b/openai-java-core/src/apiCompatibility/excluded-generated-tests.txt deleted file mode 100644 index 7571b3217..000000000 --- a/openai-java-core/src/apiCompatibility/excluded-generated-tests.txt +++ /dev/null @@ -1,24 +0,0 @@ -# These baseline tests depend on Kotlin-internal implementation details. Public expressions from -# them live in the consumer fixtures next to this manifest. -openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationCreateParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionCreateParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionMessageTest.kt -openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionTest.kt -openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileCreateParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/files/FileCreateParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/images/ImageCreateVariationParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseCreateParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseOutputMessageTest.kt -openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseTest.kt -openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseTextConfigTest.kt -openai-java-core/src/test/kotlin/com/openai/models/skills/SkillCreateParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionCreateParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/uploads/parts/PartCreateParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateCharacterParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/videos/VideoEditParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/videos/VideoExtendParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/models/videos/VideoRemixParamsTest.kt -openai-java-core/src/test/kotlin/com/openai/services/ResponseStreamEventValidationTest.kt diff --git a/openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/MultipartCompatibility.kt b/openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/MultipartCompatibility.kt deleted file mode 100644 index 6a9ff3be9..000000000 --- a/openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/MultipartCompatibility.kt +++ /dev/null @@ -1,92 +0,0 @@ -package com.openai.compatibility - -import com.openai.models.audio.AudioModel -import com.openai.models.audio.transcriptions.TranscriptionCreateParams -import com.openai.models.audio.translations.TranslationCreateParams -import com.openai.models.containers.files.FileCreateParams as ContainerFileCreateParams -import com.openai.models.files.FileCreateParams -import com.openai.models.files.FilePurpose -import com.openai.models.images.ImageCreateVariationParams -import com.openai.models.images.ImageEditParams -import com.openai.models.skills.SkillCreateParams -import com.openai.models.skills.versions.VersionCreateParams -import com.openai.models.uploads.parts.PartCreateParams -import com.openai.models.videos.VideoCreateCharacterParams -import com.openai.models.videos.VideoCreateParams -import com.openai.models.videos.VideoEditParams -import com.openai.models.videos.VideoExtendParams -import com.openai.models.videos.VideoRemixParams -import com.openai.models.videos.VideoSeconds -import java.io.InputStream - -internal object MultipartCompatibility { - fun transcription(stream: InputStream): TranscriptionCreateParams = - TranscriptionCreateParams.builder() - .file(stream) - .model(AudioModel.GPT_4O_TRANSCRIBE) - .chunkingStrategyAuto() - .build() - - fun transcriptionChunkingStrategy(): TranscriptionCreateParams.ChunkingStrategy = - TranscriptionCreateParams.ChunkingStrategy.ofAuto() - - fun translation(stream: InputStream): TranslationCreateParams = - TranslationCreateParams.builder().file(stream).model(AudioModel.WHISPER_1).build() - - fun containerFile(stream: InputStream): ContainerFileCreateParams = - ContainerFileCreateParams.builder().containerId("container").file(stream).build() - - fun file(stream: InputStream): FileCreateParams = - FileCreateParams.builder().file(stream).purpose(FilePurpose.ASSISTANTS).build() - - fun imageVariation(stream: InputStream): ImageCreateVariationParams = - ImageCreateVariationParams.builder().image(stream).build() - - fun imageEdit(stream: InputStream): ImageEditParams = - ImageEditParams.builder().image(stream).prompt("prompt").build() - - fun imageEditUnion(stream: InputStream): ImageEditParams.Image = - ImageEditParams.Image.ofInputStream(stream) - - fun imageEditUnionList(streams: List): ImageEditParams.Image = - ImageEditParams.Image.ofInputStreams(streams) - - fun skill(streams: List): SkillCreateParams = - SkillCreateParams.builder().filesOfInputStreams(streams).build() - - fun skillUnion(streams: List): SkillCreateParams.Files = - SkillCreateParams.Files.ofInputStreams(streams) - - fun skillVersion(streams: List): VersionCreateParams = - VersionCreateParams.builder().skillId("skill").filesOfInputStreams(streams).build() - - fun skillVersionUnion(streams: List): VersionCreateParams.Files = - VersionCreateParams.Files.ofInputStreams(streams) - - fun uploadPart(stream: InputStream): PartCreateParams = - PartCreateParams.builder().uploadId("upload").data(stream).build() - - fun videoCharacter(stream: InputStream): VideoCreateCharacterParams = - VideoCreateCharacterParams.builder().name("name").video(stream).build() - - fun videoCreate(stream: InputStream): VideoCreateParams = - VideoCreateParams.builder().prompt("prompt").inputReference(stream).build() - - fun videoCreateUnion(stream: InputStream): VideoCreateParams.InputReference = - VideoCreateParams.InputReference.ofStream(stream) - - fun videoEdit(stream: InputStream): VideoEditParams = - VideoEditParams.builder().prompt("prompt").video(stream).build() - - fun videoEditUnion(stream: InputStream): VideoEditParams.Video = - VideoEditParams.Video.ofInputStream(stream) - - fun videoExtend(stream: InputStream): VideoExtendParams = - VideoExtendParams.builder().prompt("prompt").seconds(VideoSeconds._4).video(stream).build() - - fun videoExtendUnion(stream: InputStream): VideoExtendParams.Video = - VideoExtendParams.Video.ofInputStream(stream) - - fun videoRemix(): VideoRemixParams = - VideoRemixParams.builder().videoId("video").prompt("prompt").build() -} diff --git a/openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/ResponseStreamEventCompatibility.kt b/openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/ResponseStreamEventCompatibility.kt deleted file mode 100644 index a855bac7d..000000000 --- a/openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/ResponseStreamEventCompatibility.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.openai.compatibility - -import com.openai.models.responses.ResponseStreamEvent - -internal object ResponseStreamEventCompatibility { - fun outputTextDelta(event: ResponseStreamEvent): String? = - if (event.isOutputTextDelta()) event.asOutputTextDelta().delta() else null -} diff --git a/openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/StructuredOutputsCompatibility.kt b/openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/StructuredOutputsCompatibility.kt deleted file mode 100644 index b2c14648e..000000000 --- a/openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/StructuredOutputsCompatibility.kt +++ /dev/null @@ -1,112 +0,0 @@ -package com.openai.compatibility - -import com.openai.models.ChatModel -import com.openai.models.chat.completions.StructuredChatCompletion -import com.openai.models.chat.completions.StructuredChatCompletionCreateParams -import com.openai.models.responses.ResponseTextConfig -import com.openai.models.responses.StructuredResponse -import com.openai.models.responses.StructuredResponseCreateParams -import com.openai.models.responses.StructuredResponseOutputMessage -import com.openai.models.responses.StructuredResponseTextConfig -import com.openai.services.async.ResponseServiceAsync -import com.openai.services.async.chat.ChatCompletionServiceAsync -import com.openai.services.blocking.ResponseService -import com.openai.services.blocking.chat.ChatCompletionService -import java.util.Optional - -internal data class CompatibilityOutput(val value: String) - -internal object StructuredOutputsCompatibility { - fun chatParams(): StructuredChatCompletionCreateParams = - StructuredChatCompletionCreateParams.builder() - .addUserMessage("input") - .model(ChatModel.GPT_4O_MINI) - .responseFormat(CompatibilityOutput::class.java) - .build() - - fun responseParams(): StructuredResponseCreateParams = - StructuredResponseCreateParams.builder() - .input("input") - .model(ChatModel.GPT_4O_MINI) - .text(CompatibilityOutput::class.java) - .build() - - fun responseTextConfig(): StructuredResponseTextConfig = - StructuredResponseTextConfig.builder() - .format(CompatibilityOutput::class.java) - .verbosity(ResponseTextConfig.Verbosity.HIGH) - .build() - - fun chatOutput( - completion: StructuredChatCompletion - ): Optional { - completion.validate() - completion.isValid() - return completion.choices().first().message().content() - } - - fun validateChatOutput(completion: StructuredChatCompletion): Boolean { - completion.validate() - val choice = completion.choices().first() - choice.validate() - val message = choice.message() - message.validate() - return completion.isValid() && choice.isValid() && message.isValid() - } - - fun responseOutput(response: StructuredResponse): CompatibilityOutput? = - response - .output() - .firstOrNull { it.isMessage() } - ?.asMessage() - ?.content() - ?.firstOrNull { it.isOutputText() } - ?.asOutputText() - - fun optionalResponseOutput( - content: StructuredResponseOutputMessage.Content - ): Optional = content.outputText() - - fun validateResponseOutput(response: StructuredResponse): Boolean { - response.validate() - val item = response.output().first() - item.validate() - val message = item.asMessage() - message.validate() - val content = message.content().first() - content.validate() - return response.isValid() && item.isValid() && message.isValid() && content.isValid() - } - - fun blockingChat( - service: ChatCompletionService, - params: StructuredChatCompletionCreateParams, - ): StructuredChatCompletion { - service.createStreaming(params) - return service.create(params) - } - - fun asyncChat( - service: ChatCompletionServiceAsync, - params: StructuredChatCompletionCreateParams, - ) { - service.create(params) - service.createStreaming(params) - } - - fun blockingResponse( - service: ResponseService, - params: StructuredResponseCreateParams, - ): StructuredResponse { - service.createStreaming(params) - return service.create(params) - } - - fun asyncResponse( - service: ResponseServiceAsync, - params: StructuredResponseCreateParams, - ) { - service.create(params) - service.createStreaming(params) - } -} diff --git a/openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/UnionFactoriesCompatibility.kt b/openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/UnionFactoriesCompatibility.kt deleted file mode 100644 index 9df28de99..000000000 --- a/openai-java-core/src/apiCompatibility/kotlin/com/openai/compatibility/UnionFactoriesCompatibility.kt +++ /dev/null @@ -1,82 +0,0 @@ -package com.openai.compatibility - -import com.openai.models.ChatModel -import com.openai.models.ResponsesModel -import com.openai.models.chat.completions.ChatCompletionAssistantMessageParam -import com.openai.models.chat.completions.ChatCompletionCreateParams -import com.openai.models.chat.completions.ChatCompletionDeveloperMessageParam -import com.openai.models.chat.completions.ChatCompletionFunctionCallOption -import com.openai.models.chat.completions.ChatCompletionFunctionTool -import com.openai.models.chat.completions.ChatCompletionMessageParam -import com.openai.models.chat.completions.ChatCompletionSystemMessageParam -import com.openai.models.chat.completions.ChatCompletionTool -import com.openai.models.chat.completions.ChatCompletionToolChoiceOption -import com.openai.models.chat.completions.ChatCompletionUserMessageParam -import com.openai.models.responses.FunctionTool -import com.openai.models.responses.Response -import com.openai.models.responses.ResponseCreateParams -import com.openai.models.responses.ResponseIncludable -import com.openai.models.responses.ResponseOutputItem -import com.openai.models.responses.ResponseOutputMessage -import com.openai.models.responses.ResponseOutputText -import com.openai.models.responses.ResponseReasoningItem -import com.openai.models.responses.Tool -import com.openai.models.responses.ToolChoiceFunction -import com.openai.models.responses.ToolChoiceTypes - -internal object UnionFactoriesCompatibility { - fun chatMessage(message: ChatCompletionUserMessageParam): ChatCompletionMessageParam = - ChatCompletionMessageParam.ofUser(message) - - fun assistantContent(text: String): ChatCompletionAssistantMessageParam.Content = - ChatCompletionAssistantMessageParam.Content.ofText(text) - - fun developerContent(text: String): ChatCompletionDeveloperMessageParam.Content = - ChatCompletionDeveloperMessageParam.Content.ofText(text) - - fun systemContent(text: String): ChatCompletionSystemMessageParam.Content = - ChatCompletionSystemMessageParam.Content.ofText(text) - - fun userContent(text: String): ChatCompletionUserMessageParam.Content = - ChatCompletionUserMessageParam.Content.ofText(text) - - fun functionCall( - option: ChatCompletionFunctionCallOption - ): ChatCompletionCreateParams.FunctionCall = - ChatCompletionCreateParams.FunctionCall.ofFunctionCallOption(option) - - fun chatTool(function: ChatCompletionFunctionTool): ChatCompletionTool = - ChatCompletionTool.ofFunction(function) - - fun chatToolChoice(auto: ChatCompletionToolChoiceOption.Auto): ChatCompletionToolChoiceOption = - ChatCompletionToolChoiceOption.ofAuto(auto) - - fun responsesModel(model: ChatModel): ResponsesModel = ResponsesModel.ofChat(model) - - fun responseInput(text: String): ResponseCreateParams.Input = - ResponseCreateParams.Input.ofText(text) - - fun responseIncludable(value: String): ResponseIncludable = ResponseIncludable.of(value) - - fun responseConversation(id: String): ResponseCreateParams.Conversation = - ResponseCreateParams.Conversation.ofId(id) - - fun responseToolChoice(types: ToolChoiceTypes): ResponseCreateParams.ToolChoice = - ResponseCreateParams.ToolChoice.ofTypes(types) - - fun responseTool(function: FunctionTool): Tool = Tool.ofFunction(function) - - fun codeInterpreterContainer( - auto: Tool.CodeInterpreter.Container.CodeInterpreterToolAuto - ): Tool.CodeInterpreter.Container = - Tool.CodeInterpreter.Container.ofCodeInterpreterToolAuto(auto) - - fun responseOutputContent(outputText: ResponseOutputText): ResponseOutputMessage.Content = - ResponseOutputMessage.Content.ofOutputText(outputText) - - fun responseResultToolChoice(function: ToolChoiceFunction): Response.ToolChoice = - Response.ToolChoice.ofFunction(function) - - fun responseOutputItem(reasoning: ResponseReasoningItem): ResponseOutputItem = - ResponseOutputItem.ofReasoning(reasoning) -} diff --git a/openai-java-core/src/apiCompatibility/structured-output-public-api.txt b/openai-java-core/src/apiCompatibility/structured-output-public-api.txt deleted file mode 100644 index 72b2c009a..000000000 --- a/openai-java-core/src/apiCompatibility/structured-output-public-api.txt +++ /dev/null @@ -1,640 +0,0 @@ -# Complete public JVM method surface for structured-output types whose generated tests are excluded. -# Format: # -com.openai.models.chat.completions.StructuredChatCompletion#_additionalProperties ()Ljava/util/Map; -com.openai.models.chat.completions.StructuredChatCompletion#_choices ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletion#_created ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletion#_id ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletion#_model ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletion#_moderation ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletion#_object_ ()Lcom/openai/core/JsonValue; -com.openai.models.chat.completions.StructuredChatCompletion#_serviceTier ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletion#_systemFingerprint ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletion#_usage ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletion#choices ()Ljava/util/List; -com.openai.models.chat.completions.StructuredChatCompletion#created ()J -com.openai.models.chat.completions.StructuredChatCompletion#id ()Ljava/lang/String; -com.openai.models.chat.completions.StructuredChatCompletion#isValid ()Z -com.openai.models.chat.completions.StructuredChatCompletion#model ()Ljava/lang/String; -com.openai.models.chat.completions.StructuredChatCompletion#moderation ()Ljava/util/Optional; -com.openai.models.chat.completions.StructuredChatCompletion#rawChatCompletion ()Lcom/openai/models/chat/completions/ChatCompletion; -com.openai.models.chat.completions.StructuredChatCompletion#responseType ()Ljava/lang/Class; -com.openai.models.chat.completions.StructuredChatCompletion#serviceTier ()Ljava/util/Optional; -com.openai.models.chat.completions.StructuredChatCompletion#systemFingerprint ()Ljava/util/Optional; -com.openai.models.chat.completions.StructuredChatCompletion#usage ()Ljava/util/Optional; -com.openai.models.chat.completions.StructuredChatCompletion#validate ()Lcom/openai/models/chat/completions/StructuredChatCompletion; -com.openai.models.chat.completions.StructuredChatCompletion$Choice#_additionalProperties ()Ljava/util/Map; -com.openai.models.chat.completions.StructuredChatCompletion$Choice#_finishReason ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletion$Choice#_index ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletion$Choice#_logprobs ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletion$Choice#_message ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletion$Choice#finishReason ()Lcom/openai/models/chat/completions/ChatCompletion$Choice$FinishReason; -com.openai.models.chat.completions.StructuredChatCompletion$Choice#index ()J -com.openai.models.chat.completions.StructuredChatCompletion$Choice#isValid ()Z -com.openai.models.chat.completions.StructuredChatCompletion$Choice#logprobs ()Ljava/util/Optional; -com.openai.models.chat.completions.StructuredChatCompletion$Choice#message ()Lcom/openai/models/chat/completions/StructuredChatCompletionMessage; -com.openai.models.chat.completions.StructuredChatCompletion$Choice#rawChoice ()Lcom/openai/models/chat/completions/ChatCompletion$Choice; -com.openai.models.chat.completions.StructuredChatCompletion$Choice#responseType ()Ljava/lang/Class; -com.openai.models.chat.completions.StructuredChatCompletion$Choice#validate ()Lcom/openai/models/chat/completions/StructuredChatCompletion$Choice; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams#builder ()Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams#rawParams ()Lcom/openai/models/chat/completions/ChatCompletionCreateParams; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams#responseType ()Ljava/lang/Class; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addAssistantMessage (Lcom/openai/models/chat/completions/ChatCompletionAssistantMessageParam$Content;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addAssistantMessage (Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addAssistantMessage (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addAssistantMessageOfArrayOfContentParts (Ljava/util/List;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addCustomTool (Lcom/openai/models/chat/completions/ChatCompletionCustomTool$Custom;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addDeveloperMessage (Lcom/openai/models/chat/completions/ChatCompletionDeveloperMessageParam$Content;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addDeveloperMessage (Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addDeveloperMessageOfArrayOfContentParts (Ljava/util/List;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addFunction (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$Function;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addFunctionTool (Lcom/openai/models/FunctionDefinition;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addMessage (Lcom/openai/models/chat/completions/ChatCompletionAssistantMessageParam;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addMessage (Lcom/openai/models/chat/completions/ChatCompletionDeveloperMessageParam;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addMessage (Lcom/openai/models/chat/completions/ChatCompletionFunctionMessageParam;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addMessage (Lcom/openai/models/chat/completions/ChatCompletionMessage;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addMessage (Lcom/openai/models/chat/completions/ChatCompletionMessageParam;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addMessage (Lcom/openai/models/chat/completions/ChatCompletionSystemMessageParam;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addMessage (Lcom/openai/models/chat/completions/ChatCompletionToolMessageParam;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addMessage (Lcom/openai/models/chat/completions/ChatCompletionUserMessageParam;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addModality (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$Modality;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addSystemMessage (Lcom/openai/models/chat/completions/ChatCompletionSystemMessageParam$Content;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addSystemMessage (Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addSystemMessageOfArrayOfContentParts (Ljava/util/List;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addTool (Lcom/openai/models/chat/completions/ChatCompletionCustomTool;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addTool (Lcom/openai/models/chat/completions/ChatCompletionFunctionTool;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addTool (Lcom/openai/models/chat/completions/ChatCompletionTool;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addTool (Ljava/lang/Class;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addTool (Ljava/lang/Class;Lcom/openai/core/JsonSchemaLocalValidation;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addUserMessage (Lcom/openai/models/chat/completions/ChatCompletionUserMessageParam$Content;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addUserMessage (Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#addUserMessageOfArrayOfContentParts (Ljava/util/List;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#additionalBodyProperties (Ljava/util/Map;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#additionalHeaders (Lcom/openai/core/http/Headers;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#additionalHeaders (Ljava/util/Map;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#additionalQueryParams (Lcom/openai/core/http/QueryParams;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#additionalQueryParams (Ljava/util/Map;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#audio (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#audio (Lcom/openai/models/chat/completions/ChatCompletionAudioParam;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#audio (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#body (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$Body;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#build ()Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#frequencyPenalty (D)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#frequencyPenalty (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#frequencyPenalty (Ljava/lang/Double;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#frequencyPenalty (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#functionCall (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#functionCall (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$FunctionCall$FunctionCallMode;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#functionCall (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$FunctionCall;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#functionCall (Lcom/openai/models/chat/completions/ChatCompletionFunctionCallOption;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#functions (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#functions (Ljava/util/List;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#jsonSchemaResponseFormat (Lcom/openai/models/ResponseFormatJsonSchema$JsonSchema;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#logitBias (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#logitBias (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$LogitBias;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#logitBias (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#logprobs (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#logprobs (Ljava/lang/Boolean;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#logprobs (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#logprobs (Z)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#maxCompletionTokens (J)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#maxCompletionTokens (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#maxCompletionTokens (Ljava/lang/Long;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#maxCompletionTokens (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#maxTokens (J)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#maxTokens (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#maxTokens (Ljava/lang/Long;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#maxTokens (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#messages (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#messages (Ljava/util/List;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#metadata (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#metadata (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$Metadata;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#metadata (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#modalities (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#modalities (Ljava/util/List;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#modalities (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#model (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#model (Lcom/openai/models/ChatModel;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#model (Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#moderation (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#moderation (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$Moderation;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#moderation (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#n (J)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#n (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#n (Ljava/lang/Long;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#n (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#parallelToolCalls (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#parallelToolCalls (Z)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#prediction (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#prediction (Lcom/openai/models/chat/completions/ChatCompletionPredictionContent;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#prediction (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#presencePenalty (D)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#presencePenalty (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#presencePenalty (Ljava/lang/Double;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#presencePenalty (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#promptCacheKey (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#promptCacheKey (Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#promptCacheKey (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#promptCacheOptions (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#promptCacheOptions (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$PromptCacheOptions;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#promptCacheRetention (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#promptCacheRetention (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$PromptCacheRetention;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#promptCacheRetention (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#putAdditionalBodyProperty (Ljava/lang/String;Lcom/openai/core/JsonValue;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#putAdditionalHeader (Ljava/lang/String;Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#putAdditionalHeaders (Ljava/lang/String;Ljava/lang/Iterable;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#putAdditionalQueryParam (Ljava/lang/String;Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#putAdditionalQueryParams (Ljava/lang/String;Ljava/lang/Iterable;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#putAllAdditionalBodyProperties (Ljava/util/Map;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#putAllAdditionalHeaders (Lcom/openai/core/http/Headers;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#putAllAdditionalHeaders (Ljava/util/Map;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#putAllAdditionalQueryParams (Lcom/openai/core/http/QueryParams;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#putAllAdditionalQueryParams (Ljava/util/Map;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#reasoningEffort (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#reasoningEffort (Lcom/openai/models/ReasoningEffort;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#reasoningEffort (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#removeAdditionalBodyProperty (Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#removeAdditionalHeaders (Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#removeAdditionalQueryParams (Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#removeAllAdditionalBodyProperties (Ljava/util/Set;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#removeAllAdditionalHeaders (Ljava/util/Set;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#removeAllAdditionalQueryParams (Ljava/util/Set;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#replaceAdditionalHeaders (Ljava/lang/String;Ljava/lang/Iterable;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#replaceAdditionalHeaders (Ljava/lang/String;Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#replaceAdditionalQueryParams (Ljava/lang/String;Ljava/lang/Iterable;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#replaceAdditionalQueryParams (Ljava/lang/String;Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#replaceAllAdditionalHeaders (Lcom/openai/core/http/Headers;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#replaceAllAdditionalHeaders (Ljava/util/Map;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#replaceAllAdditionalQueryParams (Lcom/openai/core/http/QueryParams;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#replaceAllAdditionalQueryParams (Ljava/util/Map;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#responseFormat (Ljava/lang/Class;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#responseFormat (Ljava/lang/Class;Lcom/openai/core/JsonSchemaLocalValidation;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#safetyIdentifier (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#safetyIdentifier (Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#safetyIdentifier (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#seed (J)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#seed (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#seed (Ljava/lang/Long;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#seed (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#serviceTier (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#serviceTier (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$ServiceTier;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#serviceTier (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#stop (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#stop (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$Stop;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#stop (Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#stop (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#stopOfStrings (Ljava/util/List;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#store (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#store (Ljava/lang/Boolean;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#store (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#store (Z)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#streamOptions (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#streamOptions (Lcom/openai/models/chat/completions/ChatCompletionStreamOptions;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#streamOptions (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#temperature (D)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#temperature (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#temperature (Ljava/lang/Double;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#temperature (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#toolChoice (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#toolChoice (Lcom/openai/models/chat/completions/ChatCompletionAllowedToolChoice;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#toolChoice (Lcom/openai/models/chat/completions/ChatCompletionNamedToolChoice;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#toolChoice (Lcom/openai/models/chat/completions/ChatCompletionNamedToolChoiceCustom;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#toolChoice (Lcom/openai/models/chat/completions/ChatCompletionToolChoiceOption$Auto;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#toolChoice (Lcom/openai/models/chat/completions/ChatCompletionToolChoiceOption;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#tools (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#tools (Ljava/util/List;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#topLogprobs (J)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#topLogprobs (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#topLogprobs (Ljava/lang/Long;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#topLogprobs (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#topP (D)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#topP (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#topP (Ljava/lang/Double;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#topP (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#user (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#user (Ljava/lang/String;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#verbosity (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#verbosity (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$Verbosity;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#verbosity (Ljava/util/Optional;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#webSearchOptions (Lcom/openai/core/JsonField;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionCreateParams$Builder#webSearchOptions (Lcom/openai/models/chat/completions/ChatCompletionCreateParams$WebSearchOptions;)Lcom/openai/models/chat/completions/StructuredChatCompletionCreateParams$Builder; -com.openai.models.chat.completions.StructuredChatCompletionMessage#_additionalProperties ()Ljava/util/Map; -com.openai.models.chat.completions.StructuredChatCompletionMessage#_annotations ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletionMessage#_audio ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletionMessage#_content ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletionMessage#_functionCall ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletionMessage#_refusal ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletionMessage#_role ()Lcom/openai/core/JsonValue; -com.openai.models.chat.completions.StructuredChatCompletionMessage#_toolCalls ()Lcom/openai/core/JsonField; -com.openai.models.chat.completions.StructuredChatCompletionMessage#annotations ()Ljava/util/Optional; -com.openai.models.chat.completions.StructuredChatCompletionMessage#audio ()Ljava/util/Optional; -com.openai.models.chat.completions.StructuredChatCompletionMessage#content ()Ljava/util/Optional; -com.openai.models.chat.completions.StructuredChatCompletionMessage#functionCall ()Ljava/util/Optional; -com.openai.models.chat.completions.StructuredChatCompletionMessage#isValid ()Z -com.openai.models.chat.completions.StructuredChatCompletionMessage#rawMessage ()Lcom/openai/models/chat/completions/ChatCompletionMessage; -com.openai.models.chat.completions.StructuredChatCompletionMessage#refusal ()Ljava/util/Optional; -com.openai.models.chat.completions.StructuredChatCompletionMessage#responseType ()Ljava/lang/Class; -com.openai.models.chat.completions.StructuredChatCompletionMessage#toolCalls ()Ljava/util/Optional; -com.openai.models.chat.completions.StructuredChatCompletionMessage#validate ()Lcom/openai/models/chat/completions/ChatCompletionMessage; -com.openai.models.responses.StructuredResponse#_additionalProperties ()Ljava/util/Map; -com.openai.models.responses.StructuredResponse#_background ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_completedAt ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_conversation ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_createdAt ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_error ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_id ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_incompleteDetails ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_instructions ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_maxOutputTokens ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_maxToolCalls ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_metadata ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_model ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_moderation ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_object_ ()Lcom/openai/core/JsonValue; -com.openai.models.responses.StructuredResponse#_output ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_parallelToolCalls ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_previousResponseId ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_prompt ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_promptCacheKey ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_promptCacheOptions ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_promptCacheRetention ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_reasoning ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_safetyIdentifier ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_serviceTier ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_status ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_temperature ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_text ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_toolChoice ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_tools ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_topLogprobs ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_topP ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_truncation ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_usage ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#_user ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponse#background ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#completedAt ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#conversation ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#createdAt ()D -com.openai.models.responses.StructuredResponse#error ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#id ()Ljava/lang/String; -com.openai.models.responses.StructuredResponse#incompleteDetails ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#instructions ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#isValid ()Z -com.openai.models.responses.StructuredResponse#maxOutputTokens ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#maxToolCalls ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#metadata ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#model ()Lcom/openai/models/ResponsesModel; -com.openai.models.responses.StructuredResponse#moderation ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#output ()Ljava/util/List; -com.openai.models.responses.StructuredResponse#parallelToolCalls ()Z -com.openai.models.responses.StructuredResponse#previousResponseId ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#prompt ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#promptCacheKey ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#promptCacheOptions ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#promptCacheRetention ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#rawResponse ()Lcom/openai/models/responses/Response; -com.openai.models.responses.StructuredResponse#reasoning ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#responseType ()Ljava/lang/Class; -com.openai.models.responses.StructuredResponse#safetyIdentifier ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#serviceTier ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#status ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#temperature ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#text ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#toolChoice ()Lcom/openai/models/responses/Response$ToolChoice; -com.openai.models.responses.StructuredResponse#tools ()Ljava/util/List; -com.openai.models.responses.StructuredResponse#topLogprobs ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#topP ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#truncation ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#usage ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#user ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponse#validate ()Lcom/openai/models/responses/StructuredResponse; -com.openai.models.responses.StructuredResponseCreateParams#builder ()Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams#rawParams ()Lcom/openai/models/responses/ResponseCreateParams; -com.openai.models.responses.StructuredResponseCreateParams#responseType ()Ljava/lang/Class; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addCodeInterpreterTool (Lcom/openai/models/responses/Tool$CodeInterpreter$Container$CodeInterpreterToolAuto;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addCodeInterpreterTool (Lcom/openai/models/responses/Tool$CodeInterpreter$Container;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addCodeInterpreterTool (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addContextManagement (Lcom/openai/models/responses/ResponseCreateParams$ContextManagement;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addCustomTool (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addFileSearchTool (Ljava/util/List;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addInclude (Lcom/openai/models/responses/ResponseIncludable;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addMcpTool (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/ApplyPatchTool;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/ComputerTool;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/ComputerUsePreviewTool;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/CustomTool;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/FileSearchTool;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/FunctionShellTool;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/FunctionTool;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/NamespaceTool;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/Tool$CodeInterpreter;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/Tool$ImageGeneration;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/Tool$Mcp;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/Tool;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/ToolSearchTool;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/WebSearchPreviewTool;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Lcom/openai/models/responses/WebSearchTool;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Ljava/lang/Class;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addTool (Ljava/lang/Class;Lcom/openai/core/JsonSchemaLocalValidation;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addToolLocalShell ()Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#addToolProgrammaticToolCalling ()Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#additionalBodyProperties (Ljava/util/Map;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#additionalHeaders (Lcom/openai/core/http/Headers;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#additionalHeaders (Ljava/util/Map;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#additionalQueryParams (Lcom/openai/core/http/QueryParams;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#additionalQueryParams (Ljava/util/Map;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#background (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#background (Ljava/lang/Boolean;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#background (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#background (Z)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#build ()Lcom/openai/models/responses/StructuredResponseCreateParams; -com.openai.models.responses.StructuredResponseCreateParams$Builder#contextManagement (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#contextManagement (Ljava/util/List;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#contextManagement (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#conversation (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#conversation (Lcom/openai/models/responses/ResponseConversationParam;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#conversation (Lcom/openai/models/responses/ResponseCreateParams$Conversation;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#conversation (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#conversation (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#include (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#include (Ljava/util/List;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#include (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#input (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#input (Lcom/openai/models/responses/ResponseCreateParams$Input;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#input (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#inputOfResponse (Ljava/util/List;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#instructions (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#instructions (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#instructions (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#maxOutputTokens (J)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#maxOutputTokens (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#maxOutputTokens (Ljava/lang/Long;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#maxOutputTokens (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#maxToolCalls (J)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#maxToolCalls (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#maxToolCalls (Ljava/lang/Long;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#maxToolCalls (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#metadata (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#metadata (Lcom/openai/models/responses/ResponseCreateParams$Metadata;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#metadata (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#model (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#model (Lcom/openai/models/ChatModel;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#model (Lcom/openai/models/ResponsesModel$ResponsesOnlyModel;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#model (Lcom/openai/models/ResponsesModel;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#model (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#moderation (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#moderation (Lcom/openai/models/responses/ResponseCreateParams$Moderation;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#moderation (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#parallelToolCalls (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#parallelToolCalls (Ljava/lang/Boolean;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#parallelToolCalls (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#parallelToolCalls (Z)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#previousResponseId (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#previousResponseId (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#previousResponseId (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#prompt (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#prompt (Lcom/openai/models/responses/ResponsePrompt;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#prompt (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#promptCacheKey (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#promptCacheKey (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#promptCacheKey (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#promptCacheOptions (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#promptCacheOptions (Lcom/openai/models/responses/ResponseCreateParams$PromptCacheOptions;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#promptCacheRetention (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#promptCacheRetention (Lcom/openai/models/responses/ResponseCreateParams$PromptCacheRetention;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#promptCacheRetention (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#putAdditionalBodyProperty (Ljava/lang/String;Lcom/openai/core/JsonValue;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#putAdditionalHeader (Ljava/lang/String;Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#putAdditionalHeaders (Ljava/lang/String;Ljava/lang/Iterable;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#putAdditionalQueryParam (Ljava/lang/String;Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#putAdditionalQueryParams (Ljava/lang/String;Ljava/lang/Iterable;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#putAllAdditionalBodyProperties (Ljava/util/Map;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#putAllAdditionalHeaders (Lcom/openai/core/http/Headers;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#putAllAdditionalHeaders (Ljava/util/Map;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#putAllAdditionalQueryParams (Lcom/openai/core/http/QueryParams;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#putAllAdditionalQueryParams (Ljava/util/Map;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#reasoning (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#reasoning (Lcom/openai/models/Reasoning;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#reasoning (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#removeAdditionalBodyProperty (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#removeAdditionalHeaders (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#removeAdditionalQueryParams (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#removeAllAdditionalBodyProperties (Ljava/util/Set;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#removeAllAdditionalHeaders (Ljava/util/Set;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#removeAllAdditionalQueryParams (Ljava/util/Set;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#replaceAdditionalHeaders (Ljava/lang/String;Ljava/lang/Iterable;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#replaceAdditionalHeaders (Ljava/lang/String;Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#replaceAdditionalQueryParams (Ljava/lang/String;Ljava/lang/Iterable;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#replaceAdditionalQueryParams (Ljava/lang/String;Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#replaceAllAdditionalHeaders (Lcom/openai/core/http/Headers;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#replaceAllAdditionalHeaders (Ljava/util/Map;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#replaceAllAdditionalQueryParams (Lcom/openai/core/http/QueryParams;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#replaceAllAdditionalQueryParams (Ljava/util/Map;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#safetyIdentifier (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#safetyIdentifier (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#safetyIdentifier (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#serviceTier (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#serviceTier (Lcom/openai/models/responses/ResponseCreateParams$ServiceTier;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#serviceTier (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#store (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#store (Ljava/lang/Boolean;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#store (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#store (Z)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#streamOptions (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#streamOptions (Lcom/openai/models/responses/ResponseCreateParams$StreamOptions;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#streamOptions (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#temperature (D)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#temperature (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#temperature (Ljava/lang/Double;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#temperature (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#text (Lcom/openai/models/responses/StructuredResponseTextConfig;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#text (Ljava/lang/Class;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#text (Ljava/lang/Class;Lcom/openai/core/JsonSchemaLocalValidation;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#toolChoice (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#toolChoice (Lcom/openai/models/responses/ResponseCreateParams$ToolChoice;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#toolChoice (Lcom/openai/models/responses/ToolChoiceAllowed;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#toolChoice (Lcom/openai/models/responses/ToolChoiceApplyPatch;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#toolChoice (Lcom/openai/models/responses/ToolChoiceCustom;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#toolChoice (Lcom/openai/models/responses/ToolChoiceFunction;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#toolChoice (Lcom/openai/models/responses/ToolChoiceMcp;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#toolChoice (Lcom/openai/models/responses/ToolChoiceOptions;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#toolChoice (Lcom/openai/models/responses/ToolChoiceShell;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#toolChoice (Lcom/openai/models/responses/ToolChoiceTypes;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#toolChoiceSpecificProgrammaticToolCallingParam ()Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#tools (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#tools (Ljava/util/List;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#topLogprobs (J)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#topLogprobs (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#topLogprobs (Ljava/lang/Long;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#topLogprobs (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#topP (D)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#topP (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#topP (Ljava/lang/Double;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#topP (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#truncation (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#truncation (Lcom/openai/models/responses/ResponseCreateParams$Truncation;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#truncation (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#user (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseCreateParams$Builder#user (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseCreateParams$Builder; -com.openai.models.responses.StructuredResponseOutputItem#_json ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#accept (Lcom/openai/models/responses/StructuredResponseOutputItem$Visitor;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem#additionalTools ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#applyPatchCall ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#applyPatchCallOutput ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#asAdditionalTools ()Lcom/openai/models/responses/ResponseOutputItem$AdditionalTools; -com.openai.models.responses.StructuredResponseOutputItem#asApplyPatchCall ()Lcom/openai/models/responses/ResponseApplyPatchToolCall; -com.openai.models.responses.StructuredResponseOutputItem#asApplyPatchCallOutput ()Lcom/openai/models/responses/ResponseApplyPatchToolCallOutput; -com.openai.models.responses.StructuredResponseOutputItem#asCodeInterpreterCall ()Lcom/openai/models/responses/ResponseCodeInterpreterToolCall; -com.openai.models.responses.StructuredResponseOutputItem#asCompaction ()Lcom/openai/models/responses/ResponseCompactionItem; -com.openai.models.responses.StructuredResponseOutputItem#asComputerCall ()Lcom/openai/models/responses/ResponseComputerToolCall; -com.openai.models.responses.StructuredResponseOutputItem#asComputerCallOutput ()Lcom/openai/models/responses/ResponseComputerToolCallOutputItem; -com.openai.models.responses.StructuredResponseOutputItem#asCustomToolCall ()Lcom/openai/models/responses/ResponseCustomToolCall; -com.openai.models.responses.StructuredResponseOutputItem#asCustomToolCallOutput ()Lcom/openai/models/responses/ResponseCustomToolCallOutputItem; -com.openai.models.responses.StructuredResponseOutputItem#asFileSearchCall ()Lcom/openai/models/responses/ResponseFileSearchToolCall; -com.openai.models.responses.StructuredResponseOutputItem#asFunctionCall ()Lcom/openai/models/responses/ResponseFunctionToolCall; -com.openai.models.responses.StructuredResponseOutputItem#asFunctionCallOutput ()Lcom/openai/models/responses/ResponseFunctionToolCallOutputItem; -com.openai.models.responses.StructuredResponseOutputItem#asImageGenerationCall ()Lcom/openai/models/responses/ResponseOutputItem$ImageGenerationCall; -com.openai.models.responses.StructuredResponseOutputItem#asLocalShellCall ()Lcom/openai/models/responses/ResponseOutputItem$LocalShellCall; -com.openai.models.responses.StructuredResponseOutputItem#asLocalShellCallOutput ()Lcom/openai/models/responses/ResponseOutputItem$LocalShellCallOutput; -com.openai.models.responses.StructuredResponseOutputItem#asMcpApprovalRequest ()Lcom/openai/models/responses/ResponseOutputItem$McpApprovalRequest; -com.openai.models.responses.StructuredResponseOutputItem#asMcpApprovalResponse ()Lcom/openai/models/responses/ResponseOutputItem$McpApprovalResponse; -com.openai.models.responses.StructuredResponseOutputItem#asMcpCall ()Lcom/openai/models/responses/ResponseOutputItem$McpCall; -com.openai.models.responses.StructuredResponseOutputItem#asMcpListTools ()Lcom/openai/models/responses/ResponseOutputItem$McpListTools; -com.openai.models.responses.StructuredResponseOutputItem#asMessage ()Lcom/openai/models/responses/StructuredResponseOutputMessage; -com.openai.models.responses.StructuredResponseOutputItem#asProgram ()Lcom/openai/models/responses/ResponseOutputItem$Program; -com.openai.models.responses.StructuredResponseOutputItem#asProgramOutput ()Lcom/openai/models/responses/ResponseOutputItem$ProgramOutput; -com.openai.models.responses.StructuredResponseOutputItem#asReasoning ()Lcom/openai/models/responses/ResponseReasoningItem; -com.openai.models.responses.StructuredResponseOutputItem#asShellCall ()Lcom/openai/models/responses/ResponseFunctionShellToolCall; -com.openai.models.responses.StructuredResponseOutputItem#asShellCallOutput ()Lcom/openai/models/responses/ResponseFunctionShellToolCallOutput; -com.openai.models.responses.StructuredResponseOutputItem#asToolSearchCall ()Lcom/openai/models/responses/ResponseToolSearchCall; -com.openai.models.responses.StructuredResponseOutputItem#asToolSearchOutput ()Lcom/openai/models/responses/ResponseToolSearchOutputItem; -com.openai.models.responses.StructuredResponseOutputItem#asWebSearchCall ()Lcom/openai/models/responses/ResponseFunctionWebSearch; -com.openai.models.responses.StructuredResponseOutputItem#codeInterpreterCall ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#compaction ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#computerCall ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#computerCallOutput ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#customToolCall ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#customToolCallOutput ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#fileSearchCall ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#functionCall ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#functionCallOutput ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#imageGenerationCall ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#isAdditionalTools ()Z -com.openai.models.responses.StructuredResponseOutputItem#isApplyPatchCall ()Z -com.openai.models.responses.StructuredResponseOutputItem#isApplyPatchCallOutput ()Z -com.openai.models.responses.StructuredResponseOutputItem#isCodeInterpreterCall ()Z -com.openai.models.responses.StructuredResponseOutputItem#isCompaction ()Z -com.openai.models.responses.StructuredResponseOutputItem#isComputerCall ()Z -com.openai.models.responses.StructuredResponseOutputItem#isComputerCallOutput ()Z -com.openai.models.responses.StructuredResponseOutputItem#isCustomToolCall ()Z -com.openai.models.responses.StructuredResponseOutputItem#isCustomToolCallOutput ()Z -com.openai.models.responses.StructuredResponseOutputItem#isFileSearchCall ()Z -com.openai.models.responses.StructuredResponseOutputItem#isFunctionCall ()Z -com.openai.models.responses.StructuredResponseOutputItem#isFunctionCallOutput ()Z -com.openai.models.responses.StructuredResponseOutputItem#isImageGenerationCall ()Z -com.openai.models.responses.StructuredResponseOutputItem#isLocalShellCall ()Z -com.openai.models.responses.StructuredResponseOutputItem#isLocalShellCallOutput ()Z -com.openai.models.responses.StructuredResponseOutputItem#isMcpApprovalRequest ()Z -com.openai.models.responses.StructuredResponseOutputItem#isMcpApprovalResponse ()Z -com.openai.models.responses.StructuredResponseOutputItem#isMcpCall ()Z -com.openai.models.responses.StructuredResponseOutputItem#isMcpListTools ()Z -com.openai.models.responses.StructuredResponseOutputItem#isMessage ()Z -com.openai.models.responses.StructuredResponseOutputItem#isProgram ()Z -com.openai.models.responses.StructuredResponseOutputItem#isProgramOutput ()Z -com.openai.models.responses.StructuredResponseOutputItem#isReasoning ()Z -com.openai.models.responses.StructuredResponseOutputItem#isShellCall ()Z -com.openai.models.responses.StructuredResponseOutputItem#isShellCallOutput ()Z -com.openai.models.responses.StructuredResponseOutputItem#isToolSearchCall ()Z -com.openai.models.responses.StructuredResponseOutputItem#isToolSearchOutput ()Z -com.openai.models.responses.StructuredResponseOutputItem#isValid ()Z -com.openai.models.responses.StructuredResponseOutputItem#isWebSearchCall ()Z -com.openai.models.responses.StructuredResponseOutputItem#localShellCall ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#localShellCallOutput ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#mcpApprovalRequest ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#mcpApprovalResponse ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#mcpCall ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#mcpListTools ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#message ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#program ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#programOutput ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#rawOutputItem ()Lcom/openai/models/responses/ResponseOutputItem; -com.openai.models.responses.StructuredResponseOutputItem#reasoning ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#responseType ()Ljava/lang/Class; -com.openai.models.responses.StructuredResponseOutputItem#shellCall ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#shellCallOutput ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#toolSearchCall ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#toolSearchOutput ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem#validate ()Lcom/openai/models/responses/StructuredResponseOutputItem; -com.openai.models.responses.StructuredResponseOutputItem#webSearchCall ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#unknown (Lcom/openai/core/JsonValue;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitAdditionalTools (Lcom/openai/models/responses/ResponseOutputItem$AdditionalTools;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitApplyPatchCall (Lcom/openai/models/responses/ResponseApplyPatchToolCall;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitApplyPatchCallOutput (Lcom/openai/models/responses/ResponseApplyPatchToolCallOutput;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitCodeInterpreterCall (Lcom/openai/models/responses/ResponseCodeInterpreterToolCall;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitCompaction (Lcom/openai/models/responses/ResponseCompactionItem;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitComputerCall (Lcom/openai/models/responses/ResponseComputerToolCall;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitComputerCallOutput (Lcom/openai/models/responses/ResponseComputerToolCallOutputItem;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitCustomToolCall (Lcom/openai/models/responses/ResponseCustomToolCall;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitCustomToolCallOutput (Lcom/openai/models/responses/ResponseCustomToolCallOutputItem;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitFileSearchCall (Lcom/openai/models/responses/ResponseFileSearchToolCall;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitFunctionCall (Lcom/openai/models/responses/ResponseFunctionToolCall;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitFunctionCallOutput (Lcom/openai/models/responses/ResponseFunctionToolCallOutputItem;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitImageGenerationCall (Lcom/openai/models/responses/ResponseOutputItem$ImageGenerationCall;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitLocalShellCall (Lcom/openai/models/responses/ResponseOutputItem$LocalShellCall;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitLocalShellCallOutput (Lcom/openai/models/responses/ResponseOutputItem$LocalShellCallOutput;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitMcpApprovalRequest (Lcom/openai/models/responses/ResponseOutputItem$McpApprovalRequest;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitMcpApprovalResponse (Lcom/openai/models/responses/ResponseOutputItem$McpApprovalResponse;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitMcpCall (Lcom/openai/models/responses/ResponseOutputItem$McpCall;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitMcpListTools (Lcom/openai/models/responses/ResponseOutputItem$McpListTools;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitMessage (Lcom/openai/models/responses/StructuredResponseOutputMessage;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitProgram (Lcom/openai/models/responses/ResponseOutputItem$Program;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitProgramOutput (Lcom/openai/models/responses/ResponseOutputItem$ProgramOutput;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitReasoning (Lcom/openai/models/responses/ResponseReasoningItem;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitShellCall (Lcom/openai/models/responses/ResponseFunctionShellToolCall;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitShellCallOutput (Lcom/openai/models/responses/ResponseFunctionShellToolCallOutput;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitToolSearchCall (Lcom/openai/models/responses/ResponseToolSearchCall;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitToolSearchOutput (Lcom/openai/models/responses/ResponseToolSearchOutputItem;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputItem$Visitor#visitWebSearchCall (Lcom/openai/models/responses/ResponseFunctionWebSearch;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputMessage#_additionalProperties ()Ljava/util/Map; -com.openai.models.responses.StructuredResponseOutputMessage#_content ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponseOutputMessage#_id ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponseOutputMessage#_phase ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponseOutputMessage#_role ()Lcom/openai/core/JsonValue; -com.openai.models.responses.StructuredResponseOutputMessage#_status ()Lcom/openai/core/JsonField; -com.openai.models.responses.StructuredResponseOutputMessage#_type ()Lcom/openai/core/JsonValue; -com.openai.models.responses.StructuredResponseOutputMessage#content ()Ljava/util/List; -com.openai.models.responses.StructuredResponseOutputMessage#id ()Ljava/lang/String; -com.openai.models.responses.StructuredResponseOutputMessage#isValid ()Z -com.openai.models.responses.StructuredResponseOutputMessage#phase ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputMessage#rawMessage ()Lcom/openai/models/responses/ResponseOutputMessage; -com.openai.models.responses.StructuredResponseOutputMessage#responseType ()Ljava/lang/Class; -com.openai.models.responses.StructuredResponseOutputMessage#status ()Lcom/openai/models/responses/ResponseOutputMessage$Status; -com.openai.models.responses.StructuredResponseOutputMessage#validate ()Lcom/openai/models/responses/StructuredResponseOutputMessage; -com.openai.models.responses.StructuredResponseOutputMessage$Content#_json ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputMessage$Content#accept (Lcom/openai/models/responses/StructuredResponseOutputMessage$Content$Visitor;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputMessage$Content#asOutputText ()Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputMessage$Content#asRefusal ()Lcom/openai/models/responses/ResponseOutputRefusal; -com.openai.models.responses.StructuredResponseOutputMessage$Content#isOutputText ()Z -com.openai.models.responses.StructuredResponseOutputMessage$Content#isRefusal ()Z -com.openai.models.responses.StructuredResponseOutputMessage$Content#isValid ()Z -com.openai.models.responses.StructuredResponseOutputMessage$Content#outputText ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputMessage$Content#rawContent ()Lcom/openai/models/responses/ResponseOutputMessage$Content; -com.openai.models.responses.StructuredResponseOutputMessage$Content#refusal ()Ljava/util/Optional; -com.openai.models.responses.StructuredResponseOutputMessage$Content#responseType ()Ljava/lang/Class; -com.openai.models.responses.StructuredResponseOutputMessage$Content#validate ()Lcom/openai/models/responses/StructuredResponseOutputMessage$Content; -com.openai.models.responses.StructuredResponseOutputMessage$Content$Visitor#unknown (Lcom/openai/core/JsonValue;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputMessage$Content$Visitor#visitOutputText (Ljava/lang/Object;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseOutputMessage$Content$Visitor#visitRefusal (Lcom/openai/models/responses/ResponseOutputRefusal;)Ljava/lang/Object; -com.openai.models.responses.StructuredResponseTextConfig#builder ()Lcom/openai/models/responses/StructuredResponseTextConfig$Builder; -com.openai.models.responses.StructuredResponseTextConfig#rawConfig ()Lcom/openai/models/responses/ResponseTextConfig; -com.openai.models.responses.StructuredResponseTextConfig#responseType ()Ljava/lang/Class; -com.openai.models.responses.StructuredResponseTextConfig$Builder#additionalProperties (Ljava/util/Map;)Lcom/openai/models/responses/StructuredResponseTextConfig$Builder; -com.openai.models.responses.StructuredResponseTextConfig$Builder#build ()Lcom/openai/models/responses/StructuredResponseTextConfig; -com.openai.models.responses.StructuredResponseTextConfig$Builder#format (Ljava/lang/Class;)Lcom/openai/models/responses/StructuredResponseTextConfig$Builder; -com.openai.models.responses.StructuredResponseTextConfig$Builder#format (Ljava/lang/Class;Lcom/openai/core/JsonSchemaLocalValidation;)Lcom/openai/models/responses/StructuredResponseTextConfig$Builder; -com.openai.models.responses.StructuredResponseTextConfig$Builder#putAdditionalProperty (Ljava/lang/String;Lcom/openai/core/JsonValue;)Lcom/openai/models/responses/StructuredResponseTextConfig$Builder; -com.openai.models.responses.StructuredResponseTextConfig$Builder#putAllAdditionalProperties (Ljava/util/Map;)Lcom/openai/models/responses/StructuredResponseTextConfig$Builder; -com.openai.models.responses.StructuredResponseTextConfig$Builder#removeAdditionalProperty (Ljava/lang/String;)Lcom/openai/models/responses/StructuredResponseTextConfig$Builder; -com.openai.models.responses.StructuredResponseTextConfig$Builder#removeAllAdditionalProperties (Ljava/util/Set;)Lcom/openai/models/responses/StructuredResponseTextConfig$Builder; -com.openai.models.responses.StructuredResponseTextConfig$Builder#verbosity (Lcom/openai/core/JsonField;)Lcom/openai/models/responses/StructuredResponseTextConfig$Builder; -com.openai.models.responses.StructuredResponseTextConfig$Builder#verbosity (Lcom/openai/models/responses/ResponseTextConfig$Verbosity;)Lcom/openai/models/responses/StructuredResponseTextConfig$Builder; -com.openai.models.responses.StructuredResponseTextConfig$Builder#verbosity (Ljava/util/Optional;)Lcom/openai/models/responses/StructuredResponseTextConfig$Builder; diff --git a/openai-java-core/src/main/kotlin/com/openai/auth/AzureManagedIdentityTokenProvider.kt b/openai-java-core/src/main/kotlin/com/openai/auth/AzureManagedIdentityTokenProvider.kt deleted file mode 100644 index 88f785657..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/auth/AzureManagedIdentityTokenProvider.kt +++ /dev/null @@ -1,144 +0,0 @@ -package com.openai.auth - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.http.HttpClient -import com.openai.core.http.HttpMethod -import com.openai.core.http.HttpRequest -import com.openai.errors.SubjectTokenProviderException -import java.util.concurrent.CompletableFuture -import java.util.concurrent.CompletionException - -private const val DEFAULT_AUDIENCE = "https://management.azure.com/" -private const val DEFAULT_AZURE_API_VERSION = "2018-02-01" -private const val AZURE_IMDS_BASE_URL = "http://169.254.169.254/metadata/identity/oauth2/token" - -/** - * A [SubjectTokenProvider] that fetches an identity token from the Azure Instance Metadata Service - * (IMDS). - * - * It calls the local IMDS endpoint and returns the `access_token` from the response. - */ -class AzureManagedIdentityTokenProvider -private constructor(private val resource: String, private val apiVersion: String) : - SubjectTokenProvider { - - override fun tokenType(): SubjectTokenType = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String { - val request = - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl(AZURE_IMDS_BASE_URL) - .putHeader("Metadata", "true") - .putQueryParam("api-version", apiVersion) - .putQueryParam("resource", resource) - .build() - - return try { - val response = httpClient.execute(request) - response.use { - if (response.statusCode() != 200) { - throw SubjectTokenProviderException( - provider = "azure-imds", - message = "IMDS returned status ${response.statusCode()}", - ) - } - - val result = - jsonMapper.readValue(response.body(), jacksonTypeRef()) - - if (result.accessToken.isEmpty()) { - throw SubjectTokenProviderException( - provider = "azure-imds", - message = "IMDS response missing 'access_token' field", - ) - } - - result.accessToken - } - } catch (e: SubjectTokenProviderException) { - throw e - } catch (e: Exception) { - throw SubjectTokenProviderException( - provider = "azure-imds", - message = "failed to fetch token from IMDS", - cause = e, - ) - } - } - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture { - val request = - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl(AZURE_IMDS_BASE_URL) - .putHeader("Metadata", "true") - .putQueryParam("api-version", apiVersion) - .putQueryParam("resource", resource) - .build() - - return httpClient - .executeAsync(request) - .thenApply { response -> - response.use { - if (response.statusCode() != 200) { - throw SubjectTokenProviderException( - provider = "azure-imds", - message = "IMDS returned status ${response.statusCode()}", - ) - } - - val result = - jsonMapper.readValue(response.body(), jacksonTypeRef()) - - if (result.accessToken.isEmpty()) { - throw SubjectTokenProviderException( - provider = "azure-imds", - message = "IMDS response missing 'access_token' field", - ) - } - - result.accessToken - } - } - .exceptionally { e -> - val cause = if (e is CompletionException) e.cause ?: e else e - if (cause is SubjectTokenProviderException) throw cause - throw SubjectTokenProviderException( - provider = "azure-imds", - message = "failed to fetch token from IMDS", - cause = cause, - ) - } - } - - @JsonIgnoreProperties(ignoreUnknown = true) - private data class AzureIMDSResponse(@JsonProperty("access_token") val accessToken: String) - - companion object { - @JvmStatic fun builder() = Builder() - } - - class Builder internal constructor() { - - private var resource: String = DEFAULT_AUDIENCE - private var apiVersion: String = DEFAULT_AZURE_API_VERSION - - /** - * The Azure resource URI to request a token for (default: `https://management.azure.com/`). - */ - fun resource(resource: String) = apply { this.resource = resource } - - /** The IMDS API version to use (default: `2018-02-01`). */ - fun apiVersion(apiVersion: String) = apply { this.apiVersion = apiVersion } - - fun build(): AzureManagedIdentityTokenProvider = - AzureManagedIdentityTokenProvider(resource, apiVersion) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/auth/GcpIdTokenProvider.kt b/openai-java-core/src/main/kotlin/com/openai/auth/GcpIdTokenProvider.kt deleted file mode 100644 index 4e71de3b2..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/auth/GcpIdTokenProvider.kt +++ /dev/null @@ -1,133 +0,0 @@ -package com.openai.auth - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.openai.core.http.HttpClient -import com.openai.core.http.HttpMethod -import com.openai.core.http.HttpRequest -import com.openai.errors.SubjectTokenProviderException -import java.util.concurrent.CompletableFuture -import java.util.concurrent.CompletionException - -private const val DEFAULT_AUDIENCE_GCP = "https://api.openai.com/v1" -private const val GCP_METADATA_BASE_URL = - "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts" - -/** - * A [SubjectTokenProvider] that fetches an OIDC identity token from the GCP Instance Metadata - * server. - * - * It calls the local metadata server and returns the raw JWT identity token. - */ -class GcpIdTokenProvider private constructor(private val audience: String) : SubjectTokenProvider { - - override fun tokenType(): SubjectTokenType = SubjectTokenType.ID - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String { - val request = - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl(GCP_METADATA_BASE_URL) - .addPathSegment("default") - .addPathSegment("identity") - .putHeader("Metadata-Flavor", "Google") - .putQueryParam("audience", audience) - .putQueryParam("format", "full") - .build() - - return try { - val response = httpClient.execute(request) - response.use { - if (response.statusCode() != 200) { - throw SubjectTokenProviderException( - provider = "gcp-metadata", - message = "metadata server returned status ${response.statusCode()}", - ) - } - - val token = response.body().bufferedReader().readText().trim() - - if (token.isEmpty()) { - throw SubjectTokenProviderException( - provider = "gcp-metadata", - message = "metadata server returned empty token", - ) - } - - token - } - } catch (e: SubjectTokenProviderException) { - throw e - } catch (e: Exception) { - throw SubjectTokenProviderException( - provider = "gcp-metadata", - message = "failed to fetch token from metadata server", - cause = e, - ) - } - } - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture { - val request = - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl(GCP_METADATA_BASE_URL) - .addPathSegment("default") - .addPathSegment("identity") - .putHeader("Metadata-Flavor", "Google") - .putQueryParam("audience", audience) - .putQueryParam("format", "full") - .build() - - return httpClient - .executeAsync(request) - .thenApply { response -> - response.use { - if (response.statusCode() != 200) { - throw SubjectTokenProviderException( - provider = "gcp-metadata", - message = "metadata server returned status ${response.statusCode()}", - ) - } - - val token = response.body().bufferedReader().readText().trim() - - if (token.isEmpty()) { - throw SubjectTokenProviderException( - provider = "gcp-metadata", - message = "metadata server returned empty token", - ) - } - - token - } - } - .exceptionally { e -> - val cause = if (e is CompletionException) e.cause ?: e else e - if (cause is SubjectTokenProviderException) throw cause - throw SubjectTokenProviderException( - provider = "gcp-metadata", - message = "failed to fetch token from metadata server", - cause = cause, - ) - } - } - - companion object { - @JvmStatic fun builder() = Builder() - } - - class Builder internal constructor() { - - private var audience: String = DEFAULT_AUDIENCE_GCP - - /** - * The audience URI to include in the identity token (default: `https://api.openai.com/v1`). - */ - fun audience(audience: String) = apply { this.audience = audience } - - fun build(): GcpIdTokenProvider = GcpIdTokenProvider(audience) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/auth/K8sServiceAccountTokenProvider.kt b/openai-java-core/src/main/kotlin/com/openai/auth/K8sServiceAccountTokenProvider.kt deleted file mode 100644 index e8541e218..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/auth/K8sServiceAccountTokenProvider.kt +++ /dev/null @@ -1,87 +0,0 @@ -package com.openai.auth - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.openai.core.http.HttpClient -import com.openai.errors.SubjectTokenProviderException -import java.nio.file.Files -import java.nio.file.Path -import java.nio.file.Paths -import java.util.concurrent.CompletableFuture -import java.util.concurrent.Executors -import java.util.concurrent.ThreadFactory -import java.util.concurrent.atomic.AtomicLong - -private const val DEFAULT_K8S_TOKEN_PATH = "/var/run/secrets/kubernetes.io/serviceaccount/token" - -/** - * A [SubjectTokenProvider] that reads a Kubernetes service account JWT from the filesystem. - * - * By default, reads the token from `/var/run/secrets/kubernetes.io/serviceaccount/token`, which is - * the default path Kubernetes mounts service account tokens to. A custom path can be provided via - * the builder. - */ -class K8sServiceAccountTokenProvider -private constructor(private val tokenPath: String = DEFAULT_K8S_TOKEN_PATH) : - SubjectTokenProvider, AutoCloseable { - - private val executor = - Executors.newSingleThreadExecutor( - object : ThreadFactory { - - private val threadFactory: ThreadFactory = Executors.defaultThreadFactory() - private val count = AtomicLong(0) - - override fun newThread(runnable: Runnable): Thread = - threadFactory.newThread(runnable).also { - it.name = "openai-k8s-token-reader-${count.getAndIncrement()}" - } - } - ) - - override fun tokenType(): SubjectTokenType = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String { - val token = - try { - String(Files.readAllBytes(Paths.get(tokenPath))).trim() - } catch (e: Exception) { - throw SubjectTokenProviderException( - provider = "kubernetes", - message = "failed to read service account token from $tokenPath", - cause = e, - ) - } - if (token.isEmpty()) { - throw SubjectTokenProviderException( - provider = "kubernetes", - message = "service account token is empty", - ) - } - return token - } - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = - CompletableFuture.supplyAsync({ getToken(httpClient, jsonMapper) }, executor) - - override fun close() { - executor.shutdown() - } - - companion object { - @JvmStatic fun builder() = Builder() - } - - class Builder internal constructor() { - - private var tokenPath: String = DEFAULT_K8S_TOKEN_PATH - - fun tokenPath(tokenPath: Path) = apply { this.tokenPath = tokenPath.toString() } - - fun tokenPath(tokenPath: String) = apply { this.tokenPath = tokenPath } - - fun build(): K8sServiceAccountTokenProvider = K8sServiceAccountTokenProvider(tokenPath) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/auth/SubjectTokenProvider.kt b/openai-java-core/src/main/kotlin/com/openai/auth/SubjectTokenProvider.kt deleted file mode 100644 index abf328ccf..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/auth/SubjectTokenProvider.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.openai.auth - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.openai.core.http.HttpClient -import java.util.concurrent.CompletableFuture - -enum class SubjectTokenType { - JWT, - ID, -} - -/** - * Provides a subject token for use in workload identity federation. - * - * Implementations are responsible for obtaining a short-lived credential from the local environment - * (e.g. a cloud metadata server or a mounted Kubernetes secret) and returning it as a plain string. - */ -interface SubjectTokenProvider { - /** Returns the format of the token produced by [getToken] and [getTokenAsync]. */ - fun tokenType(): SubjectTokenType - - /** - * Synchronously fetches a subject token. - * - * @param httpClient the HTTP client to use for any network requests - * @param jsonMapper the JSON mapper to use for deserializing responses - * @return the raw token string - */ - fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String - - /** - * Asynchronously fetches a subject token. - * - * @param httpClient the HTTP client to use for any network requests - * @param jsonMapper the JSON mapper to use for deserializing responses - * @return a [CompletableFuture] that completes with the raw token string - */ - fun getTokenAsync(httpClient: HttpClient, jsonMapper: JsonMapper): CompletableFuture -} diff --git a/openai-java-core/src/main/kotlin/com/openai/auth/TokenExchangeResponse.kt b/openai-java-core/src/main/kotlin/com/openai/auth/TokenExchangeResponse.kt deleted file mode 100644 index b791dd046..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/auth/TokenExchangeResponse.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.openai.auth - -import com.fasterxml.jackson.annotation.JsonProperty - -internal data class TokenExchangeResponse( - @JsonProperty("access_token") val accessToken: String, - @JsonProperty("issued_token_type") val issuedTokenType: String, - @JsonProperty("token_type") val tokenType: String, - @JsonProperty("expires_in") val expiresIn: Int?, -) diff --git a/openai-java-core/src/main/kotlin/com/openai/auth/WorkloadIdentity.kt b/openai-java-core/src/main/kotlin/com/openai/auth/WorkloadIdentity.kt deleted file mode 100644 index cd0108e41..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/auth/WorkloadIdentity.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.openai.auth - -import com.openai.core.checkRequired - -/** Configuration for workload identity federation. */ -class WorkloadIdentity -private constructor( - /** A unique string that identifies the client. */ - @get:JvmName("clientId") val clientId: String?, - /** Identity provider resource id in WIFAPI. */ - @get:JvmName("identityProviderId") val identityProviderId: String, - /** Service account id to bind the verified external identity to. */ - @get:JvmName("serviceAccountId") val serviceAccountId: String, - /** The provider configuration for obtaining the subject token. */ - @get:JvmName("provider") val provider: SubjectTokenProvider, - /** - * Buffer time in seconds to refresh the OpenAI token before it expires. Defaults to 1200 - * seconds (20 minutes). - */ - @get:JvmName("refreshBufferSeconds") val refreshBufferSeconds: Int, -) { - - companion object { - @JvmStatic fun builder() = Builder() - } - - class Builder internal constructor() { - - private var clientId: String? = null - private var identityProviderId: String? = null - private var serviceAccountId: String? = null - private var provider: SubjectTokenProvider? = null - private var refreshBufferSeconds: Int = 1200 - - /** A unique string that identifies the client. */ - fun clientId(clientId: String) = apply { this.clientId = clientId } - - /** Identity provider resource id in WIFAPI. */ - fun identityProviderId(identityProviderId: String) = apply { - this.identityProviderId = identityProviderId - } - - /** Service account id to bind the verified external identity to. */ - fun serviceAccountId(serviceAccountId: String) = apply { - this.serviceAccountId = serviceAccountId - } - - /** The provider configuration for obtaining the subject token. */ - fun provider(provider: SubjectTokenProvider) = apply { this.provider = provider } - - /** - * Buffer time in seconds to refresh the OpenAI token before it expires. Defaults to 1200 - * seconds (20 minutes). - */ - fun refreshBufferSeconds(refreshBufferSeconds: Int) = apply { - this.refreshBufferSeconds = refreshBufferSeconds - } - - fun build(): WorkloadIdentity = - WorkloadIdentity( - clientId, - checkRequired("identityProviderId", identityProviderId), - checkRequired("serviceAccountId", serviceAccountId), - checkRequired("provider", provider), - refreshBufferSeconds, - ) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/auth/WorkloadIdentityAuth.kt b/openai-java-core/src/main/kotlin/com/openai/auth/WorkloadIdentityAuth.kt deleted file mode 100644 index 51d97e950..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/auth/WorkloadIdentityAuth.kt +++ /dev/null @@ -1,319 +0,0 @@ -package com.openai.auth - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.handlers.errorHandler -import com.openai.core.http.HttpClient -import com.openai.core.http.HttpMethod -import com.openai.core.http.HttpRequest -import com.openai.core.http.HttpRequestBody -import com.openai.core.http.HttpResponse -import com.openai.errors.OpenAIInvalidDataException -import com.openai.models.ErrorObject -import java.io.OutputStream -import java.time.Instant -import java.util.concurrent.CompletableFuture -import java.util.concurrent.CompletionException -import java.util.concurrent.ExecutionException -import java.util.concurrent.locks.ReentrantLock -import kotlin.concurrent.withLock - -private const val TOKEN_EXCHANGE_GRANT_TYPE = "urn:ietf:params:oauth:grant-type:token-exchange" -private const val JWT_TOKEN_TYPE = "urn:ietf:params:oauth:token-type:jwt" -private const val ID_TOKEN_TYPE = "urn:ietf:params:oauth:token-type:id_token" -private const val DEFAULT_TOKEN_EXPIRY_SECONDS = 3600 -private const val TOKEN_EXCHANGE_URL = "https://auth.openai.com/oauth/token" - -internal class WorkloadIdentityAuth( - private val config: WorkloadIdentity, - private val httpClient: HttpClient, - private val jsonMapper: JsonMapper, -) : AutoCloseable { - private val errorHandler = - errorHandler( - object : HttpResponse.Handler> { - override fun handle(response: HttpResponse): JsonField { - val node = - try { - jsonMapper.readTree(response.body()) - } catch (e: Exception) { - return JsonMissing.of() - } - - return try { - val errorCode = node.get("error")?.asText() - val errorMessage = node.get("error_description")?.asText() ?: errorCode - JsonField.of( - jsonMapper.treeToValue( - jsonMapper.createObjectNode().apply { - errorCode?.let { put("code", it) } - errorMessage?.let { put("message", it) } - }, - ErrorObject::class.java, - ) - ) - } catch (e: Exception) { - JsonValue.fromJsonNode(node) - } - } - } - ) - private val lock = ReentrantLock() - private val condition = lock.newCondition() - private var cachedToken: String? = null - private var tokenExpiry: Instant? = null - private var refreshInFlight: CompletableFuture? = null - private var refreshing: Boolean = false - - private sealed interface TokenRefreshResult { - data class Success(val token: String) : TokenRefreshResult - - data class Failure(val error: Throwable) : TokenRefreshResult - } - - private sealed interface TokenAction { - data class ReturnCached(val token: String) : TokenAction - - data class BackgroundRefresh( - val future: CompletableFuture, - val token: String, - ) : TokenAction - - data class ForegroundRefresh(val future: CompletableFuture) : - TokenAction - - data class WaitForRefresh(val future: CompletableFuture) : TokenAction - } - - private fun unwrapCompletionException(error: Throwable?): Throwable? = - when (error) { - is CompletionException -> error.cause ?: error - is ExecutionException -> error.cause ?: error - else -> error - } - - fun getToken(): String { - lock.withLock { - while (refreshing && unexpiredCachedTokenUnsafe() == null) { - condition.await() - } - - val token = unexpiredCachedTokenUnsafe() - if (token != null && !isExpiringSoonUnsafe()) { - return token - } - - if (refreshing) { - while (refreshing) { - condition.await() - } - return unexpiredCachedTokenUnsafe() - ?: throw IllegalStateException("Token is unusable after refresh completed") - } - - refreshing = true - } - - try { - performRefresh() - lock.withLock { - return unexpiredCachedTokenUnsafe() - ?: throw IllegalStateException("Token is unusable after refresh completed") - } - } finally { - lock.withLock { - refreshing = false - condition.signalAll() - } - } - } - - fun getTokenAsync(): CompletableFuture { - val action = - lock.withLock { - val token = unexpiredCachedTokenUnsafe() - if (token != null) { - if (isExpiringSoonUnsafe() && refreshInFlight == null) { - val future = CompletableFuture() - refreshInFlight = future - TokenAction.BackgroundRefresh(future, token) - } else { - TokenAction.ReturnCached(token) - } - } else if (refreshInFlight != null) { - TokenAction.WaitForRefresh(refreshInFlight!!) - } else { - val future = CompletableFuture() - refreshInFlight = future - TokenAction.ForegroundRefresh(future) - } - } - - return when (action) { - is TokenAction.ReturnCached -> CompletableFuture.completedFuture(action.token) - is TokenAction.BackgroundRefresh -> { - performRefreshAndComplete(action.future) - CompletableFuture.completedFuture(action.token) - } - is TokenAction.WaitForRefresh -> - action.future.thenApply { result -> - when (result) { - is TokenRefreshResult.Success -> result.token - is TokenRefreshResult.Failure -> throw result.error - } - } - is TokenAction.ForegroundRefresh -> { - val refresh = refreshTokenAsync() - refresh.whenComplete { token, error -> - finishRefresh(action.future, token, unwrapCompletionException(error)) - } - refresh - } - } - } - - private fun performRefreshAndComplete(future: CompletableFuture) { - refreshTokenAsync().whenComplete { token, error -> - finishRefresh(future, token, unwrapCompletionException(error)) - } - } - - private fun finishRefresh( - future: CompletableFuture, - token: String?, - error: Throwable?, - ) { - val shouldComplete = - lock.withLock { - if (refreshInFlight != future) { - false - } else { - refreshInFlight = null - true - } - } - - if (shouldComplete) { - future.complete( - when { - error != null -> TokenRefreshResult.Failure(error) - token != null -> TokenRefreshResult.Success(token) - else -> error("finishRefresh requires either a token or an error") - } - ) - } - } - - fun invalidateToken() { - lock.withLock { - cachedToken = null - tokenExpiry = null - } - } - - private fun unexpiredCachedTokenUnsafe(): String? { - val token = cachedToken - val expiry = tokenExpiry - if (token == null || expiry == null) return null - return if (Instant.now().isAfter(expiry)) null else token - } - - private fun isExpiringSoonUnsafe(): Boolean { - val expiry = tokenExpiry ?: return true - val refreshBuffer = config.refreshBufferSeconds - val refreshTime = expiry.minusSeconds(refreshBuffer.toLong()) - return Instant.now().isAfter(refreshTime) - } - - private fun performRefresh() { - val subjectToken = config.provider.getToken(httpClient, jsonMapper) - val request = buildTokenExchangeRequest(subjectToken) - val response = httpClient.execute(request) - response.use { processTokenExchangeResponse(it) } - } - - private fun refreshTokenAsync(): CompletableFuture { - return config.provider.getTokenAsync(httpClient, jsonMapper).thenCompose { subjectToken -> - val request = buildTokenExchangeRequest(subjectToken) - httpClient.executeAsync(request).thenApply { response -> - response.use { processTokenExchangeResponse(it) } - } - } - } - - private fun buildTokenExchangeRequest(subjectToken: String): HttpRequest { - val subjectTokenTypeURN = - when (config.provider.tokenType()) { - SubjectTokenType.JWT -> JWT_TOKEN_TYPE - SubjectTokenType.ID -> ID_TOKEN_TYPE - } - - val requestBody = mutableMapOf("grant_type" to TOKEN_EXCHANGE_GRANT_TYPE) - config.clientId?.let { requestBody["client_id"] = it } - requestBody["subject_token"] = subjectToken - requestBody["subject_token_type"] = subjectTokenTypeURN - requestBody["identity_provider_id"] = config.identityProviderId - requestBody["service_account_id"] = config.serviceAccountId - - val jsonBody = jsonMapper.writeValueAsBytes(requestBody) - - val body = - object : HttpRequestBody { - override fun writeTo(outputStream: OutputStream) { - outputStream.write(jsonBody) - } - - override fun contentType(): String = "application/json" - - override fun contentLength(): Long = jsonBody.size.toLong() - - override fun repeatable(): Boolean = true - - override fun close() {} - } - - return HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(TOKEN_EXCHANGE_URL) - .body(body) - .build() - } - - private fun processTokenExchangeResponse(response: HttpResponse): String { - errorHandler.handle(response) - - val bodyString = response.body().bufferedReader().readText() - val tokenResponse = - jsonMapper.readValue(bodyString, jacksonTypeRef()) - - if (tokenResponse.accessToken.isBlank()) { - throw OpenAIInvalidDataException( - "Token exchange response missing 'access_token' field. Response: $bodyString" - ) - } - - val expiresIn = tokenResponse.expiresIn ?: DEFAULT_TOKEN_EXPIRY_SECONDS - - if (expiresIn <= 0) { - throw OpenAIInvalidDataException( - "Token exchange returned invalid expires_in value: $expiresIn" - ) - } - - val newExpiry = Instant.now().plusSeconds(expiresIn.toLong()) - - lock.withLock { - cachedToken = tokenResponse.accessToken - tokenExpiry = newExpiry - } - - return tokenResponse.accessToken - } - - override fun close() { - (config.provider as? AutoCloseable)?.close() - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/azure/AzureOpenAIServiceVersion.kt b/openai-java-core/src/main/kotlin/com/openai/azure/AzureOpenAIServiceVersion.kt deleted file mode 100644 index 3b08766f7..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/azure/AzureOpenAIServiceVersion.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.openai.azure - -import java.util.concurrent.ConcurrentHashMap - -class AzureOpenAIServiceVersion private constructor(@get:JvmName("value") val value: String) { - - companion object { - private val values: ConcurrentHashMap = - ConcurrentHashMap() - - @JvmStatic - fun latestStableVersion(): AzureOpenAIServiceVersion { - // We can update the value every general available(GA)/stable announcement. - return V2024_10_21 - } - - @JvmStatic - fun latestPreviewVersion(): AzureOpenAIServiceVersion { - // We can update the value every preview announcement. - return V2025_03_01_PREVIEW - } - - @JvmStatic - fun fromString(version: String): AzureOpenAIServiceVersion = - values.computeIfAbsent(version) { AzureOpenAIServiceVersion(version) } - - @JvmStatic val V2022_12_01 = fromString("2022-12-01") - @JvmStatic val V2023_05_15 = fromString("2023-05-15") - @JvmStatic val V2024_02_01 = fromString("2024-02-01") - @JvmStatic val V2024_06_01 = fromString("2024-06-01") - @JvmStatic val V2024_10_21 = fromString("2024-10-21") - @JvmStatic val V2023_06_01_PREVIEW = fromString("2023-06-01-preview") - @JvmStatic val V2023_07_01_PREVIEW = fromString("2023-07-01-preview") - @JvmStatic val V2024_02_15_PREVIEW = fromString("2024-02-15-preview") - @JvmStatic val V2024_03_01_PREVIEW = fromString("2024-03-01-preview") - @JvmStatic val V2024_04_01_PREVIEW = fromString("2024-04-01-preview") - @JvmStatic val V2024_05_01_PREVIEW = fromString("2024-05-01-preview") - @JvmStatic val V2024_07_01_PREVIEW = fromString("2024-07-01-preview") - @JvmStatic val V2024_08_01_PREVIEW = fromString("2024-08-01-preview") - @JvmStatic val V2024_09_01_PREVIEW = fromString("2024-09-01-preview") - @JvmStatic val V2024_10_01_PREVIEW = fromString("2024-10-01-preview") - @JvmStatic val V2024_12_01_PREVIEW = fromString("2024-12-01-preview") - @JvmStatic val V2025_01_01_PREVIEW = fromString("2025-01-01-preview") - @JvmStatic val V2025_02_01_PREVIEW = fromString("2025-02-01-preview") - @JvmStatic val V2025_03_01_PREVIEW = fromString("2025-03-01-preview") - } - - override fun equals(other: Any?): Boolean = - this === other || (other is AzureOpenAIServiceVersion && value == other.value) - - override fun hashCode(): Int = value.hashCode() - - override fun toString(): String = "AzureOpenAIServiceVersion{value=$value}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/azure/AzureUrlCategory.kt b/openai-java-core/src/main/kotlin/com/openai/azure/AzureUrlCategory.kt deleted file mode 100644 index e75b0936f..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/azure/AzureUrlCategory.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.openai.azure - -import java.net.URI - -/** Represents the category of an Azure URL. */ -internal enum class AzureUrlCategory { - /** Azure host _not_ ending with `/openai/v1`. */ - AZURE_LEGACY, - /** Azure host ending with `/openai/v1`. */ - AZURE_UNIFIED, - /** Anything else. */ - NON_AZURE; - - fun isAzure(): Boolean = - when (this) { - AZURE_LEGACY, - AZURE_UNIFIED -> true - NON_AZURE -> false - } - - companion object { - - fun categorizeBaseUrl(baseUrl: String, pathMode: AzureUrlPathMode): AzureUrlCategory { - val trimmedBaseUrl = baseUrl.trim().trimEnd('/') - val host = URI.create(trimmedBaseUrl).host - - return when (pathMode) { - AzureUrlPathMode.LEGACY -> AZURE_LEGACY - AzureUrlPathMode.UNIFIED -> AZURE_UNIFIED - AzureUrlPathMode.AUTO -> - when { - host.endsWith(".openai.azure.com", ignoreCase = true) || - // Azure OpenAI resource URL with the OpenAI unified schema. - host.endsWith(".services.ai.azure.com", ignoreCase = true) || - // Azure OpenAI resource URL, but with a schema different to the known - // ones. - host.endsWith(".azure-api.net", ignoreCase = true) || - host.endsWith(".cognitiveservices.azure.com", ignoreCase = true) -> - if (trimmedBaseUrl.endsWith("/openai/v1")) AZURE_UNIFIED - else AZURE_LEGACY - - else -> NON_AZURE - } - } - } - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/azure/AzureUrlPathMode.kt b/openai-java-core/src/main/kotlin/com/openai/azure/AzureUrlPathMode.kt deleted file mode 100644 index 15ec05ea7..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/azure/AzureUrlPathMode.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.openai.azure - -/** - * Configures how the baseURL of [com.openai.core.ClientOptions] is treated for Azure OpenAI - * endpoints. - */ -enum class AzureUrlPathMode { - /** Forces the deployment or model name into the path. */ - LEGACY, - /** [AzureOpenAIServiceVersion] is optional and the model is part of the request. */ - UNIFIED, - /** Automatically detects the path mode based on the base URL. This is the default value. */ - AUTO, -} diff --git a/openai-java-core/src/main/kotlin/com/openai/azure/HttpRequestBuilderExtensions.kt b/openai-java-core/src/main/kotlin/com/openai/azure/HttpRequestBuilderExtensions.kt deleted file mode 100644 index afb5dfbba..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/azure/HttpRequestBuilderExtensions.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.openai.azure - -import com.openai.core.ClientOptions -import com.openai.core.http.HttpRequest -import com.openai.credential.BearerTokenCredential - -@JvmSynthetic -internal fun HttpRequest.Builder.addPathSegmentsForAzure( - clientOptions: ClientOptions, - deploymentModel: String?, -): HttpRequest.Builder = apply { - val urlCategory = - AzureUrlCategory.categorizeBaseUrl(clientOptions.baseUrl(), clientOptions.azureUrlPathMode) - if (urlCategory == AzureUrlCategory.AZURE_LEGACY) { - // Legacy known Azure endpoints are treated the old way. - addPathSegment("openai") - deploymentModel?.let { addPathSegments("deployments", it) } - } -} - -@JvmSynthetic -internal fun HttpRequest.Builder.replaceBearerTokenForAzure( - clientOptions: ClientOptions -): HttpRequest.Builder = apply { - val urlCategory = - AzureUrlCategory.categorizeBaseUrl(clientOptions.baseUrl(), clientOptions.azureUrlPathMode) - if (urlCategory.isAzure() && clientOptions.credential is BearerTokenCredential) { - replaceHeaders("Authorization", "Bearer ${clientOptions.credential.token()}") - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/azure/credential/AzureApiKeyCredential.kt b/openai-java-core/src/main/kotlin/com/openai/azure/credential/AzureApiKeyCredential.kt deleted file mode 100644 index 3614e3354..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/azure/credential/AzureApiKeyCredential.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.openai.azure.credential - -import com.openai.credential.Credential - -/** A credential that provides an Azure API key. */ -class AzureApiKeyCredential private constructor(private var apiKey: String) : Credential { - - init { - validateApiKey(apiKey) - } - - companion object { - @JvmStatic fun create(apiKey: String): Credential = AzureApiKeyCredential(apiKey) - - private fun validateApiKey(apiKey: String) { - require(apiKey.isNotEmpty()) { "Azure API key cannot be empty." } - } - } - - fun apiKey(): String = apiKey - - fun update(apiKey: String) = apply { - validateApiKey(apiKey) - this.apiKey = apiKey - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/AutoPager.kt b/openai-java-core/src/main/kotlin/com/openai/core/AutoPager.kt deleted file mode 100644 index 888fd0347..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/AutoPager.kt +++ /dev/null @@ -1,21 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core - -import java.util.stream.Stream -import java.util.stream.StreamSupport - -class AutoPager private constructor(private val firstPage: Page) : Iterable { - - companion object { - - fun from(firstPage: Page): AutoPager = AutoPager(firstPage) - } - - override fun iterator(): Iterator = - generateSequence(firstPage) { if (it.hasNextPage()) it.nextPage() else null } - .flatMap { it.items() } - .iterator() - - fun stream(): Stream = StreamSupport.stream(spliterator(), false) -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/AutoPagerAsync.kt b/openai-java-core/src/main/kotlin/com/openai/core/AutoPagerAsync.kt deleted file mode 100644 index 649be47c9..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/AutoPagerAsync.kt +++ /dev/null @@ -1,88 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core - -import com.openai.core.http.AsyncStreamResponse -import java.util.Optional -import java.util.concurrent.CompletableFuture -import java.util.concurrent.CompletionException -import java.util.concurrent.Executor -import java.util.concurrent.atomic.AtomicReference - -class AutoPagerAsync -private constructor(private val firstPage: PageAsync, private val defaultExecutor: Executor) : - AsyncStreamResponse { - - companion object { - - fun from(firstPage: PageAsync, defaultExecutor: Executor): AutoPagerAsync = - AutoPagerAsync(firstPage, defaultExecutor) - } - - private val onCompleteFuture = CompletableFuture() - private val state = AtomicReference(State.NEW) - - override fun subscribe(handler: AsyncStreamResponse.Handler): AsyncStreamResponse = - subscribe(handler, defaultExecutor) - - override fun subscribe( - handler: AsyncStreamResponse.Handler, - executor: Executor, - ): AsyncStreamResponse = apply { - // TODO(JDK): Use `compareAndExchange` once targeting JDK 9. - check(state.compareAndSet(State.NEW, State.SUBSCRIBED)) { - if (state.get() == State.SUBSCRIBED) "Cannot subscribe more than once" - else "Cannot subscribe after the response is closed" - } - - fun PageAsync.handle(): CompletableFuture { - if (state.get() == State.CLOSED) { - return CompletableFuture.completedFuture(null) - } - - items().forEach { handler.onNext(it) } - return if (hasNextPage()) nextPage().thenCompose { it.handle() } - else CompletableFuture.completedFuture(null) - } - - executor.execute { - firstPage.handle().whenComplete { _, error -> - val actualError = - if (error is CompletionException && error.cause != null) error.cause else error - try { - handler.onComplete(Optional.ofNullable(actualError)) - } finally { - try { - if (actualError == null) { - onCompleteFuture.complete(null) - } else { - onCompleteFuture.completeExceptionally(actualError) - } - } finally { - close() - } - } - } - } - } - - override fun onCompleteFuture(): CompletableFuture = onCompleteFuture - - override fun close() { - val previousState = state.getAndSet(State.CLOSED) - if (previousState == State.CLOSED) { - return - } - - // When the stream is closed, we should always consider it closed. If it closed due - // to an error, then we will have already completed the future earlier, and this - // will be a no-op. - onCompleteFuture.complete(null) - } -} - -private enum class State { - NEW, - SUBSCRIBED, - CLOSED, -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/BaseDeserializer.kt b/openai-java-core/src/main/kotlin/com/openai/core/BaseDeserializer.kt deleted file mode 100644 index c6dc038b4..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/BaseDeserializer.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.openai.core - -import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.core.ObjectCodec -import com.fasterxml.jackson.core.type.TypeReference -import com.fasterxml.jackson.databind.BeanProperty -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.JavaType -import com.fasterxml.jackson.databind.JsonDeserializer -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.deser.ContextualDeserializer -import com.fasterxml.jackson.databind.deser.std.StdDeserializer -import kotlin.reflect.KClass - -abstract class BaseDeserializer(type: KClass) : - StdDeserializer(type.java), ContextualDeserializer { - - override fun createContextual( - context: DeserializationContext, - property: BeanProperty?, - ): JsonDeserializer { - return this - } - - override fun deserialize(parser: JsonParser, context: DeserializationContext): T { - return parser.codec.deserialize(parser.readValueAsTree()) - } - - protected abstract fun ObjectCodec.deserialize(node: JsonNode): T - - protected fun ObjectCodec.tryDeserialize(node: JsonNode, type: TypeReference): T? = - try { - readValue(treeAsTokens(node), type) - } catch (e: Exception) { - null - } - - protected fun ObjectCodec.tryDeserialize(node: JsonNode, type: JavaType): T? = - try { - readValue(treeAsTokens(node), type) - } catch (e: Exception) { - null - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/BaseSerializer.kt b/openai-java-core/src/main/kotlin/com/openai/core/BaseSerializer.kt deleted file mode 100644 index 3e062a6a1..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/BaseSerializer.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.openai.core - -import com.fasterxml.jackson.databind.ser.std.StdSerializer -import kotlin.reflect.KClass - -abstract class BaseSerializer(type: KClass) : StdSerializer(type.java) diff --git a/openai-java-core/src/main/kotlin/com/openai/core/Check.kt b/openai-java-core/src/main/kotlin/com/openai/core/Check.kt deleted file mode 100644 index 53b3b919e..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/Check.kt +++ /dev/null @@ -1,96 +0,0 @@ -@file:JvmName("Check") - -package com.openai.core - -import com.fasterxml.jackson.core.Version -import com.fasterxml.jackson.core.util.VersionUtil - -fun checkRequired(name: String, condition: Boolean) = - check(condition) { "`$name` is required, but was not set" } - -fun checkRequired(name: String, value: T?): T = - checkNotNull(value) { "`$name` is required, but was not set" } - -@JvmSynthetic -internal fun checkKnown(name: String, value: JsonField): T = - value.asKnown().orElseThrow { - IllegalStateException("`$name` is not a known type: ${value.javaClass.simpleName}") - } - -@JvmSynthetic -internal fun checkKnown(name: String, value: MultipartField): T = - value.value.asKnown().orElseThrow { - IllegalStateException("`$name` is not a known type: ${value.javaClass.simpleName}") - } - -@JvmSynthetic -internal fun checkLength(name: String, value: String, length: Int): String = - value.also { - check(it.length == length) { "`$name` must have length $length, but was ${it.length}" } - } - -@JvmSynthetic -internal fun checkMinLength(name: String, value: String, minLength: Int): String = - value.also { - check(it.length >= minLength) { - if (minLength == 1) "`$name` must be non-empty, but was empty" - else "`$name` must have at least length $minLength, but was ${it.length}" - } - } - -@JvmSynthetic -internal fun checkMaxLength(name: String, value: String, maxLength: Int): String = - value.also { - check(it.length <= maxLength) { - "`$name` must have at most length $maxLength, but was ${it.length}" - } - } - -@JvmSynthetic -internal fun checkJacksonVersionCompatibility() { - val incompatibleJacksonVersions = - RUNTIME_JACKSON_VERSIONS.mapNotNull { - val badVersionReason = BAD_JACKSON_VERSIONS[it.toString()] - when { - it.majorVersion != MINIMUM_JACKSON_VERSION.majorVersion -> - it to "incompatible major version" - it.minorVersion < MINIMUM_JACKSON_VERSION.minorVersion -> - it to "minor version too low" - it.minorVersion == MINIMUM_JACKSON_VERSION.minorVersion && - it.patchLevel < MINIMUM_JACKSON_VERSION.patchLevel -> - it to "patch version too low" - badVersionReason != null -> it to badVersionReason - else -> null - } - } - check(incompatibleJacksonVersions.isEmpty()) { - """ -This SDK requires a minimum Jackson version of $MINIMUM_JACKSON_VERSION, but the following incompatible Jackson versions were detected at runtime: - -${incompatibleJacksonVersions.asSequence().map { (version, incompatibilityReason) -> - "- `${version.toFullString().replace("/", ":")}` ($incompatibilityReason)" -}.joinToString("\n")} - -This can happen if you are either: -1. Directly depending on different Jackson versions -2. Depending on some library that depends on different Jackson versions, potentially transitively - -Double-check that you are depending on compatible Jackson versions. - -See https://www.github.com/openai/openai-java#jackson for more information. - """ - .trimIndent() - } -} - -private val MINIMUM_JACKSON_VERSION: Version = VersionUtil.parseVersion("2.13.4", null, null) -private val BAD_JACKSON_VERSIONS: Map = - mapOf("2.18.1" to "due to https://github.com/FasterXML/jackson-databind/issues/4639") -private val RUNTIME_JACKSON_VERSIONS: List = - listOf( - com.fasterxml.jackson.core.json.PackageVersion.VERSION, - com.fasterxml.jackson.databind.cfg.PackageVersion.VERSION, - com.fasterxml.jackson.datatype.jdk8.PackageVersion.VERSION, - com.fasterxml.jackson.datatype.jsr310.PackageVersion.VERSION, - com.fasterxml.jackson.module.kotlin.PackageVersion.VERSION, - ) diff --git a/openai-java-core/src/main/kotlin/com/openai/core/ClientOptions.kt b/openai-java-core/src/main/kotlin/com/openai/core/ClientOptions.kt deleted file mode 100644 index fe00a3363..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/ClientOptions.kt +++ /dev/null @@ -1,833 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.openai.auth.WorkloadIdentity -import com.openai.auth.WorkloadIdentityAuth -import com.openai.azure.AzureOpenAIServiceVersion -import com.openai.azure.AzureUrlCategory -import com.openai.azure.AzureUrlPathMode -import com.openai.azure.credential.AzureApiKeyCredential -import com.openai.core.http.AsyncStreamResponse -import com.openai.core.http.AuthenticatingHttpClient -import com.openai.core.http.Headers -import com.openai.core.http.HttpClient -import com.openai.core.http.HttpRequestAuthenticator -import com.openai.core.http.LoggingHttpClient -import com.openai.core.http.PhantomReachableClosingHttpClient -import com.openai.core.http.PhantomReachableClosingHttpRequestAuthenticator -import com.openai.core.http.QueryParams -import com.openai.core.http.RetryingHttpClient -import com.openai.core.http.WorkloadIdentityHttpClient -import com.openai.credential.BearerTokenCredential -import com.openai.credential.Credential -import com.openai.credential.WorkloadIdentityCredential -import java.time.Clock -import java.time.Duration -import java.util.Optional -import java.util.concurrent.Executor -import java.util.concurrent.ExecutorService -import java.util.concurrent.Executors -import java.util.concurrent.ThreadFactory -import java.util.concurrent.atomic.AtomicLong -import kotlin.jvm.optionals.getOrNull - -/** A class representing the SDK client configuration. */ -class ClientOptions -private constructor( - private val originalHttpClient: HttpClient, - /** - * The HTTP client to use in the SDK. - * - * Use the one published in `openai-java-client-okhttp` or implement your own. - * - * This class takes ownership of the client and closes it when closed. - */ - @get:JvmName("httpClient") val httpClient: HttpClient, - private val httpRequestAuthenticator: HttpRequestAuthenticator?, - /** - * Whether to throw an exception if any of the Jackson versions detected at runtime are - * incompatible with the SDK's minimum supported Jackson version (2.13.4). - * - * Defaults to true. Use extreme caution when disabling this option. There is no guarantee that - * the SDK will work correctly when using an incompatible Jackson version. - */ - @get:JvmName("checkJacksonVersionCompatibility") val checkJacksonVersionCompatibility: Boolean, - /** - * The Jackson JSON mapper to use for serializing and deserializing JSON. - * - * Defaults to [com.openai.core.jsonMapper]. The default is usually sufficient and rarely needs - * to be overridden. - */ - @get:JvmName("jsonMapper") val jsonMapper: JsonMapper, - /** - * The executor to use for running [AsyncStreamResponse.Handler] callbacks. - * - * Defaults to a dedicated cached thread pool. - * - * This class takes ownership of the executor and shuts it down, if possible, when closed. - */ - @get:JvmName("streamHandlerExecutor") val streamHandlerExecutor: Executor, - /** - * The interface to use for delaying execution, like during retries. - * - * This is primarily useful for using fake delays in tests. - * - * Defaults to real execution delays. - * - * This class takes ownership of the sleeper and closes it when closed. - */ - @get:JvmName("sleeper") val sleeper: Sleeper, - /** - * The clock to use for operations that require timing, like retries. - * - * This is primarily useful for using a fake clock in tests. - * - * Defaults to [Clock.systemUTC]. - */ - @get:JvmName("clock") val clock: Clock, - private val baseUrl: String?, - /** Headers to send with the request. */ - @get:JvmName("headers") val headers: Headers, - /** Query params to send with the request. */ - @get:JvmName("queryParams") val queryParams: QueryParams, - /** - * Whether to call `validate` on every response before returning it. - * - * Setting this to `true` is _not_ forwards compatible with new types from the API for existing - * fields. - * - * Defaults to false, which means the shape of the response will not be validated upfront. - * Instead, validation will only occur for the parts of the response that are accessed. - */ - @get:JvmName("responseValidation") val responseValidation: Boolean, - /** - * Sets the maximum time allowed for various parts of an HTTP call's lifecycle, excluding - * retries. - * - * Defaults to [Timeout.default]. - */ - @get:JvmName("timeout") val timeout: Timeout, - /** - * The maximum number of times to retry failed requests, with a short exponential backoff - * between requests. - * - * Only the following error types are retried: - * - Connection errors (for example, due to a network connectivity problem) - * - 408 Request Timeout - * - 409 Conflict - * - 429 Rate Limit - * - 5xx Internal - * - * The API may also explicitly instruct the SDK to retry or not retry a request. - * - * Defaults to 2. - */ - @get:JvmName("maxRetries") val maxRetries: Int, - /** - * The level at which to log request and response information. - * - * [fromEnv] will set the level from environment variables. See [LogLevel.fromEnv]. - * - * Defaults to [LogLevel.fromEnv]. - */ - @get:JvmName("logLevel") val logLevel: LogLevel, - private val apiKey: String?, - private val adminApiKey: String?, - @get:JvmName("credential") val credential: Credential, - @get:JvmName("azureServiceVersion") val azureServiceVersion: AzureOpenAIServiceVersion?, - @get:JvmName("azureUrlPathMode") val azureUrlPathMode: AzureUrlPathMode, - private val organization: String?, - private val project: String?, - private val webhookSecret: String?, -) { - - init { - if (checkJacksonVersionCompatibility) { - checkJacksonVersionCompatibility() - } - } - - /** - * The base URL to use for every request. - * - * Defaults to the production environment: `https://api.openai.com/v1`. - */ - fun baseUrl(): String = baseUrl ?: PRODUCTION_URL - - fun apiKey(): Optional = Optional.ofNullable(apiKey) - - fun adminApiKey(): Optional = Optional.ofNullable(adminApiKey) - - fun organization(): Optional = Optional.ofNullable(organization) - - fun project(): Optional = Optional.ofNullable(project) - - fun webhookSecret(): Optional = Optional.ofNullable(webhookSecret) - - fun toBuilder() = Builder().from(this) - - companion object { - - const val PRODUCTION_URL = "https://api.openai.com/v1" - - /** - * Returns a mutable builder for constructing an instance of [ClientOptions]. - * - * The following fields are required: - * ```java - * .httpClient() - * - * ``` - */ - @JvmStatic fun builder() = Builder() - - /** - * Returns options configured using system properties and environment variables. - * - * @see Builder.fromEnv - */ - @JvmStatic fun fromEnv(): ClientOptions = builder().fromEnv().build() - } - - /** A builder for [ClientOptions]. */ - class Builder internal constructor() { - - private var httpClient: HttpClient? = null - private var httpRequestAuthenticator: HttpRequestAuthenticator? = null - private var checkJacksonVersionCompatibility: Boolean = true - private var jsonMapper: JsonMapper = jsonMapper() - private var streamHandlerExecutor: Executor? = null - private var sleeper: Sleeper? = null - private var clock: Clock = Clock.systemUTC() - private var baseUrl: String? = null - private var headers: Headers.Builder = Headers.builder() - private var queryParams: QueryParams.Builder = QueryParams.builder() - private var responseValidation: Boolean = false - private var timeout: Timeout = Timeout.default() - private var maxRetries: Int = 2 - private var logLevel: LogLevel = LogLevel.fromEnv() - private var apiKey: String? = null - private var credential: Credential? = null - private var azureServiceVersion: AzureOpenAIServiceVersion? = null - private var azureUrlPathMode: AzureUrlPathMode = AzureUrlPathMode.AUTO - private var adminApiKey: String? = null - private var organization: String? = null - private var project: String? = null - private var webhookSecret: String? = null - private var workloadIdentity: WorkloadIdentity? = null - - @JvmSynthetic - internal fun from(clientOptions: ClientOptions) = apply { - httpClient = clientOptions.originalHttpClient - httpRequestAuthenticator = clientOptions.httpRequestAuthenticator - checkJacksonVersionCompatibility = clientOptions.checkJacksonVersionCompatibility - jsonMapper = clientOptions.jsonMapper - streamHandlerExecutor = clientOptions.streamHandlerExecutor - sleeper = clientOptions.sleeper - clock = clientOptions.clock - baseUrl = clientOptions.baseUrl - headers = clientOptions.headers.toBuilder() - queryParams = clientOptions.queryParams.toBuilder() - responseValidation = clientOptions.responseValidation - timeout = clientOptions.timeout - maxRetries = clientOptions.maxRetries - logLevel = clientOptions.logLevel - apiKey = clientOptions.apiKey - adminApiKey = clientOptions.adminApiKey - credential = - clientOptions.credential.takeUnless { - it === AdminApiKeyOnlyCredential || it === HttpRequestAuthenticatorCredential - } - azureServiceVersion = clientOptions.azureServiceVersion - azureUrlPathMode = clientOptions.azureUrlPathMode - organization = clientOptions.organization - project = clientOptions.project - webhookSecret = clientOptions.webhookSecret - } - - /** - * The HTTP client to use in the SDK. - * - * Use the one published in `openai-java-client-okhttp` or implement your own. - * - * This class takes ownership of the client and closes it when closed. - */ - fun httpClient(httpClient: HttpClient) = apply { - this.httpClient = PhantomReachableClosingHttpClient(httpClient) - } - - /** - * Configures authentication that must inspect the complete HTTP request. - * - * This is reserved for OpenAI-owned provider integrations. The authenticator runs once per - * request attempt after request construction and immediately before transport logging. - */ - @JvmSynthetic - fun httpRequestAuthenticator(httpRequestAuthenticator: HttpRequestAuthenticator?) = apply { - this.httpRequestAuthenticator = - if (httpRequestAuthenticator == null) null - else PhantomReachableClosingHttpRequestAuthenticator(httpRequestAuthenticator) - } - - /** - * Whether to throw an exception if any of the Jackson versions detected at runtime are - * incompatible with the SDK's minimum supported Jackson version (2.13.4). - * - * Defaults to true. Use extreme caution when disabling this option. There is no guarantee - * that the SDK will work correctly when using an incompatible Jackson version. - */ - fun checkJacksonVersionCompatibility(checkJacksonVersionCompatibility: Boolean) = apply { - this.checkJacksonVersionCompatibility = checkJacksonVersionCompatibility - } - - /** - * The Jackson JSON mapper to use for serializing and deserializing JSON. - * - * Defaults to [com.openai.core.jsonMapper]. The default is usually sufficient and rarely - * needs to be overridden. - */ - fun jsonMapper(jsonMapper: JsonMapper) = apply { this.jsonMapper = jsonMapper } - - /** - * The executor to use for running [AsyncStreamResponse.Handler] callbacks. - * - * Defaults to a dedicated cached thread pool. - * - * This class takes ownership of the executor and shuts it down, if possible, when closed. - */ - fun streamHandlerExecutor(streamHandlerExecutor: Executor) = apply { - this.streamHandlerExecutor = - if (streamHandlerExecutor is ExecutorService) - PhantomReachableExecutorService(streamHandlerExecutor) - else streamHandlerExecutor - } - - /** - * The interface to use for delaying execution, like during retries. - * - * This is primarily useful for using fake delays in tests. - * - * Defaults to real execution delays. - * - * This class takes ownership of the sleeper and closes it when closed. - */ - fun sleeper(sleeper: Sleeper) = apply { this.sleeper = PhantomReachableSleeper(sleeper) } - - /** - * The clock to use for operations that require timing, like retries. - * - * This is primarily useful for using a fake clock in tests. - * - * Defaults to [Clock.systemUTC]. - */ - fun clock(clock: Clock) = apply { this.clock = clock } - - /** - * The base URL to use for every request. - * - * Defaults to the production environment: `https://api.openai.com/v1`. - */ - fun baseUrl(baseUrl: String?) = apply { this.baseUrl = baseUrl } - - /** Alias for calling [Builder.baseUrl] with `baseUrl.orElse(null)`. */ - fun baseUrl(baseUrl: Optional) = baseUrl(baseUrl.getOrNull()) - - /** - * Whether to call `validate` on every response before returning it. - * - * Setting this to `true` is _not_ forwards compatible with new types from the API for - * existing fields. - * - * Defaults to false, which means the shape of the response will not be validated upfront. - * Instead, validation will only occur for the parts of the response that are accessed. - */ - fun responseValidation(responseValidation: Boolean) = apply { - this.responseValidation = responseValidation - } - - /** - * Sets the maximum time allowed for various parts of an HTTP call's lifecycle, excluding - * retries. - * - * Defaults to [Timeout.default]. - */ - fun timeout(timeout: Timeout) = apply { this.timeout = timeout } - - /** - * Sets the maximum time allowed for a complete HTTP call, not including retries. - * - * See [Timeout.request] for more details. - * - * For fine-grained control, pass a [Timeout] object. - */ - fun timeout(timeout: Duration) = timeout(Timeout.builder().request(timeout).build()) - - /** - * The maximum number of times to retry failed requests, with a short exponential backoff - * between requests. - * - * Only the following error types are retried: - * - Connection errors (for example, due to a network connectivity problem) - * - 408 Request Timeout - * - 409 Conflict - * - 429 Rate Limit - * - 5xx Internal - * - * The API may also explicitly instruct the SDK to retry or not retry a request. - * - * Defaults to 2. - */ - fun maxRetries(maxRetries: Int) = apply { this.maxRetries = maxRetries } - - /** - * The level at which to log request and response information. - * - * [fromEnv] will set the level from environment variables. See [LogLevel.fromEnv]. - * - * Defaults to [LogLevel.fromEnv]. - */ - fun logLevel(logLevel: LogLevel) = apply { this.logLevel = logLevel } - - fun apiKey(apiKey: String?) = apply { - this.apiKey = apiKey - this.credential = apiKey?.let { BearerTokenCredential.create(it) } - } - - /** Alias for calling [Builder.apiKey] with `apiKey.orElse(null)`. */ - fun apiKey(apiKey: Optional) = apiKey(apiKey.getOrNull()) - - fun adminApiKey(adminApiKey: String?) = apply { this.adminApiKey = adminApiKey } - - /** Alias for calling [Builder.adminApiKey] with `adminApiKey.orElse(null)`. */ - fun adminApiKey(adminApiKey: Optional) = adminApiKey(adminApiKey.getOrNull()) - - fun credential(credential: Credential) = apply { - this.apiKey = null - this.credential = credential - } - - fun azureServiceVersion(azureServiceVersion: AzureOpenAIServiceVersion) = apply { - this.azureServiceVersion = azureServiceVersion - } - - fun azureUrlPathMode(azureUrlPathMode: AzureUrlPathMode) = apply { - this.azureUrlPathMode = azureUrlPathMode - } - - fun organization(organization: String?) = apply { this.organization = organization } - - /** Alias for calling [Builder.organization] with `organization.orElse(null)`. */ - fun organization(organization: Optional) = organization(organization.getOrNull()) - - fun project(project: String?) = apply { this.project = project } - - /** Alias for calling [Builder.project] with `project.orElse(null)`. */ - fun project(project: Optional) = project(project.getOrNull()) - - fun webhookSecret(webhookSecret: String?) = apply { this.webhookSecret = webhookSecret } - - /** Alias for calling [Builder.webhookSecret] with `webhookSecret.orElse(null)`. */ - fun webhookSecret(webhookSecret: Optional) = - webhookSecret(webhookSecret.getOrNull()) - - fun workloadIdentity(workloadIdentity: WorkloadIdentity?) = apply { - this.workloadIdentity = workloadIdentity - } - - /** Alias for calling [Builder.workloadIdentity] with `workloadIdentity.orElse(null)`. */ - fun workloadIdentity(workloadIdentity: Optional) = - workloadIdentity(workloadIdentity.getOrNull()) - - fun headers(headers: Headers) = apply { - this.headers.clear() - putAllHeaders(headers) - } - - fun headers(headers: Map>) = apply { - this.headers.clear() - putAllHeaders(headers) - } - - fun putHeader(name: String, value: String) = apply { headers.put(name, value) } - - fun putHeaders(name: String, values: Iterable) = apply { headers.put(name, values) } - - fun putAllHeaders(headers: Headers) = apply { this.headers.putAll(headers) } - - fun putAllHeaders(headers: Map>) = apply { - this.headers.putAll(headers) - } - - fun replaceHeaders(name: String, value: String) = apply { headers.replace(name, value) } - - fun replaceHeaders(name: String, values: Iterable) = apply { - headers.replace(name, values) - } - - fun replaceAllHeaders(headers: Headers) = apply { this.headers.replaceAll(headers) } - - fun replaceAllHeaders(headers: Map>) = apply { - this.headers.replaceAll(headers) - } - - fun removeHeaders(name: String) = apply { headers.remove(name) } - - fun removeAllHeaders(names: Set) = apply { headers.removeAll(names) } - - fun queryParams(queryParams: QueryParams) = apply { - this.queryParams.clear() - putAllQueryParams(queryParams) - } - - fun queryParams(queryParams: Map>) = apply { - this.queryParams.clear() - putAllQueryParams(queryParams) - } - - fun putQueryParam(key: String, value: String) = apply { queryParams.put(key, value) } - - fun putQueryParams(key: String, values: Iterable) = apply { - queryParams.put(key, values) - } - - fun putAllQueryParams(queryParams: QueryParams) = apply { - this.queryParams.putAll(queryParams) - } - - fun putAllQueryParams(queryParams: Map>) = apply { - this.queryParams.putAll(queryParams) - } - - fun replaceQueryParams(key: String, value: String) = apply { - queryParams.replace(key, value) - } - - fun replaceQueryParams(key: String, values: Iterable) = apply { - queryParams.replace(key, values) - } - - fun replaceAllQueryParams(queryParams: QueryParams) = apply { - this.queryParams.replaceAll(queryParams) - } - - fun replaceAllQueryParams(queryParams: Map>) = apply { - this.queryParams.replaceAll(queryParams) - } - - fun removeQueryParams(key: String) = apply { queryParams.remove(key) } - - fun removeAllQueryParams(keys: Set) = apply { queryParams.removeAll(keys) } - - fun timeout(): Timeout = timeout - - private fun effectiveCredential( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): Credential { - if (httpRequestAuthenticator != null) { - if ( - credential != null || workloadIdentity != null || !adminApiKey.isNullOrEmpty() - ) { - throw IllegalStateException( - "Provider authentication cannot be combined with credential (apiKey), workloadIdentity, or adminApiKey" - ) - } - return HttpRequestAuthenticatorCredential - } - if ( - credential != null && - credential !== AdminApiKeyOnlyCredential && - credential !is WorkloadIdentityCredential && - workloadIdentity != null - ) { - throw IllegalStateException( - "Cannot specify both credential (apiKey) and workloadIdentity. Please specify only one." - ) - } - return when { - workloadIdentity != null -> - WorkloadIdentityCredential( - WorkloadIdentityAuth( - config = workloadIdentity!!, - httpClient = httpClient, - jsonMapper = jsonMapper, - ) - ) - credential != null && credential !== AdminApiKeyOnlyCredential -> credential!! - !adminApiKey.isNullOrEmpty() -> AdminApiKeyOnlyCredential - else -> - throw IllegalStateException( - "At least one credential source must be specified: credential (apiKey), workloadIdentity, or adminApiKey" - ) - } - } - - /** - * Updates configuration using system properties and environment variables. - * - * See this table for the available options: - * - * |Setter |System property |Environment variable |Required|Default value | - * |---------------|----------------------|-----------------------|--------|-----------------------------| - * |`apiKey` |`openai.apiKey` |`OPENAI_API_KEY` |false |- | - * |`adminApiKey` |`openai.adminKey` |`OPENAI_ADMIN_KEY` |false |- | - * |`organization` |`openai.orgId` |`OPENAI_ORG_ID` |false |- | - * |`project` |`openai.projectId` |`OPENAI_PROJECT_ID` |false |- | - * |`webhookSecret`|`openai.webhookSecret`|`OPENAI_WEBHOOK_SECRET`|false |- | - * |`baseUrl` |`openai.baseUrl` |`OPENAI_BASE_URL` |true |`"https://api.openai.com/v1"`| - * - * System properties take precedence over environment variables. - */ - fun fromEnv() = apply { - logLevel(LogLevel.fromEnv()) - (System.getProperty("openai.baseUrl") ?: System.getenv("OPENAI_BASE_URL"))?.let { - baseUrl(it) - } - - val openAIKey = System.getProperty("openai.apiKey") ?: System.getenv("OPENAI_API_KEY") - val openAIOrgId = System.getProperty("openai.orgId") ?: System.getenv("OPENAI_ORG_ID") - val openAIProjectId = - System.getProperty("openai.projectId") ?: System.getenv("OPENAI_PROJECT_ID") - val azureOpenAIKey = System.getenv("AZURE_OPENAI_KEY") - val openAIWebhookSecret = - System.getProperty("openai.webhookSecret") ?: System.getenv("OPENAI_WEBHOOK_SECRET") - if (!openAIWebhookSecret.isNullOrEmpty()) { - webhookSecret(openAIWebhookSecret) - } - (System.getProperty("openai.adminKey") ?: System.getenv("OPENAI_ADMIN_KEY"))?.let { - adminApiKey(it) - } - - when { - !openAIKey.isNullOrEmpty() && !azureOpenAIKey.isNullOrEmpty() -> { - throw IllegalArgumentException( - "Both OpenAI and Azure OpenAI API keys, `OPENAI_API_KEY` and `AZURE_OPENAI_KEY`, are set. Please specify only one" - ) - } - !openAIKey.isNullOrEmpty() -> { - apiKey(openAIKey) - organization(openAIOrgId) - project(openAIProjectId) - } - !azureOpenAIKey.isNullOrEmpty() -> { - credential(AzureApiKeyCredential.create(azureOpenAIKey)) - } - } - - System.getenv("OPENAI_CUSTOM_HEADERS")?.let { customHeadersEnv -> - for (line in customHeadersEnv.split("\n")) { - val colon = line.indexOf(':') - if (colon >= 0) { - putHeader(line.substring(0, colon).trim(), line.substring(colon + 1).trim()) - } - } - } - } - - /** - * Returns an immutable instance of [ClientOptions]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .httpClient() - * - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ClientOptions { - val httpClient = checkRequired("httpClient", httpClient) - val streamHandlerExecutor = - streamHandlerExecutor - ?: PhantomReachableExecutorService( - Executors.newCachedThreadPool( - object : ThreadFactory { - - private val threadFactory: ThreadFactory = - Executors.defaultThreadFactory() - private val count = AtomicLong(0) - - override fun newThread(runnable: Runnable): Thread = - threadFactory.newThread(runnable).also { - it.name = - "openai-stream-handler-thread-${count.getAndIncrement()}" - } - } - ) - ) - val sleeper = sleeper ?: PhantomReachableSleeper(DefaultSleeper()) - - val headers = Headers.builder() - val queryParams = QueryParams.builder() - headers.put("X-Stainless-Lang", "java") - headers.put("X-Stainless-Arch", getOsArch()) - headers.put("X-Stainless-OS", getOsName()) - headers.put("X-Stainless-OS-Version", getOsVersion()) - headers.put("X-Stainless-Package-Version", getPackageVersion()) - headers.put("X-Stainless-Runtime", "JRE") - headers.put("X-Stainless-Runtime-Version", getJavaVersion()) - headers.put("X-Stainless-Kotlin-Version", KotlinVersion.CURRENT.toString()) - // We replace after all the default headers to allow end-users to overwrite them. - headers.replaceAll(this.headers.build()) - - baseUrl?.let { - when (AzureUrlCategory.categorizeBaseUrl(it, azureUrlPathMode)) { - // Legacy Azure routes will still require an api-version value. - AzureUrlCategory.AZURE_LEGACY -> - replaceQueryParams( - "api-version", - (azureServiceVersion ?: AzureOpenAIServiceVersion.latestStableVersion()) - .value, - ) - // We only add the value if it's defined by the user for unified Azure routes. - AzureUrlCategory.AZURE_UNIFIED -> - azureServiceVersion?.let { version -> - replaceQueryParams("api-version", version.value) - } - AzureUrlCategory.NON_AZURE -> {} - } - } - - queryParams.replaceAll(this.queryParams.build()) - organization?.let { headers.replace("OpenAI-Organization", it) } - project?.let { headers.replace("OpenAI-Project", it) } - - val credential = effectiveCredential(httpClient, jsonMapper) - - val effectiveWorkloadIdentityAuth = - (credential as? WorkloadIdentityCredential)?.getAuth() - - val loggingDelegate = - if (httpRequestAuthenticator != null) httpClient - else - WorkloadIdentityHttpClient( - delegate = httpClient, - workloadIdentityAuth = effectiveWorkloadIdentityAuth, - ) - - val loggingHttpClient = - LoggingHttpClient.builder() - .httpClient(loggingDelegate) - .clock(clock) - .level(logLevel) - .build() - - val perAttemptHttpClient = - httpRequestAuthenticator?.let { authenticator -> - AuthenticatingHttpClient( - delegate = loggingHttpClient, - authenticator = authenticator, - ) - } ?: loggingHttpClient - - val wrappedHttpClient = - RetryingHttpClient.builder() - .httpClient(perAttemptHttpClient) - .sleeper(sleeper) - .clock(clock) - .maxRetries(maxRetries) - .build() - - return ClientOptions( - httpClient, - wrappedHttpClient, - httpRequestAuthenticator, - checkJacksonVersionCompatibility, - jsonMapper, - streamHandlerExecutor, - sleeper, - clock, - baseUrl, - headers.build(), - queryParams.build(), - responseValidation, - timeout, - maxRetries, - logLevel, - apiKey, - adminApiKey, - credential, - azureServiceVersion, - azureUrlPathMode, - organization, - project, - webhookSecret, - ) - } - } - - /** - * Closes these client options, relinquishing any underlying resources. - * - * This is purposefully not inherited from [AutoCloseable] because the client options are - * long-lived and usually should not be synchronously closed via try-with-resources. - * - * It's also usually not necessary to call this method at all. the default client automatically - * releases threads and connections if they remain idle, but if you are writing an application - * that needs to aggressively release unused resources, then you may call this method. - */ - fun close() { - httpClient.close() - (streamHandlerExecutor as? ExecutorService)?.shutdown() - sleeper.close() - } - - @JvmSynthetic - internal fun securityHeaders(security: SecurityOptions): Headers { - val headers = Headers.builder() - var isSatisfied = - credential === HttpRequestAuthenticatorCredential && - (security.bearerAuth || security.adminApiKeyAuth) - - if (security.bearerAuth) { - when { - credential is BearerTokenCredential -> { - val token = credential.token() - if (!token.isEmpty()) { - headers.replace("Authorization", "Bearer $token") - isSatisfied = true - } - } - credential is AzureApiKeyCredential -> { - headers.replace("api-key", credential.apiKey()) - isSatisfied = true - } - credential is WorkloadIdentityCredential -> { - isSatisfied = true - } - credential === HttpRequestAuthenticatorCredential -> { - isSatisfied = true - } - } - } - if (security.adminApiKeyAuth) { - adminApiKey?.let { - if (!it.isEmpty()) { - headers.replace("Authorization", "Bearer $it") - isSatisfied = true - } - } - } - - if (!isSatisfied && (security.bearerAuth || security.adminApiKeyAuth)) { - throw IllegalStateException( - when { - security.bearerAuth && security.adminApiKeyAuth -> - "This request requires apiKey, workloadIdentity, or adminApiKey" - security.bearerAuth -> "This request requires apiKey or workloadIdentity" - else -> "This request requires adminApiKey" - } - ) - } - - return headers.build() - } -} - -private object AdminApiKeyOnlyCredential : Credential - -private object HttpRequestAuthenticatorCredential : Credential diff --git a/openai-java-core/src/main/kotlin/com/openai/core/DefaultSleeper.kt b/openai-java-core/src/main/kotlin/com/openai/core/DefaultSleeper.kt deleted file mode 100644 index bd8b250b0..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/DefaultSleeper.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.openai.core - -import java.time.Duration -import java.util.Timer -import java.util.TimerTask -import java.util.concurrent.CompletableFuture - -class DefaultSleeper : Sleeper { - - private val timer = Timer("DefaultSleeper", true) - - override fun sleep(duration: Duration) = Thread.sleep(duration.toMillis()) - - override fun sleepAsync(duration: Duration): CompletableFuture { - val future = CompletableFuture() - timer.schedule( - object : TimerTask() { - override fun run() { - future.complete(null) - } - }, - duration.toMillis(), - ) - return future - } - - override fun close() = timer.cancel() -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/JsonSchemaLocalValidation.kt b/openai-java-core/src/main/kotlin/com/openai/core/JsonSchemaLocalValidation.kt deleted file mode 100644 index 9a3ae7995..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/JsonSchemaLocalValidation.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.openai.core - -/** - * Options for local validation of JSON schemas derived from arbitrary classes before a request is - * executed. - */ -enum class JsonSchemaLocalValidation { - /** - * Validate the JSON schema locally before the request is executed. The remote AI model will - * also validate the JSON schema. - */ - YES, - - /** - * Do not validate the JSON schema locally before the request is executed. The remote AI model - * will always validate the JSON schema. - */ - NO, -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/JsonSchemaValidator.kt b/openai-java-core/src/main/kotlin/com/openai/core/JsonSchemaValidator.kt deleted file mode 100644 index 4242f73fe..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/JsonSchemaValidator.kt +++ /dev/null @@ -1,714 +0,0 @@ -package com.openai.core - -import com.fasterxml.jackson.databind.JsonNode -import com.openai.core.JsonSchemaValidator.Companion.MAX_ENUM_TOTAL_STRING_LENGTH -import com.openai.core.JsonSchemaValidator.Companion.UNRESTRICTED_ENUM_VALUES_LIMIT - -/** - * A validator that ensures that a JSON schema complies with the rules and restrictions imposed by - * the OpenAI API specification for the input schemas used to define structured outputs. Only a - * subset of the JSON Schema language is supported. The purpose of this validator is to perform a - * quick check of a schema so that it can be determined to be likely to be accepted when passed in - * the request for an AI inference. - * - * This validator assumes that the JSON schema represents the structure of Java/Kotlin classes; it - * is not a general-purpose JSON schema validator. Assumptions are also made that the generator will - * be well-behaved, so the validation is not a check for strict conformance to the JSON Schema - * specification, but to the OpenAI API specification's restrictions on JSON schemas. - */ -internal class JsonSchemaValidator private constructor() { - - companion object { - private const val NO_PROPERTIES_DOC = - "https://github.com/openai/openai-java#defining-json-schema-properties" - - // The names of the supported schema keywords. All other keywords will be rejected. - private const val SCHEMA = "\$schema" - private const val ID = "\$id" - private const val DEFS = "\$defs" - private const val REF = "\$ref" - private const val PROPS = "properties" - private const val ANY_OF = "anyOf" - private const val TYPE = "type" - private const val REQUIRED = "required" - private const val DESC = "description" - private const val TITLE = "title" - private const val ITEMS = "items" - private const val CONST = "const" - private const val ENUM = "enum" - private const val ADDITIONAL_PROPS = "additionalProperties" - - private const val PATTERN = "pattern" - private const val FORMAT = "format" - private const val MULTIPLE_OF = "multipleOf" - private const val MINIMUM = "minimum" - private const val EXCLUSIVE_MINIMUM = "exclusiveMinimum" - private const val MAXIMUM = "maximum" - private const val EXCLUSIVE_MAXIMUM = "exclusiveMaximum" - private const val MIN_ITEMS = "minItems" - private const val MAX_ITEMS = "maxItems" - - // The names of the supported schema data types. - // - // JSON Schema does not define an "integer" type, only a "number" type, but it allows any - // schema to define its own "vocabulary" of type names. "integer" is supported by OpenAI. - private const val TYPE_ARRAY = "array" - private const val TYPE_OBJECT = "object" - private const val TYPE_BOOLEAN = "boolean" - private const val TYPE_STRING = "string" - private const val TYPE_NUMBER = "number" - private const val TYPE_INTEGER = "integer" - private const val TYPE_NULL = "null" - - // The following sets define the allowed keywords in different contexts and all others are - // rejected. - - /** - * The set of allowed keywords in the root schema only, not including the keywords that are - * also allowed in a sub-schema. - */ - private val ALLOWED_KEYWORDS_ROOT_SCHEMA_ONLY = setOf(SCHEMA, ID, DEFS) - - /** - * The set of allowed keywords when defining sub-schemas when the `"anyOf"` field is - * present. OpenAI allows the `"anyOf"` field in sub-schemas, but not in the root schema. - */ - private val ALLOWED_KEYWORDS_ANY_OF_SUB_SCHEMA = setOf(ANY_OF, TITLE, DESC) - - /** - * The set of allowed keywords when defining sub-schemas when the `"$ref"` field is present. - */ - private val ALLOWED_KEYWORDS_REF_SUB_SCHEMA = setOf(REF, TITLE, DESC) - - /** - * The set of allowed keywords when defining sub-schemas when the `"type"` field is set to - * `"object"`. - */ - private val ALLOWED_KEYWORDS_OBJECT_SUB_SCHEMA = - setOf(TYPE, REQUIRED, ADDITIONAL_PROPS, TITLE, DESC, PROPS) - - /** - * The set of allowed keywords when defining sub-schemas when the `"type"` field is set to - * `"array"`. - */ - private val ALLOWED_KEYWORDS_ARRAY_SUB_SCHEMA = - setOf(TYPE, TITLE, DESC, ITEMS, MIN_ITEMS, MAX_ITEMS) - - /** - * The set of allowed keywords when defining sub-schemas when the `"type"` field is set to - * `"boolean"`, or any other simple type not handled separately. - */ - private val ALLOWED_KEYWORDS_SIMPLE_SUB_SCHEMA = setOf(TYPE, TITLE, DESC, ENUM, CONST) - - /** - * The set of allowed keywords when defining sub-schemas when the `"type"` field is set to - * `"string"`. - */ - private val ALLOWED_KEYWORDS_STRING_SUB_SCHEMA = - setOf(TYPE, TITLE, DESC, ENUM, CONST, PATTERN, FORMAT) - - /** - * The set of allowed keywords when defining sub-schemas when the `"type"` field is set to - * `"integer"` or `"number"`. - */ - private val ALLOWED_KEYWORDS_NUMBER_SUB_SCHEMA = - setOf( - TYPE, - TITLE, - DESC, - ENUM, - CONST, - MINIMUM, - EXCLUSIVE_MINIMUM, - MAXIMUM, - EXCLUSIVE_MAXIMUM, - MULTIPLE_OF, - ) - - /** - * The maximum total length of all strings used in the schema for property names, definition - * names, enum values and const values. The OpenAI specification states: - * > In a schema, total string length of all property names, definition names, enum values, - * > and const values cannot exceed 15,000 characters. - */ - private const val MAX_TOTAL_STRING_LENGTH = 15_000 - - /** The maximum number of object properties allowed in a schema. */ - private const val MAX_OBJECT_PROPERTIES = 100 - - /** The maximum number of enum values across all enums in the schema. */ - private const val MAX_ENUM_VALUES = 500 - - /** - * The number of enum values in any one enum with string values beyond which a limit of - * [MAX_ENUM_TOTAL_STRING_LENGTH] is imposed on the total length of all the string values of - * that one enum. - */ - private const val UNRESTRICTED_ENUM_VALUES_LIMIT = 250 - - /** - * The maximum total length of all string values of a single enum where the number of values - * exceeds [UNRESTRICTED_ENUM_VALUES_LIMIT]. - */ - private const val MAX_ENUM_TOTAL_STRING_LENGTH = 7_500 - - /** The maximum depth (number of levels) of nesting allowed in a schema. */ - private const val MAX_NESTING_DEPTH = 10 - - /** The depth value that corresponds to the root level of the schema. */ - private const val ROOT_DEPTH = 0 - - /** - * The path string that identifies the root node in the schema when appearing in error - * messages or references. - */ - private const val ROOT_PATH = "#" - - /** - * Creates a new [JsonSchemaValidator]. After calling [validate], the validator instance - * holds information about the errors that occurred during validation (if any). A validator - * instance can be used only once to validate a schema; to validate another schema, create - * another validator. - */ - fun create() = JsonSchemaValidator() - } - - /** - * The total length of all strings used in the schema for property names, definition names, enum - * values and const values. - */ - private var totalStringLength: Int = 0 - - /** The total number of values across all enums in the schema. */ - private var totalEnumValues: Int = 0 - - /** The total number of object properties found in the schema, including in definitions. */ - private var totalObjectProperties: Int = 0 - - /** - * The set of valid references that may appear in the schema. This set includes the root schema - * and any definitions within the root schema. This is used to verify that references elsewhere - * in the schema are valid. This will always contain the root schema, but that may be the only - * member. - */ - private var validReferences: MutableSet = mutableSetOf(ROOT_PATH) - - /** The list of error messages accumulated during the validation process. */ - private val errors: MutableList = mutableListOf() - - /** - * Indicates if this validator has validated a schema or not. If a schema has been validated, - * this validator cannot be used again. - */ - private var isValidationComplete = false - - /** - * Gets the list of errors that were recorded during the validation pass. - * - * @return The list of errors. The list may be empty if no errors were recorded. In that case, - * the schema was found to be valid, or has not yet been validated by calling [validate]. - */ - fun errors(): List = errors.toImmutable() - - /** - * Indicates if a validated schema is valid or not. - * - * @return `true` if a schema has been validated by calling [validate] and no errors were - * reported; or `false` if errors were reported or if a schema has not yet been validated. - */ - fun isValid(): Boolean = isValidationComplete && errors.isEmpty() - - /** - * Validates a schema with respect to the OpenAI API specifications. - * - * @param rootSchema The root node of the tree representing the JSON schema definition. - * @return This schema validator for convenience, such as when chaining calls. - * @throws IllegalStateException If called a second time. Create a new validator to validate - * each new schema. - */ - fun validate(rootSchema: JsonNode): JsonSchemaValidator { - check(!isValidationComplete) { "Validation already complete." } - isValidationComplete = true - - validateSchema(rootSchema, ROOT_PATH, ROOT_DEPTH) - - // Verify total counts/lengths. These are not localized to a specific element in the schema, - // as no one element is the cause of the error; it is the combination of all elements that - // exceed the limits. Therefore, the root path is used in the error messages. - verify(totalEnumValues <= MAX_ENUM_VALUES, ROOT_PATH) { - "Total number of enum values ($totalEnumValues) exceeds limit of $MAX_ENUM_VALUES." - } - verify(totalStringLength <= MAX_TOTAL_STRING_LENGTH, ROOT_PATH) { - "Total string length of all values ($totalStringLength) exceeds " + - "limit of $MAX_TOTAL_STRING_LENGTH." - } - verify(totalObjectProperties <= MAX_OBJECT_PROPERTIES, ROOT_PATH) { - "Total number of object properties ($totalObjectProperties) exceeds " + - "limit of $MAX_OBJECT_PROPERTIES." - } - - return this - } - - /** - * Validates a schema. This may be the root schema or a sub-schema. Some validations are - * specific to the root schema, which is identified by the [depth] being equal to zero. - * - * This method is recursive: it will validate the given schema and any sub-schemas that it - * contains at any depth. References to other schemas (either the root schema or definition - * sub-schemas) do not increase the depth of nesting, as those references are not followed - * recursively, only checked to be valid internal schema references. - * - * @param schema The schema to be validated. This may be the root schema or any sub-schema. - * @param path The path that identifies the location of this schema within the JSON schema. For - * example, for the root schema, this will be `"#"`; for a definition sub-schema of a `Person` - * object, this will be `"#/$defs/Person"`. - * @param depth The current depth of nesting. The OpenAI API specification places a maximum - * limit on the depth of nesting, which will result in an error if it is exceeded. The nesting - * depth increases with each recursion into a nested sub-schema. For the root schema, the - * nesting depth is zero; all other sub-schemas will have a nesting depth greater than zero. - */ - private fun validateSchema(schema: JsonNode, path: String, depth: Int) { - verify(depth <= MAX_NESTING_DEPTH, path) { - "Current nesting depth is $depth, but maximum is $MAX_NESTING_DEPTH." - } - - verify(schema.isObject, path, { "Schema or sub-schema is not an object." }) { - // If the schema is not an object, perform no further validations. - return - } - - verify(!schema.isEmpty, path) { "Schema or sub-schema is empty." } - - if (depth == ROOT_DEPTH) { - // Sanity check for the presence of the "$schema" field, as this makes it more likely - // that the schema with `depth == 0` is actually the root node of a JSON schema, not - // just a generic JSON document that is being validated in error. - verify(schema.get(SCHEMA) != null, path) { "Root schema missing '$SCHEMA' field." } - } - - // Before sub-schemas can be validated, the list of definitions must be recorded to ensure - // that "$ref" references can be checked for validity. Definitions are optional and only - // appear in the root schema. - validateDefinitions(schema.get(DEFS), "$path/$DEFS", depth) - - val anyOf = schema.get(ANY_OF) - val type = schema.get(TYPE) - val ref = schema.get(REF) - - verify( - (anyOf != null).xor(type != null).xor(ref != null), - path, - { "Expected exactly one of '$TYPE' or '$ANY_OF' or '$REF'." }, - ) { - // Validation cannot continue if none are set, or if more than one is set. - return - } - - validateAnyOfSchema(schema, path, depth) - validateTypeSchema(schema, path, depth) - validateRefSchema(schema, path, depth) - } - - /** - * Validates a schema if it has an `"anyOf"` field. OpenAI does not support the use of `"anyOf"` - * at the root of a JSON schema. The value of the field is expected to be an array of valid - * sub-schemas. If the schema has no `"anyOf"` field, no action is taken. - */ - private fun validateAnyOfSchema(schema: JsonNode, path: String, depth: Int) { - val anyOf = schema.get(ANY_OF) - - if (anyOf == null) return - - validateKeywords(schema, ALLOWED_KEYWORDS_ANY_OF_SUB_SCHEMA, path, depth) - - verify( - anyOf.isArray && !anyOf.isEmpty, - path, - { "'$ANY_OF' field is not a non-empty array." }, - ) { - return - } - - // Validates that the root schema does not contain an `anyOf` field. This is a restriction - // imposed by the OpenAI API specification. `anyOf` fields _can_ appear at other depths. - verify(depth != ROOT_DEPTH, path) { "Root schema contains '$ANY_OF' field." } - - // Each entry must be a valid sub-schema. - anyOf.forEachIndexed { index, subSchema -> - validateSchema(subSchema, "$path/$ANY_OF[$index]", depth + 1) - } - } - - /** - * Validates a schema if it has a `"$ref"` field. The reference is checked to ensure it - * corresponds to a valid definition, or is a reference to the root schema. Recursive references - * are allowed. If no `"$ref"` field is found in the schema, no action is taken. - */ - private fun validateRefSchema(schema: JsonNode, path: String, depth: Int) { - val ref = schema.get(REF) - - if (ref == null) return - - validateKeywords(schema, ALLOWED_KEYWORDS_REF_SUB_SCHEMA, path, depth) - - val refPath = "$path/$REF" - - verify(ref.isTextual, refPath, { "'$REF' field is not a text value." }) { - // No point checking the reference has a referent if it is definitely malformed. - return - } - verify(ref.asText() in validReferences, refPath) { - "Invalid or unsupported reference: '${ref.asText()}'." - } - } - - /** - * Validates a schema if it has a `"type"` field. This includes most sub-schemas, except those - * that have a `"$ref"` or `"anyOf"` field instead. The `"type"` field may be set to a text - * value that is the name of the type (e.g., `"object"`, `"array"`, `"number"`), or it may be - * set to an array that contains two text values: the name of the type and `"null"`. The OpenAI - * API specification explains that this is how a property can be both required (i.e., it must - * appear in the JSON document), but its value can be optional (i.e., it can be set explicitly - * to `"null"`). If the schema has no `"type"` field, no action is taken. - */ - private fun validateTypeSchema(schema: JsonNode, path: String, depth: Int) { - val type = schema.get(TYPE) - - if (type == null) return - - val typeName = - if (type.isTextual) { - // Type will be something like `"type" : "string"` - type.asText() - } else if (type.isArray) { - // Type will be something like `"type" : [ "string", "null" ]`. This corresponds to - // the use of "Optional" in Java/Kotlin. - getTypeNameFromTypeArray(type, "$path/$TYPE") - } else { - error(path) { "'$TYPE' field is not a type name or array of type names." } - return - } - - when (typeName) { - TYPE_ARRAY -> validateArraySchema(schema, path, depth) - TYPE_OBJECT -> validateObjectSchema(schema, path, depth) - - TYPE_BOOLEAN, - TYPE_INTEGER, - TYPE_NUMBER, - TYPE_STRING -> validateSimpleSchema(schema, typeName, path, depth) - - // The type name could not be determined from a type name array. An error will already - // have been logged by `getTypeNameFromTypeArray`, so no need to do anything more here. - null -> return - - else -> error("$path/$TYPE") { "Unsupported '$TYPE' value: '$typeName'." } - } - } - - /** - * Validates a schema whose `"type"` is `"object"`. It is the responsibility of the caller to - * ensure that [schema] contains that type definition. If no type, or a different type is - * present, the behavior is not defined. - */ - private fun validateObjectSchema(schema: JsonNode, path: String, depth: Int) { - validateKeywords(schema, ALLOWED_KEYWORDS_OBJECT_SUB_SCHEMA, path, depth) - - // The schema must declare that additional properties are not allowed. For this check, it - // does not matter if there are no "properties" in the schema. - verify( - schema.get(ADDITIONAL_PROPS) != null && !schema.get(ADDITIONAL_PROPS).asBoolean(), - path, - ) { - "'$ADDITIONAL_PROPS' field is missing or is not set to 'false'." - } - - val properties = schema.get(PROPS) - - // An object schema _must_ have a `"properties"` field, and it must contain at least one - // property. The AI model will report an error relating to a missing or empty `"required"` - // array if the "properties" field is missing or empty (and therefore the `"required"` array - // will also be missing or empty). This condition can arise if a `Map` is used as the field - // type: it will cause the generation of an object schema with no defined properties. If not - // present or empty, validation cannot continue. - verify( - properties != null && properties.isObject && !properties.isEmpty, - path, - { - "'$PROPS' field is missing, empty or not an object. " + - "At least one named property must be defined. See: $NO_PROPERTIES_DOC" - }, - ) { - return - } - - // Similarly, insist that the `"required"` array is present or stop validation. - val required = schema.get(REQUIRED) - - verify( - required != null && required.isArray && !required.isEmpty, - path, - { "'$REQUIRED' field is missing, empty or not an array." }, - ) { - return - } - - validatePropertiesRequired( - properties.fieldNames().asSequence().toSet(), - required, - "$path/$REQUIRED", - ) - validateProperties(properties, "$path/$PROPS", depth) - } - - /** - * Validates a schema whose `"type"` is `"array"`. It is the responsibility of the caller to - * ensure that [schema] contains that type definition. If no type, or a different type is - * present, the behavior is not defined. - * - * An array schema must have an `"items"` field whose value is an object representing a valid - * sub-schema. - */ - private fun validateArraySchema(schema: JsonNode, path: String, depth: Int) { - validateKeywords(schema, ALLOWED_KEYWORDS_ARRAY_SUB_SCHEMA, path, depth) - - val items = schema.get(ITEMS) - - verify( - items != null && items.isObject, - path, - { "'$ITEMS' field is missing or is not an object." }, - ) { - return - } - - validateSchema(items, "$path/$ITEMS", depth + 1) - } - - /** - * Validates a schema whose `"type"` is one of the supported simple type names other than - * `"object"` and `"array"`. It is the responsibility of the caller to ensure that [schema] - * contains the correct type definition. If no type, or a different type is present, the - * behavior is not defined. - * - * @param typeName The name of the specific type of the schema. Where the field value is - * optional and the type is defined as an array of a type name and a `"null"`, this is the - * value of the non-`"null"` type name. For example `"string"`, or `"number"`. - */ - private fun validateSimpleSchema(schema: JsonNode, typeName: String, path: String, depth: Int) { - val allowedKeywords = - when (typeName) { - TYPE_NUMBER, - TYPE_INTEGER -> ALLOWED_KEYWORDS_NUMBER_SUB_SCHEMA - TYPE_STRING -> ALLOWED_KEYWORDS_STRING_SUB_SCHEMA - else -> ALLOWED_KEYWORDS_SIMPLE_SUB_SCHEMA - } - - validateKeywords(schema, allowedKeywords, path, depth) - - val enumField = schema.get(ENUM) - - // OpenAI API specification: "For a single enum property with string values, the total - // string length of all enum values cannot exceed 7,500 characters when there are more than - // 250 enum values." - val isString = typeName == TYPE_STRING - var numEnumValues = 0 - var stringLength = 0 - - enumField?.forEach { value -> - // OpenAI places limits on the total string length of all enum values across all enums - // without being specific about the type of those enums (unlike for enums with string - // values, which have their own restrictions noted above). The specification does not - // indicate how to count the string length for boolean or number values. Here it is - // assumed that their simple string representations should be counted. - val length = value.asText().length - - totalStringLength += length - totalEnumValues++ - - if (isString) { - numEnumValues++ - stringLength += length - } - } - - verify( - !isString || - numEnumValues <= UNRESTRICTED_ENUM_VALUES_LIMIT || - stringLength <= MAX_ENUM_TOTAL_STRING_LENGTH, - "$path/$ENUM", - ) { - "Total string length ($stringLength) of values of an enum with $numEnumValues " + - "values exceeds limit of $MAX_ENUM_TOTAL_STRING_LENGTH." - } - - schema.get(CONST)?.let { constValue -> totalStringLength += constValue.asText().length } - } - - /** - * Validates that the definitions (if present) contain fields that each define a valid schema. - * Records the names of any definitions to construct the set of possible valid references to - * those definitions. This set will be used to validate any references from within definition - * sub-schemas, or any other sub-schemas validated at a later time. - * - * @param defs The node containing the definitions. Definitions are optional, so this node may - * be `null`. Definitions may appear in the root schema, but will not appear in any - * sub-schemas. If no definitions are present, the list of valid references will not be - * changed and no errors will be recorded. - * @param path The path that identifies the location within the schema of the `"$defs"` node. - * @param depth The current depth of nesting. If definitions are present, this will be zero, as - * that is the depth of the root schema. - */ - private fun validateDefinitions(defs: JsonNode?, path: String, depth: Int) { - // Definitions are optional. If present, expect an object whose fields are named from the - // classes the definitions were extracted from. If not present, do not continue. - verify(defs == null || defs.isObject, path, { "'$DEFS' must be an object." }) { - return - } - - // First, record the valid references to definitions, as any definition sub-schema may - // contain a reference to any other definitions sub-schema (including itself) and those - // references need to be validated. - defs?.fieldNames()?.asSequence()?.forEach { defName -> - val reference = "$path/$defName" - - // Consider that there might be duplicate definition names if two different classes - // (from different packages) have the same simple name. That would be an error, but - // there is no need to stop the validations. - // TODO: How should duplicate names be handled? Will the generator use longer names? - verify(reference !in validReferences, path) { "Duplicate definition of '$defName'." } - validReferences += reference - } - - // Second, recursively validate the definition sub-schemas. - defs?.fieldNames()?.asSequence()?.forEach { defName -> - totalStringLength += defName.length - validateSchema(defs.get(defName), "$path/$DEFS/$defName", depth + 1) - } - } - - /** - * Validates that every property in a collection of property names appears in the array of - * property names in a `"required"` field. - * - * @param propertyNames The collection of property names to check in the array of required - * properties. This collection will not be empty. - * @param required The `"required"` field. This is expected to be a non-`null` array field with - * a set of property names. - * @param path The path identifying the location of the `"required"` field within the schema. - */ - private fun validatePropertiesRequired( - propertyNames: Collection, - required: JsonNode, - path: String, - ) { - val requiredNames = required.map { it.asText() }.toSet() - - propertyNames.forEach { propertyName -> - verify(propertyName in requiredNames, path) { - "'$PROPS' field '$propertyName' is not listed as '$REQUIRED'." - } - } - } - - /** - * Validates that each named entry in the `"properties"` field of an object schema has a value - * that is a valid sub-schema. - * - * @param properties The `"properties"` field node of an object schema. - * @param path The path identifying the location of the `"properties"` field within the schema. - */ - private fun validateProperties(properties: JsonNode, path: String, depth: Int) { - val propertyNames = properties.fieldNames().asSequence().toList() - - propertyNames.forEach { propertyName -> - totalObjectProperties++ - totalStringLength += propertyName.length - validateSchema(properties.get(propertyName), "$path/$propertyName", depth + 1) - } - } - - /** - * Validates that the names of all fields in the given schema node are present in a collection - * of allowed keywords. The values associated with the keywords are _not_ validated. - * - * @param depth The nesting depth of the [schema] node. If this depth is zero, an additional set - * of allowed keywords will be included automatically for keywords that are allowed to appear - * only at the root level of the schema (e.g., `"$schema"`, `"$defs"`). - */ - private fun validateKeywords( - schema: JsonNode, - allowedKeywords: Collection, - path: String, - depth: Int, - ) { - schema.fieldNames().forEach { keyword -> - verify( - keyword in allowedKeywords || - (depth == ROOT_DEPTH && keyword in ALLOWED_KEYWORDS_ROOT_SCHEMA_ONLY), - path, - ) { - "Use of '$keyword' is not supported here." - } - } - } - - /** - * Gets the name of a type from the given `"type"` field, where the field is an array that - * contains exactly two string values: a type name and a `"null"` (in any order). - * - * @param type The type node. This must be a field with an array value. If this is not an array - * field, the behavior is undefined. It is the responsibility of the caller to ensure that - * this function is only called for array fields. - * @return The type name in the array that is not the `"null"` type; or `null` if no such type - * name was found, or if the array does not contain exactly two expected values: the type name - * and a `"null"` type. If `null`, one or more validation errors will be recorded. - */ - private fun getTypeNameFromTypeArray(type: JsonNode, path: String): String? { - val types = type.asSequence().toList() - - if (types.size == 2 && types.all { it.isTextual }) { - // Allow one type name and one "null". Be lenient about the order. Assume that there are - // no oddities like type names that are empty strings, etc., as the schemas are expected - // to be generated. - if (types[1].asText() == TYPE_NULL && types[0].asText() != TYPE_NULL) { - return types[0].asText() - } else if (types[0].asText() == TYPE_NULL && types[1].asText() != TYPE_NULL) { - return types[1].asText() - } else { - error(path) { "Expected one type name and one \"$TYPE_NULL\"." } - } - } else { - error(path) { "Expected exactly two types, both strings." } - } - - return null - } - - private inline fun verify(value: Boolean, path: String, lazyMessage: () -> Any) { - verify(value, path, lazyMessage) {} - } - - private inline fun verify( - value: Boolean, - path: String, - lazyMessage: () -> Any, - onFalse: () -> Unit, - ) { - if (!value) { - error(path, lazyMessage) - onFalse() - } - } - - private inline fun error(path: String, lazyMessage: () -> Any) { - errors.add("$path: ${lazyMessage()}") - } - - override fun toString(): String = - "${javaClass.simpleName}{isValidationComplete=$isValidationComplete, " + - "totalStringLength=$totalStringLength, " + - "totalObjectProperties=$totalObjectProperties, " + - "totalEnumValues=$totalEnumValues, errors=$errors}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/LogLevel.kt b/openai-java-core/src/main/kotlin/com/openai/core/LogLevel.kt deleted file mode 100644 index a3b2fc1e9..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/LogLevel.kt +++ /dev/null @@ -1,33 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core - -/** The level at which to log request and response information. */ -enum class LogLevel { - /** No logging. */ - OFF, - /** Minimal request and response summary logs. No headers or bodies are logged. */ - INFO, - /** [INFO] logs plus details about request failures. */ - ERROR, - /** - * Full request and response logs. Sensitive headers are redacted, but sensitive data in request - * and response bodies may still be visible. - */ - DEBUG; - - /** Returns whether this level is at or higher than the given [level]. */ - fun shouldLog(level: LogLevel): Boolean = ordinal >= level.ordinal - - companion object { - - /** Returns a [LogLevel] based on the `OPENAI_LOG` environment variable. */ - fun fromEnv() = - when (System.getenv("OPENAI_LOG")?.lowercase()) { - "info" -> INFO - "error" -> ERROR - "debug" -> DEBUG - else -> OFF - } - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/ObjectMappers.kt b/openai-java-core/src/main/kotlin/com/openai/core/ObjectMappers.kt deleted file mode 100644 index 4a3133fbd..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/ObjectMappers.kt +++ /dev/null @@ -1,180 +0,0 @@ -@file:JvmName("ObjectMappers") - -package com.openai.core - -import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.JsonParseException -import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.DeserializationFeature -import com.fasterxml.jackson.databind.MapperFeature -import com.fasterxml.jackson.databind.SerializationFeature -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.cfg.CoercionAction -import com.fasterxml.jackson.databind.cfg.CoercionInputShape -import com.fasterxml.jackson.databind.deser.std.StdDeserializer -import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.databind.module.SimpleModule -import com.fasterxml.jackson.databind.type.LogicalType -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule -import com.fasterxml.jackson.module.kotlin.kotlinModule -import java.io.InputStream -import java.time.DateTimeException -import java.time.LocalDate -import java.time.LocalDateTime -import java.time.OffsetDateTime -import java.time.ZoneId -import java.time.format.DateTimeFormatter -import java.time.temporal.ChronoField - -fun jsonMapper(): JsonMapper = JSON_MAPPER - -private val JSON_MAPPER: JsonMapper = - JsonMapper.builder() - .addModule(kotlinModule()) - .addModule(Jdk8Module()) - .addModule(JavaTimeModule()) - .addModule( - SimpleModule() - .addSerializer(InputStreamSerializer) - .addDeserializer(OffsetDateTime::class.java, LenientOffsetDateTimeDeserializer()) - ) - .withCoercionConfig(LogicalType.Boolean) { - it.setCoercion(CoercionInputShape.Integer, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Float, CoercionAction.Fail) - .setCoercion(CoercionInputShape.String, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Array, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Object, CoercionAction.Fail) - } - .withCoercionConfig(LogicalType.Integer) { - it.setCoercion(CoercionInputShape.Boolean, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Float, CoercionAction.Fail) - .setCoercion(CoercionInputShape.String, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Array, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Object, CoercionAction.Fail) - } - .withCoercionConfig(LogicalType.Float) { - it.setCoercion(CoercionInputShape.Boolean, CoercionAction.Fail) - .setCoercion(CoercionInputShape.String, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Array, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Object, CoercionAction.Fail) - } - .withCoercionConfig(LogicalType.Textual) { - it.setCoercion(CoercionInputShape.Boolean, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Integer, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Float, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Array, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Object, CoercionAction.Fail) - } - .withCoercionConfig(LogicalType.DateTime) { - it.setCoercion(CoercionInputShape.Integer, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Float, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Array, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Object, CoercionAction.Fail) - } - .withCoercionConfig(LogicalType.Array) { - it.setCoercion(CoercionInputShape.Boolean, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Integer, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Float, CoercionAction.Fail) - .setCoercion(CoercionInputShape.String, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Object, CoercionAction.Fail) - } - .withCoercionConfig(LogicalType.Collection) { - it.setCoercion(CoercionInputShape.Boolean, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Integer, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Float, CoercionAction.Fail) - .setCoercion(CoercionInputShape.String, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Object, CoercionAction.Fail) - } - .withCoercionConfig(LogicalType.Map) { - it.setCoercion(CoercionInputShape.Boolean, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Integer, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Float, CoercionAction.Fail) - .setCoercion(CoercionInputShape.String, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Object, CoercionAction.Fail) - } - .withCoercionConfig(LogicalType.POJO) { - it.setCoercion(CoercionInputShape.Boolean, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Integer, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Float, CoercionAction.Fail) - .setCoercion(CoercionInputShape.String, CoercionAction.Fail) - .setCoercion(CoercionInputShape.Array, CoercionAction.Fail) - } - .serializationInclusion(JsonInclude.Include.NON_ABSENT) - .disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE) - .disable(SerializationFeature.FLUSH_AFTER_WRITE_VALUE) - .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .disable(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) - .disable(MapperFeature.ALLOW_COERCION_OF_SCALARS) - .disable(MapperFeature.AUTO_DETECT_CREATORS) - .disable(MapperFeature.AUTO_DETECT_FIELDS) - .disable(MapperFeature.AUTO_DETECT_GETTERS) - .disable(MapperFeature.AUTO_DETECT_IS_GETTERS) - .disable(MapperFeature.AUTO_DETECT_SETTERS) - .build() - -/** A serializer that serializes [InputStream] to bytes. */ -private object InputStreamSerializer : BaseSerializer(InputStream::class) { - - private fun readResolve(): Any = InputStreamSerializer - - override fun serialize( - value: InputStream?, - gen: JsonGenerator?, - serializers: SerializerProvider?, - ) { - if (value == null) { - gen?.writeNull() - } else { - value.use { gen?.writeBinary(it.readBytes()) } - } - } -} - -/** - * A deserializer that can deserialize [OffsetDateTime] from datetimes, dates, and zoned datetimes. - */ -private class LenientOffsetDateTimeDeserializer : - StdDeserializer(OffsetDateTime::class.java) { - - companion object { - - private val DATE_TIME_FORMATTERS = - listOf( - DateTimeFormatter.ISO_LOCAL_DATE_TIME, - DateTimeFormatter.ISO_LOCAL_DATE, - DateTimeFormatter.ISO_ZONED_DATE_TIME, - ) - } - - override fun logicalType(): LogicalType = LogicalType.DateTime - - override fun deserialize(p: JsonParser, context: DeserializationContext): OffsetDateTime { - val exceptions = mutableListOf() - - for (formatter in DATE_TIME_FORMATTERS) { - try { - val temporal = formatter.parse(p.text) - - return when { - !temporal.isSupported(ChronoField.HOUR_OF_DAY) -> - LocalDate.from(temporal) - .atStartOfDay() - .atZone(ZoneId.of("UTC")) - .toOffsetDateTime() - !temporal.isSupported(ChronoField.OFFSET_SECONDS) -> - LocalDateTime.from(temporal).atZone(ZoneId.of("UTC")).toOffsetDateTime() - else -> OffsetDateTime.from(temporal) - } - } catch (e: DateTimeException) { - exceptions.add(e) - } - } - - throw JsonParseException(p, "Cannot parse `OffsetDateTime` from value: ${p.text}").apply { - exceptions.forEach { addSuppressed(it) } - } - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/Page.kt b/openai-java-core/src/main/kotlin/com/openai/core/Page.kt deleted file mode 100644 index 9c9560b41..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/Page.kt +++ /dev/null @@ -1,33 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core - -/** - * An interface representing a single page, with items of type [T], from a paginated endpoint - * response. - * - * Implementations of this interface are expected to request additional pages synchronously. For - * asynchronous pagination, see the [PageAsync] interface. - */ -interface Page { - - /** - * Returns whether there's another page after this one. - * - * The method generally doesn't make requests so the result depends entirely on the data in this - * page. If a significant amount of time has passed between requesting this page and calling - * this method, then the result could be stale. - */ - fun hasNextPage(): Boolean - - /** - * Returns the page after this one by making another request. - * - * @throws IllegalStateException if it's impossible to get the next page. This exception is - * avoidable by calling [hasNextPage] first. - */ - fun nextPage(): Page - - /** Returns the items in this page. */ - fun items(): List -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/PageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/core/PageAsync.kt deleted file mode 100644 index c67ff7916..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/PageAsync.kt +++ /dev/null @@ -1,35 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core - -import java.util.concurrent.CompletableFuture - -/** - * An interface representing a single page, with items of type [T], from a paginated endpoint - * response. - * - * Implementations of this interface are expected to request additional pages asynchronously. For - * synchronous pagination, see the [Page] interface. - */ -interface PageAsync { - - /** - * Returns whether there's another page after this one. - * - * The method generally doesn't make requests so the result depends entirely on the data in this - * page. If a significant amount of time has passed between requesting this page and calling - * this method, then the result could be stale. - */ - fun hasNextPage(): Boolean - - /** - * Returns the page after this one by making another request. - * - * @throws IllegalStateException if it's impossible to get the next page. This exception is - * avoidable by calling [hasNextPage] first. - */ - fun nextPage(): CompletableFuture> - - /** Returns the items in this page. */ - fun items(): List -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/Params.kt b/openai-java-core/src/main/kotlin/com/openai/core/Params.kt deleted file mode 100644 index 1ce472aee..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/Params.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.openai.core - -import com.openai.core.http.Headers -import com.openai.core.http.QueryParams - -/** An interface representing parameters passed to a service method. */ -interface Params { - /** The full set of headers in the parameters, including both fixed and additional headers. */ - fun _headers(): Headers - - /** - * The full set of query params in the parameters, including both fixed and additional query - * params. - */ - fun _queryParams(): QueryParams -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/PhantomReachable.kt b/openai-java-core/src/main/kotlin/com/openai/core/PhantomReachable.kt deleted file mode 100644 index a1662c173..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/PhantomReachable.kt +++ /dev/null @@ -1,56 +0,0 @@ -@file:JvmName("PhantomReachable") - -package com.openai.core - -import com.openai.errors.OpenAIException -import java.lang.reflect.InvocationTargetException - -/** - * Closes [closeable] when [observed] becomes only phantom reachable. - * - * This is a wrapper around a Java 9+ [java.lang.ref.Cleaner], or a no-op in older Java versions. - */ -@JvmSynthetic -internal fun closeWhenPhantomReachable(observed: Any, closeable: AutoCloseable) { - check(observed !== closeable) { - "`observed` cannot be the same object as `closeable` because it would never become phantom reachable" - } - closeWhenPhantomReachable(observed, closeable::close) -} - -/** - * Calls [close] when [observed] becomes only phantom reachable. - * - * This is a wrapper around a Java 9+ [java.lang.ref.Cleaner], or a no-op in older Java versions. - */ -@JvmSynthetic -internal fun closeWhenPhantomReachable(observed: Any, close: () -> Unit) { - closeWhenPhantomReachable?.let { it(observed, close) } -} - -private val closeWhenPhantomReachable: ((Any, () -> Unit) -> Unit)? by lazy { - try { - val cleanerClass = Class.forName("java.lang.ref.Cleaner") - val cleanerCreate = cleanerClass.getMethod("create") - val cleanerRegister = - cleanerClass.getMethod("register", Any::class.java, Runnable::class.java) - val cleanerObject = cleanerCreate.invoke(null); - - { observed, close -> - try { - cleanerRegister.invoke(cleanerObject, observed, Runnable { close() }) - } catch (e: ReflectiveOperationException) { - if (e is InvocationTargetException) { - when (val cause = e.cause) { - is RuntimeException, - is Error -> throw cause - } - } - throw OpenAIException("Unexpected reflective invocation failure", e) - } - } - } catch (e: ReflectiveOperationException) { - // We're running Java 8, which has no Cleaner. - null - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/PhantomReachableExecutorService.kt b/openai-java-core/src/main/kotlin/com/openai/core/PhantomReachableExecutorService.kt deleted file mode 100644 index 250071c78..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/PhantomReachableExecutorService.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.openai.core - -import java.util.concurrent.Callable -import java.util.concurrent.ExecutorService -import java.util.concurrent.Future -import java.util.concurrent.TimeUnit - -/** - * A delegating wrapper around an [ExecutorService] that shuts it down once it's only phantom - * reachable. - * - * This class ensures the [ExecutorService] is shut down even if the user forgets to do it. - */ -internal class PhantomReachableExecutorService(private val executorService: ExecutorService) : - ExecutorService { - init { - closeWhenPhantomReachable(this) { executorService.shutdown() } - } - - override fun execute(command: Runnable) = executorService.execute(command) - - override fun shutdown() = executorService.shutdown() - - override fun shutdownNow(): MutableList = executorService.shutdownNow() - - override fun isShutdown(): Boolean = executorService.isShutdown - - override fun isTerminated(): Boolean = executorService.isTerminated - - override fun awaitTermination(timeout: Long, unit: TimeUnit): Boolean = - executorService.awaitTermination(timeout, unit) - - override fun submit(task: Callable): Future = executorService.submit(task) - - override fun submit(task: Runnable, result: T): Future = - executorService.submit(task, result) - - override fun submit(task: Runnable): Future<*> = executorService.submit(task) - - override fun invokeAll( - tasks: MutableCollection> - ): MutableList> = executorService.invokeAll(tasks) - - override fun invokeAll( - tasks: MutableCollection>, - timeout: Long, - unit: TimeUnit, - ): MutableList> = executorService.invokeAll(tasks, timeout, unit) - - override fun invokeAny(tasks: MutableCollection>): T = - executorService.invokeAny(tasks) - - override fun invokeAny( - tasks: MutableCollection>, - timeout: Long, - unit: TimeUnit, - ): T = executorService.invokeAny(tasks, timeout, unit) -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/PhantomReachableSleeper.kt b/openai-java-core/src/main/kotlin/com/openai/core/PhantomReachableSleeper.kt deleted file mode 100644 index 65ec40080..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/PhantomReachableSleeper.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.openai.core - -import java.time.Duration -import java.util.concurrent.CompletableFuture - -/** - * A delegating wrapper around a [Sleeper] that closes it once it's only phantom reachable. - * - * This class ensures the [Sleeper] is closed even if the user forgets to do it. - */ -internal class PhantomReachableSleeper(private val sleeper: Sleeper) : Sleeper { - - init { - closeWhenPhantomReachable(this, sleeper) - } - - override fun sleep(duration: Duration) = sleeper.sleep(duration) - - override fun sleepAsync(duration: Duration): CompletableFuture = - sleeper.sleepAsync(duration) - - override fun close() = sleeper.close() -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/PrepareRequest.kt b/openai-java-core/src/main/kotlin/com/openai/core/PrepareRequest.kt deleted file mode 100644 index 81fee2787..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/PrepareRequest.kt +++ /dev/null @@ -1,56 +0,0 @@ -@file:JvmName("PrepareRequest") - -package com.openai.core - -import com.openai.azure.addPathSegmentsForAzure -import com.openai.azure.replaceBearerTokenForAzure -import com.openai.core.http.HttpRequest -import java.util.Optional -import java.util.concurrent.CompletableFuture -import kotlin.reflect.full.declaredFunctions - -@JvmSynthetic -internal fun HttpRequest.prepare( - clientOptions: ClientOptions, - params: Params, - security: SecurityOptions = SecurityOptions.all(), -): HttpRequest = - toBuilder() - // Clear the path segments and add them back below after the Azure path segments. - .pathSegments(listOf()) - .addPathSegmentsForAzure(clientOptions, params.modelNameOrNull()) - .addPathSegments(*pathSegments.toTypedArray()) - .putAllQueryParams(clientOptions.queryParams) - .replaceAllQueryParams(params._queryParams()) - .putAllHeaders(clientOptions.securityHeaders(security)) - .putAllHeaders(clientOptions.headers) - .replaceBearerTokenForAzure(clientOptions) - .replaceAllHeaders(params._headers()) - .build() - -@JvmSynthetic -internal fun HttpRequest.prepareAsync( - clientOptions: ClientOptions, - params: Params, - security: SecurityOptions = SecurityOptions.all(), -): CompletableFuture = - // This async version exists to make it easier to add async specific preparation logic in the - // future. - CompletableFuture.completedFuture(prepare(clientOptions, params, security)) - -@JvmSynthetic -internal fun Params.modelNameOrNull(): String? { - val modelName = - try { - this::class.declaredFunctions.find { it.name == "model" }?.call(this) - } catch (_: Exception) { - // Use `null` if `model()` takes parameters, is `private`, or other similar issues that - // prevent it from being called successfully. - null - } - - return when (modelName) { - is Optional<*> -> modelName.orElse(null)?.toString() - else -> modelName?.toString() - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/Properties.kt b/openai-java-core/src/main/kotlin/com/openai/core/Properties.kt deleted file mode 100644 index 354311006..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/Properties.kt +++ /dev/null @@ -1,42 +0,0 @@ -@file:JvmName("Properties") - -package com.openai.core - -import com.openai.client.OpenAIClient - -fun getOsArch(): String { - val osArch = System.getProperty("os.arch") - - return when (osArch) { - null -> "unknown" - "i386", - "x32", - "x86" -> "x32" - "amd64", - "x86_64" -> "x64" - "arm" -> "arm" - "aarch64" -> "arm64" - else -> "other:$osArch" - } -} - -fun getOsName(): String { - val osName = System.getProperty("os.name") - val vendorUrl = System.getProperty("java.vendor.url") - - return when { - osName == null -> "Unknown" - osName.startsWith("Linux") && vendorUrl == "http://www.android.com/" -> "Android" - osName.startsWith("Linux") -> "Linux" - osName.startsWith("Mac OS") -> "MacOS" - osName.startsWith("Windows") -> "Windows" - else -> "Other:$osName" - } -} - -fun getOsVersion(): String = System.getProperty("os.version", "unknown") ?: "unknown" - -fun getPackageVersion(): String = - OpenAIClient::class.java.`package`?.implementationVersion ?: "unknown" - -fun getJavaVersion(): String = System.getProperty("java.version", "unknown") ?: "unknown" diff --git a/openai-java-core/src/main/kotlin/com/openai/core/RequestOptions.kt b/openai-java-core/src/main/kotlin/com/openai/core/RequestOptions.kt deleted file mode 100644 index bf5b28b09..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/RequestOptions.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.openai.core - -import java.time.Duration - -class RequestOptions private constructor(val responseValidation: Boolean?, val timeout: Timeout?) { - - companion object { - - private val NONE = builder().build() - - @JvmStatic fun none() = NONE - - @JvmSynthetic - internal fun from(clientOptions: ClientOptions): RequestOptions = - builder() - .responseValidation(clientOptions.responseValidation) - .timeout(clientOptions.timeout) - .build() - - @JvmStatic fun builder() = Builder() - } - - fun applyDefaults(options: RequestOptions): RequestOptions = - RequestOptions( - responseValidation = responseValidation ?: options.responseValidation, - timeout = - if (options.timeout != null && timeout != null) timeout.assign(options.timeout) - else timeout ?: options.timeout, - ) - - class Builder internal constructor() { - - private var responseValidation: Boolean? = null - private var timeout: Timeout? = null - - /** - * Whether to call `validate` on the response before returning it. - * - * Setting this to `true` is _not_ forwards compatible with new types from the API for - * existing fields. - * - * Defaults to false, which means the shape of the response will not be validated upfront. - * Instead, validation will only occur for the parts of the response that are accessed. - */ - fun responseValidation(responseValidation: Boolean) = apply { - this.responseValidation = responseValidation - } - - fun timeout(timeout: Timeout) = apply { this.timeout = timeout } - - fun timeout(timeout: Duration) = timeout(Timeout.builder().request(timeout).build()) - - fun build(): RequestOptions = RequestOptions(responseValidation, timeout) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/SecurityOptions.kt b/openai-java-core/src/main/kotlin/com/openai/core/SecurityOptions.kt deleted file mode 100644 index ea6c0df43..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/SecurityOptions.kt +++ /dev/null @@ -1,73 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core - -import java.util.Objects - -/** A class for configuring which security schemes are enabled for a request. */ -class SecurityOptions -private constructor( - /** Whether the BearerAuth security scheme is enabled. */ - @get:JvmName("bearerAuth") val bearerAuth: Boolean, - /** Whether the AdminApiKeyAuth security scheme is enabled. */ - @get:JvmName("adminApiKeyAuth") val adminApiKeyAuth: Boolean, -) { - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [SecurityOptions]. */ - @JvmStatic fun builder() = Builder() - - /** Returns a [Security] instance with all security schemes enabled. */ - @JvmStatic - fun all(): SecurityOptions = builder().bearerAuth(true).adminApiKeyAuth(true).build() - - /** Returns a [Security] instance with no security schemes enabled. */ - @JvmStatic fun none(): SecurityOptions = builder().build() - } - - /** A builder for [SecurityOptions]. */ - class Builder internal constructor() { - - private var bearerAuth: Boolean = false - private var adminApiKeyAuth: Boolean = false - - @JvmSynthetic - internal fun from(securityOptions: SecurityOptions) = apply { - bearerAuth = securityOptions.bearerAuth - adminApiKeyAuth = securityOptions.adminApiKeyAuth - } - - /** Whether the BearerAuth security scheme is enabled. */ - fun bearerAuth(bearerAuth: Boolean) = apply { this.bearerAuth = bearerAuth } - - /** Whether the AdminApiKeyAuth security scheme is enabled. */ - fun adminApiKeyAuth(adminApiKeyAuth: Boolean) = apply { - this.adminApiKeyAuth = adminApiKeyAuth - } - - /** - * Returns an immutable instance of [SecurityOptions]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): SecurityOptions = SecurityOptions(bearerAuth, adminApiKeyAuth) - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is SecurityOptions && - bearerAuth == other.bearerAuth && - adminApiKeyAuth == other.adminApiKeyAuth - } - - override fun hashCode(): Int = Objects.hash(bearerAuth, adminApiKeyAuth) - - override fun toString() = - "SecurityOptions{bearerAuth=$bearerAuth, adminApiKeyAuth=$adminApiKeyAuth}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/Sleeper.kt b/openai-java-core/src/main/kotlin/com/openai/core/Sleeper.kt deleted file mode 100644 index 788bb1c16..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/Sleeper.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.openai.core - -import java.time.Duration -import java.util.concurrent.CompletableFuture - -/** - * An interface for delaying execution for a specified amount of time. - * - * Useful for testing and cleaning up resources. - */ -interface Sleeper : AutoCloseable { - - /** Synchronously pauses execution for the given [duration]. */ - fun sleep(duration: Duration) - - /** Asynchronously pauses execution for the given [duration]. */ - fun sleepAsync(duration: Duration): CompletableFuture - - /** Overridden from [AutoCloseable] to not have a checked exception in its signature. */ - override fun close() -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/StructuredOutputs.kt b/openai-java-core/src/main/kotlin/com/openai/core/StructuredOutputs.kt deleted file mode 100644 index 36b3df529..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/StructuredOutputs.kt +++ /dev/null @@ -1,244 +0,0 @@ -package com.openai.core - -import com.fasterxml.jackson.annotation.JsonTypeName -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.SerializationFeature -import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.databind.node.ObjectNode -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule -import com.fasterxml.jackson.module.kotlin.kotlinModule -import com.github.victools.jsonschema.generator.Option -import com.github.victools.jsonschema.generator.OptionPreset -import com.github.victools.jsonschema.generator.SchemaGenerator -import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder -import com.github.victools.jsonschema.module.jackson.JacksonModule -import com.github.victools.jsonschema.module.swagger2.Swagger2Module -import com.openai.errors.OpenAIInvalidDataException -import com.openai.models.FunctionDefinition -import com.openai.models.ResponseFormatJsonSchema -import com.openai.models.chat.completions.ChatCompletionFunctionTool -import com.openai.models.chat.completions.ChatCompletionTool -import com.openai.models.responses.FunctionTool -import com.openai.models.responses.ResponseFormatTextJsonSchemaConfig -import com.openai.models.responses.ResponseTextConfig - -// The SDK `ObjectMappers.jsonMapper()` requires that all fields of classes be marked with -// `@JsonProperty`, which is not desirable in this context, as it impedes usability. Therefore, a -// custom JSON mapper configuration is required. -private val MAPPER = - JsonMapper.builder() - .addModule(kotlinModule()) - .addModule(Jdk8Module()) - .addModule(JavaTimeModule()) - .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .build() - -/** - * Builds a response format using a JSON schema derived from the structure of an arbitrary Java - * class. - */ -@JvmSynthetic -internal fun responseFormatFromClass( - type: Class<*>, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, -): ResponseFormatJsonSchema = - ResponseFormatJsonSchema.builder() - .jsonSchema( - ResponseFormatJsonSchema.JsonSchema.builder() - .name("json-schema-from-${type.simpleName}") - .schema( - JsonValue.fromJsonNode( - validateSchema(extractSchema(type), type, localValidation) - ) - ) - // Ensure the model's output strictly adheres to this JSON schema. This is the - // essential "ON switch" for Structured Outputs. - .strict(true) - .build() - ) - .build() - -/** - * Validates the given JSON schema with respect to OpenAI's JSON schema restrictions. - * - * @param schema The JSON schema to be validated. - * @param sourceType The class from which the JSON schema was derived. This is only used in error - * messages. - * @param localValidation Set to [JsonSchemaLocalValidation.YES] to perform the validation. Other - * values will cause validation to be skipped. - */ -@JvmSynthetic -internal fun validateSchema( - schema: ObjectNode, - sourceType: Class<*>, - localValidation: JsonSchemaLocalValidation, -): ObjectNode { - if (localValidation == JsonSchemaLocalValidation.YES) { - val validator = JsonSchemaValidator.create().validate(schema) - - require(validator.isValid()) { - "Local validation failed for JSON schema derived from $sourceType:\n" + - validator.errors().joinToString("\n") { " - $it" } - } - } - return schema -} - -/** Builds a text configuration's JSON schema, deriving it from the structure of a class. */ -@JvmSynthetic -internal fun jsonSchemaFromClass( - type: Class<*>, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, -): ResponseFormatTextJsonSchemaConfig = - ResponseFormatTextJsonSchemaConfig.builder() - .name("json-schema-from-${type.simpleName}") - .schema(JsonValue.fromJsonNode(validateSchema(extractSchema(type), type, localValidation))) - // Ensure the model's output strictly adheres to this JSON schema. This is the essential - // "ON switch" for Structured Outputs. - .strict(true) - .build() - -/** - * Builds a text configuration with its format set to a JSON schema derived from the structure of an - * arbitrary Java class. - */ -@JvmSynthetic -internal fun textConfigFromClass( - type: Class<*>, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, -): ResponseTextConfig = - ResponseTextConfig.builder().format(jsonSchemaFromClass(type, localValidation)).build() - -// "internal" instead of "private" for testing purposes. -internal data class FunctionInfo(val name: String, val description: String?, val schema: ObjectNode) - -@JvmSynthetic -// "internal" instead of "private" for testing purposes. -internal fun extractFunctionInfo( - parametersType: Class<*>, - localValidation: JsonSchemaLocalValidation, -): FunctionInfo { - val schema = extractSchema(parametersType) - - validateSchema(schema, parametersType, localValidation) - - // The JSON schema generator ignores the `@JsonTypeName` annotation, so it never sets the "name" - // field at the root of the schema. Respect that annotation here and use it to set the name - // (outside the schema). Fall back to using the simple name of the class. - val name = - parametersType.getAnnotation(JsonTypeName::class.java)?.value ?: parametersType.simpleName - - // The JSON schema generator will copy the `@JsonClassDescription` into the schema. If present, - // remove it from the schema so it can be set on the function definition/tool. - val descriptionNode: JsonNode? = schema.remove("description") - val description: String? = descriptionNode?.textValue() - - return FunctionInfo(name, description, schema) -} - -/** - * Creates a Chat Completions API tool defining a function whose input parameters are derived from - * the fields of a class. - */ -@JvmSynthetic -internal fun functionToolFromClass( - parametersType: Class<*>, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, -): ChatCompletionTool { - val functionInfo = extractFunctionInfo(parametersType, localValidation) - - return ChatCompletionTool.ofFunction( - ChatCompletionFunctionTool.builder() - .function( - FunctionDefinition.builder() - .name(functionInfo.name) - .apply { functionInfo.description?.let(::description) } - .parameters(JsonValue.fromJsonNode(functionInfo.schema)) - // OpenAI: "Setting strict to true will ensure function calls reliably adhere to - // the function schema, instead of being best effort. We recommend always - // enabling strict mode." - .strict(true) - .build() - ) - .build() - ) -} - -/** - * Creates a Responses API function tool defining a function whose input parameters are derived from - * the fields of a class. - */ -@JvmSynthetic -internal fun responseFunctionToolFromClass( - parametersType: Class<*>, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, -): FunctionTool { - val functionInfo = extractFunctionInfo(parametersType, localValidation) - - return FunctionTool.builder() - .name(functionInfo.name) - .apply { functionInfo.description?.let(::description) } - .parameters(JsonValue.fromJsonNode(functionInfo.schema)) - .strict(true) - .build() -} - -/** - * Derives a JSON schema from the structure of an arbitrary Java class. - * - * Validation is not performed by this function, as it allows extraction of the schema and - * validation of the schema to be controlled more easily when unit testing, as no exceptions will be - * thrown and any recorded validation errors can be inspected at leisure by the tests. - */ -@JvmSynthetic -internal fun extractSchema(type: Class<*>): ObjectNode { - val configBuilder = - SchemaGeneratorConfigBuilder( - com.github.victools.jsonschema.generator.SchemaVersion.DRAFT_2020_12, - OptionPreset.PLAIN_JSON, - ) - // Add `"additionalProperties" : false` to all object schemas (see OpenAI). - .with(Option.FORBIDDEN_ADDITIONAL_PROPERTIES_BY_DEFAULT) - // Use `JacksonModule` to support the use of Jackson annotations to set property and - // class names and descriptions and to mark fields with `@JsonIgnore`. - .with(JacksonModule()) - // Use `Swagger2Module` to support OpenAPI Swagger 2 `@Schema` annotations to set - // property constraints (e.g., a `"pattern"` constraint for a string property). - .with(Swagger2Module()) - - configBuilder - .forFields() - // For OpenAI schemas, _all_ properties _must_ be required. Override the interpretation of - // the Jackson `required` parameter to the `@JsonProperty` annotation: it will always be - // assumed to be `true`, even if explicitly `false` and even if there is no `@JsonProperty` - // annotation present. - .withRequiredCheck { true } - - return SchemaGenerator(configBuilder.build()).generateSchema(type) -} - -/** - * Creates an instance of a Java class using data from a JSON string. The JSON data should conform - * to the JSON schema previously extracted from the Java class. - * - * @throws OpenAIInvalidDataException If the JSON data cannot be parsed to an instance of the - * [responseType] class. - */ -@JvmSynthetic -internal fun responseTypeFromJson(json: String, responseType: Class): T = - try { - MAPPER.readValue(json, responseType) - } catch (e: Exception) { - // The JSON document is included in the exception message to aid diagnosis of the problem. - // It is the responsibility of the SDK user to ensure that exceptions that may contain - // sensitive data are not exposed in logs. - throw OpenAIInvalidDataException("Error parsing JSON: $json", e) - } - -/** - * Converts any object into a JSON-formatted string. For `Object` types (other than strings and - * boxed primitives) a JSON object is created with its fields and values set from the fields of the - * object. - */ -@JvmSynthetic internal fun toJsonString(obj: Any): String = MAPPER.writeValueAsString(obj) diff --git a/openai-java-core/src/main/kotlin/com/openai/core/Timeout.kt b/openai-java-core/src/main/kotlin/com/openai/core/Timeout.kt deleted file mode 100644 index 092fcc66a..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/Timeout.kt +++ /dev/null @@ -1,171 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core - -import java.time.Duration -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** A class containing timeouts for various processing phases of a request. */ -class Timeout -private constructor( - private val connect: Duration?, - private val read: Duration?, - private val write: Duration?, - private val request: Duration?, -) { - - /** - * The maximum time allowed to establish a connection with a host. - * - * A value of [Duration.ZERO] means there's no timeout. - * - * Defaults to `Duration.ofMinutes(1)`. - */ - fun connect(): Duration = connect ?: Duration.ofMinutes(1) - - /** - * The maximum time allowed between two data packets when waiting for the server’s response. - * - * A value of [Duration.ZERO] means there's no timeout. - * - * Defaults to `request()`. - */ - fun read(): Duration = read ?: request() - - /** - * The maximum time allowed between two data packets when sending the request to the server. - * - * A value of [Duration.ZERO] means there's no timeout. - * - * Defaults to `request()`. - */ - fun write(): Duration = write ?: request() - - /** - * The maximum time allowed for a complete HTTP call, not including retries. - * - * This includes resolving DNS, connecting, writing the request body, server processing, as well - * as reading the response body. - * - * A value of [Duration.ZERO] means there's no timeout. - * - * Defaults to `Duration.ofMinutes(10)`. - */ - fun request(): Duration = request ?: Duration.ofMinutes(10) - - fun toBuilder() = Builder().from(this) - - companion object { - - @JvmStatic fun default() = builder().build() - - /** Returns a mutable builder for constructing an instance of [Timeout]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Timeout]. */ - class Builder internal constructor() { - - private var connect: Duration? = null - private var read: Duration? = null - private var write: Duration? = null - private var request: Duration? = null - - @JvmSynthetic - internal fun from(timeout: Timeout) = apply { - connect = timeout.connect - read = timeout.read - write = timeout.write - request = timeout.request - } - - /** - * The maximum time allowed to establish a connection with a host. - * - * A value of [Duration.ZERO] means there's no timeout. - * - * Defaults to `Duration.ofMinutes(1)`. - */ - fun connect(connect: Duration?) = apply { this.connect = connect } - - /** Alias for calling [Builder.connect] with `connect.orElse(null)`. */ - fun connect(connect: Optional) = connect(connect.getOrNull()) - - /** - * The maximum time allowed between two data packets when waiting for the server’s response. - * - * A value of [Duration.ZERO] means there's no timeout. - * - * Defaults to `request()`. - */ - fun read(read: Duration?) = apply { this.read = read } - - /** Alias for calling [Builder.read] with `read.orElse(null)`. */ - fun read(read: Optional) = read(read.getOrNull()) - - /** - * The maximum time allowed between two data packets when sending the request to the server. - * - * A value of [Duration.ZERO] means there's no timeout. - * - * Defaults to `request()`. - */ - fun write(write: Duration?) = apply { this.write = write } - - /** Alias for calling [Builder.write] with `write.orElse(null)`. */ - fun write(write: Optional) = write(write.getOrNull()) - - /** - * The maximum time allowed for a complete HTTP call, not including retries. - * - * This includes resolving DNS, connecting, writing the request body, server processing, as - * well as reading the response body. - * - * A value of [Duration.ZERO] means there's no timeout. - * - * Defaults to `Duration.ofMinutes(10)`. - */ - fun request(request: Duration?) = apply { this.request = request } - - /** Alias for calling [Builder.request] with `request.orElse(null)`. */ - fun request(request: Optional) = request(request.getOrNull()) - - /** - * Returns an immutable instance of [Timeout]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Timeout = Timeout(connect, read, write, request) - } - - @JvmSynthetic - internal fun assign(target: Timeout): Timeout = - target - .toBuilder() - .apply { - connect?.let(this::connect) - read?.let(this::read) - write?.let(this::write) - request?.let(this::request) - } - .build() - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Timeout && - connect == other.connect && - read == other.read && - write == other.write && - request == other.request - } - - override fun hashCode(): Int = Objects.hash(connect, read, write, request) - - override fun toString() = - "Timeout{connect=$connect, read=$read, write=$write, request=$request}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/Utils.kt b/openai-java-core/src/main/kotlin/com/openai/core/Utils.kt deleted file mode 100644 index 14744d521..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/Utils.kt +++ /dev/null @@ -1,121 +0,0 @@ -@file:JvmName("Utils") - -package com.openai.core - -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.SortedMap -import java.util.SortedSet -import java.util.concurrent.CompletableFuture -import java.util.concurrent.locks.Lock - -@JvmSynthetic -internal fun T?.getOrThrow(name: String): T = - this ?: throw OpenAIInvalidDataException("`${name}` is not present") - -@JvmSynthetic -internal fun List.toImmutable(): List = - if (isEmpty()) Collections.emptyList() else Collections.unmodifiableList(toList()) - -@JvmSynthetic -internal fun > SortedSet.toImmutable(): SortedSet = - if (isEmpty()) Collections.emptySortedSet() - else Collections.unmodifiableSortedSet(toSortedSet(comparator() ?: Comparator.naturalOrder())) - -@JvmSynthetic -internal fun Map.toImmutable(): Map = - if (isEmpty()) immutableEmptyMap() else Collections.unmodifiableMap(toMap()) - -@JvmSynthetic internal fun immutableEmptyMap(): Map = Collections.emptyMap() - -@JvmSynthetic -internal fun , V> SortedMap.toImmutable(): SortedMap = - if (isEmpty()) Collections.emptySortedMap() - else Collections.unmodifiableSortedMap(toSortedMap(comparator())) - -/** - * Returns all elements that yield the largest value for the given function, or an empty list if - * there are zero elements. - * - * This is similar to [Sequence.maxByOrNull] except it returns _all_ elements that yield the largest - * value; not just the first one. - */ -@JvmSynthetic -internal fun > Sequence.allMaxBy(selector: (T) -> R): List { - var maxValue: R? = null - val maxElements = mutableListOf() - - val iterator = iterator() - while (iterator.hasNext()) { - val element = iterator.next() - val value = selector(element) - if (maxValue == null || value > maxValue) { - maxValue = value - maxElements.clear() - maxElements.add(element) - } else if (value == maxValue) { - maxElements.add(element) - } - } - - return maxElements -} - -/** - * Returns whether [this] is equal to [other]. - * - * This differs from [Object.equals] because it also deeply equates arrays based on their contents, - * even when there are arrays directly nested within other arrays. - */ -@JvmSynthetic -internal infix fun Any?.contentEquals(other: Any?): Boolean = - arrayOf(this).contentDeepEquals(arrayOf(other)) - -/** - * Returns a hash of the given sequence of [values]. - * - * This differs from [java.util.Objects.hash] because it also deeply hashes arrays based on their - * contents, even when there are arrays directly nested within other arrays. - */ -@JvmSynthetic internal fun contentHash(vararg values: Any?): Int = values.contentDeepHashCode() - -/** - * Returns a [String] representation of [this]. - * - * This differs from [Object.toString] because it also deeply stringifies arrays based on their - * contents, even when there are arrays directly nested within other arrays. - */ -@JvmSynthetic -internal fun Any?.contentToString(): String { - var string = arrayOf(this).contentDeepToString() - if (string.startsWith('[')) { - string = string.substring(1) - } - if (string.endsWith(']')) { - string = string.substring(0, string.length - 1) - } - return string -} - -internal interface Enum - -/** - * Executes the given [action] while holding the lock, returning a [CompletableFuture] with the - * result. - * - * @param action The asynchronous action to execute while holding the lock - * @return A [CompletableFuture] that completes with the result of the action - */ -@JvmSynthetic -internal fun Lock.withLockAsync(action: () -> CompletableFuture): CompletableFuture { - lock() - val future = - try { - action() - } catch (e: Throwable) { - unlock() - throw e - } - future.whenComplete { _, _ -> unlock() } - return future -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/Values.kt b/openai-java-core/src/main/kotlin/com/openai/core/Values.kt deleted file mode 100644 index 196140a5b..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/Values.kt +++ /dev/null @@ -1,723 +0,0 @@ -package com.openai.core - -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.ObjectCodec -import com.fasterxml.jackson.core.type.TypeReference -import com.fasterxml.jackson.databind.BeanProperty -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.JavaType -import com.fasterxml.jackson.databind.JsonDeserializer -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.databind.node.JsonNodeType.ARRAY -import com.fasterxml.jackson.databind.node.JsonNodeType.BINARY -import com.fasterxml.jackson.databind.node.JsonNodeType.BOOLEAN -import com.fasterxml.jackson.databind.node.JsonNodeType.MISSING -import com.fasterxml.jackson.databind.node.JsonNodeType.NULL -import com.fasterxml.jackson.databind.node.JsonNodeType.NUMBER -import com.fasterxml.jackson.databind.node.JsonNodeType.OBJECT -import com.fasterxml.jackson.databind.node.JsonNodeType.POJO -import com.fasterxml.jackson.databind.node.JsonNodeType.STRING -import com.fasterxml.jackson.databind.ser.std.NullSerializer -import com.openai.errors.OpenAIInvalidDataException -import java.io.InputStream -import java.util.Objects -import java.util.Optional - -/** - * A class representing a serializable JSON field. - * - * It can either be a [KnownValue] value of type [T], matching the type the SDK expects, or an - * arbitrary JSON value that bypasses the type system (via [JsonValue]). - */ -@JsonDeserialize(using = JsonField.Deserializer::class) -sealed class JsonField { - - /** - * Returns whether this field is missing, which means it will be omitted from the serialized - * JSON entirely. - */ - fun isMissing(): Boolean = this is JsonMissing - - /** Whether this field is explicitly set to `null`. */ - fun isNull(): Boolean = this is JsonNull - - /** - * Returns an [Optional] containing this field's "known" value, meaning it matches the type the - * SDK expects, or an empty [Optional] if this field contains an arbitrary [JsonValue]. - * - * This is the opposite of [asUnknown]. - */ - fun asKnown(): - Optional< - // Safe because `Optional` is effectively covariant, but Kotlin doesn't know that. - @UnsafeVariance - T - > = Optional.ofNullable((this as? KnownValue)?.value) - - /** - * Returns an [Optional] containing this field's arbitrary [JsonValue], meaning it mismatches - * the type the SDK expects, or an empty [Optional] if this field contains a "known" value. - * - * This is the opposite of [asKnown]. - */ - fun asUnknown(): Optional = Optional.ofNullable(this as? JsonValue) - - /** - * Returns an [Optional] containing this field's boolean value, or an empty [Optional] if it - * doesn't contain a boolean. - * - * This method checks for both a [KnownValue] containing a boolean and for [JsonBoolean]. - */ - fun asBoolean(): Optional = - when (this) { - is JsonBoolean -> Optional.of(value) - is KnownValue -> Optional.ofNullable(value as? Boolean) - else -> Optional.empty() - } - - /** - * Returns an [Optional] containing this field's numerical value, or an empty [Optional] if it - * doesn't contain a number. - * - * This method checks for both a [KnownValue] containing a number and for [JsonNumber]. - */ - fun asNumber(): Optional = - when (this) { - is JsonNumber -> Optional.of(value) - is KnownValue -> Optional.ofNullable(value as? Number) - else -> Optional.empty() - } - - /** - * Returns an [Optional] containing this field's string value, or an empty [Optional] if it - * doesn't contain a string. - * - * This method checks for both a [KnownValue] containing a string and for [JsonString]. - */ - fun asString(): Optional = - when (this) { - is JsonString -> Optional.of(value) - is KnownValue -> Optional.ofNullable(value as? String) - else -> Optional.empty() - } - - fun asStringOrThrow(): String = - asString().orElseThrow { OpenAIInvalidDataException("Value is not a string") } - - /** - * Returns an [Optional] containing this field's list value, or an empty [Optional] if it - * doesn't contain a list. - * - * This method checks for both a [KnownValue] containing a list and for [JsonArray]. - */ - fun asArray(): Optional> = - when (this) { - is JsonArray -> Optional.of(values) - is KnownValue -> - Optional.ofNullable( - (value as? List<*>)?.map { - try { - JsonValue.from(it) - } catch (e: IllegalArgumentException) { - // The known value is a list, but not all values are convertible to - // `JsonValue`. - return Optional.empty() - } - } - ) - else -> Optional.empty() - } - - /** - * Returns an [Optional] containing this field's map value, or an empty [Optional] if it doesn't - * contain a map. - * - * This method checks for both a [KnownValue] containing a map and for [JsonObject]. - */ - fun asObject(): Optional> = - when (this) { - is JsonObject -> Optional.of(values) - is KnownValue -> - Optional.ofNullable( - (value as? Map<*, *>) - ?.map { (key, value) -> - if (key !is String) { - return Optional.empty() - } - - val jsonValue = - try { - JsonValue.from(value) - } catch (e: IllegalArgumentException) { - // The known value is a map, but not all items are convertible - // to `JsonValue`. - return Optional.empty() - } - - key to jsonValue - } - ?.toMap() - ) - else -> Optional.empty() - } - - @JvmSynthetic - internal fun getRequired(name: String): T = - when (this) { - is KnownValue -> value - is JsonMissing -> throw OpenAIInvalidDataException("`$name` is not set") - is JsonNull -> throw OpenAIInvalidDataException("`$name` is null") - else -> throw OpenAIInvalidDataException("`$name` is invalid, received $this") - } - - @JvmSynthetic - internal fun getOptional( - name: String - ): Optional< - // Safe because `Optional` is effectively covariant, but Kotlin doesn't know that. - @UnsafeVariance - T - > = - when (this) { - is KnownValue -> Optional.of(value) - is JsonMissing, - is JsonNull -> Optional.empty() - else -> throw OpenAIInvalidDataException("`$name` is invalid, received $this") - } - - @JvmSynthetic - internal fun map(transform: (T) -> R): JsonField = - when (this) { - is KnownValue -> KnownValue.of(transform(value)) - is JsonValue -> this - } - - @JvmSynthetic internal fun accept(consume: (T) -> Unit) = asKnown().ifPresent(consume) - - /** Returns the result of calling the [visitor] method corresponding to this field's state. */ - fun accept(visitor: Visitor): R = - when (this) { - is KnownValue -> visitor.visitKnown(value) - is JsonValue -> accept(visitor as JsonValue.Visitor) - } - - /** - * An interface that defines how to map each possible state of a `JsonField` to a value of - * type [R]. - */ - interface Visitor : JsonValue.Visitor { - - fun visitKnown(value: T): R = visitDefault() - } - - companion object { - - /** Returns a [JsonField] containing the given "known" [value]. */ - @JvmStatic fun of(value: T): JsonField = KnownValue.of(value) - - /** - * Returns a [JsonField] containing the given "known" [value], or [JsonNull] if [value] is - * null. - */ - @JvmStatic - fun ofNullable(value: T?): JsonField = - when (value) { - null -> JsonNull.of() - else -> KnownValue.of(value) - } - } - - /** - * This class is a Jackson filter that can be used to exclude missing properties from objects. - * This filter should not be used directly and should instead use the @ExcludeMissing - * annotation. - */ - class IsMissing { - - override fun equals(other: Any?): Boolean = other is JsonMissing - - override fun hashCode(): Int = Objects.hash() - } - - class Deserializer(private val type: JavaType? = null) : - BaseDeserializer>(JsonField::class) { - - override fun createContextual( - context: DeserializationContext, - property: BeanProperty?, - ): JsonDeserializer> = Deserializer(context.contextualType?.containedType(0)) - - override fun ObjectCodec.deserialize(node: JsonNode): JsonField<*> = - type?.let { tryDeserialize(node, type) }?.let { of(it) } - ?: JsonValue.fromJsonNode(node) - - override fun getNullValue(context: DeserializationContext): JsonField<*> = JsonNull.of() - } -} - -/** - * A class representing an arbitrary JSON value. - * - * It is immutable and assignable to any [JsonField], regardless of its expected type (i.e. its - * generic type argument). - */ -@JsonDeserialize(using = JsonValue.Deserializer::class) -sealed class JsonValue : JsonField() { - - fun convert(type: TypeReference): R? = JSON_MAPPER.convertValue(this, type) - - fun convert(type: Class): R? = JSON_MAPPER.convertValue(this, type) - - /** Returns the result of calling the [visitor] method corresponding to this value's variant. */ - fun accept(visitor: Visitor): R = - when (this) { - is JsonMissing -> visitor.visitMissing() - is JsonNull -> visitor.visitNull() - is JsonBoolean -> visitor.visitBoolean(value) - is JsonNumber -> visitor.visitNumber(value) - is JsonString -> visitor.visitString(value) - is JsonArray -> visitor.visitArray(values) - is JsonObject -> visitor.visitObject(values) - } - - /** - * An interface that defines how to map each variant state of a [JsonValue] to a value of type - * [R]. - */ - interface Visitor { - - fun visitNull(): R = visitDefault() - - fun visitMissing(): R = visitDefault() - - fun visitBoolean(value: Boolean): R = visitDefault() - - fun visitNumber(value: Number): R = visitDefault() - - fun visitString(value: String): R = visitDefault() - - fun visitArray(values: List): R = visitDefault() - - fun visitObject(values: Map): R = visitDefault() - - /** - * The default implementation for unimplemented visitor methods. - * - * @throws IllegalArgumentException in the default implementation. - */ - fun visitDefault(): R = throw IllegalArgumentException("Unexpected value") - } - - companion object { - - private val JSON_MAPPER = jsonMapper() - - /** - * Converts the given [value] to a [JsonValue]. - * - * This method works best on primitive types, [List] values, [Map] values, and nested - * combinations of these. For example: - * ```java - * // Create primitive JSON values - * JsonValue nullValue = JsonValue.from(null); - * JsonValue booleanValue = JsonValue.from(true); - * JsonValue numberValue = JsonValue.from(42); - * JsonValue stringValue = JsonValue.from("Hello World!"); - * - * // Create a JSON array value equivalent to `["Hello", "World"]` - * JsonValue arrayValue = JsonValue.from(List.of("Hello", "World")); - * - * // Create a JSON object value equivalent to `{ "a": 1, "b": 2 }` - * JsonValue objectValue = JsonValue.from(Map.of( - * "a", 1, - * "b", 2 - * )); - * - * // Create an arbitrarily nested JSON equivalent to: - * // { - * // "a": [1, 2], - * // "b": [3, 4] - * // } - * JsonValue complexValue = JsonValue.from(Map.of( - * "a", List.of(1, 2), - * "b", List.of(3, 4) - * )); - * ``` - * - * @throws IllegalArgumentException if [value] is not JSON serializable. - */ - @JvmStatic - fun from(value: Any?): JsonValue = - when (value) { - null -> JsonNull.of() - is JsonValue -> value - else -> JSON_MAPPER.convertValue(value, JsonValue::class.java) - } - - /** - * Returns a [JsonValue] converted from the given Jackson [JsonNode]. - * - * @throws IllegalStateException for unsupported node types. - */ - @JvmStatic - fun fromJsonNode(node: JsonNode): JsonValue = - when (node.nodeType) { - MISSING -> JsonMissing.of() - NULL -> JsonNull.of() - BOOLEAN -> JsonBoolean.of(node.booleanValue()) - NUMBER -> JsonNumber.of(node.numberValue()) - STRING -> JsonString.of(node.textValue()) - ARRAY -> - JsonArray.of(node.elements().asSequence().map { fromJsonNode(it) }.toList()) - OBJECT -> - JsonObject.of( - node.fields().asSequence().map { it.key to fromJsonNode(it.value) }.toMap() - ) - BINARY, - POJO, - null -> throw IllegalStateException("Unexpected JsonNode type: ${node.nodeType}") - } - } - - class Deserializer : BaseDeserializer(JsonValue::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): JsonValue = fromJsonNode(node) - - override fun getNullValue(context: DeserializationContext?): JsonValue = JsonNull.of() - } -} - -/** - * A class representing a "known" JSON serializable value of type [T], matching the type the SDK - * expects. - * - * It is assignable to `JsonField`. - */ -class KnownValue -private constructor( - @com.fasterxml.jackson.annotation.JsonValue @get:JvmName("value") val value: T -) : JsonField() { - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is KnownValue<*> && value contentEquals other.value - } - - override fun hashCode() = contentHash(value) - - override fun toString() = value.contentToString() - - companion object { - - /** Returns a [KnownValue] containing the given [value]. */ - @JsonCreator @JvmStatic fun of(value: T) = KnownValue(value) - } -} - -/** - * A [JsonValue] representing an omitted JSON field. - * - * An instance of this class will cause a JSON field to be omitted from the serialized JSON - * entirely. - */ -@JsonSerialize(using = JsonMissing.Serializer::class) -class JsonMissing : JsonValue() { - - override fun toString() = "" - - companion object { - - private val INSTANCE: JsonMissing = JsonMissing() - - /** Returns the singleton instance of [JsonMissing]. */ - @JvmStatic fun of() = INSTANCE - } - - class Serializer : BaseSerializer(JsonMissing::class) { - - override fun serialize( - value: JsonMissing, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - throw IllegalStateException("JsonMissing cannot be serialized") - } - } -} - -/** A [JsonValue] representing a JSON `null` value. */ -@JsonSerialize(using = NullSerializer::class) -class JsonNull : JsonValue() { - - override fun toString() = "null" - - companion object { - - private val INSTANCE: JsonNull = JsonNull() - - /** Returns the singleton instance of [JsonMissing]. */ - @JsonCreator @JvmStatic fun of() = INSTANCE - } -} - -/** A [JsonValue] representing a JSON boolean value. */ -class JsonBoolean -private constructor( - @get:com.fasterxml.jackson.annotation.JsonValue @get:JvmName("value") val value: Boolean -) : JsonValue() { - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is JsonBoolean && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - - companion object { - - /** Returns a [JsonBoolean] containing the given [value]. */ - @JsonCreator @JvmStatic fun of(value: Boolean) = JsonBoolean(value) - } -} - -/** A [JsonValue] representing a JSON number value. */ -class JsonNumber -private constructor( - @get:com.fasterxml.jackson.annotation.JsonValue @get:JvmName("value") val value: Number -) : JsonValue() { - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is JsonNumber && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - - companion object { - - /** Returns a [JsonNumber] containing the given [value]. */ - @JsonCreator @JvmStatic fun of(value: Number) = JsonNumber(value) - } -} - -/** A [JsonValue] representing a JSON string value. */ -class JsonString -private constructor( - @get:com.fasterxml.jackson.annotation.JsonValue @get:JvmName("value") val value: String -) : JsonValue() { - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is JsonString && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value - - companion object { - - /** Returns a [JsonString] containing the given [value]. */ - @JsonCreator @JvmStatic fun of(value: String) = JsonString(value) - } -} - -/** A [JsonValue] representing a JSON array value. */ -class JsonArray -private constructor( - @get:com.fasterxml.jackson.annotation.JsonValue - @get:JvmName("values") - val values: List -) : JsonValue() { - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is JsonArray && values == other.values - } - - override fun hashCode() = values.hashCode() - - override fun toString() = values.toString() - - companion object { - - /** Returns a [JsonArray] containing the given [values]. */ - @JsonCreator @JvmStatic fun of(values: List) = JsonArray(values.toImmutable()) - } -} - -/** A [JsonValue] representing a JSON object value. */ -class JsonObject -private constructor( - @get:com.fasterxml.jackson.annotation.JsonValue - @get:JvmName("values") - val values: Map -) : JsonValue() { - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is JsonObject && values == other.values - } - - override fun hashCode() = values.hashCode() - - override fun toString() = values.toString() - - companion object { - - /** Returns a [JsonObject] containing the given [values]. */ - @JsonCreator - @JvmStatic - fun of(values: Map) = JsonObject(values.toImmutable()) - } -} - -/** A Jackson annotation for excluding fields set to [JsonMissing] from the serialized JSON. */ -@JacksonAnnotationsInside -@JsonInclude(JsonInclude.Include.CUSTOM, valueFilter = JsonField.IsMissing::class) -annotation class ExcludeMissing - -/** A class representing a field in a `multipart/form-data` request. */ -class MultipartField -private constructor( - /** A [JsonField] value, which will be serialized to zero or more parts. */ - @get:com.fasterxml.jackson.annotation.JsonValue @get:JvmName("value") val value: JsonField, - /** A content type for the serialized parts. */ - @get:JvmName("contentType") val contentType: String, - private val filename: String?, -) { - - companion object { - - /** - * Returns a [MultipartField] containing the given [value] as a [KnownValue]. - * - * [contentType] will be set to `application/octet-stream` if [value] is binary data, or - * `text/plain; charset=utf-8` otherwise. - */ - @JvmStatic fun of(value: T?) = builder().value(value).build() - - /** - * Returns a [MultipartField] containing the given [value]. - * - * [contentType] will be set to `application/octet-stream` if [value] is binary data, or - * `text/plain; charset=utf-8` otherwise. - */ - @JvmStatic fun of(value: JsonField) = builder().value(value).build() - - /** - * Returns a mutable builder for constructing an instance of [MultipartField]. - * - * The following fields are required: - * ```java - * .value() - * ``` - * - * If [contentType] is unset, then it will be set to `application/octet-stream` if [value] - * is binary data, or `text/plain; charset=utf-8` otherwise. - */ - @JvmStatic fun builder() = Builder() - } - - /** Returns the filename directive that will be included in the serialized field. */ - fun filename(): Optional = Optional.ofNullable(filename) - - @JvmSynthetic - internal fun map(transform: (T) -> R): MultipartField = - builder().value(value.map(transform)).contentType(contentType).filename(filename).build() - - /** A builder for [MultipartField]. */ - class Builder internal constructor() { - - private var value: JsonField? = null - private var contentType: String? = null - private var filename: String? = null - - fun value(value: JsonField) = apply { this.value = value } - - fun value(value: T?) = value(JsonField.ofNullable(value)) - - fun contentType(contentType: String) = apply { this.contentType = contentType } - - fun filename(filename: String?) = apply { this.filename = filename } - - /** Alias for calling [Builder.filename] with `filename.orElse(null)`. */ - fun filename(filename: Optional) = filename(filename.orElse(null)) - - /** - * Returns an immutable instance of [MultipartField]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .value() - * ``` - * - * If [contentType] is unset, then it will be set to `application/octet-stream` if [value] - * is binary data, or `text/plain; charset=utf-8` otherwise. - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): MultipartField { - val value = checkRequired("value", value) - return MultipartField( - value, - contentType - ?: if ( - value is KnownValue && - (value.value is InputStream || value.value is ByteArray) - ) - "application/octet-stream" - else "text/plain; charset=utf-8", - filename, - ) - } - } - - private val hashCode: Int by lazy { contentHash(value, contentType, filename) } - - override fun hashCode(): Int = hashCode - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is MultipartField<*> && - value == other.value && - contentType == other.contentType && - filename == other.filename - } - - override fun toString(): String = - "MultipartField{value=$value, contentType=$contentType, filename=$filename}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/handlers/EmptyHandler.kt b/openai-java-core/src/main/kotlin/com/openai/core/handlers/EmptyHandler.kt deleted file mode 100644 index 8fcaff241..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/handlers/EmptyHandler.kt +++ /dev/null @@ -1,12 +0,0 @@ -@file:JvmName("EmptyHandler") - -package com.openai.core.handlers - -import com.openai.core.http.HttpResponse -import com.openai.core.http.HttpResponse.Handler - -@JvmSynthetic internal fun emptyHandler(): Handler = EmptyHandlerInternal - -private object EmptyHandlerInternal : Handler { - override fun handle(response: HttpResponse): Void? = null -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/handlers/ErrorHandler.kt b/openai-java-core/src/main/kotlin/com/openai/core/handlers/ErrorHandler.kt deleted file mode 100644 index 6d6ee571c..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/handlers/ErrorHandler.kt +++ /dev/null @@ -1,93 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -@file:JvmName("ErrorHandler") - -package com.openai.core.handlers - -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.http.HttpResponse -import com.openai.core.http.HttpResponse.Handler -import com.openai.errors.BadRequestException -import com.openai.errors.InternalServerException -import com.openai.errors.NotFoundException -import com.openai.errors.PermissionDeniedException -import com.openai.errors.RateLimitException -import com.openai.errors.UnauthorizedException -import com.openai.errors.UnexpectedStatusCodeException -import com.openai.errors.UnprocessableEntityException -import com.openai.models.ErrorObject - -@JvmSynthetic -internal fun errorBodyHandler(jsonMapper: JsonMapper): Handler> { - val handler = jsonHandler(jsonMapper) - - return object : Handler> { - override fun handle(response: HttpResponse): JsonField = - try { - val node = handler.handle(response) - node.get("error")?.let { - jsonMapper.readerFor(jacksonTypeRef>()).readValue(it) - } ?: JsonValue.fromJsonNode(node) - } catch (e: Exception) { - JsonMissing.of() - } - } -} - -@JvmSynthetic -internal fun errorHandler( - errorBodyHandler: Handler> -): Handler = - object : Handler { - override fun handle(response: HttpResponse): HttpResponse = - when (val statusCode = response.statusCode()) { - in 200..299 -> response - 400 -> - throw BadRequestException.builder() - .headers(response.headers()) - .error(errorBodyHandler.handle(response)) - .build() - 401 -> - throw UnauthorizedException.builder() - .headers(response.headers()) - .error(errorBodyHandler.handle(response)) - .build() - 403 -> - throw PermissionDeniedException.builder() - .headers(response.headers()) - .error(errorBodyHandler.handle(response)) - .build() - 404 -> - throw NotFoundException.builder() - .headers(response.headers()) - .error(errorBodyHandler.handle(response)) - .build() - 422 -> - throw UnprocessableEntityException.builder() - .headers(response.headers()) - .error(errorBodyHandler.handle(response)) - .build() - 429 -> - throw RateLimitException.builder() - .headers(response.headers()) - .error(errorBodyHandler.handle(response)) - .build() - in 500..599 -> - throw InternalServerException.builder() - .statusCode(statusCode) - .headers(response.headers()) - .error(errorBodyHandler.handle(response)) - .build() - else -> - throw UnexpectedStatusCodeException.builder() - .statusCode(statusCode) - .headers(response.headers()) - .error(errorBodyHandler.handle(response)) - .build() - } - } diff --git a/openai-java-core/src/main/kotlin/com/openai/core/handlers/JsonHandler.kt b/openai-java-core/src/main/kotlin/com/openai/core/handlers/JsonHandler.kt deleted file mode 100644 index a4b4d62bc..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/handlers/JsonHandler.kt +++ /dev/null @@ -1,20 +0,0 @@ -@file:JvmName("JsonHandler") - -package com.openai.core.handlers - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.http.HttpResponse -import com.openai.core.http.HttpResponse.Handler -import com.openai.errors.OpenAIInvalidDataException - -@JvmSynthetic -internal inline fun jsonHandler(jsonMapper: JsonMapper): Handler = - object : Handler { - override fun handle(response: HttpResponse): T = - try { - jsonMapper.readValue(response.body(), jacksonTypeRef()) - } catch (e: Exception) { - throw OpenAIInvalidDataException("Error reading response", e) - } - } diff --git a/openai-java-core/src/main/kotlin/com/openai/core/handlers/SseHandler.kt b/openai-java-core/src/main/kotlin/com/openai/core/handlers/SseHandler.kt deleted file mode 100644 index 80581caf5..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/handlers/SseHandler.kt +++ /dev/null @@ -1,147 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -@file:JvmName("SseHandler") - -package com.openai.core.handlers - -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.http.HttpResponse -import com.openai.core.http.HttpResponse.Handler -import com.openai.core.http.SseMessage -import com.openai.core.http.StreamResponse -import com.openai.core.http.map -import com.openai.errors.SseException -import com.openai.models.ErrorObject - -@JvmSynthetic -internal fun sseHandler(jsonMapper: JsonMapper): Handler> = - streamHandler { response, lines -> - val state = SseState(jsonMapper) - var done = false - for (line in lines) { - // Stop emitting messages, but iterate through the full stream. - if (done) { - continue - } - - val message = state.decode(line) ?: continue - - if (message.data.startsWith("[DONE]")) { - // In this case we don't break because we still want to iterate through the full - // stream. - done = true - continue - } - - val jsonNode = - try { - message.json() ?: jsonMapper.createObjectNode() - } catch (e: Exception) { - jsonMapper.createObjectNode() - } - jsonNode.get("error")?.let { - throw SseException.builder() - .statusCode(response.statusCode()) - .headers(response.headers()) - .error( - try { - jsonMapper - .readerFor(jacksonTypeRef>()) - .readValue>(it) - } catch (e: Exception) { - JsonMissing.of() - } - ) - .build() - } - yield(message) - } - } - -private class SseState( - val jsonMapper: JsonMapper, - var event: String? = null, - val data: MutableList = mutableListOf(), - var lastId: String? = null, - var retry: Int? = null, -) { - // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation - fun decode(line: String): SseMessage? { - if (line.isEmpty()) { - return flush() - } - - if (line.startsWith(':')) { - return null - } - - val fieldName: String - var value: String - - val colonIndex = line.indexOf(':') - if (colonIndex == -1) { - fieldName = line - value = "" - } else { - fieldName = line.substring(0, colonIndex) - value = line.substring(colonIndex + 1) - } - - if (value.startsWith(' ')) { - value = value.substring(1) - } - - when (fieldName) { - "event" -> event = value - "data" -> data.add(value) - "id" -> { - if (!value.contains('\u0000')) { - lastId = value - } - } - "retry" -> value.toIntOrNull()?.let { retry = it } - } - - return null - } - - private fun flush(): SseMessage? { - // Per the SSE spec, metadata-only blocks do not dispatch an event. Check the collection - // rather than the joined data because an explicitly empty `data:` field is still an event. - if (data.isEmpty()) { - // The dispatch algorithm clears the event type buffer even when no event is emitted. - event = null - retry = null - return null - } - - val message = - SseMessage.builder() - .jsonMapper(jsonMapper) - .event(event) - .data(data.joinToString("\n")) - .id(lastId) - .retry(retry) - .build() - - // NOTE: Per the SSE spec, do not reset lastId. - event = null - data.clear() - retry = null - - return message - } -} - -@JvmSynthetic -internal inline fun Handler>.mapJson( - includeEventAndData: Boolean = false -): Handler> = - object : Handler> { - override fun handle(response: HttpResponse): StreamResponse = - this@mapJson.handle(response).map { it.json(includeEventAndData) } - } diff --git a/openai-java-core/src/main/kotlin/com/openai/core/handlers/StreamHandler.kt b/openai-java-core/src/main/kotlin/com/openai/core/handlers/StreamHandler.kt deleted file mode 100644 index 13a1949a6..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/handlers/StreamHandler.kt +++ /dev/null @@ -1,102 +0,0 @@ -@file:JvmName("StreamHandler") - -package com.openai.core.handlers - -import com.openai.core.http.HttpResponse -import com.openai.core.http.HttpResponse.Handler -import com.openai.core.http.PhantomReachableClosingStreamResponse -import com.openai.core.http.StreamResponse -import com.openai.errors.OpenAIIoException -import java.io.IOException -import java.util.stream.Stream -import kotlin.streams.asStream - -@JvmSynthetic -internal fun streamHandler( - block: suspend SequenceScope.(response: HttpResponse, lines: Sequence) -> Unit -): Handler> = - object : Handler> { - - override fun handle(response: HttpResponse): StreamResponse { - val reader = response.body().bufferedReader() - val sequence = - // Wrap in a `CloseableSequence` to avoid performing a read on the `reader` - // after it has been closed, which would throw an `IOException`. - CloseableSequence( - sequence { - reader.useLines { lines -> - block( - response, - // We wrap the `lines` instead of the top-level sequence because - // we only want to catch `IOException` from the reader; not from - // the user's own code. - IOExceptionWrappingSequence(lines), - ) - } - } - .constrainOnce() - ) - - return PhantomReachableClosingStreamResponse( - object : StreamResponse { - - override fun stream(): Stream = sequence.asStream() - - override fun close() { - sequence.close() - reader.close() - response.close() - } - } - ) - } - } - -/** A sequence that catches, wraps, and rethrows [IOException] as [OpenAIIoException]. */ -private class IOExceptionWrappingSequence(private val sequence: Sequence) : Sequence { - - override fun iterator(): Iterator { - val iterator = sequence.iterator() - return object : Iterator { - - override fun next(): T = - try { - iterator.next() - } catch (e: IOException) { - throw OpenAIIoException("Stream failed", e) - } - - override fun hasNext(): Boolean = - try { - iterator.hasNext() - } catch (e: IOException) { - throw OpenAIIoException("Stream failed", e) - } - } - } -} - -/** - * A sequence that can be closed. - * - * Once [close] is called, it will not yield more elements. It will also no longer consult the - * underlying [Iterator.hasNext] method. - */ -private class CloseableSequence(private val sequence: Sequence) : Sequence { - - private var isClosed: Boolean = false - - override fun iterator(): Iterator { - val iterator = sequence.iterator() - return object : Iterator { - - override fun next(): T = iterator.next() - - override fun hasNext(): Boolean = !isClosed && iterator.hasNext() - } - } - - fun close() { - isClosed = true - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/handlers/StringHandler.kt b/openai-java-core/src/main/kotlin/com/openai/core/handlers/StringHandler.kt deleted file mode 100644 index 5f1787a70..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/handlers/StringHandler.kt +++ /dev/null @@ -1,13 +0,0 @@ -@file:JvmName("StringHandler") - -package com.openai.core.handlers - -import com.openai.core.http.HttpResponse -import com.openai.core.http.HttpResponse.Handler - -@JvmSynthetic internal fun stringHandler(): Handler = StringHandlerInternal - -private object StringHandlerInternal : Handler { - override fun handle(response: HttpResponse): String = - response.body().readBytes().toString(Charsets.UTF_8) -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/AsyncStreamResponse.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/AsyncStreamResponse.kt deleted file mode 100644 index 019dc6aff..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/AsyncStreamResponse.kt +++ /dev/null @@ -1,157 +0,0 @@ -package com.openai.core.http - -import com.openai.core.http.AsyncStreamResponse.Handler -import java.util.Optional -import java.util.concurrent.CompletableFuture -import java.util.concurrent.Executor -import java.util.concurrent.atomic.AtomicReference - -/** - * A class providing access to an API response as an asynchronous stream of chunks of type [T], - * where each chunk can be individually processed as soon as it arrives instead of waiting on the - * full response. - */ -interface AsyncStreamResponse { - - /** - * Registers [handler] to be called for events of this stream. - * - * [handler]'s methods will be called in the client's configured or default thread pool. - * - * @throws IllegalStateException if [subscribe] has already been called. - */ - fun subscribe(handler: Handler): AsyncStreamResponse - - /** - * Registers [handler] to be called for events of this stream. - * - * [handler]'s methods will be called in the given [executor]. - * - * @throws IllegalStateException if [subscribe] has already been called. - */ - fun subscribe(handler: Handler, executor: Executor): AsyncStreamResponse - - /** - * Returns a future that completes when a stream is fully consumed, errors, or gets closed - * early. - */ - fun onCompleteFuture(): CompletableFuture - - /** - * Closes this resource, relinquishing any underlying resources. - * - * This is purposefully not inherited from [AutoCloseable] because this response should not be - * synchronously closed via try-with-resources. - */ - fun close() - - /** A class for handling streaming events. */ - fun interface Handler { - - /** Called whenever a chunk is received. */ - fun onNext(value: T) - - /** - * Called when a stream is fully consumed, errors, or gets closed early. - * - * [onNext] will not be called once this method is called. - * - * @param error Non-empty if the stream completed due to an error. - */ - fun onComplete(error: Optional) {} - } -} - -@JvmSynthetic -internal fun CompletableFuture>.toAsync(streamHandlerExecutor: Executor) = - PhantomReachableClosingAsyncStreamResponse( - object : AsyncStreamResponse { - - private val onCompleteFuture = CompletableFuture() - private val state = AtomicReference(State.NEW) - - init { - this@toAsync.whenComplete { _, error -> - // If an error occurs from the original future, then we should resolve the - // `onCompleteFuture` even if `subscribe` has not been called. - error?.let(onCompleteFuture::completeExceptionally) - } - } - - override fun subscribe(handler: Handler): AsyncStreamResponse = - subscribe(handler, streamHandlerExecutor) - - override fun subscribe( - handler: Handler, - executor: Executor, - ): AsyncStreamResponse = apply { - // TODO(JDK): Use `compareAndExchange` once targeting JDK 9. - check(state.compareAndSet(State.NEW, State.SUBSCRIBED)) { - if (state.get() == State.SUBSCRIBED) "Cannot subscribe more than once" - else "Cannot subscribe after the response is closed" - } - - this@toAsync.whenCompleteAsync( - { streamResponse, futureError -> - if (state.get() == State.CLOSED) { - // Avoid doing any work if `close` was called before the future - // completed. - return@whenCompleteAsync - } - - if (futureError != null) { - // An error occurred before we started passing chunks to the handler. - handler.onComplete(Optional.of(futureError)) - return@whenCompleteAsync - } - - var streamError: Throwable? = null - try { - streamResponse.stream().forEach(handler::onNext) - } catch (e: Throwable) { - streamError = e - } - - try { - handler.onComplete(Optional.ofNullable(streamError)) - } finally { - try { - // Notify completion via the `onCompleteFuture` as well. This is in - // a separate `try-finally` block so that we still complete the - // future if `handler.onComplete` throws. - if (streamError == null) { - onCompleteFuture.complete(null) - } else { - onCompleteFuture.completeExceptionally(streamError) - } - } finally { - close() - } - } - }, - executor, - ) - } - - override fun onCompleteFuture(): CompletableFuture = onCompleteFuture - - override fun close() { - val previousState = state.getAndSet(State.CLOSED) - if (previousState == State.CLOSED) { - return - } - - this@toAsync.whenComplete { streamResponse, error -> streamResponse?.close() } - // When the stream is closed, we should always consider it closed. If it closed due - // to an error, then we will have already completed the future earlier, and this - // will be a no-op. - onCompleteFuture.complete(null) - } - } - ) - -private enum class State { - NEW, - SUBSCRIBED, - CLOSED, -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/AuthenticatingHttpClient.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/AuthenticatingHttpClient.kt deleted file mode 100644 index cbde277af..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/AuthenticatingHttpClient.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.openai.core.http - -import com.openai.core.RequestOptions -import java.util.concurrent.CompletableFuture - -internal class AuthenticatingHttpClient( - private val delegate: HttpClient, - private val authenticator: HttpRequestAuthenticator, -) : HttpClient { - - override fun execute(request: HttpRequest, requestOptions: RequestOptions): HttpResponse = - delegate.execute(authenticator.authenticate(request), requestOptions) - - override fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture = - authenticator.authenticateAsync(request).thenCompose { authenticated -> - delegate.executeAsync(authenticated, requestOptions) - } - - override fun close() { - try { - authenticator.close() - } catch (authenticatorFailure: Throwable) { - try { - delegate.close() - } catch (delegateFailure: Throwable) { - if (delegateFailure !== authenticatorFailure) { - authenticatorFailure.addSuppressed(delegateFailure) - } - } - throw authenticatorFailure - } - delegate.close() - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/Headers.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/Headers.kt deleted file mode 100644 index 2f217023b..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/Headers.kt +++ /dev/null @@ -1,115 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core.http - -import com.openai.core.JsonArray -import com.openai.core.JsonBoolean -import com.openai.core.JsonMissing -import com.openai.core.JsonNull -import com.openai.core.JsonNumber -import com.openai.core.JsonObject -import com.openai.core.JsonString -import com.openai.core.JsonValue -import com.openai.core.toImmutable -import java.util.TreeMap - -class Headers -private constructor( - private val map: Map>, - @get:JvmName("size") val size: Int, -) { - - fun isEmpty(): Boolean = map.isEmpty() - - fun names(): Set = map.keys - - fun values(name: String): List = map[name].orEmpty() - - fun toBuilder(): Builder = Builder().putAll(map) - - companion object { - - @JvmStatic fun builder() = Builder() - } - - class Builder internal constructor() { - - private val map: MutableMap> = - TreeMap(String.CASE_INSENSITIVE_ORDER) - private var size: Int = 0 - - fun put(name: String, value: JsonValue): Builder = apply { - when (value) { - is JsonMissing, - is JsonNull -> {} - is JsonBoolean -> put(name, value.value.toString()) - is JsonNumber -> put(name, value.value.toString()) - is JsonString -> put(name, value.value) - is JsonArray -> value.values.forEach { put(name, it) } - is JsonObject -> - value.values.forEach { (nestedName, value) -> put("$name.$nestedName", value) } - } - } - - fun put(name: String, value: String) = apply { - map.getOrPut(name) { mutableListOf() }.add(value) - size++ - } - - fun put(name: String, values: Iterable) = apply { values.forEach { put(name, it) } } - - fun putAll(headers: Map>) = apply { headers.forEach(::put) } - - fun putAll(headers: Headers) = apply { - headers.names().forEach { put(it, headers.values(it)) } - } - - fun replace(name: String, value: String) = apply { - remove(name) - put(name, value) - } - - fun replace(name: String, values: Iterable) = apply { - remove(name) - put(name, values) - } - - fun replaceAll(headers: Map>) = apply { - headers.forEach(::replace) - } - - fun replaceAll(headers: Headers) = apply { - headers.names().forEach { replace(it, headers.values(it)) } - } - - fun remove(name: String) = apply { size -= map.remove(name).orEmpty().size } - - fun removeAll(names: Set) = apply { names.forEach(::remove) } - - fun clear() = apply { - map.clear() - size = 0 - } - - fun build() = - Headers( - map.mapValuesTo(TreeMap(String.CASE_INSENSITIVE_ORDER)) { (_, values) -> - values.toImmutable() - } - .toImmutable(), - size, - ) - } - - override fun hashCode(): Int = map.hashCode() - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Headers && map == other.map - } - - override fun toString(): String = "Headers{map=$map}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpClient.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/HttpClient.kt deleted file mode 100644 index 3db3a2669..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpClient.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.openai.core.http - -import com.openai.core.RequestOptions -import java.lang.AutoCloseable -import java.util.concurrent.CompletableFuture - -interface HttpClient : AutoCloseable { - - fun execute( - request: HttpRequest, - requestOptions: RequestOptions = RequestOptions.none(), - ): HttpResponse - - fun execute(request: HttpRequest): HttpResponse = execute(request, RequestOptions.none()) - - fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions = RequestOptions.none(), - ): CompletableFuture - - fun executeAsync(request: HttpRequest): CompletableFuture = - executeAsync(request, RequestOptions.none()) - - /** Overridden from [AutoCloseable] to not have a checked exception in its signature. */ - override fun close() -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpMethod.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/HttpMethod.kt deleted file mode 100644 index 2b776bbe7..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpMethod.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.openai.core.http - -enum class HttpMethod { - GET, - HEAD, - POST, - PUT, - DELETE, - CONNECT, - OPTIONS, - TRACE, - PATCH, -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequest.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequest.kt deleted file mode 100644 index 7dfa41d18..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequest.kt +++ /dev/null @@ -1,180 +0,0 @@ -package com.openai.core.http - -import com.openai.core.checkRequired -import com.openai.core.toImmutable -import java.net.URLEncoder - -class HttpRequest -private constructor( - @get:JvmName("method") val method: HttpMethod, - @get:JvmName("baseUrl") val baseUrl: String, - @get:JvmName("pathSegments") val pathSegments: List, - @get:JvmName("headers") val headers: Headers, - @get:JvmName("queryParams") val queryParams: QueryParams, - @get:JvmName("body") val body: HttpRequestBody?, -) { - - fun url(): String = buildString { - append(baseUrl) - - pathSegments.forEach { segment -> - if (!endsWith("/")) { - append("/") - } - append(URLEncoder.encode(segment, "UTF-8")) - } - - if (queryParams.isEmpty()) { - return@buildString - } - - append("?") - var isFirst = true - queryParams.keys().forEach { key -> - queryParams.values(key).forEach { value -> - if (!isFirst) { - append("&") - } - append(URLEncoder.encode(key, "UTF-8")) - append("=") - append(URLEncoder.encode(value, "UTF-8")) - isFirst = false - } - } - } - - fun toBuilder(): Builder = Builder().from(this) - - override fun toString(): String = - "HttpRequest{method=$method, baseUrl=$baseUrl, pathSegments=$pathSegments, headers=$headers, queryParams=$queryParams, body=$body}" - - companion object { - @JvmStatic fun builder() = Builder() - } - - class Builder internal constructor() { - - private var method: HttpMethod? = null - private var baseUrl: String? = null - private var pathSegments: MutableList = mutableListOf() - private var headers: Headers.Builder = Headers.builder() - private var queryParams: QueryParams.Builder = QueryParams.builder() - private var body: HttpRequestBody? = null - - @JvmSynthetic - internal fun from(request: HttpRequest) = apply { - method = request.method - baseUrl = request.baseUrl - pathSegments = request.pathSegments.toMutableList() - headers = request.headers.toBuilder() - queryParams = request.queryParams.toBuilder() - body = request.body - } - - fun method(method: HttpMethod) = apply { this.method = method } - - fun baseUrl(baseUrl: String) = apply { this.baseUrl = baseUrl } - - fun pathSegments(pathSegments: List) = apply { - this.pathSegments = pathSegments.toMutableList() - } - - fun addPathSegment(pathSegment: String) = apply { pathSegments.add(pathSegment) } - - fun addPathSegments(vararg pathSegments: String) = apply { - this.pathSegments.addAll(pathSegments) - } - - fun headers(headers: Headers) = apply { - this.headers.clear() - putAllHeaders(headers) - } - - fun headers(headers: Map>) = apply { - this.headers.clear() - putAllHeaders(headers) - } - - fun putHeader(name: String, value: String) = apply { headers.put(name, value) } - - fun putHeaders(name: String, values: Iterable) = apply { headers.put(name, values) } - - fun putAllHeaders(headers: Headers) = apply { this.headers.putAll(headers) } - - fun putAllHeaders(headers: Map>) = apply { - this.headers.putAll(headers) - } - - fun replaceHeaders(name: String, value: String) = apply { headers.replace(name, value) } - - fun replaceHeaders(name: String, values: Iterable) = apply { - headers.replace(name, values) - } - - fun replaceAllHeaders(headers: Headers) = apply { this.headers.replaceAll(headers) } - - fun replaceAllHeaders(headers: Map>) = apply { - this.headers.replaceAll(headers) - } - - fun removeHeaders(name: String) = apply { headers.remove(name) } - - fun removeAllHeaders(names: Set) = apply { headers.removeAll(names) } - - fun queryParams(queryParams: QueryParams) = apply { - this.queryParams.clear() - putAllQueryParams(queryParams) - } - - fun queryParams(queryParams: Map>) = apply { - this.queryParams.clear() - putAllQueryParams(queryParams) - } - - fun putQueryParam(key: String, value: String) = apply { queryParams.put(key, value) } - - fun putQueryParams(key: String, values: Iterable) = apply { - queryParams.put(key, values) - } - - fun putAllQueryParams(queryParams: QueryParams) = apply { - this.queryParams.putAll(queryParams) - } - - fun putAllQueryParams(queryParams: Map>) = apply { - this.queryParams.putAll(queryParams) - } - - fun replaceQueryParams(key: String, value: String) = apply { - queryParams.replace(key, value) - } - - fun replaceQueryParams(key: String, values: Iterable) = apply { - queryParams.replace(key, values) - } - - fun replaceAllQueryParams(queryParams: QueryParams) = apply { - this.queryParams.replaceAll(queryParams) - } - - fun replaceAllQueryParams(queryParams: Map>) = apply { - this.queryParams.replaceAll(queryParams) - } - - fun removeQueryParams(key: String) = apply { queryParams.remove(key) } - - fun removeAllQueryParams(keys: Set) = apply { queryParams.removeAll(keys) } - - fun body(body: HttpRequestBody) = apply { this.body = body } - - fun build(): HttpRequest = - HttpRequest( - checkRequired("method", method), - checkRequired("baseUrl", baseUrl), - pathSegments.toImmutable(), - headers.build(), - queryParams.build(), - body, - ) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequestAuthenticator.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequestAuthenticator.kt deleted file mode 100644 index 8fbf9ec3a..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequestAuthenticator.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.openai.core.http - -import java.util.concurrent.CompletableFuture - -/** - * Authenticates a fully constructed HTTP request immediately before it is sent. - * - * This hook is intended for OpenAI-owned provider integrations whose authentication depends on the - * complete request, such as AWS SigV4. It runs once per request attempt, including retries, before - * transport logging so signed headers can be redacted consistently. - */ -interface HttpRequestAuthenticator : AutoCloseable { - - fun authenticate(request: HttpRequest): HttpRequest - - fun authenticateAsync(request: HttpRequest): CompletableFuture = - try { - CompletableFuture.completedFuture(authenticate(request)) - } catch (throwable: Throwable) { - val future = CompletableFuture() - future.completeExceptionally(throwable) - future - } - - override fun close() {} -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequestBodies.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequestBodies.kt deleted file mode 100644 index 9c1e9e901..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequestBodies.kt +++ /dev/null @@ -1,243 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -@file:JvmName("HttpRequestBodies") - -package com.openai.core.http - -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.databind.node.JsonNodeType -import com.openai.core.MultipartField -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.io.ByteArrayInputStream -import java.io.InputStream -import java.io.OutputStream -import java.util.UUID -import kotlin.jvm.optionals.getOrNull - -@JvmSynthetic -internal inline fun json(jsonMapper: JsonMapper, value: T): HttpRequestBody = - object : HttpRequestBody { - private val bytes: ByteArray by lazy { jsonMapper.writeValueAsBytes(value) } - - override fun writeTo(outputStream: OutputStream) = outputStream.write(bytes) - - override fun contentType(): String = "application/json" - - override fun contentLength(): Long = bytes.size.toLong() - - override fun repeatable(): Boolean = true - - override fun close() {} - } - -@JvmSynthetic -internal fun multipartFormData( - jsonMapper: JsonMapper, - fields: Map>, -): HttpRequestBody = - MultipartBody.Builder() - .apply { - fields.forEach { (name, field) -> - val knownValue = field.value.asKnown().getOrNull() - val parts = - if (knownValue is InputStream) { - // Read directly from the `InputStream` instead of reading it all - // into memory due to the `jsonMapper` serialization below. - sequenceOf(name to knownValue) - } else { - val node = jsonMapper.valueToTree(field.value) - serializePart(name, node) - } - - parts.forEach { (name, bytes) -> - val partBody = - if (bytes is ByteArrayInputStream) { - val byteArray = bytes.readBytes() - - object : HttpRequestBody { - - override fun writeTo(outputStream: OutputStream) { - outputStream.write(byteArray) - } - - override fun contentType(): String = field.contentType - - override fun contentLength(): Long = byteArray.size.toLong() - - override fun repeatable(): Boolean = true - - override fun close() {} - } - } else { - object : HttpRequestBody { - - override fun writeTo(outputStream: OutputStream) { - bytes.copyTo(outputStream) - } - - override fun contentType(): String = field.contentType - - override fun contentLength(): Long = -1L - - override fun repeatable(): Boolean = false - - override fun close() = bytes.close() - } - } - - addPart( - MultipartBody.Part.create( - name, - field.filename().getOrNull(), - field.contentType, - partBody, - ) - ) - } - } - } - .build() - -private fun serializePart(name: String, node: JsonNode): Sequence> = - when (node.nodeType) { - JsonNodeType.MISSING, - JsonNodeType.NULL -> emptySequence() - JsonNodeType.BINARY -> sequenceOf(name to node.binaryValue().inputStream()) - JsonNodeType.STRING -> sequenceOf(name to node.textValue().byteInputStream()) - JsonNodeType.BOOLEAN -> sequenceOf(name to node.booleanValue().toString().byteInputStream()) - JsonNodeType.NUMBER -> sequenceOf(name to node.numberValue().toString().byteInputStream()) - JsonNodeType.ARRAY -> - node.elements().asSequence().flatMap { element -> serializePart("$name[]", element) } - JsonNodeType.OBJECT -> - node.fields().asSequence().flatMap { (key, value) -> - serializePart("$name[$key]", value) - } - JsonNodeType.POJO, - null -> throw OpenAIInvalidDataException("Unexpected JsonNode type: ${node.nodeType}") - } - -private class MultipartBody -private constructor(private val boundary: String, private val parts: List) : HttpRequestBody { - private val boundaryBytes: ByteArray = boundary.toByteArray() - private val contentType = "multipart/form-data; boundary=$boundary" - - // This must remain in sync with `contentLength`. - override fun writeTo(outputStream: OutputStream) { - parts.forEach { part -> - outputStream.write(DASHDASH) - outputStream.write(boundaryBytes) - outputStream.write(CRLF) - - outputStream.write(CONTENT_DISPOSITION) - outputStream.write(part.contentDisposition.toByteArray()) - outputStream.write(CRLF) - - outputStream.write(CONTENT_TYPE) - outputStream.write(part.contentType.toByteArray()) - outputStream.write(CRLF) - - outputStream.write(CRLF) - part.body.writeTo(outputStream) - outputStream.write(CRLF) - } - - outputStream.write(DASHDASH) - outputStream.write(boundaryBytes) - outputStream.write(DASHDASH) - outputStream.write(CRLF) - } - - override fun contentType(): String = contentType - - // This must remain in sync with `writeTo`. - override fun contentLength(): Long { - var byteCount = 0L - - parts.forEach { part -> - val contentLength = part.body.contentLength() - if (contentLength == -1L) { - return -1L - } - - byteCount += - DASHDASH.size + - boundaryBytes.size + - CRLF.size + - CONTENT_DISPOSITION.size + - part.contentDisposition.toByteArray().size + - CRLF.size + - CONTENT_TYPE.size + - part.contentType.toByteArray().size + - CRLF.size + - CRLF.size + - contentLength + - CRLF.size - } - - byteCount += DASHDASH.size + boundaryBytes.size + DASHDASH.size + CRLF.size - return byteCount - } - - override fun repeatable(): Boolean = parts.all { it.body.repeatable() } - - override fun close() { - parts.forEach { it.body.close() } - } - - class Builder { - private val boundary = UUID.randomUUID().toString() - private val parts: MutableList = mutableListOf() - - fun addPart(part: Part) = apply { parts.add(part) } - - fun build() = MultipartBody(boundary, parts.toImmutable()) - } - - class Part - private constructor( - val contentDisposition: String, - val contentType: String, - val body: HttpRequestBody, - ) { - companion object { - fun create( - name: String, - filename: String?, - contentType: String, - body: HttpRequestBody, - ): Part { - val disposition = buildString { - append("form-data; name=") - appendQuotedString(name) - if (filename != null) { - append("; filename=") - appendQuotedString(filename) - } - } - return Part(disposition, contentType, body) - } - } - } - - companion object { - private val CRLF = byteArrayOf('\r'.code.toByte(), '\n'.code.toByte()) - private val DASHDASH = byteArrayOf('-'.code.toByte(), '-'.code.toByte()) - private val CONTENT_DISPOSITION = "Content-Disposition: ".toByteArray() - private val CONTENT_TYPE = "Content-Type: ".toByteArray() - - private fun StringBuilder.appendQuotedString(key: String) { - append('"') - for (ch in key) { - when (ch) { - '\n' -> append("%0A") - '\r' -> append("%0D") - '"' -> append("%22") - else -> append(ch) - } - } - append('"') - } - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequestBody.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequestBody.kt deleted file mode 100644 index 55bc68a30..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpRequestBody.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.openai.core.http - -import java.io.OutputStream -import java.lang.AutoCloseable - -interface HttpRequestBody : AutoCloseable { - - fun writeTo(outputStream: OutputStream) - - fun contentType(): String? - - fun contentLength(): Long - - /** - * Determines if a request can be repeated in a meaningful way, for example before doing a - * retry. - * - * The most typical case when a request can't be retried is if the request body is being - * streamed. In this case the body data isn't available on subsequent attempts. - */ - fun repeatable(): Boolean - - /** Overridden from [AutoCloseable] to not have a checked exception in its signature. */ - override fun close() -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpResponse.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/HttpResponse.kt deleted file mode 100644 index 6ceea355d..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpResponse.kt +++ /dev/null @@ -1,30 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core.http - -import java.io.InputStream -import java.util.Optional - -interface HttpResponse : AutoCloseable { - - fun statusCode(): Int - - fun headers(): Headers - - /** - * Returns the value of the `x-request-id` header, or an empty [Optional] if there's no such - * header in the response. - */ - fun requestId(): Optional = - Optional.ofNullable(headers().values("x-request-id").firstOrNull()) - - fun body(): InputStream - - /** Overridden from [AutoCloseable] to not have a checked exception in its signature. */ - override fun close() - - interface Handler { - - fun handle(response: HttpResponse): T - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpResponseFor.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/HttpResponseFor.kt deleted file mode 100644 index bb1a56199..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/HttpResponseFor.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.openai.core.http - -import java.io.InputStream - -interface HttpResponseFor : HttpResponse { - - fun parse(): T -} - -@JvmSynthetic -internal fun HttpResponse.parseable(parse: () -> T): HttpResponseFor = - object : HttpResponseFor { - - private val parsed: T by lazy { parse() } - - override fun parse(): T = parsed - - override fun statusCode(): Int = this@parseable.statusCode() - - override fun headers(): Headers = this@parseable.headers() - - override fun body(): InputStream = this@parseable.body() - - override fun close() = this@parseable.close() - } diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/LoggingHttpClient.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/LoggingHttpClient.kt deleted file mode 100644 index 8085c82c7..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/LoggingHttpClient.kt +++ /dev/null @@ -1,636 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core.http - -import com.openai.core.LogLevel -import com.openai.core.RequestOptions -import com.openai.core.checkRequired -import com.openai.core.toImmutable -import java.io.ByteArrayOutputStream -import java.io.InputStream -import java.io.OutputStream -import java.nio.ByteBuffer -import java.nio.charset.CharacterCodingException -import java.nio.charset.Charset -import java.nio.charset.CharsetDecoder -import java.nio.charset.CodingErrorAction -import java.nio.charset.StandardCharsets -import java.time.Clock -import java.time.Duration -import java.time.OffsetDateTime -import java.util.SortedSet -import java.util.concurrent.CompletableFuture -import java.util.concurrent.CompletionException -import kotlin.time.toKotlinDuration - -/** A wrapper [HttpClient] around [httpClient] that logs request and response information. */ -class LoggingHttpClient -private constructor( - /** The underlying [HttpClient] for making requests. */ - @get:JvmName("httpClient") val httpClient: HttpClient, - /** - * Sensitive headers to redact from logs. - * - * Defaults to `Set.of("authorization", "api-key", "x-api-key", "cookie", "set-cookie")`. - */ - @get:JvmName("redactedHeaders") val redactedHeaders: SortedSet, - /** - * The clock to use for measuring request and response durations. - * - * This is primarily useful for using a fake clock in tests. - * - * Defaults to [Clock.systemUTC]. - */ - @get:JvmName("clock") val clock: Clock, - /** - * The log level to use. - * - * Pass [LogLevel.fromEnv] to read from environment variables. - */ - @get:JvmName("level") val level: LogLevel, -) : HttpClient { - - override fun execute(request: HttpRequest, requestOptions: RequestOptions): HttpResponse { - val loggingRequest = logRequest(request) - - val before = OffsetDateTime.now(clock) - val response = - try { - httpClient.execute(loggingRequest, requestOptions) - } catch (e: Throwable) { - logFailure(e, Duration.between(before, OffsetDateTime.now(clock))) - throw e - } - - val took = Duration.between(before, OffsetDateTime.now(clock)) - return logResponse(response, took) - } - - override fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture { - val loggingRequest = logRequest(request) - - val before = OffsetDateTime.now(clock) - val future = - try { - httpClient.executeAsync(loggingRequest, requestOptions) - } catch (e: Throwable) { - logFailure(e, Duration.between(before, OffsetDateTime.now(clock))) - throw e - } - return future.handle { response, error -> - val took = Duration.between(before, OffsetDateTime.now(clock)) - if (error != null) { - logFailure(unwrapCompletionException(error), took) - throw error - } - logResponse(response, took) - } - } - - private fun logRequest(request: HttpRequest): HttpRequest { - if (!level.shouldLog(LogLevel.INFO)) { - return request - } - - System.err.println( - buildString { - append("--> ${request.method} ${request.url()}") - request.body?.let { - val length = it.contentLength() - append(if (length >= 0) " ($length-byte body)" else " (unknown-length body)") - } - } - ) - - if (!level.shouldLog(LogLevel.DEBUG)) { - return request - } - - logHeaders(request.headers) - - if (request.body == null) { - System.err.println("--> END ${request.method}") - System.err.println() - return request - } - - return request - .toBuilder() - .body(LoggingHttpRequestBody(request.method, request.body)) - .build() - } - - private fun logResponse(response: HttpResponse, took: Duration): HttpResponse { - if (!level.shouldLog(LogLevel.INFO)) { - return response - } - - val contentLength = response.headers().values("Content-Length").firstOrNull()?.toIntOrNull() - System.err.println( - "<-- ${response.statusCode()} (${ - buildString { - append(took.format()) - contentLength?.let { append(", $contentLength-byte body") } - } - })" - ) - - if (!level.shouldLog(LogLevel.DEBUG)) { - return response - } - - logHeaders(response.headers()) - return LoggingHttpResponse(response) - } - - private fun logFailure(error: Throwable, took: Duration) { - if (!level.shouldLog(LogLevel.ERROR)) { - return - } - - System.err.println( - buildString { - append("<-- !! ${error.javaClass.simpleName}") - error.message?.let { append(": $it") } - append(" (${took.format()})") - } - ) - } - - private fun unwrapCompletionException(error: Throwable): Throwable = - if (error is CompletionException && error.cause != null) error.cause!! else error - - private fun logHeaders(headers: Headers) = - headers.names().forEach { name -> - headers.values(name).forEach { value -> - System.err.println("$name: ${if (redactedHeaders.contains(name)) "██" else value}") - } - } - - override fun close() = httpClient.close() - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [LoggingHttpClient]. - * - * The following fields are required: - * ```java - * .httpClient() - * .level() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [LoggingHttpClient]. */ - class Builder internal constructor() { - - private var httpClient: HttpClient? = null - private var redactedHeaders: Set = - setOf( - "authorization", - "api-key", - "x-api-key", - "x-amz-security-token", - "cookie", - "set-cookie", - ) - private var clock: Clock = Clock.systemUTC() - private var level: LogLevel? = null - - @JvmSynthetic - internal fun from(loggingHttpClient: LoggingHttpClient) = apply { - httpClient = loggingHttpClient.httpClient - redactedHeaders = loggingHttpClient.redactedHeaders - clock = loggingHttpClient.clock - level = loggingHttpClient.level - } - - /** The underlying [HttpClient] for making requests. */ - fun httpClient(httpClient: HttpClient) = apply { this.httpClient = httpClient } - - /** - * Sensitive headers to redact from logs. - * - * Defaults to `Set.of("authorization", "api-key", "x-api-key", "x-amz-security-token", - * "cookie", "set-cookie")`. - */ - fun redactedHeaders(redactedHeaders: Set) = apply { - this.redactedHeaders = redactedHeaders - } - - /** - * The clock to use for measuring request and response durations. - * - * This is primarily useful for using a fake clock in tests. - * - * Defaults to [Clock.systemUTC]. - */ - fun clock(clock: Clock) = apply { this.clock = clock } - - /** - * The log level to use. - * - * Pass [LogLevel.fromEnv] to read from environment variables. - */ - fun level(level: LogLevel) = apply { this.level = level } - - /** - * Returns an immutable instance of [LoggingHttpClient]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .httpClient() - * .level() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): LoggingHttpClient = - LoggingHttpClient( - checkRequired("httpClient", httpClient), - redactedHeaders.toSortedSet(String.CASE_INSENSITIVE_ORDER).toImmutable(), - clock, - checkRequired("level", level), - ) - } -} - -/** - * An [HttpRequestBody] wrapper that delegates to [body] while also logging line by line as it's - * written. - * - * The logging occurs in a streaming manner with minimal buffering. - */ -private class LoggingHttpRequestBody( - private val method: HttpMethod, - private val body: HttpRequestBody, -) : HttpRequestBody { - - private val charset by lazy { parseCharset(body.contentType()) } - - override fun writeTo(outputStream: OutputStream) { - val loggingOutputStream = LoggingOutputStream(outputStream, charset) - body.writeTo(loggingOutputStream) - - loggingOutputStream.flush() - System.err.println("--> END $method (${loggingOutputStream.writeCount()}-byte body)") - System.err.println() - } - - override fun contentType(): String? = body.contentType() - - override fun contentLength(): Long = body.contentLength() - - override fun repeatable(): Boolean = body.repeatable() - - override fun close() = body.close() -} - -/** - * An [OutputStream] wrapper that delegates to [outputStream] while also logging bytes line by line - * as it's written to. - * - * The written content is assumed to be in the given [charset] and the logging occurs in a streaming - * manner with minimal buffering. - */ -private class LoggingOutputStream(private val outputStream: OutputStream, charset: Charset?) : - OutputStream() { - - private val buffer = LoggingBuffer(charset) - - fun writeCount() = buffer.writeCount() - - override fun write(b: Int) { - outputStream.write(b) - buffer.write(b) - } - - override fun write(b: ByteArray, off: Int, len: Int) { - outputStream.write(b, off, len) - for (i in off until off + len) { - buffer.write(b[i].toInt() and 0xFF) - } - } - - /** Prints any currently buffered content. */ - override fun flush() { - buffer.flush() - outputStream.flush() - } - - override fun close() = outputStream.close() -} - -/** - * An [HttpResponse] wrapper that delegates to [response] while also logging line-by-line as it's - * read. - * - * The logging occurs in a streaming manner with minimal buffering. - */ -private class LoggingHttpResponse(private val response: HttpResponse) : HttpResponse { - - private val loggingBody: Lazy = lazy { - LoggingInputStream( - response.body(), - parseCharset(response.headers().values("Content-Type").firstOrNull()), - ) - } - - override fun statusCode(): Int = response.statusCode() - - override fun headers(): Headers = response.headers() - - override fun body(): InputStream = loggingBody.value - - override fun close() { - if (loggingBody.isInitialized()) { - loggingBody.value.close() - } - response.close() - } -} - -/** - * An [InputStream] wrapper that delegates to [inputStream] while also logging bytes line by line as - * it's read. - * - * The contents of [inputStream] are assumed to be in the given [charset] and the logging occurs in - * a streaming manner with minimal buffering. - */ -private class LoggingInputStream(private val inputStream: InputStream, charset: Charset?) : - InputStream() { - - private var isDone = false - private val buffer = LoggingBuffer(charset) - - override fun read(): Int { - if (isDone) { - return -1 - } - - val b = inputStream.read() - - if (b == -1) { - markDone() - return b - } - - buffer.write(b) - return b - } - - override fun read(b: ByteArray, off: Int, len: Int): Int { - if (isDone) { - return -1 - } - - val bytesRead = inputStream.read(b, off, len) - - if (bytesRead == -1) { - markDone() - return bytesRead - } - - for (i in off until off + bytesRead) { - buffer.write(b[i].toInt() and 0xFF) - } - return bytesRead - } - - override fun close() { - if (!isDone) { - markDone(closedEarly = true) - } - inputStream.close() - } - - private fun markDone(closedEarly: Boolean = false) { - isDone = true - buffer.flush() - val suffix = if (closedEarly) ", closed early" else "" - System.err.println("<-- END HTTP (${buffer.writeCount()}-byte body$suffix)") - System.err.println() - } -} - -/** - * A byte buffer that prints line by line, using the given [charset], as bytes are written to it. - * - * When [charset] is `null`, the buffer performs an upfront check to detect binary content. If - * non-whitespace ISO control characters are found in the first [PROBABLY_UTF8_CODE_POINT_LIMIT] - * code points, body logging is suppressed entirely. - */ -private class LoggingBuffer(charset: Charset?) { - - private val charset = charset ?: StandardCharsets.UTF_8 - - private val decoder: CharsetDecoder = - this.charset - .newDecoder() - .onMalformedInput(CodingErrorAction.REPORT) - .onUnmappableCharacter(CodingErrorAction.REPORT) - private var writeCount = 0 - private val buffer = ByteArrayOutputStream(128) - - /** - * Whether logging has been suppressed because the content doesn't appear to be readable text. - * - * This is only set when [charset] is `null` and the content fails the [isProbablyUtf8] check. - */ - private var suppressed = false - - /** - * Bytes accumulated for the [isProbablyUtf8] check before any lines are printed. - * - * Once the check passes (or [charset] is non-null), this is set to `null` and bytes flow - * directly to [buffer]. - */ - private var prefetchBuffer: ByteArrayOutputStream? = - if (charset != null) null else ByteArrayOutputStream(128) - - fun writeCount() = writeCount - - fun write(b: Int) { - if (writeCount == 0) { - // Print a newline before we start printing anything to separate the printed content - // from previous content. - System.err.println() - } - - writeCount++ - - if (suppressed) { - return - } - - val prefetch = prefetchBuffer - if (prefetch != null) { - prefetch.write(b) - // Continue accumulating until we have enough bytes to decide. - if (prefetch.size() < PROBABLY_UTF8_BYTE_LIMIT && b != '\n'.code) { - return - } - // We have enough bytes. Check if the content is probably UTF-8. - prefetchBuffer = null - val bytes = prefetch.toByteArray() - if (!isProbablyUtf8(bytes)) { - suppressed = true - System.err.println("(binary body omitted)") - return - } - // Content looks like UTF-8. Feed the accumulated bytes into the normal buffer. - for (byte in bytes) { - writeToBuffer(byte.toInt() and 0xFF) - } - return - } - - writeToBuffer(b) - } - - private fun writeToBuffer(b: Int) { - if (b == '\n'.code) { - flush() - return - } - - buffer.write(b) - } - - /** Prints any currently buffered content. */ - fun flush() { - if (suppressed) { - return - } - - // If we still have a prefetch buffer when flush is called (body was shorter than the - // limit), run the check now. - val prefetch = prefetchBuffer - if (prefetch != null) { - prefetchBuffer = null - val bytes = prefetch.toByteArray() - if (bytes.isEmpty()) { - return - } - if (!isProbablyUtf8(bytes)) { - suppressed = true - System.err.println("(binary body omitted)") - return - } - for (byte in bytes) { - writeToBuffer(byte.toInt() and 0xFF) - } - } - - if (buffer.size() == 0) { - return - } - - val line = - try { - decoder.decode(ByteBuffer.wrap(buffer.toByteArray())) - } catch (e: CharacterCodingException) { - "(omitted line is not valid $charset)" - } - buffer.reset() - System.err.println(line) - } -} - -/** The maximum number of code points to sample when checking if content is probably UTF-8. */ -private const val PROBABLY_UTF8_CODE_POINT_LIMIT = 64 - -/** - * The maximum number of bytes to accumulate before running the [isProbablyUtf8] check. UTF-8 code - * points are at most 4 bytes, so this accommodates [PROBABLY_UTF8_CODE_POINT_LIMIT] code points. - */ -private const val PROBABLY_UTF8_BYTE_LIMIT = PROBABLY_UTF8_CODE_POINT_LIMIT * 4 - -/** - * Returns `true` if the given [bytes] probably contain human-readable UTF-8 text. - * - * Decodes up to [PROBABLY_UTF8_CODE_POINT_LIMIT] code points and returns `false` if any - * non-whitespace ISO control characters are found, or if the bytes are not valid UTF-8. - */ -private fun isProbablyUtf8(bytes: ByteArray): Boolean { - try { - val decoder = - StandardCharsets.UTF_8.newDecoder() - .onMalformedInput(CodingErrorAction.REPORT) - .onUnmappableCharacter(CodingErrorAction.REPORT) - val charBuffer = decoder.decode(ByteBuffer.wrap(bytes)) - var codePointCount = 0 - var i = 0 - while (i < charBuffer.length && codePointCount < PROBABLY_UTF8_CODE_POINT_LIMIT) { - val codePoint = Character.codePointAt(charBuffer, i) - if (Character.isISOControl(codePoint) && !Character.isWhitespace(codePoint)) { - return false - } - i += Character.charCount(codePoint) - codePointCount++ - } - return true - } catch (e: CharacterCodingException) { - return false - } -} - -/** Returns the [Charset] in the given [contentType] string, or `null` if unspecified. */ -private fun parseCharset(contentType: String?): Charset? = - contentType - ?.split(";") - ?.drop(1) - ?.map { it.trim() } - ?.firstOrNull { it.startsWith("charset=", ignoreCase = true) } - ?.substringAfter("=") - ?.trim() - ?.removeSurrounding("\"") - ?.let { runCatching { charset(it) }.getOrNull() } - -/** Formats the [Duration] into a string like "1m 40s 467ms". */ -private fun Duration.format(): String = - toKotlinDuration().toComponents { days, hours, minutes, seconds, nanoseconds -> - buildString { - val milliseconds = nanoseconds / 1_000_000 - if (days > 0) { - append("${days}d") - } - if (hours > 0) { - if (isNotEmpty()) { - append(" ") - } - append("${hours}h") - } - if (minutes > 0) { - if (isNotEmpty()) { - append(" ") - } - append("${minutes}m") - } - if (seconds > 0) { - if (isNotEmpty()) { - append(" ") - } - append("${seconds}s") - } - if (milliseconds > 0) { - if (isNotEmpty()) { - append(" ") - } - append("${milliseconds}ms") - } - - if (isEmpty()) { - append("0s") - } - } - } diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingAsyncStreamResponse.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingAsyncStreamResponse.kt deleted file mode 100644 index 8c32247d8..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingAsyncStreamResponse.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.openai.core.http - -import com.openai.core.closeWhenPhantomReachable -import com.openai.core.http.AsyncStreamResponse.Handler -import java.util.Optional -import java.util.concurrent.CompletableFuture -import java.util.concurrent.Executor - -/** - * A delegating wrapper around an `AsyncStreamResponse` that closes it once it's only phantom - * reachable. - * - * This class ensures the `AsyncStreamResponse` is closed even if the user forgets to close it. - */ -internal class PhantomReachableClosingAsyncStreamResponse( - private val asyncStreamResponse: AsyncStreamResponse -) : AsyncStreamResponse { - - /** - * An object used for keeping `asyncStreamResponse` open while the object is still reachable. - */ - private val reachabilityTracker = Object() - - init { - closeWhenPhantomReachable(reachabilityTracker, asyncStreamResponse::close) - } - - override fun subscribe(handler: Handler): AsyncStreamResponse = apply { - asyncStreamResponse.subscribe(TrackedHandler(handler, reachabilityTracker)) - } - - override fun subscribe(handler: Handler, executor: Executor): AsyncStreamResponse = - apply { - asyncStreamResponse.subscribe(TrackedHandler(handler, reachabilityTracker), executor) - } - - override fun onCompleteFuture(): CompletableFuture = - asyncStreamResponse.onCompleteFuture() - - override fun close() = asyncStreamResponse.close() -} - -/** - * A wrapper around a `Handler` that also references a `reachabilityTracker` object. - * - * Referencing the `reachabilityTracker` object prevents it from getting reclaimed while the handler - * is still reachable. - */ -private class TrackedHandler( - private val handler: Handler, - private val reachabilityTracker: Any, -) : Handler { - override fun onNext(value: T) = handler.onNext(value) - - override fun onComplete(error: Optional) = handler.onComplete(error) -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingHttpClient.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingHttpClient.kt deleted file mode 100644 index 4d891cc69..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingHttpClient.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.openai.core.http - -import com.openai.core.RequestOptions -import com.openai.core.closeWhenPhantomReachable -import java.util.concurrent.CompletableFuture - -/** - * A delegating wrapper around an `HttpClient` that closes it once it's only phantom reachable. - * - * This class ensures the `HttpClient` is closed even if the user forgets to close it. - */ -internal class PhantomReachableClosingHttpClient(private val httpClient: HttpClient) : HttpClient { - init { - closeWhenPhantomReachable(this, httpClient) - } - - override fun execute(request: HttpRequest, requestOptions: RequestOptions): HttpResponse = - httpClient.execute(request, requestOptions) - - override fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture = httpClient.executeAsync(request, requestOptions) - - override fun close() = httpClient.close() -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingHttpRequestAuthenticator.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingHttpRequestAuthenticator.kt deleted file mode 100644 index c4679e598..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingHttpRequestAuthenticator.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.openai.core.http - -import com.openai.core.closeWhenPhantomReachable -import java.util.concurrent.CompletableFuture - -/** - * A delegating wrapper around an authenticator that closes it once it's only phantom reachable. - * - * This lets provider integrations release owned resources even if the user forgets to close the - * client. - */ -internal class PhantomReachableClosingHttpRequestAuthenticator( - private val authenticator: HttpRequestAuthenticator -) : HttpRequestAuthenticator { - init { - closeWhenPhantomReachable(this, authenticator) - } - - override fun authenticate(request: HttpRequest): HttpRequest = - authenticator.authenticate(request) - - override fun authenticateAsync(request: HttpRequest): CompletableFuture = - authenticator.authenticateAsync(request) - - override fun close() = authenticator.close() -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingStreamResponse.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingStreamResponse.kt deleted file mode 100644 index 4321edb49..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingStreamResponse.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.openai.core.http - -import com.openai.core.closeWhenPhantomReachable -import java.util.stream.Stream - -/** - * A delegating wrapper around a `StreamResponse` that closes it once it's only phantom reachable. - * - * This class ensures the `StreamResponse` is closed even if the user forgets to close it. - */ -internal class PhantomReachableClosingStreamResponse( - private val streamResponse: StreamResponse -) : StreamResponse { - init { - closeWhenPhantomReachable(this, streamResponse) - } - - override fun stream(): Stream = streamResponse.stream() - - override fun close() = streamResponse.close() -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/ProxyAuthenticator.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/ProxyAuthenticator.kt deleted file mode 100644 index 254976690..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/ProxyAuthenticator.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.openai.core.http - -import java.net.Proxy -import java.nio.charset.Charset -import java.nio.charset.StandardCharsets -import java.util.Base64 -import java.util.Optional - -/** - * Provides credentials when an HTTP proxy responds with `407 Proxy Authentication Required`. - * - * Implementations inspect the 407 [response] (typically its `Proxy-Authenticate` header) and return - * the request to retry with a `Proxy-Authorization` header set, or [Optional.empty] to abandon - * authentication and surface the 407 to the caller. - * - * Implementations must be thread-safe; they may be invoked concurrently from multiple HTTP calls. - */ -fun interface ProxyAuthenticator { - - /** - * @param proxy the proxy that produced the challenge, or [Proxy.NO_PROXY] if the route is not - * yet established - * @param request the request that produced [response] - * @param response the 407 challenge response - * @return the retry request to send (typically [request] with a `Proxy-Authorization` header - * added), or [Optional.empty] to abandon authentication - */ - fun authenticate( - proxy: Proxy, - request: HttpRequest, - response: HttpResponse, - ): Optional - - companion object { - - /** - * A [ProxyAuthenticator] that uses RFC 7617 Basic authentication with the ISO-8859-1 - * charset. - */ - @JvmStatic - fun basic(username: String, password: String): ProxyAuthenticator = - basic(username, password, StandardCharsets.ISO_8859_1) - - /** - * A [ProxyAuthenticator] that uses RFC 7617 Basic authentication with the given [charset]. - */ - @JvmStatic - fun basic(username: String, password: String, charset: Charset): ProxyAuthenticator { - val token = - Base64.getEncoder().encodeToString("$username:$password".toByteArray(charset)) - val headerValue = "Basic $token" - return ProxyAuthenticator { _, request, _ -> - Optional.of( - request.toBuilder().putHeader("Proxy-Authorization", headerValue).build() - ) - } - } - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/QueryParams.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/QueryParams.kt deleted file mode 100644 index 5f671fb3e..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/QueryParams.kt +++ /dev/null @@ -1,109 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core.http - -import com.openai.core.JsonArray -import com.openai.core.JsonBoolean -import com.openai.core.JsonMissing -import com.openai.core.JsonNull -import com.openai.core.JsonNumber -import com.openai.core.JsonObject -import com.openai.core.JsonString -import com.openai.core.JsonValue -import com.openai.core.toImmutable - -class QueryParams -private constructor( - private val map: Map>, - @get:JvmName("size") val size: Int, -) { - - fun isEmpty(): Boolean = map.isEmpty() - - fun keys(): Set = map.keys - - fun values(key: String): List = map[key].orEmpty() - - fun toBuilder(): Builder = Builder().putAll(map) - - companion object { - - @JvmStatic fun builder() = Builder() - } - - class Builder internal constructor() { - - private val map: MutableMap> = mutableMapOf() - private var size: Int = 0 - - fun put(key: String, value: JsonValue): Builder = apply { - when (value) { - is JsonMissing, - is JsonNull -> {} - is JsonBoolean -> put(key, value.value.toString()) - is JsonNumber -> put(key, value.value.toString()) - is JsonString -> put(key, value.value) - is JsonArray -> value.values.forEach { put("$key[]", it) } - is JsonObject -> - value.values.forEach { (nestedKey, value) -> put("$key[$nestedKey]", value) } - } - } - - fun put(key: String, value: String) = apply { - map.getOrPut(key) { mutableListOf() }.add(value) - size++ - } - - fun put(key: String, values: Iterable) = apply { values.forEach { put(key, it) } } - - fun putAll(queryParams: Map>) = apply { - queryParams.forEach(::put) - } - - fun putAll(queryParams: QueryParams) = apply { - queryParams.keys().forEach { put(it, queryParams.values(it)) } - } - - fun replace(key: String, value: String) = apply { - remove(key) - put(key, value) - } - - fun replace(key: String, values: Iterable) = apply { - remove(key) - put(key, values) - } - - fun replaceAll(queryParams: Map>) = apply { - queryParams.forEach(::replace) - } - - fun replaceAll(queryParams: QueryParams) = apply { - queryParams.keys().forEach { replace(it, queryParams.values(it)) } - } - - fun remove(key: String) = apply { size -= map.remove(key).orEmpty().size } - - fun removeAll(keys: Set) = apply { keys.forEach(::remove) } - - fun clear() = apply { - map.clear() - size = 0 - } - - fun build() = - QueryParams(map.mapValues { (_, values) -> values.toImmutable() }.toImmutable(), size) - } - - override fun hashCode(): Int = map.hashCode() - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is QueryParams && map == other.map - } - - override fun toString(): String = "QueryParams{map=$map}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/RetryingHttpClient.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/RetryingHttpClient.kt deleted file mode 100644 index b9d7eef8f..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/RetryingHttpClient.kt +++ /dev/null @@ -1,262 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core.http - -import com.openai.core.DefaultSleeper -import com.openai.core.RequestOptions -import com.openai.core.Sleeper -import com.openai.core.checkRequired -import com.openai.errors.OpenAIIoException -import com.openai.errors.OpenAIRetryableException -import java.io.IOException -import java.time.Clock -import java.time.Duration -import java.time.OffsetDateTime -import java.time.format.DateTimeFormatter -import java.time.format.DateTimeParseException -import java.time.temporal.ChronoUnit -import java.util.UUID -import java.util.concurrent.CompletableFuture -import java.util.concurrent.ThreadLocalRandom -import java.util.concurrent.TimeUnit -import java.util.function.Function -import kotlin.math.min -import kotlin.math.pow - -class RetryingHttpClient -private constructor( - private val httpClient: HttpClient, - private val sleeper: Sleeper, - private val clock: Clock, - private val maxRetries: Int, - private val idempotencyHeader: String?, -) : HttpClient { - - override fun execute(request: HttpRequest, requestOptions: RequestOptions): HttpResponse { - var modifiedRequest = maybeAddIdempotencyHeader(request) - - // Don't send the current retry count in the headers if the caller set their own value. - val shouldSendRetryCount = - !modifiedRequest.headers.names().contains("X-Stainless-Retry-Count") - - var retries = 0 - - while (true) { - if (shouldSendRetryCount) { - modifiedRequest = setRetryCountHeader(modifiedRequest, retries) - } - - if (!isRetryable(modifiedRequest)) { - return httpClient.execute(modifiedRequest, requestOptions) - } - - val response = - try { - val response = httpClient.execute(modifiedRequest, requestOptions) - if (++retries > maxRetries || !shouldRetry(response)) { - return response - } - - response - } catch (throwable: Throwable) { - if (++retries > maxRetries || !shouldRetry(throwable)) { - throw throwable - } - - null - } - - val backoffDuration = getRetryBackoffDuration(retries, response) - // All responses must be closed, so close the failed one before retrying. - response?.close() - sleeper.sleep(backoffDuration) - } - } - - override fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture { - val modifiedRequest = maybeAddIdempotencyHeader(request) - - // Don't send the current retry count in the headers if the caller set their own value. - val shouldSendRetryCount = - !modifiedRequest.headers.names().contains("X-Stainless-Retry-Count") - - var retries = 0 - - fun executeWithRetries( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture { - val requestWithRetryCount = - if (shouldSendRetryCount) setRetryCountHeader(request, retries) else request - - val responseFuture = httpClient.executeAsync(requestWithRetryCount, requestOptions) - if (!isRetryable(requestWithRetryCount)) { - return responseFuture - } - - return responseFuture - .handleAsync( - fun( - response: HttpResponse?, - throwable: Throwable?, - ): CompletableFuture { - if (response != null) { - if (++retries > maxRetries || !shouldRetry(response)) { - return CompletableFuture.completedFuture(response) - } - } else { - if (++retries > maxRetries || !shouldRetry(throwable!!)) { - val failedFuture = CompletableFuture() - failedFuture.completeExceptionally(throwable) - return failedFuture - } - } - - val backoffDuration = getRetryBackoffDuration(retries, response) - // All responses must be closed, so close the failed one before retrying. - response?.close() - return sleeper.sleepAsync(backoffDuration).thenCompose { - executeWithRetries(requestWithRetryCount, requestOptions) - } - } - ) { - // Run in the same thread. - it.run() - } - .thenCompose(Function.identity()) - } - - return executeWithRetries(modifiedRequest, requestOptions) - } - - override fun close() { - httpClient.close() - sleeper.close() - } - - private fun isRetryable(request: HttpRequest): Boolean = - // Some requests, such as when a request body is being streamed, cannot be retried because - // the body data aren't available on subsequent attempts. - request.body?.repeatable() ?: true - - private fun setRetryCountHeader(request: HttpRequest, retries: Int): HttpRequest = - request.toBuilder().replaceHeaders("X-Stainless-Retry-Count", retries.toString()).build() - - private fun idempotencyKey(): String = "stainless-java-retry-${UUID.randomUUID()}" - - private fun maybeAddIdempotencyHeader(request: HttpRequest): HttpRequest { - if (idempotencyHeader == null || request.headers.names().contains(idempotencyHeader)) { - return request - } - - return request - .toBuilder() - // Set a header to uniquely identify the request when retried. - .putHeader(idempotencyHeader, idempotencyKey()) - .build() - } - - private fun shouldRetry(response: HttpResponse): Boolean { - // Note: this is not a standard header - val shouldRetryHeader = response.headers().values("X-Should-Retry").getOrNull(0) - val statusCode = response.statusCode() - - return when { - // If the server explicitly says whether to retry, obey - shouldRetryHeader == "true" -> true - shouldRetryHeader == "false" -> false - - // Retry on request timeouts - statusCode == 408 -> true - // Retry on lock timeouts - statusCode == 409 -> true - // Retry on rate limits - statusCode == 429 -> true - // Retry internal errors - statusCode >= 500 -> true - else -> false - } - } - - private fun shouldRetry(throwable: Throwable): Boolean = - // Only retry known retryable exceptions, other exceptions are not intended to be retried. - throwable is IOException || - throwable is OpenAIIoException || - throwable is OpenAIRetryableException - - private fun getRetryBackoffDuration(retries: Int, response: HttpResponse?): Duration { - // About the Retry-After header: - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After - response - ?.headers() - ?.let { headers -> - headers - .values("Retry-After-Ms") - .getOrNull(0) - ?.toFloatOrNull() - ?.times(TimeUnit.MILLISECONDS.toNanos(1)) - ?: headers.values("Retry-After").getOrNull(0)?.let { retryAfter -> - retryAfter.toFloatOrNull()?.times(TimeUnit.SECONDS.toNanos(1)) - ?: try { - ChronoUnit.NANOS.between( - OffsetDateTime.now(clock), - OffsetDateTime.parse( - retryAfter, - DateTimeFormatter.RFC_1123_DATE_TIME, - ), - ) - } catch (e: DateTimeParseException) { - null - } - } - } - ?.let { retryAfterNanos -> - // If the API asks us to wait a certain amount of time, do what it says. - return Duration.ofNanos(retryAfterNanos.toLong()) - } - - // Apply exponential backoff, but not more than the max. - val backoffSeconds = min(0.5 * 2.0.pow(retries - 1), 8.0) - - // Apply some jitter - val jitter = 1.0 - 0.25 * ThreadLocalRandom.current().nextDouble() - - return Duration.ofNanos((TimeUnit.SECONDS.toNanos(1) * backoffSeconds * jitter).toLong()) - } - - companion object { - - @JvmStatic fun builder() = Builder() - } - - class Builder internal constructor() { - - private var httpClient: HttpClient? = null - private var sleeper: Sleeper? = null - private var clock: Clock = Clock.systemUTC() - private var maxRetries: Int = 2 - private var idempotencyHeader: String? = null - - fun httpClient(httpClient: HttpClient) = apply { this.httpClient = httpClient } - - fun sleeper(sleeper: Sleeper) = apply { this.sleeper = sleeper } - - fun clock(clock: Clock) = apply { this.clock = clock } - - fun maxRetries(maxRetries: Int) = apply { this.maxRetries = maxRetries } - - fun idempotencyHeader(header: String) = apply { this.idempotencyHeader = header } - - fun build(): HttpClient = - RetryingHttpClient( - checkRequired("httpClient", httpClient), - sleeper ?: DefaultSleeper(), - clock, - maxRetries, - idempotencyHeader, - ) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/SseMessage.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/SseMessage.kt deleted file mode 100644 index b1389fb2d..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/SseMessage.kt +++ /dev/null @@ -1,83 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core.http - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.errors.OpenAIInvalidDataException -import java.util.Objects - -internal class SseMessage -private constructor( - val jsonMapper: JsonMapper, - val event: String?, - val data: String, - val id: String?, - val retry: Int?, -) { - - companion object { - @JvmStatic fun builder() = Builder() - } - - class Builder internal constructor() { - - private var jsonMapper: JsonMapper? = null - private var event: String? = null - private var data: String = "" - private var id: String? = null - private var retry: Int? = null - - fun jsonMapper(jsonMapper: JsonMapper) = apply { this.jsonMapper = jsonMapper } - - fun event(event: String?) = apply { this.event = event } - - fun data(data: String) = apply { this.data = data } - - fun id(id: String?) = apply { this.id = id } - - fun retry(retry: Int?) = apply { this.retry = retry } - - fun build(): SseMessage = SseMessage(jsonMapper!!, event, data, id, retry) - } - - inline fun json(includeEventAndData: Boolean = false): T { - var jsonNode = jsonNode - if (includeEventAndData) { - val newJsonNode = jsonMapper.createObjectNode() - event?.let { newJsonNode.put("event", event) } - newJsonNode.replace("data", jsonNode) - jsonNode = newJsonNode - } - - try { - return jsonMapper.readerFor(jacksonTypeRef()).readValue(jsonNode) - } catch (e: Exception) { - throw OpenAIInvalidDataException("Error reading response", e) - } - } - - private val jsonNode by lazy { - try { - jsonMapper.readTree(data) - } catch (e: Exception) { - throw OpenAIInvalidDataException("Error reading response", e) - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is SseMessage && - event == other.event && - data == other.data && - id == other.id && - retry == other.retry - } - - override fun hashCode(): Int = Objects.hash(event, data, id, retry) - - override fun toString(): String = "SseMessage{event=$event, data=$data, id=$id, retry=$retry}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/StreamResponse.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/StreamResponse.kt deleted file mode 100644 index 821f21db1..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/StreamResponse.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.openai.core.http - -import java.util.stream.Stream - -interface StreamResponse : AutoCloseable { - - fun stream(): Stream - - /** Overridden from [AutoCloseable] to not have a checked exception in its signature. */ - override fun close() -} - -@JvmSynthetic -internal fun StreamResponse.map(transform: (T) -> R): StreamResponse = - object : StreamResponse { - override fun stream(): Stream = this@map.stream().map(transform) - - override fun close() = this@map.close() - } diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/WorkloadIdentityHttpClient.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/WorkloadIdentityHttpClient.kt deleted file mode 100644 index 33ed86940..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/core/http/WorkloadIdentityHttpClient.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.openai.core.http - -import com.openai.auth.WorkloadIdentityAuth -import com.openai.core.RequestOptions -import com.openai.errors.OpenAIRetryableException -import java.util.concurrent.CompletableFuture - -internal class WorkloadIdentityHttpClient( - private val delegate: HttpClient, - private val workloadIdentityAuth: WorkloadIdentityAuth?, -) : HttpClient { - - override fun execute(request: HttpRequest, requestOptions: RequestOptions): HttpResponse { - if (workloadIdentityAuth == null) { - return delegate.execute(request, requestOptions) - } - - val token = workloadIdentityAuth.getToken() - val requestWithAuth = - request.toBuilder().replaceHeaders("Authorization", "Bearer $token").build() - - val response = delegate.execute(requestWithAuth, requestOptions) - - if (response.statusCode() == 401) { - response.close() - workloadIdentityAuth.invalidateToken() - throw OpenAIRetryableException("OAuth token is expired") - } - - return response - } - - override fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture { - if (workloadIdentityAuth == null) { - return delegate.executeAsync(request, requestOptions) - } - - return workloadIdentityAuth.getTokenAsync().thenCompose { token -> - val requestWithAuth = - request.toBuilder().replaceHeaders("Authorization", "Bearer $token").build() - - delegate.executeAsync(requestWithAuth, requestOptions).thenApply { response -> - if (response.statusCode() == 401) { - response.close() - workloadIdentityAuth.invalidateToken() - throw OpenAIRetryableException("OAuth token is expired") - } - - response - } - } - } - - override fun close() { - workloadIdentityAuth?.close() - delegate.close() - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/credential/BearerTokenCredential.kt b/openai-java-core/src/main/kotlin/com/openai/credential/BearerTokenCredential.kt deleted file mode 100644 index 6da402a95..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/credential/BearerTokenCredential.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.openai.credential - -import java.util.function.Supplier - -/** - *

A credential that provides a bearer token.

- * - *

- * If you are using the OpenAI API, you need to provide a bearer token for authentication. All API - * requests should include your API key in an Authorization HTTP header as follows: "Authorization: - * Bearer OPENAI_API_KEY"

- * - *

Two ways to provide the token:

- *
    - * 1. Provide the token directly, 'BearerTokenCredential.create(String)'. The method - * 'ClientOptions.apiKey(String)' is a wrapper for this. 2. Provide a supplier that - * provides the token, 'BearerTokenCredential.create(Supplier)'. - *
- * - * @param tokenSupplier a supplier that provides the token. - * @see OpenAI - * Authentication - */ -class BearerTokenCredential private constructor(private val tokenSupplier: Supplier) : - Credential { - - companion object { - @JvmStatic fun create(token: String): Credential = BearerTokenCredential { token } - - @JvmStatic - fun create(tokenSupplier: Supplier): Credential = - BearerTokenCredential(tokenSupplier) - } - - fun token(): String = tokenSupplier.get() -} diff --git a/openai-java-core/src/main/kotlin/com/openai/credential/Credential.kt b/openai-java-core/src/main/kotlin/com/openai/credential/Credential.kt deleted file mode 100644 index f43ab84c4..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/credential/Credential.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.openai.credential - -/** An interface that represents a credential. */ -interface Credential diff --git a/openai-java-core/src/main/kotlin/com/openai/credential/WorkloadIdentityCredential.kt b/openai-java-core/src/main/kotlin/com/openai/credential/WorkloadIdentityCredential.kt deleted file mode 100644 index 07d21205e..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/credential/WorkloadIdentityCredential.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.openai.credential - -import com.openai.auth.WorkloadIdentityAuth - -class WorkloadIdentityCredential -internal constructor(private val workloadIdentityAuth: WorkloadIdentityAuth) : Credential { - - @JvmSynthetic internal fun getAuth(): WorkloadIdentityAuth = workloadIdentityAuth -} diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/BadRequestException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/BadRequestException.kt deleted file mode 100644 index 7bdb7f4cb..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/BadRequestException.kt +++ /dev/null @@ -1,100 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.errors - -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.core.http.Headers -import com.openai.core.jsonMapper -import com.openai.models.ErrorObject -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -class BadRequestException -private constructor( - private val headers: Headers, - private val error: JsonField, - cause: Throwable?, -) : - OpenAIServiceException( - "400: ${error.asKnown().getOrNull()?._message()?.asKnown()?.getOrNull() ?: (if (error.isMissing()) "Unknown" else jsonMapper().writeValueAsString(error))}", - cause, - ) { - - override fun statusCode(): Int = 400 - - override fun body(): JsonValue = - if (error.isMissing()) JsonMissing.of() - else JsonValue.fromJsonNode(jsonMapper().valueToTree(error)) - - override fun code(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.code()?.getOrNull()) - - override fun param(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.param()?.getOrNull()) - - override fun type(): Optional = Optional.ofNullable(error.asKnown().getOrNull()?.type()) - - override fun headers(): Headers = headers - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [BadRequestException]. - * - * The following fields are required: - * ```java - * .headers() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [BadRequestException]. */ - class Builder internal constructor() { - - private var headers: Headers? = null - private var error: JsonField = JsonMissing.of() - private var cause: Throwable? = null - - @JvmSynthetic - internal fun from(badRequestException: BadRequestException) = apply { - headers = badRequestException.headers - error = badRequestException.error - cause = badRequestException.cause - } - - fun headers(headers: Headers) = apply { this.headers = headers } - - fun error(error: ErrorObject?) = error(JsonField.ofNullable(error)) - - /** Alias for calling [Builder.error] with `error.orElse(null)`. */ - fun error(error: Optional) = error(error.getOrNull()) - - fun error(error: JsonField) = apply { this.error = error } - - fun cause(cause: Throwable?) = apply { this.cause = cause } - - /** Alias for calling [Builder.cause] with `cause.orElse(null)`. */ - fun cause(cause: Optional) = cause(cause.getOrNull()) - - /** - * Returns an immutable instance of [BadRequestException]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .headers() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): BadRequestException = - BadRequestException(checkRequired("headers", headers), error, cause) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/InternalServerException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/InternalServerException.kt deleted file mode 100644 index d573588d4..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/InternalServerException.kt +++ /dev/null @@ -1,112 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.errors - -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.core.http.Headers -import com.openai.core.jsonMapper -import com.openai.models.ErrorObject -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -class InternalServerException -private constructor( - private val statusCode: Int, - private val headers: Headers, - private val error: JsonField, - cause: Throwable?, -) : - OpenAIServiceException( - "$statusCode: ${error.asKnown().getOrNull()?._message()?.asKnown()?.getOrNull() ?: (if (error.isMissing()) "Unknown" else jsonMapper().writeValueAsString(error))}", - cause, - ) { - - override fun body(): JsonValue = - if (error.isMissing()) JsonMissing.of() - else JsonValue.fromJsonNode(jsonMapper().valueToTree(error)) - - override fun code(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.code()?.getOrNull()) - - override fun param(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.param()?.getOrNull()) - - override fun type(): Optional = Optional.ofNullable(error.asKnown().getOrNull()?.type()) - - override fun statusCode(): Int = statusCode - - override fun headers(): Headers = headers - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [InternalServerException]. - * - * The following fields are required: - * ```java - * .statusCode() - * .headers() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InternalServerException]. */ - class Builder internal constructor() { - - private var statusCode: Int? = null - private var headers: Headers? = null - private var error: JsonField = JsonMissing.of() - private var cause: Throwable? = null - - @JvmSynthetic - internal fun from(internalServerException: InternalServerException) = apply { - statusCode = internalServerException.statusCode - headers = internalServerException.headers - error = internalServerException.error - cause = internalServerException.cause - } - - fun statusCode(statusCode: Int) = apply { this.statusCode = statusCode } - - fun headers(headers: Headers) = apply { this.headers = headers } - - fun error(error: ErrorObject?) = error(JsonField.ofNullable(error)) - - /** Alias for calling [Builder.error] with `error.orElse(null)`. */ - fun error(error: Optional) = error(error.getOrNull()) - - fun error(error: JsonField) = apply { this.error = error } - - fun cause(cause: Throwable?) = apply { this.cause = cause } - - /** Alias for calling [Builder.cause] with `cause.orElse(null)`. */ - fun cause(cause: Optional) = cause(cause.getOrNull()) - - /** - * Returns an immutable instance of [InternalServerException]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .statusCode() - * .headers() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): InternalServerException = - InternalServerException( - checkRequired("statusCode", statusCode), - checkRequired("headers", headers), - error, - cause, - ) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/InvalidWebhookSignatureException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/InvalidWebhookSignatureException.kt deleted file mode 100644 index ed55b3566..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/InvalidWebhookSignatureException.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.openai.errors - -class InvalidWebhookSignatureException -@JvmOverloads -constructor(message: String? = null, cause: Throwable? = null) : OpenAIException(message, cause) diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/NotFoundException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/NotFoundException.kt deleted file mode 100644 index 457b0503c..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/NotFoundException.kt +++ /dev/null @@ -1,100 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.errors - -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.core.http.Headers -import com.openai.core.jsonMapper -import com.openai.models.ErrorObject -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -class NotFoundException -private constructor( - private val headers: Headers, - private val error: JsonField, - cause: Throwable?, -) : - OpenAIServiceException( - "404: ${error.asKnown().getOrNull()?._message()?.asKnown()?.getOrNull() ?: (if (error.isMissing()) "Unknown" else jsonMapper().writeValueAsString(error))}", - cause, - ) { - - override fun statusCode(): Int = 404 - - override fun body(): JsonValue = - if (error.isMissing()) JsonMissing.of() - else JsonValue.fromJsonNode(jsonMapper().valueToTree(error)) - - override fun code(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.code()?.getOrNull()) - - override fun param(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.param()?.getOrNull()) - - override fun type(): Optional = Optional.ofNullable(error.asKnown().getOrNull()?.type()) - - override fun headers(): Headers = headers - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [NotFoundException]. - * - * The following fields are required: - * ```java - * .headers() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [NotFoundException]. */ - class Builder internal constructor() { - - private var headers: Headers? = null - private var error: JsonField = JsonMissing.of() - private var cause: Throwable? = null - - @JvmSynthetic - internal fun from(notFoundException: NotFoundException) = apply { - headers = notFoundException.headers - error = notFoundException.error - cause = notFoundException.cause - } - - fun headers(headers: Headers) = apply { this.headers = headers } - - fun error(error: ErrorObject?) = error(JsonField.ofNullable(error)) - - /** Alias for calling [Builder.error] with `error.orElse(null)`. */ - fun error(error: Optional) = error(error.getOrNull()) - - fun error(error: JsonField) = apply { this.error = error } - - fun cause(cause: Throwable?) = apply { this.cause = cause } - - /** Alias for calling [Builder.cause] with `cause.orElse(null)`. */ - fun cause(cause: Optional) = cause(cause.getOrNull()) - - /** - * Returns an immutable instance of [NotFoundException]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .headers() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): NotFoundException = - NotFoundException(checkRequired("headers", headers), error, cause) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIException.kt deleted file mode 100644 index 6489ca0a0..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIException.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.openai.errors - -open class OpenAIException -@JvmOverloads -constructor(message: String? = null, cause: Throwable? = null) : RuntimeException(message, cause) diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIInvalidDataException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIInvalidDataException.kt deleted file mode 100644 index 9c3f4e6da..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIInvalidDataException.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.openai.errors - -class OpenAIInvalidDataException -@JvmOverloads -constructor(message: String? = null, cause: Throwable? = null) : OpenAIException(message, cause) diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIIoException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIIoException.kt deleted file mode 100644 index 5df9c4a3d..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIIoException.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.openai.errors - -class OpenAIIoException -@JvmOverloads -constructor(message: String? = null, cause: Throwable? = null) : OpenAIException(message, cause) diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIRetryableException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIRetryableException.kt deleted file mode 100644 index cf45dd47b..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIRetryableException.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.openai.errors - -/** - * Exception that indicates a transient error that can be retried. - * - * When this exception is thrown during an HTTP request, the SDK will automatically retry the - * request up to the maximum number of retries. - * - * @param message A descriptive error message - * @param cause The underlying cause of this exception, if any - */ -class OpenAIRetryableException -@JvmOverloads -constructor(message: String? = null, cause: Throwable? = null) : OpenAIException(message, cause) diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIServiceException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIServiceException.kt deleted file mode 100644 index 14446768a..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/OpenAIServiceException.kt +++ /dev/null @@ -1,23 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.errors - -import com.openai.core.JsonValue -import com.openai.core.http.Headers -import java.util.Optional - -abstract class OpenAIServiceException -protected constructor(message: String, cause: Throwable? = null) : OpenAIException(message, cause) { - - abstract fun statusCode(): Int - - abstract fun headers(): Headers - - abstract fun body(): JsonValue - - abstract fun code(): Optional - - abstract fun param(): Optional - - abstract fun type(): Optional -} diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/PermissionDeniedException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/PermissionDeniedException.kt deleted file mode 100644 index c9ae8beec..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/PermissionDeniedException.kt +++ /dev/null @@ -1,100 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.errors - -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.core.http.Headers -import com.openai.core.jsonMapper -import com.openai.models.ErrorObject -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -class PermissionDeniedException -private constructor( - private val headers: Headers, - private val error: JsonField, - cause: Throwable?, -) : - OpenAIServiceException( - "403: ${error.asKnown().getOrNull()?._message()?.asKnown()?.getOrNull() ?: (if (error.isMissing()) "Unknown" else jsonMapper().writeValueAsString(error))}", - cause, - ) { - - override fun statusCode(): Int = 403 - - override fun body(): JsonValue = - if (error.isMissing()) JsonMissing.of() - else JsonValue.fromJsonNode(jsonMapper().valueToTree(error)) - - override fun code(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.code()?.getOrNull()) - - override fun param(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.param()?.getOrNull()) - - override fun type(): Optional = Optional.ofNullable(error.asKnown().getOrNull()?.type()) - - override fun headers(): Headers = headers - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [PermissionDeniedException]. - * - * The following fields are required: - * ```java - * .headers() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [PermissionDeniedException]. */ - class Builder internal constructor() { - - private var headers: Headers? = null - private var error: JsonField = JsonMissing.of() - private var cause: Throwable? = null - - @JvmSynthetic - internal fun from(permissionDeniedException: PermissionDeniedException) = apply { - headers = permissionDeniedException.headers - error = permissionDeniedException.error - cause = permissionDeniedException.cause - } - - fun headers(headers: Headers) = apply { this.headers = headers } - - fun error(error: ErrorObject?) = error(JsonField.ofNullable(error)) - - /** Alias for calling [Builder.error] with `error.orElse(null)`. */ - fun error(error: Optional) = error(error.getOrNull()) - - fun error(error: JsonField) = apply { this.error = error } - - fun cause(cause: Throwable?) = apply { this.cause = cause } - - /** Alias for calling [Builder.cause] with `cause.orElse(null)`. */ - fun cause(cause: Optional) = cause(cause.getOrNull()) - - /** - * Returns an immutable instance of [PermissionDeniedException]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .headers() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): PermissionDeniedException = - PermissionDeniedException(checkRequired("headers", headers), error, cause) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/RateLimitException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/RateLimitException.kt deleted file mode 100644 index 8425abb2b..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/RateLimitException.kt +++ /dev/null @@ -1,100 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.errors - -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.core.http.Headers -import com.openai.core.jsonMapper -import com.openai.models.ErrorObject -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -class RateLimitException -private constructor( - private val headers: Headers, - private val error: JsonField, - cause: Throwable?, -) : - OpenAIServiceException( - "429: ${error.asKnown().getOrNull()?._message()?.asKnown()?.getOrNull() ?: (if (error.isMissing()) "Unknown" else jsonMapper().writeValueAsString(error))}", - cause, - ) { - - override fun statusCode(): Int = 429 - - override fun body(): JsonValue = - if (error.isMissing()) JsonMissing.of() - else JsonValue.fromJsonNode(jsonMapper().valueToTree(error)) - - override fun code(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.code()?.getOrNull()) - - override fun param(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.param()?.getOrNull()) - - override fun type(): Optional = Optional.ofNullable(error.asKnown().getOrNull()?.type()) - - override fun headers(): Headers = headers - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [RateLimitException]. - * - * The following fields are required: - * ```java - * .headers() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [RateLimitException]. */ - class Builder internal constructor() { - - private var headers: Headers? = null - private var error: JsonField = JsonMissing.of() - private var cause: Throwable? = null - - @JvmSynthetic - internal fun from(rateLimitException: RateLimitException) = apply { - headers = rateLimitException.headers - error = rateLimitException.error - cause = rateLimitException.cause - } - - fun headers(headers: Headers) = apply { this.headers = headers } - - fun error(error: ErrorObject?) = error(JsonField.ofNullable(error)) - - /** Alias for calling [Builder.error] with `error.orElse(null)`. */ - fun error(error: Optional) = error(error.getOrNull()) - - fun error(error: JsonField) = apply { this.error = error } - - fun cause(cause: Throwable?) = apply { this.cause = cause } - - /** Alias for calling [Builder.cause] with `cause.orElse(null)`. */ - fun cause(cause: Optional) = cause(cause.getOrNull()) - - /** - * Returns an immutable instance of [RateLimitException]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .headers() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): RateLimitException = - RateLimitException(checkRequired("headers", headers), error, cause) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/SseException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/SseException.kt deleted file mode 100644 index 74f969c25..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/SseException.kt +++ /dev/null @@ -1,112 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.errors - -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.core.http.Headers -import com.openai.core.jsonMapper -import com.openai.models.ErrorObject -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -class SseException -private constructor( - private val statusCode: Int, - private val headers: Headers, - private val error: JsonField, - cause: Throwable?, -) : - OpenAIServiceException( - "$statusCode: ${error.asKnown().getOrNull()?._message()?.asKnown()?.getOrNull() ?: (if (error.isMissing()) "Unknown" else jsonMapper().writeValueAsString(error))}", - cause, - ) { - - override fun body(): JsonValue = - if (error.isMissing()) JsonMissing.of() - else JsonValue.fromJsonNode(jsonMapper().valueToTree(error)) - - override fun code(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.code()?.getOrNull()) - - override fun param(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.param()?.getOrNull()) - - override fun type(): Optional = Optional.ofNullable(error.asKnown().getOrNull()?.type()) - - override fun statusCode(): Int = statusCode - - override fun headers(): Headers = headers - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [SseException]. - * - * The following fields are required: - * ```java - * .statusCode() - * .headers() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [SseException]. */ - class Builder internal constructor() { - - private var statusCode: Int? = null - private var headers: Headers? = null - private var error: JsonField = JsonMissing.of() - private var cause: Throwable? = null - - @JvmSynthetic - internal fun from(sseException: SseException) = apply { - statusCode = sseException.statusCode - headers = sseException.headers - error = sseException.error - cause = sseException.cause - } - - fun statusCode(statusCode: Int) = apply { this.statusCode = statusCode } - - fun headers(headers: Headers) = apply { this.headers = headers } - - fun error(error: ErrorObject?) = error(JsonField.ofNullable(error)) - - /** Alias for calling [Builder.error] with `error.orElse(null)`. */ - fun error(error: Optional) = error(error.getOrNull()) - - fun error(error: JsonField) = apply { this.error = error } - - fun cause(cause: Throwable?) = apply { this.cause = cause } - - /** Alias for calling [Builder.cause] with `cause.orElse(null)`. */ - fun cause(cause: Optional) = cause(cause.getOrNull()) - - /** - * Returns an immutable instance of [SseException]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .statusCode() - * .headers() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): SseException = - SseException( - checkRequired("statusCode", statusCode), - checkRequired("headers", headers), - error, - cause, - ) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/SubjectTokenProviderException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/SubjectTokenProviderException.kt deleted file mode 100644 index 87d4872e1..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/SubjectTokenProviderException.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.openai.errors - -/** - * Thrown when the workload identity authentication flow fails to obtain the subject token from the - * provider. - * - * For example, this is thrown by [com.openai.auth.K8sServiceAccountTokenProvider] when the service - * account token file cannot be found at the configured path. - */ -class SubjectTokenProviderException( - @get:JvmName("provider") val provider: String, - message: String, - cause: Throwable? = null, -) : OpenAIException("$provider provider error: $message", cause) diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/UnauthorizedException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/UnauthorizedException.kt deleted file mode 100644 index e9ae80302..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/UnauthorizedException.kt +++ /dev/null @@ -1,100 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.errors - -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.core.http.Headers -import com.openai.core.jsonMapper -import com.openai.models.ErrorObject -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -class UnauthorizedException -private constructor( - private val headers: Headers, - private val error: JsonField, - cause: Throwable?, -) : - OpenAIServiceException( - "401: ${error.asKnown().getOrNull()?._message()?.asKnown()?.getOrNull() ?: (if (error.isMissing()) "Unknown" else jsonMapper().writeValueAsString(error))}", - cause, - ) { - - override fun statusCode(): Int = 401 - - override fun body(): JsonValue = - if (error.isMissing()) JsonMissing.of() - else JsonValue.fromJsonNode(jsonMapper().valueToTree(error)) - - override fun code(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.code()?.getOrNull()) - - override fun param(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.param()?.getOrNull()) - - override fun type(): Optional = Optional.ofNullable(error.asKnown().getOrNull()?.type()) - - override fun headers(): Headers = headers - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [UnauthorizedException]. - * - * The following fields are required: - * ```java - * .headers() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [UnauthorizedException]. */ - class Builder internal constructor() { - - private var headers: Headers? = null - private var error: JsonField = JsonMissing.of() - private var cause: Throwable? = null - - @JvmSynthetic - internal fun from(unauthorizedException: UnauthorizedException) = apply { - headers = unauthorizedException.headers - error = unauthorizedException.error - cause = unauthorizedException.cause - } - - fun headers(headers: Headers) = apply { this.headers = headers } - - fun error(error: ErrorObject?) = error(JsonField.ofNullable(error)) - - /** Alias for calling [Builder.error] with `error.orElse(null)`. */ - fun error(error: Optional) = error(error.getOrNull()) - - fun error(error: JsonField) = apply { this.error = error } - - fun cause(cause: Throwable?) = apply { this.cause = cause } - - /** Alias for calling [Builder.cause] with `cause.orElse(null)`. */ - fun cause(cause: Optional) = cause(cause.getOrNull()) - - /** - * Returns an immutable instance of [UnauthorizedException]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .headers() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): UnauthorizedException = - UnauthorizedException(checkRequired("headers", headers), error, cause) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/UnexpectedStatusCodeException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/UnexpectedStatusCodeException.kt deleted file mode 100644 index 16627f1f3..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/UnexpectedStatusCodeException.kt +++ /dev/null @@ -1,113 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.errors - -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.core.http.Headers -import com.openai.core.jsonMapper -import com.openai.models.ErrorObject -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -class UnexpectedStatusCodeException -private constructor( - private val statusCode: Int, - private val headers: Headers, - private val error: JsonField, - cause: Throwable?, -) : - OpenAIServiceException( - "$statusCode: ${error.asKnown().getOrNull()?._message()?.asKnown()?.getOrNull() ?: (if (error.isMissing()) "Unknown" else jsonMapper().writeValueAsString(error))}", - cause, - ) { - - override fun body(): JsonValue = - if (error.isMissing()) JsonMissing.of() - else JsonValue.fromJsonNode(jsonMapper().valueToTree(error)) - - override fun code(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.code()?.getOrNull()) - - override fun param(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.param()?.getOrNull()) - - override fun type(): Optional = Optional.ofNullable(error.asKnown().getOrNull()?.type()) - - override fun statusCode(): Int = statusCode - - override fun headers(): Headers = headers - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [UnexpectedStatusCodeException]. - * - * The following fields are required: - * ```java - * .statusCode() - * .headers() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [UnexpectedStatusCodeException]. */ - class Builder internal constructor() { - - private var statusCode: Int? = null - private var headers: Headers? = null - private var error: JsonField = JsonMissing.of() - private var cause: Throwable? = null - - @JvmSynthetic - internal fun from(unexpectedStatusCodeException: UnexpectedStatusCodeException) = apply { - statusCode = unexpectedStatusCodeException.statusCode - headers = unexpectedStatusCodeException.headers - error = unexpectedStatusCodeException.error - cause = unexpectedStatusCodeException.cause - } - - fun statusCode(statusCode: Int) = apply { this.statusCode = statusCode } - - fun headers(headers: Headers) = apply { this.headers = headers } - - fun error(error: ErrorObject?) = error(JsonField.ofNullable(error)) - - /** Alias for calling [Builder.error] with `error.orElse(null)`. */ - fun error(error: Optional) = error(error.getOrNull()) - - fun error(error: JsonField) = apply { this.error = error } - - fun cause(cause: Throwable?) = apply { this.cause = cause } - - /** Alias for calling [Builder.cause] with `cause.orElse(null)`. */ - fun cause(cause: Optional) = cause(cause.getOrNull()) - - /** - * Returns an immutable instance of [UnexpectedStatusCodeException]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .statusCode() - * .headers() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): UnexpectedStatusCodeException = - UnexpectedStatusCodeException( - checkRequired("statusCode", statusCode), - checkRequired("headers", headers), - error, - cause, - ) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/errors/UnprocessableEntityException.kt b/openai-java-core/src/main/kotlin/com/openai/errors/UnprocessableEntityException.kt deleted file mode 100644 index f23316843..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/errors/UnprocessableEntityException.kt +++ /dev/null @@ -1,100 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.errors - -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.core.http.Headers -import com.openai.core.jsonMapper -import com.openai.models.ErrorObject -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -class UnprocessableEntityException -private constructor( - private val headers: Headers, - private val error: JsonField, - cause: Throwable?, -) : - OpenAIServiceException( - "422: ${error.asKnown().getOrNull()?._message()?.asKnown()?.getOrNull() ?: (if (error.isMissing()) "Unknown" else jsonMapper().writeValueAsString(error))}", - cause, - ) { - - override fun statusCode(): Int = 422 - - override fun body(): JsonValue = - if (error.isMissing()) JsonMissing.of() - else JsonValue.fromJsonNode(jsonMapper().valueToTree(error)) - - override fun code(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.code()?.getOrNull()) - - override fun param(): Optional = - Optional.ofNullable(error.asKnown().getOrNull()?.param()?.getOrNull()) - - override fun type(): Optional = Optional.ofNullable(error.asKnown().getOrNull()?.type()) - - override fun headers(): Headers = headers - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [UnprocessableEntityException]. - * - * The following fields are required: - * ```java - * .headers() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [UnprocessableEntityException]. */ - class Builder internal constructor() { - - private var headers: Headers? = null - private var error: JsonField = JsonMissing.of() - private var cause: Throwable? = null - - @JvmSynthetic - internal fun from(unprocessableEntityException: UnprocessableEntityException) = apply { - headers = unprocessableEntityException.headers - error = unprocessableEntityException.error - cause = unprocessableEntityException.cause - } - - fun headers(headers: Headers) = apply { this.headers = headers } - - fun error(error: ErrorObject?) = error(JsonField.ofNullable(error)) - - /** Alias for calling [Builder.error] with `error.orElse(null)`. */ - fun error(error: Optional) = error(error.getOrNull()) - - fun error(error: JsonField) = apply { this.error = error } - - fun cause(cause: Throwable?) = apply { this.cause = cause } - - /** Alias for calling [Builder.cause] with `cause.orElse(null)`. */ - fun cause(cause: Optional) = cause(cause.getOrNull()) - - /** - * Returns an immutable instance of [UnprocessableEntityException]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .headers() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): UnprocessableEntityException = - UnprocessableEntityException(checkRequired("headers", headers), error, cause) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/helpers/ChatCompletionAccumulator.kt b/openai-java-core/src/main/kotlin/com/openai/helpers/ChatCompletionAccumulator.kt deleted file mode 100644 index 0f65d3a8d..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/helpers/ChatCompletionAccumulator.kt +++ /dev/null @@ -1,360 +0,0 @@ -package com.openai.helpers - -import com.openai.core.JsonNull -import com.openai.core.JsonValue -import com.openai.errors.OpenAIInvalidDataException -import com.openai.models.chat.completions.* -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * An accumulator that constructs a [ChatCompletion] from a sequence of streamed chunks. Pass all - * chunks to [accumulate] and then call [chatCompletion] to get the final accumulated chat - * completion. The final [ChatCompletion] will be similar to what would have been received had the - * non-streaming API been used. - * - * A [ChatCompletionAccumulator] may only be used to accumulate _one_ chat completion. To accumulate - * another chat completion, create another instance of [ChatCompletionAccumulator]. - */ -class ChatCompletionAccumulator private constructor() { - /** - * The final [ChatCompletion] accumulated from the chunks. This is created when the final chunk - * carrying the `finishReason` is accumulated. It may be re-created if an optional `usage` chunk - * is accumulated after the presumed final chunk. - */ - private var chatCompletion: ChatCompletion? = null - - /** - * The builder for the [chatCompletion]. This is updated until the final chunk is accumulated. - * It may be used to build the [chatCompletion] again if a final usage chunk is accumulated. - */ - private var chatCompletionBuilder: ChatCompletion.Builder? = null - - /** - * The builders for the [ChatCompletion.Choice] elements that are updated for the choices in - * each chunk. When the last chunk is accumulated, the choices are finally built and added to - * the [chatCompletionBuilder]. The keys are the `index` values from each chunk delta. - */ - private val choiceBuilders = mutableMapOf() - - /** - * The builders for the [ChatCompletionMessage] elements that are added to their respective - * choices when all chunks have been accumulated. The keys are the `index` values from each - * chunk delta. - */ - private val messageBuilders = mutableMapOf() - - /** - * The accumulated content for each message. The keys correspond to the indexes in - * [messageBuilders]. - */ - private val messageContents = mutableMapOf() - - /** - * The accumulated refusal for each message. The keys correspond to the indexes in - * [messageBuilders]. - */ - private val messageRefusals = mutableMapOf() - - /** - * The builders for the [ChatCompletion.Choice.Logprobs] of each choice. These are only - * accumulated if the option to report log probabilities was enabled in the request. When the - * last chunk is accumulated, these are added to their respective [chatCompletionBuilder]. The - * keys are the `index` values from each chunk delta. - */ - private val logprobsBuilders = mutableMapOf() - - /** - * The accumulated tool call builders for each message. The "outer" keys correspond to the - * indexes in [messageBuilders] (the choice index). The "inner" keys correspond to the position - * of each tool call in the message's list of tool calls (the tool call index). - */ - private val toolCallBuilders = - mutableMapOf>() - - /** - * The accumulated tool call function builders for the tool call builders of each message. The - * entries correspond to those in [toolCallBuilders]. - */ - private val toolCallFunctionBuilders = - mutableMapOf< - Long, - MutableMap, - >() - - /** - * The accumulated tool call function arguments that will be set on the function builders when - * completed. The entries correspond to those in [toolCallFunctionBuilders]. - */ - private val toolCallFunctionArgs = mutableMapOf>() - - /** - * The finished status of each of the `n` completions. When a chunk with a `finishReason` is - * encountered, its index is recorded against a `true` value. When a `true` has been recorded - * for all indexes, the chat completion is finished and no further chunks (except perhaps a - * usage chunk) are expected to be accumulated. The keys are the `index` values from each chunk - * delta. - */ - private val isFinished = mutableMapOf() - - companion object { - @JvmStatic fun create() = ChatCompletionAccumulator() - - @JvmSynthetic - internal fun convertFunctionCall( - chunkFunctionCall: ChatCompletionChunk.Choice.Delta.FunctionCall - ) = - ChatCompletionMessage.FunctionCall.builder() - .name(chunkFunctionCall._name()) - .arguments(chunkFunctionCall._arguments()) - .additionalProperties(chunkFunctionCall._additionalProperties()) - .build() - } - - /** - * Gets the final accumulated chat completion. Until the last chunk has been accumulated, a - * [ChatCompletion] will not be available. Wait until all chunks have been handled by - * [accumulate] before calling this method. See that method for more details on how the last - * chunk is detected. - * - * @throws IllegalStateException If called before the last chunk has been accumulated. - */ - fun chatCompletion(): ChatCompletion = - checkNotNull(chatCompletion) { "Final chat completion chunk(s) not yet received." } - - /** - * Gets the final accumulated chat completion with support for structured outputs. Until the - * last chunk has been accumulated, a [StructuredChatCompletion] will not be available. Wait - * until all chunks have been handled by [accumulate] before calling this method. See that - * method for more details on how the last chunk is detected. See the SDK documentation on - * _Structured Outputs_ for more details and example code. - * - * @param responseType The Java class from which the JSON schema in the request was derived. The - * output JSON conforming to that schema can be converted automatically back to an instance of - * that Java class by the [StructuredChatCompletion]. - * @throws IllegalStateException If called before the last chunk has been accumulated. - * @throws OpenAIInvalidDataException If the JSON data cannot be parsed to an instance of the - * [responseType] class. - */ - fun chatCompletion(responseType: Class) = - StructuredChatCompletion(responseType, chatCompletion()) - - /** - * Accumulates a streamed chunk and uses it to construct a [ChatCompletion]. When all chunks - * have been accumulated, the chat completion can be retrieved by calling [chatCompletion]. - * - * The last chunk is identified as that which provides the `finishReason`. At that point, the - * [ChatCompletion] is created and available. However, if the request was configured to include - * the usage details, one additional chunk may be accumulated which provides those usage details - * and the [ChatCompletion] will be recreated to reflect them. After that, no more chunks of any - * kind may be accumulated. - * - * @return The given [chunk] for convenience, such as when chaining method calls. - * @throws IllegalStateException If [accumulate] is called again after the last chunk has been - * accumulated. A [ChatCompletionAccumulator] can only be used to accumulate a single - * [ChatCompletion]. - * @throws OpenAIInvalidDataException If the [chunk] contains invalid or unexpected data. - */ - fun accumulate(chunk: ChatCompletionChunk): ChatCompletionChunk { - val localChatCompletion = chatCompletion - - check( - localChatCompletion == null || - (chunk.usage().getOrNull() != null && - localChatCompletion.usage().getOrNull() == null) - ) { - "Already accumulated the final chunk(s)." - } - - val chatCompletionBuilder = ensureChatCompletionBuilder() - - chunk.usage().getOrNull()?.let { - chatCompletionBuilder.usage(it) - chatCompletion = chatCompletionBuilder.build() - // This final `usage` chunk will have no `choices`, so stop here. - return@accumulate chunk - } - - // Each chunk in the stream will repeat these values. They could be copied just once, but it - // is simpler copy them each time they are encountered. - chatCompletionBuilder - // These are the mandatory fields that must be set to something. - .id(chunk.id()) - .created(chunk.created()) - .model(chunk.model()) - // The other fields are optional and `object` has an appropriate default value. - .systemFingerprint(chunk._systemFingerprint()) - .apply { - chunk.serviceTier().ifPresent { - serviceTier(ChatCompletion.ServiceTier.of(it.asString())) - } - } - .putAllAdditionalProperties(chunk._additionalProperties()) - - // Each chunk contains a `choices` list (the size depends on `n` in the request). Each - // chunked `choice` has an `index`, that identifies the corresponding `Choice` within the - // accumulated list of choices; and a `Delta`, that contains additional content to be - // accumulated in that `Choice`, mostly within its `message`. - chunk.choices().forEach { choice -> - val index = choice.index() - val choiceBuilder = - choiceBuilders.getOrPut(index) { ChatCompletion.Choice.builder().index(index) } - - accumulateLogprobs(index, choice.logprobs()) - accumulateMessage(index, choice.delta()) - - choiceBuilder.additionalProperties(choice._additionalProperties()) - - if (choice.finishReason().isPresent) { - choiceBuilder.finishReason( - ChatCompletion.Choice.FinishReason.of(choice.finishReason().get().asString()) - ) - - // A non-null `finishReason` signals that this is the final `Chunk` for its index. - // For each of the `n` messages completed, there will be one chunk carrying only a - // `finishReason` (its `Choice` will have no `content`). These `finalReason` chunks - // will all arrive after the non-empty chunks have been received for all `n` - // choices. Therefore, the value of `n` can be inferred from the number of distinct - // indexes observed thus far when building choices. When all `n` `finishReason` - // chunks have been received, presumptively build the `ChatCompletion`. (One further - // usage chunk _might_ be notified.) - isFinished[index] = true - if (choiceBuilders.keys.all { isFinished[it] == true }) { - chatCompletion = ensureChatCompletionBuilder().choices(buildChoices()).build() - } - } else { - choiceBuilder.finishReason(JsonNull.of()) - } - } - - return chunk - } - - private fun ensureChatCompletionBuilder(): ChatCompletion.Builder = - chatCompletionBuilder ?: ChatCompletion.builder().also { chatCompletionBuilder = it } - - @JvmSynthetic - internal fun accumulateLogprobs( - index: Long, - logprobs: Optional, - ) { - val chunkLogprobs = logprobs.getOrNull() ?: return - - val logprobsBuilder = - logprobsBuilders.getOrPut(index) { - ChatCompletion.Choice.Logprobs.builder() - // These must be set explicitly to avoid an error when `build()` is called in - // the event that no `content` or `refusal` is added later. - .content(mutableListOf()) - .refusal(mutableListOf()) - } - - chunkLogprobs.content().ifPresent { chunkContentList -> - chunkContentList.forEach(logprobsBuilder::addContent) - } - chunkLogprobs.refusal().ifPresent { chunkRefusalsList -> - chunkRefusalsList.forEach(logprobsBuilder::addRefusal) - } - logprobsBuilder.putAllAdditionalProperties(chunkLogprobs._additionalProperties()) - } - - @JvmSynthetic - internal fun accumulateMessage(index: Long, delta: ChatCompletionChunk.Choice.Delta) { - val messageBuilder = messageBuilders.getOrPut(index) { ChatCompletionMessage.builder() } - - delta.content().ifPresent { messageContents[index] = (messageContents[index] ?: "") + it } - delta.refusal().ifPresent { messageRefusals[index] = (messageRefusals[index] ?: "") + it } - // The `role` defaults to "assistant", so if no other `role` is set on the delta, there is - // no need to set it explicitly to anything else. - delta.role().ifPresent { messageBuilder.role(JsonValue.from(it.asString())) } - delta.functionCall().ifPresent { messageBuilder.functionCall(convertFunctionCall(it)) } - - delta.toolCalls().ifPresent { - it.map { deltaToolCall -> - // The first chunk delta will carry the tool call ID and the function name. Later - // deltas will carry only fragments of the function arguments, but the tool call - // index will identify the function to which those argument fragments belong. - val messageToolCallBuilders = toolCallBuilders.getOrPut(index) { mutableMapOf() } - - messageToolCallBuilders.getOrPut(deltaToolCall.index()) { - ChatCompletionMessageFunctionToolCall.builder() - .id(deltaToolCall._id()) - .additionalProperties(deltaToolCall._additionalProperties()) - // Must wait until the `function` is accumulated and built before adding it to - // the tool call later when `buildChoices` is called. - } - - val messageToolCallFunctionBuilders = - toolCallFunctionBuilders.getOrPut(index) { mutableMapOf() } - - messageToolCallFunctionBuilders.getOrPut(deltaToolCall.index()) { - ChatCompletionMessageFunctionToolCall.Function.builder() - .name(ensureFunction(deltaToolCall.function())._name()) - .additionalProperties(deltaToolCall._additionalProperties()) - } - - val messageToolCallFunctionArgs = - toolCallFunctionArgs.getOrPut(index) { mutableMapOf() } - - messageToolCallFunctionArgs[deltaToolCall.index()] = - (messageToolCallFunctionArgs[deltaToolCall.index()] ?: "") + - (ensureFunction(deltaToolCall.function()).arguments().getOrNull() ?: "") - } - } - - messageBuilder.putAllAdditionalProperties(delta._additionalProperties()) - } - - private fun ensureFunction( - function: Optional - ): ChatCompletionChunk.Choice.Delta.ToolCall.Function = - function.orElseThrow { OpenAIInvalidDataException("Tool call chunk missing function.") } - - private fun buildChoices() = - choiceBuilders.entries - .sortedBy { it.key } - .map { - it.value - .message(buildMessage(it.key)) - .logprobs(logprobsBuilders[it.key]?.build()) - .build() - } - - private fun buildMessage(index: Long) = - messageBuilders - .getOrElse(index) { - throw OpenAIInvalidDataException("Missing message for index $index.") - } - .content(messageContents[index]) - .refusal(messageRefusals[index]) - .toolCalls(buildToolCalls(index)) - .build() - - private fun buildToolCalls(index: Long): List = - // It is OK for a message not to have any tool calls; most will not and an empty list will - // be returned. An entry (if it exists) will be a collection of tool call builders and each - // has a function that needs to be set. - toolCallBuilders[index] - ?.entries - ?.sortedBy { it.key } - ?.map { (toolCallIndex, toolCallBuilder) -> - ChatCompletionMessageToolCall.ofFunction( - toolCallBuilder.function(buildFunction(index, toolCallIndex)).build() - ) - } ?: listOf() - - private fun buildFunction(index: Long, toolCallIndex: Long) = - // Every tool call is expected to have a function with arguments. - toolCallFunctionBuilders[index] - ?.get(toolCallIndex) - ?.arguments( - toolCallFunctionArgs[index]?.get(toolCallIndex) - ?: throw OpenAIInvalidDataException( - "Missing function arguments for index $index.$toolCallIndex." - ) - ) - ?.build() - ?: throw OpenAIInvalidDataException( - "Missing function builder for index $index.$toolCallIndex." - ) -} diff --git a/openai-java-core/src/main/kotlin/com/openai/helpers/ResponseAccumulator.kt b/openai-java-core/src/main/kotlin/com/openai/helpers/ResponseAccumulator.kt deleted file mode 100644 index 5401d3fcd..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/helpers/ResponseAccumulator.kt +++ /dev/null @@ -1,337 +0,0 @@ -package com.openai.helpers - -import com.openai.core.JsonValue -import com.openai.errors.OpenAIInvalidDataException -import com.openai.models.responses.Response -import com.openai.models.responses.ResponseAudioDeltaEvent -import com.openai.models.responses.ResponseAudioDoneEvent -import com.openai.models.responses.ResponseAudioTranscriptDeltaEvent -import com.openai.models.responses.ResponseAudioTranscriptDoneEvent -import com.openai.models.responses.ResponseCodeInterpreterCallCodeDeltaEvent -import com.openai.models.responses.ResponseCodeInterpreterCallCodeDoneEvent -import com.openai.models.responses.ResponseCodeInterpreterCallCompletedEvent -import com.openai.models.responses.ResponseCodeInterpreterCallInProgressEvent -import com.openai.models.responses.ResponseCodeInterpreterCallInterpretingEvent -import com.openai.models.responses.ResponseCompletedEvent -import com.openai.models.responses.ResponseContentPartAddedEvent -import com.openai.models.responses.ResponseContentPartDoneEvent -import com.openai.models.responses.ResponseCreatedEvent -import com.openai.models.responses.ResponseCustomToolCallInputDeltaEvent -import com.openai.models.responses.ResponseCustomToolCallInputDoneEvent -import com.openai.models.responses.ResponseErrorEvent -import com.openai.models.responses.ResponseFailedEvent -import com.openai.models.responses.ResponseFileSearchCallCompletedEvent -import com.openai.models.responses.ResponseFileSearchCallInProgressEvent -import com.openai.models.responses.ResponseFileSearchCallSearchingEvent -import com.openai.models.responses.ResponseFunctionCallArgumentsDeltaEvent -import com.openai.models.responses.ResponseFunctionCallArgumentsDoneEvent -import com.openai.models.responses.ResponseImageGenCallCompletedEvent -import com.openai.models.responses.ResponseImageGenCallGeneratingEvent -import com.openai.models.responses.ResponseImageGenCallInProgressEvent -import com.openai.models.responses.ResponseImageGenCallPartialImageEvent -import com.openai.models.responses.ResponseInProgressEvent -import com.openai.models.responses.ResponseIncompleteEvent -import com.openai.models.responses.ResponseMcpCallArgumentsDeltaEvent -import com.openai.models.responses.ResponseMcpCallArgumentsDoneEvent -import com.openai.models.responses.ResponseMcpCallCompletedEvent -import com.openai.models.responses.ResponseMcpCallFailedEvent -import com.openai.models.responses.ResponseMcpCallInProgressEvent -import com.openai.models.responses.ResponseMcpListToolsCompletedEvent -import com.openai.models.responses.ResponseMcpListToolsFailedEvent -import com.openai.models.responses.ResponseMcpListToolsInProgressEvent -import com.openai.models.responses.ResponseOutputItemAddedEvent -import com.openai.models.responses.ResponseOutputItemDoneEvent -import com.openai.models.responses.ResponseOutputTextAnnotationAddedEvent -import com.openai.models.responses.ResponseQueuedEvent -import com.openai.models.responses.ResponseReasoningSummaryPartAddedEvent -import com.openai.models.responses.ResponseReasoningSummaryPartDoneEvent -import com.openai.models.responses.ResponseReasoningSummaryTextDeltaEvent -import com.openai.models.responses.ResponseReasoningSummaryTextDoneEvent -import com.openai.models.responses.ResponseReasoningTextDeltaEvent -import com.openai.models.responses.ResponseReasoningTextDoneEvent -import com.openai.models.responses.ResponseRefusalDeltaEvent -import com.openai.models.responses.ResponseRefusalDoneEvent -import com.openai.models.responses.ResponseStreamEvent -import com.openai.models.responses.ResponseTextDeltaEvent -import com.openai.models.responses.ResponseTextDoneEvent -import com.openai.models.responses.ResponseWebSearchCallCompletedEvent -import com.openai.models.responses.ResponseWebSearchCallInProgressEvent -import com.openai.models.responses.ResponseWebSearchCallSearchingEvent -import com.openai.models.responses.StructuredResponse - -/** - * An accumulator that constructs a [Response] from a sequence of streamed events. Pass all events - * to [accumulate] and then call [response] to get the final accumulated response. The final - * `Response` will be similar to what would have been received had the non-streaming API been used. - * - * A [ResponseAccumulator] may only be used to accumulate _one_ response. To accumulate another - * response, create another instance of `ResponseAccumulator`. - */ -class ResponseAccumulator private constructor() { - - /** - * The response accumulated from the event stream. This is set when a terminal event is - * accumulated. That single event carries all the response details. - */ - private var response: Response? = null - - companion object { - @JvmStatic fun create() = ResponseAccumulator() - } - - /** - * Gets the final accumulated response. Until the last event has been accumulated, a [Response] - * will not be available. Wait until all events have been handled by [accumulate] before calling - * this method. - * - * @throws IllegalStateException If called before the stream has been completed. - */ - fun response() = checkNotNull(response) { "Completed response is not yet received." } - - /** - * Gets the final accumulated response with support for structured outputs. Until the last event - * has been accumulated, a [StructuredResponse] will not be available. Wait until all events - * have been handled by [accumulate] before calling this method. See that method for more - * details on how the last event is detected. See the - * [SDK documentation](https://github.com/openai/openai-java/#usage-with-streaming) for more - * details and example code. - * - * @param responseType The Java class from which the JSON schema in the request was derived. The - * output JSON conforming to that schema can be converted automatically back to an instance of - * that Java class by the [StructuredResponse]. - * @throws IllegalStateException If called before the last event has been accumulated. - * @throws OpenAIInvalidDataException If the JSON data cannot be parsed to an instance of the - * [responseType] class. - */ - fun response(responseType: Class) = StructuredResponse(responseType, response()) - - /** - * Accumulates a streamed event and uses it to construct a [Response]. When all events have been - * accumulated, the response can be retrieved by calling [response]. The last event is detected - * if one of `ResponseCompletedEvent`, `ResponseIncompleteEvent`, or `ResponseFailedEvent` is - * accumulated. After that event, additional stream events may still arrive, but they do not - * affect the accumulated response. - * - * @return The given [event] for convenience, such as when chaining method calls. - */ - fun accumulate(event: ResponseStreamEvent): ResponseStreamEvent { - // The API may send non-response events (e.g. `response.rate_limits.updated`) after a - // terminal event (`response.completed`, `response.failed`, `response.incomplete`). These - // events do not change the accumulated response. - if (response != null) { - return event - } - - event.accept( - object : ResponseStreamEvent.Visitor { - // -------------------------------------------------------------------------------- - // The following events _all_ have a `response` property. - - override fun visitCreated(created: ResponseCreatedEvent) { - // The initial response (on creation) has no content, so it is not stored. - } - - override fun visitCompleted(completed: ResponseCompletedEvent) { - response = completed.response() - } - - override fun visitInProgress(inProgress: ResponseInProgressEvent) { - // An in-progress response is not complete, so it is not stored. - } - - override fun visitQueued(queued: ResponseQueuedEvent) { - // A queued response that is awaiting processing is not complete, so it is not - // stored. - } - - override fun visitCustomToolCallInputDelta( - customToolCallInputDelta: ResponseCustomToolCallInputDeltaEvent - ) {} - - override fun visitCustomToolCallInputDone( - customToolCallInputDone: ResponseCustomToolCallInputDoneEvent - ) {} - - override fun visitFailed(failed: ResponseFailedEvent) { - // TODO: Confirm that this is a "terminal" event and will occur _instead of_ - // `ResponseCompletedEvent` or `ResponseIncompleteEvent`. - // Store the response so the reason for the failure can be interrogated. - response = failed.response() - } - - override fun visitIncomplete(incomplete: ResponseIncompleteEvent) { - // TODO: Confirm that this is a "terminal" event and will occur _instead of_ - // `ResponseCompletedEvent` or `ResponseFailedEvent`. - // Store the response so the reason for the incompleteness can be interrogated. - response = incomplete.response() - } - - // -------------------------------------------------------------------------------- - // The following events do _not_ have a `Response` property. - - override fun visitAudioDelta(audioDelta: ResponseAudioDeltaEvent) {} - - override fun visitAudioDone(audioDone: ResponseAudioDoneEvent) {} - - override fun visitAudioTranscriptDelta( - audioTranscriptDelta: ResponseAudioTranscriptDeltaEvent - ) {} - - override fun visitAudioTranscriptDone( - audioTranscriptDone: ResponseAudioTranscriptDoneEvent - ) {} - - override fun visitCodeInterpreterCallCodeDelta( - codeInterpreterCallCodeDelta: ResponseCodeInterpreterCallCodeDeltaEvent - ) {} - - override fun visitCodeInterpreterCallCodeDone( - codeInterpreterCallCodeDone: ResponseCodeInterpreterCallCodeDoneEvent - ) {} - - override fun visitCodeInterpreterCallCompleted( - codeInterpreterCallCompleted: ResponseCodeInterpreterCallCompletedEvent - ) {} - - override fun visitCodeInterpreterCallInProgress( - codeInterpreterCallInProgress: ResponseCodeInterpreterCallInProgressEvent - ) {} - - override fun visitCodeInterpreterCallInterpreting( - codeInterpreterCallInterpreting: ResponseCodeInterpreterCallInterpretingEvent - ) {} - - override fun visitContentPartAdded( - contentPartAdded: ResponseContentPartAddedEvent - ) {} - - override fun visitContentPartDone(contentPartDone: ResponseContentPartDoneEvent) {} - - override fun visitError(error: ResponseErrorEvent) {} - - override fun visitFileSearchCallCompleted( - fileSearchCallCompleted: ResponseFileSearchCallCompletedEvent - ) {} - - override fun visitFileSearchCallInProgress( - fileSearchCallInProgress: ResponseFileSearchCallInProgressEvent - ) {} - - override fun visitFileSearchCallSearching( - fileSearchCallSearching: ResponseFileSearchCallSearchingEvent - ) {} - - override fun visitFunctionCallArgumentsDelta( - functionCallArgumentsDelta: ResponseFunctionCallArgumentsDeltaEvent - ) {} - - override fun visitFunctionCallArgumentsDone( - functionCallArgumentsDone: ResponseFunctionCallArgumentsDoneEvent - ) {} - - override fun visitOutputItemAdded(outputItemAdded: ResponseOutputItemAddedEvent) {} - - override fun visitOutputItemDone(outputItemDone: ResponseOutputItemDoneEvent) {} - - override fun visitReasoningSummaryPartAdded( - reasoningSummaryPartAdded: ResponseReasoningSummaryPartAddedEvent - ) {} - - override fun visitReasoningSummaryPartDone( - reasoningSummaryPartDone: ResponseReasoningSummaryPartDoneEvent - ) {} - - override fun visitReasoningSummaryTextDelta( - reasoningSummaryTextDelta: ResponseReasoningSummaryTextDeltaEvent - ) {} - - override fun visitReasoningSummaryTextDone( - reasoningSummaryTextDone: ResponseReasoningSummaryTextDoneEvent - ) {} - - override fun visitReasoningTextDelta( - reasoningTextDelta: ResponseReasoningTextDeltaEvent - ) {} - - override fun visitReasoningTextDone( - reasoningTextDone: ResponseReasoningTextDoneEvent - ) {} - - override fun visitRefusalDelta(refusalDelta: ResponseRefusalDeltaEvent) {} - - override fun visitRefusalDone(refusalDone: ResponseRefusalDoneEvent) {} - - override fun visitOutputTextDelta(outputTextDelta: ResponseTextDeltaEvent) {} - - override fun visitOutputTextDone(outputTextDone: ResponseTextDoneEvent) {} - - override fun visitWebSearchCallCompleted( - webSearchCallCompleted: ResponseWebSearchCallCompletedEvent - ) {} - - override fun visitWebSearchCallInProgress( - webSearchCallInProgress: ResponseWebSearchCallInProgressEvent - ) {} - - override fun visitWebSearchCallSearching( - webSearchCallSearching: ResponseWebSearchCallSearchingEvent - ) {} - - override fun visitImageGenerationCallCompleted( - imageGenerationCallCompleted: ResponseImageGenCallCompletedEvent - ) {} - - override fun visitImageGenerationCallGenerating( - imageGenerationCallGenerating: ResponseImageGenCallGeneratingEvent - ) {} - - override fun visitImageGenerationCallInProgress( - imageGenerationCallInProgress: ResponseImageGenCallInProgressEvent - ) {} - - override fun visitImageGenerationCallPartialImage( - imageGenerationCallPartialImage: ResponseImageGenCallPartialImageEvent - ) {} - - override fun visitMcpCallArgumentsDelta( - mcpCallArgumentsDelta: ResponseMcpCallArgumentsDeltaEvent - ) {} - - override fun visitMcpCallArgumentsDone( - mcpCallArgumentsDone: ResponseMcpCallArgumentsDoneEvent - ) {} - - override fun visitMcpCallCompleted( - mcpCallCompleted: ResponseMcpCallCompletedEvent - ) {} - - override fun visitMcpCallFailed(mcpCallFailed: ResponseMcpCallFailedEvent) {} - - override fun visitMcpCallInProgress( - mcpCallInProgress: ResponseMcpCallInProgressEvent - ) {} - - override fun visitMcpListToolsCompleted( - mcpListToolsCompleted: ResponseMcpListToolsCompletedEvent - ) {} - - override fun visitMcpListToolsFailed( - mcpListToolsFailed: ResponseMcpListToolsFailedEvent - ) {} - - override fun visitMcpListToolsInProgress( - mcpListToolsInProgress: ResponseMcpListToolsInProgressEvent - ) {} - - override fun visitOutputTextAnnotationAdded( - outputTextAnnotationAdded: ResponseOutputTextAnnotationAddedEvent - ) {} - - // Ignore unknown variants for forwards compatibility. - override fun unknown(json: JsonValue?) {} - } - ) - - return event - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/AudioResponseFormat.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/AudioResponseFormat.kt index fa2a75a45..3fa1e6a41 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/AudioResponseFormat.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/AudioResponseFormat.kt @@ -158,17 +158,6 @@ class AudioResponseFormat @JsonCreator private constructor(private val value: Js */ @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - @JvmSynthetic - internal fun isJson(): Boolean = - when (this) { - JSON -> true - TEXT -> false - SRT -> false - VERBOSE_JSON -> true - VTT -> false - else -> false - } - override fun equals(other: Any?): Boolean { if (this === other) { return true diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationCreatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationCreatedEvent.kt deleted file mode 100644 index e2ac1a41b..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationCreatedEvent.kt +++ /dev/null @@ -1,564 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** Returned when a conversation is created. Emitted right after session creation. */ -class ConversationCreatedEvent -private constructor( - private val conversation: JsonField, - private val eventId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("conversation") - @ExcludeMissing - conversation: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(conversation, eventId, type, mutableMapOf()) - - /** - * The conversation resource. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun conversation(): Conversation = conversation.getRequired("conversation") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The event type, must be `conversation.created`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("conversation.created") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [conversation]. - * - * Unlike [conversation], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("conversation") - @ExcludeMissing - fun _conversation(): JsonField = conversation - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ConversationCreatedEvent]. - * - * The following fields are required: - * ```java - * .conversation() - * .eventId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationCreatedEvent]. */ - class Builder internal constructor() { - - private var conversation: JsonField? = null - private var eventId: JsonField? = null - private var type: JsonValue = JsonValue.from("conversation.created") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(conversationCreatedEvent: ConversationCreatedEvent) = apply { - conversation = conversationCreatedEvent.conversation - eventId = conversationCreatedEvent.eventId - type = conversationCreatedEvent.type - additionalProperties = conversationCreatedEvent.additionalProperties.toMutableMap() - } - - /** The conversation resource. */ - fun conversation(conversation: Conversation) = conversation(JsonField.of(conversation)) - - /** - * Sets [Builder.conversation] to an arbitrary JSON value. - * - * You should usually call [Builder.conversation] with a well-typed [Conversation] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun conversation(conversation: JsonField) = apply { - this.conversation = conversation - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("conversation.created") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationCreatedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .conversation() - * .eventId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ConversationCreatedEvent = - ConversationCreatedEvent( - checkRequired("conversation", conversation), - checkRequired("eventId", eventId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationCreatedEvent = apply { - if (validated) { - return@apply - } - - conversation().validate() - eventId() - _type().let { - if (it != JsonValue.from("conversation.created")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (conversation.asKnown().getOrNull()?.validity() ?: 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("conversation.created")) 1 else 0 } - - /** The conversation resource. */ - class Conversation - private constructor( - private val id: JsonField, - private val object_: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("id") @ExcludeMissing id: JsonField = JsonMissing.of(), - @JsonProperty("object") @ExcludeMissing object_: JsonField = JsonMissing.of(), - ) : this(id, object_, mutableMapOf()) - - /** - * The unique ID of the conversation. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun id(): Optional = id.getOptional("id") - - /** - * The object type, must be `realtime.conversation`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun object_(): Optional = object_.getOptional("object") - - /** - * Returns the raw JSON value of [id]. - * - * Unlike [id], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("id") @ExcludeMissing fun _id(): JsonField = id - - /** - * Returns the raw JSON value of [object_]. - * - * Unlike [object_], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("object") @ExcludeMissing fun _object_(): JsonField = object_ - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Conversation]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Conversation]. */ - class Builder internal constructor() { - - private var id: JsonField = JsonMissing.of() - private var object_: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(conversation: Conversation) = apply { - id = conversation.id - object_ = conversation.object_ - additionalProperties = conversation.additionalProperties.toMutableMap() - } - - /** The unique ID of the conversation. */ - fun id(id: String) = id(JsonField.of(id)) - - /** - * Sets [Builder.id] to an arbitrary JSON value. - * - * You should usually call [Builder.id] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun id(id: JsonField) = apply { this.id = id } - - /** The object type, must be `realtime.conversation`. */ - fun object_(object_: Object) = object_(JsonField.of(object_)) - - /** - * Sets [Builder.object_] to an arbitrary JSON value. - * - * You should usually call [Builder.object_] with a well-typed [Object] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun object_(object_: JsonField) = apply { this.object_ = object_ } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Conversation]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Conversation = - Conversation(id, object_, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): Conversation = apply { - if (validated) { - return@apply - } - - id() - object_().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (id.asKnown().isPresent) 1 else 0) + - (object_.asKnown().getOrNull()?.validity() ?: 0) - - /** The object type, must be `realtime.conversation`. */ - class Object @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val REALTIME_CONVERSATION = of("realtime.conversation") - - @JvmStatic fun of(value: String) = Object(JsonField.of(value)) - } - - /** An enum containing [Object]'s known values. */ - enum class Known { - REALTIME_CONVERSATION - } - - /** - * An enum containing [Object]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Object] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - REALTIME_CONVERSATION, - /** - * An enum member indicating that [Object] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - REALTIME_CONVERSATION -> Value.REALTIME_CONVERSATION - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - REALTIME_CONVERSATION -> Known.REALTIME_CONVERSATION - else -> throw OpenAIInvalidDataException("Unknown Object: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Object = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Object && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Conversation && - id == other.id && - object_ == other.object_ && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(id, object_, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Conversation{id=$id, object_=$object_, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationCreatedEvent && - conversation == other.conversation && - eventId == other.eventId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(conversation, eventId, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationCreatedEvent{conversation=$conversation, eventId=$eventId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItem.kt deleted file mode 100644 index 9860f979f..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItem.kt +++ /dev/null @@ -1,1068 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkKnown -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** The item to add to the conversation. */ -class ConversationItem -private constructor( - private val id: JsonField, - private val arguments: JsonField, - private val callId: JsonField, - private val content: JsonField>, - private val name: JsonField, - private val object_: JsonField, - private val output: JsonField, - private val role: JsonField, - private val status: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("id") @ExcludeMissing id: JsonField = JsonMissing.of(), - @JsonProperty("arguments") @ExcludeMissing arguments: JsonField = JsonMissing.of(), - @JsonProperty("call_id") @ExcludeMissing callId: JsonField = JsonMissing.of(), - @JsonProperty("content") - @ExcludeMissing - content: JsonField> = JsonMissing.of(), - @JsonProperty("name") @ExcludeMissing name: JsonField = JsonMissing.of(), - @JsonProperty("object") @ExcludeMissing object_: JsonField = JsonMissing.of(), - @JsonProperty("output") @ExcludeMissing output: JsonField = JsonMissing.of(), - @JsonProperty("role") @ExcludeMissing role: JsonField = JsonMissing.of(), - @JsonProperty("status") @ExcludeMissing status: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this( - id, - arguments, - callId, - content, - name, - object_, - output, - role, - status, - type, - mutableMapOf(), - ) - - /** - * The unique ID of the item, this can be generated by the client to help manage server-side - * context, but is not required because the server will generate one if not provided. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun id(): Optional = id.getOptional("id") - - /** - * The arguments of the function call (for `function_call` items). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun arguments(): Optional = arguments.getOptional("arguments") - - /** - * The ID of the function call (for `function_call` and `function_call_output` items). If passed - * on a `function_call_output` item, the server will check that a `function_call` item with the - * same ID exists in the conversation history. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun callId(): Optional = callId.getOptional("call_id") - - /** - * The content of the message, applicable for `message` items. - * - Message items of role `system` support only `input_text` content - * - Message items of role `user` support `input_text` and `input_audio` content - * - Message items of role `assistant` support `text` content. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun content(): Optional> = content.getOptional("content") - - /** - * The name of the function being called (for `function_call` items). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun name(): Optional = name.getOptional("name") - - /** - * Identifier for the API object being returned - always `realtime.item`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun object_(): Optional = object_.getOptional("object") - - /** - * The output of the function call (for `function_call_output` items). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun output(): Optional = output.getOptional("output") - - /** - * The role of the message sender (`user`, `assistant`, `system`), only applicable for `message` - * items. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun role(): Optional = role.getOptional("role") - - /** - * The status of the item (`completed`, `incomplete`, `in_progress`). These have no effect on - * the conversation, but are accepted for consistency with the `conversation.item.created` - * event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun status(): Optional = status.getOptional("status") - - /** - * The type of the item (`message`, `function_call`, `function_call_output`). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [id]. - * - * Unlike [id], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("id") @ExcludeMissing fun _id(): JsonField = id - - /** - * Returns the raw JSON value of [arguments]. - * - * Unlike [arguments], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("arguments") @ExcludeMissing fun _arguments(): JsonField = arguments - - /** - * Returns the raw JSON value of [callId]. - * - * Unlike [callId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("call_id") @ExcludeMissing fun _callId(): JsonField = callId - - /** - * Returns the raw JSON value of [content]. - * - * Unlike [content], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content") - @ExcludeMissing - fun _content(): JsonField> = content - - /** - * Returns the raw JSON value of [name]. - * - * Unlike [name], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("name") @ExcludeMissing fun _name(): JsonField = name - - /** - * Returns the raw JSON value of [object_]. - * - * Unlike [object_], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("object") @ExcludeMissing fun _object_(): JsonField = object_ - - /** - * Returns the raw JSON value of [output]. - * - * Unlike [output], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output") @ExcludeMissing fun _output(): JsonField = output - - /** - * Returns the raw JSON value of [role]. - * - * Unlike [role], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("role") @ExcludeMissing fun _role(): JsonField = role - - /** - * Returns the raw JSON value of [status]. - * - * Unlike [status], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("status") @ExcludeMissing fun _status(): JsonField = status - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [ConversationItem]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItem]. */ - class Builder internal constructor() { - - private var id: JsonField = JsonMissing.of() - private var arguments: JsonField = JsonMissing.of() - private var callId: JsonField = JsonMissing.of() - private var content: JsonField>? = null - private var name: JsonField = JsonMissing.of() - private var object_: JsonField = JsonMissing.of() - private var output: JsonField = JsonMissing.of() - private var role: JsonField = JsonMissing.of() - private var status: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(conversationItem: ConversationItem) = apply { - id = conversationItem.id - arguments = conversationItem.arguments - callId = conversationItem.callId - content = conversationItem.content.map { it.toMutableList() } - name = conversationItem.name - object_ = conversationItem.object_ - output = conversationItem.output - role = conversationItem.role - status = conversationItem.status - type = conversationItem.type - additionalProperties = conversationItem.additionalProperties.toMutableMap() - } - - /** - * The unique ID of the item, this can be generated by the client to help manage server-side - * context, but is not required because the server will generate one if not provided. - */ - fun id(id: String) = id(JsonField.of(id)) - - /** - * Sets [Builder.id] to an arbitrary JSON value. - * - * You should usually call [Builder.id] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun id(id: JsonField) = apply { this.id = id } - - /** The arguments of the function call (for `function_call` items). */ - fun arguments(arguments: String) = arguments(JsonField.of(arguments)) - - /** - * Sets [Builder.arguments] to an arbitrary JSON value. - * - * You should usually call [Builder.arguments] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun arguments(arguments: JsonField) = apply { this.arguments = arguments } - - /** - * The ID of the function call (for `function_call` and `function_call_output` items). If - * passed on a `function_call_output` item, the server will check that a `function_call` - * item with the same ID exists in the conversation history. - */ - fun callId(callId: String) = callId(JsonField.of(callId)) - - /** - * Sets [Builder.callId] to an arbitrary JSON value. - * - * You should usually call [Builder.callId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun callId(callId: JsonField) = apply { this.callId = callId } - - /** - * The content of the message, applicable for `message` items. - * - Message items of role `system` support only `input_text` content - * - Message items of role `user` support `input_text` and `input_audio` content - * - Message items of role `assistant` support `text` content. - */ - fun content(content: List) = content(JsonField.of(content)) - - /** - * Sets [Builder.content] to an arbitrary JSON value. - * - * You should usually call [Builder.content] with a well-typed - * `List` value instead. This method is primarily for setting the - * field to an undocumented or not yet supported value. - */ - fun content(content: JsonField>) = apply { - this.content = content.map { it.toMutableList() } - } - - /** - * Adds a single [ConversationItemContent] to [Builder.content]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addContent(content: ConversationItemContent) = apply { - this.content = - (this.content ?: JsonField.of(mutableListOf())).also { - checkKnown("content", it).add(content) - } - } - - /** The name of the function being called (for `function_call` items). */ - fun name(name: String) = name(JsonField.of(name)) - - /** - * Sets [Builder.name] to an arbitrary JSON value. - * - * You should usually call [Builder.name] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun name(name: JsonField) = apply { this.name = name } - - /** Identifier for the API object being returned - always `realtime.item`. */ - fun object_(object_: Object) = object_(JsonField.of(object_)) - - /** - * Sets [Builder.object_] to an arbitrary JSON value. - * - * You should usually call [Builder.object_] with a well-typed [Object] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun object_(object_: JsonField) = apply { this.object_ = object_ } - - /** The output of the function call (for `function_call_output` items). */ - fun output(output: String) = output(JsonField.of(output)) - - /** - * Sets [Builder.output] to an arbitrary JSON value. - * - * You should usually call [Builder.output] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun output(output: JsonField) = apply { this.output = output } - - /** - * The role of the message sender (`user`, `assistant`, `system`), only applicable for - * `message` items. - */ - fun role(role: Role) = role(JsonField.of(role)) - - /** - * Sets [Builder.role] to an arbitrary JSON value. - * - * You should usually call [Builder.role] with a well-typed [Role] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun role(role: JsonField) = apply { this.role = role } - - /** - * The status of the item (`completed`, `incomplete`, `in_progress`). These have no effect - * on the conversation, but are accepted for consistency with the - * `conversation.item.created` event. - */ - fun status(status: Status) = status(JsonField.of(status)) - - /** - * Sets [Builder.status] to an arbitrary JSON value. - * - * You should usually call [Builder.status] with a well-typed [Status] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun status(status: JsonField) = apply { this.status = status } - - /** The type of the item (`message`, `function_call`, `function_call_output`). */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItem]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): ConversationItem = - ConversationItem( - id, - arguments, - callId, - (content ?: JsonMissing.of()).map { it.toImmutable() }, - name, - object_, - output, - role, - status, - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItem = apply { - if (validated) { - return@apply - } - - id() - arguments() - callId() - content().ifPresent { it.forEach { it.validate() } } - name() - object_().ifPresent { it.validate() } - output() - role().ifPresent { it.validate() } - status().ifPresent { it.validate() } - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (id.asKnown().isPresent) 1 else 0) + - (if (arguments.asKnown().isPresent) 1 else 0) + - (if (callId.asKnown().isPresent) 1 else 0) + - (content.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (if (name.asKnown().isPresent) 1 else 0) + - (object_.asKnown().getOrNull()?.validity() ?: 0) + - (if (output.asKnown().isPresent) 1 else 0) + - (role.asKnown().getOrNull()?.validity() ?: 0) + - (status.asKnown().getOrNull()?.validity() ?: 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** Identifier for the API object being returned - always `realtime.item`. */ - class Object @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val REALTIME_ITEM = of("realtime.item") - - @JvmStatic fun of(value: String) = Object(JsonField.of(value)) - } - - /** An enum containing [Object]'s known values. */ - enum class Known { - REALTIME_ITEM - } - - /** - * An enum containing [Object]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Object] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - REALTIME_ITEM, - /** An enum member indicating that [Object] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - REALTIME_ITEM -> Value.REALTIME_ITEM - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - REALTIME_ITEM -> Known.REALTIME_ITEM - else -> throw OpenAIInvalidDataException("Unknown Object: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Object = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Object && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * The role of the message sender (`user`, `assistant`, `system`), only applicable for `message` - * items. - */ - class Role @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val USER = of("user") - - @JvmField val ASSISTANT = of("assistant") - - @JvmField val SYSTEM = of("system") - - @JvmStatic fun of(value: String) = Role(JsonField.of(value)) - } - - /** An enum containing [Role]'s known values. */ - enum class Known { - USER, - ASSISTANT, - SYSTEM, - } - - /** - * An enum containing [Role]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Role] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - USER, - ASSISTANT, - SYSTEM, - /** An enum member indicating that [Role] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - USER -> Value.USER - ASSISTANT -> Value.ASSISTANT - SYSTEM -> Value.SYSTEM - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - USER -> Known.USER - ASSISTANT -> Known.ASSISTANT - SYSTEM -> Known.SYSTEM - else -> throw OpenAIInvalidDataException("Unknown Role: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Role = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Role && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * The status of the item (`completed`, `incomplete`, `in_progress`). These have no effect on - * the conversation, but are accepted for consistency with the `conversation.item.created` - * event. - */ - class Status @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val COMPLETED = of("completed") - - @JvmField val INCOMPLETE = of("incomplete") - - @JvmField val IN_PROGRESS = of("in_progress") - - @JvmStatic fun of(value: String) = Status(JsonField.of(value)) - } - - /** An enum containing [Status]'s known values. */ - enum class Known { - COMPLETED, - INCOMPLETE, - IN_PROGRESS, - } - - /** - * An enum containing [Status]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Status] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - COMPLETED, - INCOMPLETE, - IN_PROGRESS, - /** An enum member indicating that [Status] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - COMPLETED -> Value.COMPLETED - INCOMPLETE -> Value.INCOMPLETE - IN_PROGRESS -> Value.IN_PROGRESS - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - COMPLETED -> Known.COMPLETED - INCOMPLETE -> Known.INCOMPLETE - IN_PROGRESS -> Known.IN_PROGRESS - else -> throw OpenAIInvalidDataException("Unknown Status: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Status = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Status && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** The type of the item (`message`, `function_call`, `function_call_output`). */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val MESSAGE = of("message") - - @JvmField val FUNCTION_CALL = of("function_call") - - @JvmField val FUNCTION_CALL_OUTPUT = of("function_call_output") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - MESSAGE, - FUNCTION_CALL, - FUNCTION_CALL_OUTPUT, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - MESSAGE, - FUNCTION_CALL, - FUNCTION_CALL_OUTPUT, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - MESSAGE -> Value.MESSAGE - FUNCTION_CALL -> Value.FUNCTION_CALL - FUNCTION_CALL_OUTPUT -> Value.FUNCTION_CALL_OUTPUT - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - MESSAGE -> Known.MESSAGE - FUNCTION_CALL -> Known.FUNCTION_CALL - FUNCTION_CALL_OUTPUT -> Known.FUNCTION_CALL_OUTPUT - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItem && - id == other.id && - arguments == other.arguments && - callId == other.callId && - content == other.content && - name == other.name && - object_ == other.object_ && - output == other.output && - role == other.role && - status == other.status && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - id, - arguments, - callId, - content, - name, - object_, - output, - role, - status, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItem{id=$id, arguments=$arguments, callId=$callId, content=$content, name=$name, object_=$object_, output=$output, role=$role, status=$status, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemContent.kt deleted file mode 100644 index bb81b9f63..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemContent.kt +++ /dev/null @@ -1,451 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -class ConversationItemContent -private constructor( - private val id: JsonField, - private val audio: JsonField, - private val text: JsonField, - private val transcript: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("id") @ExcludeMissing id: JsonField = JsonMissing.of(), - @JsonProperty("audio") @ExcludeMissing audio: JsonField = JsonMissing.of(), - @JsonProperty("text") @ExcludeMissing text: JsonField = JsonMissing.of(), - @JsonProperty("transcript") - @ExcludeMissing - transcript: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(id, audio, text, transcript, type, mutableMapOf()) - - /** - * ID of a previous conversation item to reference (for `item_reference` content types in - * `response.create` events). These can reference both client and server created items. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun id(): Optional = id.getOptional("id") - - /** - * Base64-encoded audio bytes, used for `input_audio` content type. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun audio(): Optional = audio.getOptional("audio") - - /** - * The text content, used for `input_text` and `text` content types. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun text(): Optional = text.getOptional("text") - - /** - * The transcript of the audio, used for `input_audio` and `audio` content types. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun transcript(): Optional = transcript.getOptional("transcript") - - /** - * The content type (`input_text`, `input_audio`, `item_reference`, `text`, `audio`). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [id]. - * - * Unlike [id], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("id") @ExcludeMissing fun _id(): JsonField = id - - /** - * Returns the raw JSON value of [audio]. - * - * Unlike [audio], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("audio") @ExcludeMissing fun _audio(): JsonField = audio - - /** - * Returns the raw JSON value of [text]. - * - * Unlike [text], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("text") @ExcludeMissing fun _text(): JsonField = text - - /** - * Returns the raw JSON value of [transcript]. - * - * Unlike [transcript], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("transcript") @ExcludeMissing fun _transcript(): JsonField = transcript - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [ConversationItemContent]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItemContent]. */ - class Builder internal constructor() { - - private var id: JsonField = JsonMissing.of() - private var audio: JsonField = JsonMissing.of() - private var text: JsonField = JsonMissing.of() - private var transcript: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(conversationItemContent: ConversationItemContent) = apply { - id = conversationItemContent.id - audio = conversationItemContent.audio - text = conversationItemContent.text - transcript = conversationItemContent.transcript - type = conversationItemContent.type - additionalProperties = conversationItemContent.additionalProperties.toMutableMap() - } - - /** - * ID of a previous conversation item to reference (for `item_reference` content types in - * `response.create` events). These can reference both client and server created items. - */ - fun id(id: String) = id(JsonField.of(id)) - - /** - * Sets [Builder.id] to an arbitrary JSON value. - * - * You should usually call [Builder.id] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun id(id: JsonField) = apply { this.id = id } - - /** Base64-encoded audio bytes, used for `input_audio` content type. */ - fun audio(audio: String) = audio(JsonField.of(audio)) - - /** - * Sets [Builder.audio] to an arbitrary JSON value. - * - * You should usually call [Builder.audio] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun audio(audio: JsonField) = apply { this.audio = audio } - - /** The text content, used for `input_text` and `text` content types. */ - fun text(text: String) = text(JsonField.of(text)) - - /** - * Sets [Builder.text] to an arbitrary JSON value. - * - * You should usually call [Builder.text] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun text(text: JsonField) = apply { this.text = text } - - /** The transcript of the audio, used for `input_audio` and `audio` content types. */ - fun transcript(transcript: String) = transcript(JsonField.of(transcript)) - - /** - * Sets [Builder.transcript] to an arbitrary JSON value. - * - * You should usually call [Builder.transcript] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun transcript(transcript: JsonField) = apply { this.transcript = transcript } - - /** The content type (`input_text`, `input_audio`, `item_reference`, `text`, `audio`). */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItemContent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): ConversationItemContent = - ConversationItemContent( - id, - audio, - text, - transcript, - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItemContent = apply { - if (validated) { - return@apply - } - - id() - audio() - text() - transcript() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (id.asKnown().isPresent) 1 else 0) + - (if (audio.asKnown().isPresent) 1 else 0) + - (if (text.asKnown().isPresent) 1 else 0) + - (if (transcript.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** The content type (`input_text`, `input_audio`, `item_reference`, `text`, `audio`). */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val INPUT_TEXT = of("input_text") - - @JvmField val INPUT_AUDIO = of("input_audio") - - @JvmField val ITEM_REFERENCE = of("item_reference") - - @JvmField val TEXT = of("text") - - @JvmField val AUDIO = of("audio") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - INPUT_TEXT, - INPUT_AUDIO, - ITEM_REFERENCE, - TEXT, - AUDIO, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - INPUT_TEXT, - INPUT_AUDIO, - ITEM_REFERENCE, - TEXT, - AUDIO, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - INPUT_TEXT -> Value.INPUT_TEXT - INPUT_AUDIO -> Value.INPUT_AUDIO - ITEM_REFERENCE -> Value.ITEM_REFERENCE - TEXT -> Value.TEXT - AUDIO -> Value.AUDIO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - INPUT_TEXT -> Known.INPUT_TEXT - INPUT_AUDIO -> Known.INPUT_AUDIO - ITEM_REFERENCE -> Known.ITEM_REFERENCE - TEXT -> Known.TEXT - AUDIO -> Known.AUDIO - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItemContent && - id == other.id && - audio == other.audio && - text == other.text && - transcript == other.transcript && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(id, audio, text, transcript, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItemContent{id=$id, audio=$audio, text=$text, transcript=$transcript, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemCreateEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemCreateEvent.kt deleted file mode 100644 index 5ce0f8b6e..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemCreateEvent.kt +++ /dev/null @@ -1,312 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * Add a new Item to the Conversation's context, including messages, function calls, and function - * call responses. This event can be used both to populate a "history" of the conversation and to - * add new items mid-stream, but has the current limitation that it cannot populate assistant audio - * messages. - * - * If successful, the server will respond with a `conversation.item.created` event, otherwise an - * `error` event will be sent. - */ -class ConversationItemCreateEvent -private constructor( - private val item: JsonField, - private val type: JsonValue, - private val eventId: JsonField, - private val previousItemId: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("item") @ExcludeMissing item: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("previous_item_id") - @ExcludeMissing - previousItemId: JsonField = JsonMissing.of(), - ) : this(item, type, eventId, previousItemId, mutableMapOf()) - - /** - * The item to add to the conversation. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun item(): ConversationItem = item.getRequired("item") - - /** - * The event type, must be `conversation.item.create`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("conversation.item.create") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Optional client-generated ID used to identify this event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eventId(): Optional = eventId.getOptional("event_id") - - /** - * The ID of the preceding item after which the new item will be inserted. If not set, the new - * item will be appended to the end of the conversation. If set to `root`, the new item will be - * added to the beginning of the conversation. If set to an existing ID, it allows an item to be - * inserted mid-conversation. If the ID cannot be found, an error will be returned and the item - * will not be added. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun previousItemId(): Optional = previousItemId.getOptional("previous_item_id") - - /** - * Returns the raw JSON value of [item]. - * - * Unlike [item], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item") @ExcludeMissing fun _item(): JsonField = item - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [previousItemId]. - * - * Unlike [previousItemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("previous_item_id") - @ExcludeMissing - fun _previousItemId(): JsonField = previousItemId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ConversationItemCreateEvent]. - * - * The following fields are required: - * ```java - * .item() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItemCreateEvent]. */ - class Builder internal constructor() { - - private var item: JsonField? = null - private var type: JsonValue = JsonValue.from("conversation.item.create") - private var eventId: JsonField = JsonMissing.of() - private var previousItemId: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(conversationItemCreateEvent: ConversationItemCreateEvent) = apply { - item = conversationItemCreateEvent.item - type = conversationItemCreateEvent.type - eventId = conversationItemCreateEvent.eventId - previousItemId = conversationItemCreateEvent.previousItemId - additionalProperties = conversationItemCreateEvent.additionalProperties.toMutableMap() - } - - /** The item to add to the conversation. */ - fun item(item: ConversationItem) = item(JsonField.of(item)) - - /** - * Sets [Builder.item] to an arbitrary JSON value. - * - * You should usually call [Builder.item] with a well-typed [ConversationItem] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun item(item: JsonField) = apply { this.item = item } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("conversation.item.create") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** Optional client-generated ID used to identify this event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** - * The ID of the preceding item after which the new item will be inserted. If not set, the - * new item will be appended to the end of the conversation. If set to `root`, the new item - * will be added to the beginning of the conversation. If set to an existing ID, it allows - * an item to be inserted mid-conversation. If the ID cannot be found, an error will be - * returned and the item will not be added. - */ - fun previousItemId(previousItemId: String) = previousItemId(JsonField.of(previousItemId)) - - /** - * Sets [Builder.previousItemId] to an arbitrary JSON value. - * - * You should usually call [Builder.previousItemId] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun previousItemId(previousItemId: JsonField) = apply { - this.previousItemId = previousItemId - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItemCreateEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .item() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ConversationItemCreateEvent = - ConversationItemCreateEvent( - checkRequired("item", item), - type, - eventId, - previousItemId, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItemCreateEvent = apply { - if (validated) { - return@apply - } - - item().validate() - _type().let { - if (it != JsonValue.from("conversation.item.create")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - eventId() - previousItemId() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (item.asKnown().getOrNull()?.validity() ?: 0) + - type.let { if (it == JsonValue.from("conversation.item.create")) 1 else 0 } + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (previousItemId.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItemCreateEvent && - item == other.item && - type == other.type && - eventId == other.eventId && - previousItemId == other.previousItemId && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(item, type, eventId, previousItemId, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItemCreateEvent{item=$item, type=$type, eventId=$eventId, previousItemId=$previousItemId, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemCreatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemCreatedEvent.kt deleted file mode 100644 index 3416e04d3..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemCreatedEvent.kt +++ /dev/null @@ -1,314 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * Returned when a conversation item is created. There are several scenarios that produce this - * event: - * - The server is generating a Response, which if successful will produce either one or two Items, - * which will be of type `message` (role `assistant`) or type `function_call`. - * - The input audio buffer has been committed, either by the client or the server (in `server_vad` - * mode). The server will take the content of the input audio buffer and add it to a new user - * message Item. - * - The client has sent a `conversation.item.create` event to add a new Item to the Conversation. - */ -class ConversationItemCreatedEvent -private constructor( - private val eventId: JsonField, - private val item: JsonField, - private val type: JsonValue, - private val previousItemId: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item") @ExcludeMissing item: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("previous_item_id") - @ExcludeMissing - previousItemId: JsonField = JsonMissing.of(), - ) : this(eventId, item, type, previousItemId, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The item to add to the conversation. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun item(): ConversationItem = item.getRequired("item") - - /** - * The event type, must be `conversation.item.created`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("conversation.item.created") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * The ID of the preceding item in the Conversation context, allows the client to understand the - * order of the conversation. Can be `null` if the item has no predecessor. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun previousItemId(): Optional = previousItemId.getOptional("previous_item_id") - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [item]. - * - * Unlike [item], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item") @ExcludeMissing fun _item(): JsonField = item - - /** - * Returns the raw JSON value of [previousItemId]. - * - * Unlike [previousItemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("previous_item_id") - @ExcludeMissing - fun _previousItemId(): JsonField = previousItemId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ConversationItemCreatedEvent]. - * - * The following fields are required: - * ```java - * .eventId() - * .item() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItemCreatedEvent]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var item: JsonField? = null - private var type: JsonValue = JsonValue.from("conversation.item.created") - private var previousItemId: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(conversationItemCreatedEvent: ConversationItemCreatedEvent) = apply { - eventId = conversationItemCreatedEvent.eventId - item = conversationItemCreatedEvent.item - type = conversationItemCreatedEvent.type - previousItemId = conversationItemCreatedEvent.previousItemId - additionalProperties = conversationItemCreatedEvent.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The item to add to the conversation. */ - fun item(item: ConversationItem) = item(JsonField.of(item)) - - /** - * Sets [Builder.item] to an arbitrary JSON value. - * - * You should usually call [Builder.item] with a well-typed [ConversationItem] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun item(item: JsonField) = apply { this.item = item } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("conversation.item.created") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** - * The ID of the preceding item in the Conversation context, allows the client to understand - * the order of the conversation. Can be `null` if the item has no predecessor. - */ - fun previousItemId(previousItemId: String?) = - previousItemId(JsonField.ofNullable(previousItemId)) - - /** Alias for calling [Builder.previousItemId] with `previousItemId.orElse(null)`. */ - fun previousItemId(previousItemId: Optional) = - previousItemId(previousItemId.getOrNull()) - - /** - * Sets [Builder.previousItemId] to an arbitrary JSON value. - * - * You should usually call [Builder.previousItemId] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun previousItemId(previousItemId: JsonField) = apply { - this.previousItemId = previousItemId - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItemCreatedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .item() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ConversationItemCreatedEvent = - ConversationItemCreatedEvent( - checkRequired("eventId", eventId), - checkRequired("item", item), - type, - previousItemId, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItemCreatedEvent = apply { - if (validated) { - return@apply - } - - eventId() - item().validate() - _type().let { - if (it != JsonValue.from("conversation.item.created")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - previousItemId() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (item.asKnown().getOrNull()?.validity() ?: 0) + - type.let { if (it == JsonValue.from("conversation.item.created")) 1 else 0 } + - (if (previousItemId.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItemCreatedEvent && - eventId == other.eventId && - item == other.item && - type == other.type && - previousItemId == other.previousItemId && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(eventId, item, type, previousItemId, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItemCreatedEvent{eventId=$eventId, item=$item, type=$type, previousItemId=$previousItemId, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemDeleteEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemDeleteEvent.kt deleted file mode 100644 index 5d09f42f6..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemDeleteEvent.kt +++ /dev/null @@ -1,253 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional - -/** - * Send this event when you want to remove any item from the conversation history. The server will - * respond with a `conversation.item.deleted` event, unless the item does not exist in the - * conversation history, in which case the server will respond with an error. - */ -class ConversationItemDeleteEvent -private constructor( - private val itemId: JsonField, - private val type: JsonValue, - private val eventId: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - ) : this(itemId, type, eventId, mutableMapOf()) - - /** - * The ID of the item to delete. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The event type, must be `conversation.item.delete`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("conversation.item.delete") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Optional client-generated ID used to identify this event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eventId(): Optional = eventId.getOptional("event_id") - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ConversationItemDeleteEvent]. - * - * The following fields are required: - * ```java - * .itemId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItemDeleteEvent]. */ - class Builder internal constructor() { - - private var itemId: JsonField? = null - private var type: JsonValue = JsonValue.from("conversation.item.delete") - private var eventId: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(conversationItemDeleteEvent: ConversationItemDeleteEvent) = apply { - itemId = conversationItemDeleteEvent.itemId - type = conversationItemDeleteEvent.type - eventId = conversationItemDeleteEvent.eventId - additionalProperties = conversationItemDeleteEvent.additionalProperties.toMutableMap() - } - - /** The ID of the item to delete. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("conversation.item.delete") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** Optional client-generated ID used to identify this event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItemDeleteEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .itemId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ConversationItemDeleteEvent = - ConversationItemDeleteEvent( - checkRequired("itemId", itemId), - type, - eventId, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItemDeleteEvent = apply { - if (validated) { - return@apply - } - - itemId() - _type().let { - if (it != JsonValue.from("conversation.item.delete")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - eventId() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (itemId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("conversation.item.delete")) 1 else 0 } + - (if (eventId.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItemDeleteEvent && - itemId == other.itemId && - type == other.type && - eventId == other.eventId && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(itemId, type, eventId, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItemDeleteEvent{itemId=$itemId, type=$type, eventId=$eventId, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemDeletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemDeletedEvent.kt deleted file mode 100644 index aa153c31d..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemDeletedEvent.kt +++ /dev/null @@ -1,254 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects - -/** - * Returned when an item in the conversation is deleted by the client with a - * `conversation.item.delete` event. This event is used to synchronize the server's understanding of - * the conversation history with the client's view. - */ -class ConversationItemDeletedEvent -private constructor( - private val eventId: JsonField, - private val itemId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, itemId, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the item that was deleted. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The event type, must be `conversation.item.deleted`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("conversation.item.deleted") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ConversationItemDeletedEvent]. - * - * The following fields are required: - * ```java - * .eventId() - * .itemId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItemDeletedEvent]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var type: JsonValue = JsonValue.from("conversation.item.deleted") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(conversationItemDeletedEvent: ConversationItemDeletedEvent) = apply { - eventId = conversationItemDeletedEvent.eventId - itemId = conversationItemDeletedEvent.itemId - type = conversationItemDeletedEvent.type - additionalProperties = conversationItemDeletedEvent.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the item that was deleted. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("conversation.item.deleted") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItemDeletedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .itemId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ConversationItemDeletedEvent = - ConversationItemDeletedEvent( - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItemDeletedEvent = apply { - if (validated) { - return@apply - } - - eventId() - itemId() - _type().let { - if (it != JsonValue.from("conversation.item.deleted")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("conversation.item.deleted")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItemDeletedEvent && - eventId == other.eventId && - itemId == other.itemId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(eventId, itemId, type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItemDeletedEvent{eventId=$eventId, itemId=$itemId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionCompletedEvent.kt deleted file mode 100644 index 107e82f17..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionCompletedEvent.kt +++ /dev/null @@ -1,1718 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.ObjectCodec -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.BaseDeserializer -import com.openai.core.BaseSerializer -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.allMaxBy -import com.openai.core.checkKnown -import com.openai.core.checkRequired -import com.openai.core.getOrThrow -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * This event is the output of audio transcription for user audio written to the user audio buffer. - * Transcription begins when the input audio buffer is committed by the client or server (in - * `server_vad` mode). Transcription runs asynchronously with Response creation, so this event may - * come before or after the Response events. - * - * Realtime API models accept audio natively, and thus input transcription is a separate process run - * on a separate ASR (Automatic Speech Recognition) model. The transcript may diverge somewhat from - * the model's interpretation, and should be treated as a rough guide. - */ -class ConversationItemInputAudioTranscriptionCompletedEvent -private constructor( - private val contentIndex: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val transcript: JsonField, - private val type: JsonValue, - private val usage: JsonField, - private val logprobs: JsonField>, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("content_index") - @ExcludeMissing - contentIndex: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("transcript") - @ExcludeMissing - transcript: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("usage") @ExcludeMissing usage: JsonField = JsonMissing.of(), - @JsonProperty("logprobs") - @ExcludeMissing - logprobs: JsonField> = JsonMissing.of(), - ) : this(contentIndex, eventId, itemId, transcript, type, usage, logprobs, mutableMapOf()) - - /** - * The index of the content part containing the audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun contentIndex(): Long = contentIndex.getRequired("content_index") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the user message item containing the audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The transcribed text. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun transcript(): String = transcript.getRequired("transcript") - - /** - * The event type, must be `conversation.item.input_audio_transcription.completed`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("conversation.item.input_audio_transcription.completed") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Usage statistics for the transcription. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun usage(): Usage = usage.getRequired("usage") - - /** - * The log probabilities of the transcription. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun logprobs(): Optional> = logprobs.getOptional("logprobs") - - /** - * Returns the raw JSON value of [contentIndex]. - * - * Unlike [contentIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content_index") - @ExcludeMissing - fun _contentIndex(): JsonField = contentIndex - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [transcript]. - * - * Unlike [transcript], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("transcript") @ExcludeMissing fun _transcript(): JsonField = transcript - - /** - * Returns the raw JSON value of [usage]. - * - * Unlike [usage], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("usage") @ExcludeMissing fun _usage(): JsonField = usage - - /** - * Returns the raw JSON value of [logprobs]. - * - * Unlike [logprobs], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("logprobs") @ExcludeMissing fun _logprobs(): JsonField> = logprobs - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [ConversationItemInputAudioTranscriptionCompletedEvent]. - * - * The following fields are required: - * ```java - * .contentIndex() - * .eventId() - * .itemId() - * .transcript() - * .usage() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItemInputAudioTranscriptionCompletedEvent]. */ - class Builder internal constructor() { - - private var contentIndex: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var transcript: JsonField? = null - private var type: JsonValue = - JsonValue.from("conversation.item.input_audio_transcription.completed") - private var usage: JsonField? = null - private var logprobs: JsonField>? = null - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from( - conversationItemInputAudioTranscriptionCompletedEvent: - ConversationItemInputAudioTranscriptionCompletedEvent - ) = apply { - contentIndex = conversationItemInputAudioTranscriptionCompletedEvent.contentIndex - eventId = conversationItemInputAudioTranscriptionCompletedEvent.eventId - itemId = conversationItemInputAudioTranscriptionCompletedEvent.itemId - transcript = conversationItemInputAudioTranscriptionCompletedEvent.transcript - type = conversationItemInputAudioTranscriptionCompletedEvent.type - usage = conversationItemInputAudioTranscriptionCompletedEvent.usage - logprobs = - conversationItemInputAudioTranscriptionCompletedEvent.logprobs.map { - it.toMutableList() - } - additionalProperties = - conversationItemInputAudioTranscriptionCompletedEvent.additionalProperties - .toMutableMap() - } - - /** The index of the content part containing the audio. */ - fun contentIndex(contentIndex: Long) = contentIndex(JsonField.of(contentIndex)) - - /** - * Sets [Builder.contentIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.contentIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun contentIndex(contentIndex: JsonField) = apply { this.contentIndex = contentIndex } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the user message item containing the audio. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** The transcribed text. */ - fun transcript(transcript: String) = transcript(JsonField.of(transcript)) - - /** - * Sets [Builder.transcript] to an arbitrary JSON value. - * - * You should usually call [Builder.transcript] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun transcript(transcript: JsonField) = apply { this.transcript = transcript } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("conversation.item.input_audio_transcription.completed") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** Usage statistics for the transcription. */ - fun usage(usage: Usage) = usage(JsonField.of(usage)) - - /** - * Sets [Builder.usage] to an arbitrary JSON value. - * - * You should usually call [Builder.usage] with a well-typed [Usage] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun usage(usage: JsonField) = apply { this.usage = usage } - - /** - * Alias for calling [usage] with - * `Usage.ofTranscriptTextUsageTokens(transcriptTextUsageTokens)`. - */ - fun usage(transcriptTextUsageTokens: Usage.TranscriptTextUsageTokens) = - usage(Usage.ofTranscriptTextUsageTokens(transcriptTextUsageTokens)) - - /** - * Alias for calling [usage] with - * `Usage.ofTranscriptTextUsageDuration(transcriptTextUsageDuration)`. - */ - fun usage(transcriptTextUsageDuration: Usage.TranscriptTextUsageDuration) = - usage(Usage.ofTranscriptTextUsageDuration(transcriptTextUsageDuration)) - - /** The log probabilities of the transcription. */ - fun logprobs(logprobs: List?) = logprobs(JsonField.ofNullable(logprobs)) - - /** Alias for calling [Builder.logprobs] with `logprobs.orElse(null)`. */ - fun logprobs(logprobs: Optional>) = logprobs(logprobs.getOrNull()) - - /** - * Sets [Builder.logprobs] to an arbitrary JSON value. - * - * You should usually call [Builder.logprobs] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun logprobs(logprobs: JsonField>) = apply { - this.logprobs = logprobs.map { it.toMutableList() } - } - - /** - * Adds a single [Logprob] to [logprobs]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addLogprob(logprob: Logprob) = apply { - logprobs = - (logprobs ?: JsonField.of(mutableListOf())).also { - checkKnown("logprobs", it).add(logprob) - } - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItemInputAudioTranscriptionCompletedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .contentIndex() - * .eventId() - * .itemId() - * .transcript() - * .usage() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ConversationItemInputAudioTranscriptionCompletedEvent = - ConversationItemInputAudioTranscriptionCompletedEvent( - checkRequired("contentIndex", contentIndex), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - checkRequired("transcript", transcript), - type, - checkRequired("usage", usage), - (logprobs ?: JsonMissing.of()).map { it.toImmutable() }, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItemInputAudioTranscriptionCompletedEvent = apply { - if (validated) { - return@apply - } - - contentIndex() - eventId() - itemId() - transcript() - _type().let { - if (it != JsonValue.from("conversation.item.input_audio_transcription.completed")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - usage().validate() - logprobs().ifPresent { it.forEach { it.validate() } } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (contentIndex.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - (if (transcript.asKnown().isPresent) 1 else 0) + - type.let { - if (it == JsonValue.from("conversation.item.input_audio_transcription.completed")) 1 - else 0 - } + - (usage.asKnown().getOrNull()?.validity() ?: 0) + - (logprobs.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) - - /** Usage statistics for the transcription. */ - @JsonDeserialize(using = Usage.Deserializer::class) - @JsonSerialize(using = Usage.Serializer::class) - class Usage - private constructor( - private val transcriptTextUsageTokens: TranscriptTextUsageTokens? = null, - private val transcriptTextUsageDuration: TranscriptTextUsageDuration? = null, - private val _json: JsonValue? = null, - ) { - - /** Usage statistics for models billed by token usage. */ - fun transcriptTextUsageTokens(): Optional = - Optional.ofNullable(transcriptTextUsageTokens) - - /** Usage statistics for models billed by audio input duration. */ - fun transcriptTextUsageDuration(): Optional = - Optional.ofNullable(transcriptTextUsageDuration) - - fun isTranscriptTextUsageTokens(): Boolean = transcriptTextUsageTokens != null - - fun isTranscriptTextUsageDuration(): Boolean = transcriptTextUsageDuration != null - - /** Usage statistics for models billed by token usage. */ - fun asTranscriptTextUsageTokens(): TranscriptTextUsageTokens = - transcriptTextUsageTokens.getOrThrow("transcriptTextUsageTokens") - - /** Usage statistics for models billed by audio input duration. */ - fun asTranscriptTextUsageDuration(): TranscriptTextUsageDuration = - transcriptTextUsageDuration.getOrThrow("transcriptTextUsageDuration") - - fun _json(): Optional = Optional.ofNullable(_json) - - fun accept(visitor: Visitor): T = - when { - transcriptTextUsageTokens != null -> - visitor.visitTranscriptTextUsageTokens(transcriptTextUsageTokens) - transcriptTextUsageDuration != null -> - visitor.visitTranscriptTextUsageDuration(transcriptTextUsageDuration) - else -> visitor.unknown(_json) - } - - private var validated: Boolean = false - - fun validate(): Usage = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitTranscriptTextUsageTokens( - transcriptTextUsageTokens: TranscriptTextUsageTokens - ) { - transcriptTextUsageTokens.validate() - } - - override fun visitTranscriptTextUsageDuration( - transcriptTextUsageDuration: TranscriptTextUsageDuration - ) { - transcriptTextUsageDuration.validate() - } - } - ) - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - accept( - object : Visitor { - override fun visitTranscriptTextUsageTokens( - transcriptTextUsageTokens: TranscriptTextUsageTokens - ) = transcriptTextUsageTokens.validity() - - override fun visitTranscriptTextUsageDuration( - transcriptTextUsageDuration: TranscriptTextUsageDuration - ) = transcriptTextUsageDuration.validity() - - override fun unknown(json: JsonValue?) = 0 - } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Usage && - transcriptTextUsageTokens == other.transcriptTextUsageTokens && - transcriptTextUsageDuration == other.transcriptTextUsageDuration - } - - override fun hashCode(): Int = - Objects.hash(transcriptTextUsageTokens, transcriptTextUsageDuration) - - override fun toString(): String = - when { - transcriptTextUsageTokens != null -> - "Usage{transcriptTextUsageTokens=$transcriptTextUsageTokens}" - transcriptTextUsageDuration != null -> - "Usage{transcriptTextUsageDuration=$transcriptTextUsageDuration}" - _json != null -> "Usage{_unknown=$_json}" - else -> throw IllegalStateException("Invalid Usage") - } - - companion object { - - /** Usage statistics for models billed by token usage. */ - @JvmStatic - fun ofTranscriptTextUsageTokens(transcriptTextUsageTokens: TranscriptTextUsageTokens) = - Usage(transcriptTextUsageTokens = transcriptTextUsageTokens) - - /** Usage statistics for models billed by audio input duration. */ - @JvmStatic - fun ofTranscriptTextUsageDuration( - transcriptTextUsageDuration: TranscriptTextUsageDuration - ) = Usage(transcriptTextUsageDuration = transcriptTextUsageDuration) - } - - /** An interface that defines how to map each variant of [Usage] to a value of type [T]. */ - interface Visitor { - - /** Usage statistics for models billed by token usage. */ - fun visitTranscriptTextUsageTokens( - transcriptTextUsageTokens: TranscriptTextUsageTokens - ): T - - /** Usage statistics for models billed by audio input duration. */ - fun visitTranscriptTextUsageDuration( - transcriptTextUsageDuration: TranscriptTextUsageDuration - ): T - - /** - * Maps an unknown variant of [Usage] to a value of type [T]. - * - * An instance of [Usage] can contain an unknown variant if it was deserialized from - * data that doesn't match any known variant. For example, if the SDK is on an older - * version than the API, then the API may respond with new variants that the SDK is - * unaware of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown Usage: $json") - } - } - - internal class Deserializer : BaseDeserializer(Usage::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): Usage { - val json = JsonValue.fromJsonNode(node) - - val bestMatches = - sequenceOf( - tryDeserialize(node, jacksonTypeRef())?.let { - Usage(transcriptTextUsageTokens = it, _json = json) - }, - tryDeserialize(node, jacksonTypeRef()) - ?.let { Usage(transcriptTextUsageDuration = it, _json = json) }, - ) - .filterNotNull() - .allMaxBy { it.validity() } - .toList() - return when (bestMatches.size) { - // This can happen if what we're deserializing is completely incompatible with - // all the possible variants (e.g. deserializing from boolean). - 0 -> Usage(_json = json) - 1 -> bestMatches.single() - // If there's more than one match with the highest validity, then use the first - // completely valid match, or simply the first match if none are completely - // valid. - else -> bestMatches.firstOrNull { it.isValid() } ?: bestMatches.first() - } - } - } - - internal class Serializer : BaseSerializer(Usage::class) { - - override fun serialize( - value: Usage, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.transcriptTextUsageTokens != null -> - generator.writeObject(value.transcriptTextUsageTokens) - value.transcriptTextUsageDuration != null -> - generator.writeObject(value.transcriptTextUsageDuration) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid Usage") - } - } - } - - /** Usage statistics for models billed by token usage. */ - class TranscriptTextUsageTokens - private constructor( - private val inputTokens: JsonField, - private val outputTokens: JsonField, - private val totalTokens: JsonField, - private val type: JsonValue, - private val inputTokenDetails: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("input_tokens") - @ExcludeMissing - inputTokens: JsonField = JsonMissing.of(), - @JsonProperty("output_tokens") - @ExcludeMissing - outputTokens: JsonField = JsonMissing.of(), - @JsonProperty("total_tokens") - @ExcludeMissing - totalTokens: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("input_token_details") - @ExcludeMissing - inputTokenDetails: JsonField = JsonMissing.of(), - ) : this( - inputTokens, - outputTokens, - totalTokens, - type, - inputTokenDetails, - mutableMapOf(), - ) - - /** - * Number of input tokens billed for this request. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected - * value). - */ - fun inputTokens(): Long = inputTokens.getRequired("input_tokens") - - /** - * Number of output tokens generated. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected - * value). - */ - fun outputTokens(): Long = outputTokens.getRequired("output_tokens") - - /** - * Total number of tokens used (input + output). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected - * value). - */ - fun totalTokens(): Long = totalTokens.getRequired("total_tokens") - - /** - * The type of the usage object. Always `tokens` for this variant. - * - * Expected to always return the following: - * ```java - * JsonValue.from("tokens") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server - * responded with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Details about the input tokens billed for this request. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun inputTokenDetails(): Optional = - inputTokenDetails.getOptional("input_token_details") - - /** - * Returns the raw JSON value of [inputTokens]. - * - * Unlike [inputTokens], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("input_tokens") - @ExcludeMissing - fun _inputTokens(): JsonField = inputTokens - - /** - * Returns the raw JSON value of [outputTokens]. - * - * Unlike [outputTokens], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("output_tokens") - @ExcludeMissing - fun _outputTokens(): JsonField = outputTokens - - /** - * Returns the raw JSON value of [totalTokens]. - * - * Unlike [totalTokens], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("total_tokens") - @ExcludeMissing - fun _totalTokens(): JsonField = totalTokens - - /** - * Returns the raw JSON value of [inputTokenDetails]. - * - * Unlike [inputTokenDetails], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("input_token_details") - @ExcludeMissing - fun _inputTokenDetails(): JsonField = inputTokenDetails - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [TranscriptTextUsageTokens]. - * - * The following fields are required: - * ```java - * .inputTokens() - * .outputTokens() - * .totalTokens() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TranscriptTextUsageTokens]. */ - class Builder internal constructor() { - - private var inputTokens: JsonField? = null - private var outputTokens: JsonField? = null - private var totalTokens: JsonField? = null - private var type: JsonValue = JsonValue.from("tokens") - private var inputTokenDetails: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(transcriptTextUsageTokens: TranscriptTextUsageTokens) = apply { - inputTokens = transcriptTextUsageTokens.inputTokens - outputTokens = transcriptTextUsageTokens.outputTokens - totalTokens = transcriptTextUsageTokens.totalTokens - type = transcriptTextUsageTokens.type - inputTokenDetails = transcriptTextUsageTokens.inputTokenDetails - additionalProperties = - transcriptTextUsageTokens.additionalProperties.toMutableMap() - } - - /** Number of input tokens billed for this request. */ - fun inputTokens(inputTokens: Long) = inputTokens(JsonField.of(inputTokens)) - - /** - * Sets [Builder.inputTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.inputTokens] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun inputTokens(inputTokens: JsonField) = apply { - this.inputTokens = inputTokens - } - - /** Number of output tokens generated. */ - fun outputTokens(outputTokens: Long) = outputTokens(JsonField.of(outputTokens)) - - /** - * Sets [Builder.outputTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.outputTokens] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun outputTokens(outputTokens: JsonField) = apply { - this.outputTokens = outputTokens - } - - /** Total number of tokens used (input + output). */ - fun totalTokens(totalTokens: Long) = totalTokens(JsonField.of(totalTokens)) - - /** - * Sets [Builder.totalTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.totalTokens] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun totalTokens(totalTokens: JsonField) = apply { - this.totalTokens = totalTokens - } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("tokens") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** Details about the input tokens billed for this request. */ - fun inputTokenDetails(inputTokenDetails: InputTokenDetails) = - inputTokenDetails(JsonField.of(inputTokenDetails)) - - /** - * Sets [Builder.inputTokenDetails] to an arbitrary JSON value. - * - * You should usually call [Builder.inputTokenDetails] with a well-typed - * [InputTokenDetails] value instead. This method is primarily for setting the field - * to an undocumented or not yet supported value. - */ - fun inputTokenDetails(inputTokenDetails: JsonField) = apply { - this.inputTokenDetails = inputTokenDetails - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TranscriptTextUsageTokens]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .inputTokens() - * .outputTokens() - * .totalTokens() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): TranscriptTextUsageTokens = - TranscriptTextUsageTokens( - checkRequired("inputTokens", inputTokens), - checkRequired("outputTokens", outputTokens), - checkRequired("totalTokens", totalTokens), - type, - inputTokenDetails, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TranscriptTextUsageTokens = apply { - if (validated) { - return@apply - } - - inputTokens() - outputTokens() - totalTokens() - _type().let { - if (it != JsonValue.from("tokens")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - inputTokenDetails().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (inputTokens.asKnown().isPresent) 1 else 0) + - (if (outputTokens.asKnown().isPresent) 1 else 0) + - (if (totalTokens.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("tokens")) 1 else 0 } + - (inputTokenDetails.asKnown().getOrNull()?.validity() ?: 0) - - /** Details about the input tokens billed for this request. */ - class InputTokenDetails - private constructor( - private val audioTokens: JsonField, - private val textTokens: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("audio_tokens") - @ExcludeMissing - audioTokens: JsonField = JsonMissing.of(), - @JsonProperty("text_tokens") - @ExcludeMissing - textTokens: JsonField = JsonMissing.of(), - ) : this(audioTokens, textTokens, mutableMapOf()) - - /** - * Number of audio tokens billed for this request. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. - * if the server responded with an unexpected value). - */ - fun audioTokens(): Optional = audioTokens.getOptional("audio_tokens") - - /** - * Number of text tokens billed for this request. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. - * if the server responded with an unexpected value). - */ - fun textTokens(): Optional = textTokens.getOptional("text_tokens") - - /** - * Returns the raw JSON value of [audioTokens]. - * - * Unlike [audioTokens], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("audio_tokens") - @ExcludeMissing - fun _audioTokens(): JsonField = audioTokens - - /** - * Returns the raw JSON value of [textTokens]. - * - * Unlike [textTokens], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("text_tokens") - @ExcludeMissing - fun _textTokens(): JsonField = textTokens - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [InputTokenDetails]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputTokenDetails]. */ - class Builder internal constructor() { - - private var audioTokens: JsonField = JsonMissing.of() - private var textTokens: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputTokenDetails: InputTokenDetails) = apply { - audioTokens = inputTokenDetails.audioTokens - textTokens = inputTokenDetails.textTokens - additionalProperties = inputTokenDetails.additionalProperties.toMutableMap() - } - - /** Number of audio tokens billed for this request. */ - fun audioTokens(audioTokens: Long) = audioTokens(JsonField.of(audioTokens)) - - /** - * Sets [Builder.audioTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.audioTokens] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or - * not yet supported value. - */ - fun audioTokens(audioTokens: JsonField) = apply { - this.audioTokens = audioTokens - } - - /** Number of text tokens billed for this request. */ - fun textTokens(textTokens: Long) = textTokens(JsonField.of(textTokens)) - - /** - * Sets [Builder.textTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.textTokens] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or - * not yet supported value. - */ - fun textTokens(textTokens: JsonField) = apply { - this.textTokens = textTokens - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputTokenDetails]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputTokenDetails = - InputTokenDetails( - audioTokens, - textTokens, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): InputTokenDetails = apply { - if (validated) { - return@apply - } - - audioTokens() - textTokens() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (audioTokens.asKnown().isPresent) 1 else 0) + - (if (textTokens.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputTokenDetails && - audioTokens == other.audioTokens && - textTokens == other.textTokens && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(audioTokens, textTokens, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputTokenDetails{audioTokens=$audioTokens, textTokens=$textTokens, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TranscriptTextUsageTokens && - inputTokens == other.inputTokens && - outputTokens == other.outputTokens && - totalTokens == other.totalTokens && - type == other.type && - inputTokenDetails == other.inputTokenDetails && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - inputTokens, - outputTokens, - totalTokens, - type, - inputTokenDetails, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TranscriptTextUsageTokens{inputTokens=$inputTokens, outputTokens=$outputTokens, totalTokens=$totalTokens, type=$type, inputTokenDetails=$inputTokenDetails, additionalProperties=$additionalProperties}" - } - - /** Usage statistics for models billed by audio input duration. */ - class TranscriptTextUsageDuration - private constructor( - private val seconds: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("seconds") - @ExcludeMissing - seconds: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(seconds, type, mutableMapOf()) - - /** - * Duration of the input audio in seconds. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected - * value). - */ - fun seconds(): Double = seconds.getRequired("seconds") - - /** - * The type of the usage object. Always `duration` for this variant. - * - * Expected to always return the following: - * ```java - * JsonValue.from("duration") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server - * responded with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [seconds]. - * - * Unlike [seconds], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("seconds") @ExcludeMissing fun _seconds(): JsonField = seconds - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [TranscriptTextUsageDuration]. - * - * The following fields are required: - * ```java - * .seconds() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TranscriptTextUsageDuration]. */ - class Builder internal constructor() { - - private var seconds: JsonField? = null - private var type: JsonValue = JsonValue.from("duration") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(transcriptTextUsageDuration: TranscriptTextUsageDuration) = - apply { - seconds = transcriptTextUsageDuration.seconds - type = transcriptTextUsageDuration.type - additionalProperties = - transcriptTextUsageDuration.additionalProperties.toMutableMap() - } - - /** Duration of the input audio in seconds. */ - fun seconds(seconds: Double) = seconds(JsonField.of(seconds)) - - /** - * Sets [Builder.seconds] to an arbitrary JSON value. - * - * You should usually call [Builder.seconds] with a well-typed [Double] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun seconds(seconds: JsonField) = apply { this.seconds = seconds } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("duration") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TranscriptTextUsageDuration]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .seconds() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): TranscriptTextUsageDuration = - TranscriptTextUsageDuration( - checkRequired("seconds", seconds), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TranscriptTextUsageDuration = apply { - if (validated) { - return@apply - } - - seconds() - _type().let { - if (it != JsonValue.from("duration")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (seconds.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("duration")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TranscriptTextUsageDuration && - seconds == other.seconds && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(seconds, type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TranscriptTextUsageDuration{seconds=$seconds, type=$type, additionalProperties=$additionalProperties}" - } - } - - /** A log probability object. */ - class Logprob - private constructor( - private val token: JsonField, - private val bytes: JsonField>, - private val logprob: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("token") @ExcludeMissing token: JsonField = JsonMissing.of(), - @JsonProperty("bytes") @ExcludeMissing bytes: JsonField> = JsonMissing.of(), - @JsonProperty("logprob") @ExcludeMissing logprob: JsonField = JsonMissing.of(), - ) : this(token, bytes, logprob, mutableMapOf()) - - /** - * The token that was used to generate the log probability. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun token(): String = token.getRequired("token") - - /** - * The bytes that were used to generate the log probability. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun bytes(): List = bytes.getRequired("bytes") - - /** - * The log probability of the token. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun logprob(): Double = logprob.getRequired("logprob") - - /** - * Returns the raw JSON value of [token]. - * - * Unlike [token], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("token") @ExcludeMissing fun _token(): JsonField = token - - /** - * Returns the raw JSON value of [bytes]. - * - * Unlike [bytes], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("bytes") @ExcludeMissing fun _bytes(): JsonField> = bytes - - /** - * Returns the raw JSON value of [logprob]. - * - * Unlike [logprob], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("logprob") @ExcludeMissing fun _logprob(): JsonField = logprob - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [Logprob]. - * - * The following fields are required: - * ```java - * .token() - * .bytes() - * .logprob() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Logprob]. */ - class Builder internal constructor() { - - private var token: JsonField? = null - private var bytes: JsonField>? = null - private var logprob: JsonField? = null - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(logprob: Logprob) = apply { - token = logprob.token - bytes = logprob.bytes.map { it.toMutableList() } - this.logprob = logprob.logprob - additionalProperties = logprob.additionalProperties.toMutableMap() - } - - /** The token that was used to generate the log probability. */ - fun token(token: String) = token(JsonField.of(token)) - - /** - * Sets [Builder.token] to an arbitrary JSON value. - * - * You should usually call [Builder.token] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun token(token: JsonField) = apply { this.token = token } - - /** The bytes that were used to generate the log probability. */ - fun bytes(bytes: List) = bytes(JsonField.of(bytes)) - - /** - * Sets [Builder.bytes] to an arbitrary JSON value. - * - * You should usually call [Builder.bytes] with a well-typed `List` value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun bytes(bytes: JsonField>) = apply { - this.bytes = bytes.map { it.toMutableList() } - } - - /** - * Adds a single [Long] to [bytes]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addByte(byte_: Long) = apply { - bytes = - (bytes ?: JsonField.of(mutableListOf())).also { - checkKnown("bytes", it).add(byte_) - } - } - - /** The log probability of the token. */ - fun logprob(logprob: Double) = logprob(JsonField.of(logprob)) - - /** - * Sets [Builder.logprob] to an arbitrary JSON value. - * - * You should usually call [Builder.logprob] with a well-typed [Double] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun logprob(logprob: JsonField) = apply { this.logprob = logprob } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Logprob]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .token() - * .bytes() - * .logprob() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): Logprob = - Logprob( - checkRequired("token", token), - checkRequired("bytes", bytes).map { it.toImmutable() }, - checkRequired("logprob", logprob), - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): Logprob = apply { - if (validated) { - return@apply - } - - token() - bytes() - logprob() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (token.asKnown().isPresent) 1 else 0) + - (bytes.asKnown().getOrNull()?.size ?: 0) + - (if (logprob.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Logprob && - token == other.token && - bytes == other.bytes && - logprob == other.logprob && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(token, bytes, logprob, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Logprob{token=$token, bytes=$bytes, logprob=$logprob, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItemInputAudioTranscriptionCompletedEvent && - contentIndex == other.contentIndex && - eventId == other.eventId && - itemId == other.itemId && - transcript == other.transcript && - type == other.type && - usage == other.usage && - logprobs == other.logprobs && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - contentIndex, - eventId, - itemId, - transcript, - type, - usage, - logprobs, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItemInputAudioTranscriptionCompletedEvent{contentIndex=$contentIndex, eventId=$eventId, itemId=$itemId, transcript=$transcript, type=$type, usage=$usage, logprobs=$logprobs, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionDeltaEvent.kt deleted file mode 100644 index 0f88184bd..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionDeltaEvent.kt +++ /dev/null @@ -1,647 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkKnown -import com.openai.core.checkRequired -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** Returned when the text value of an input audio transcription content part is updated. */ -class ConversationItemInputAudioTranscriptionDeltaEvent -private constructor( - private val eventId: JsonField, - private val itemId: JsonField, - private val type: JsonValue, - private val contentIndex: JsonField, - private val delta: JsonField, - private val logprobs: JsonField>, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("content_index") - @ExcludeMissing - contentIndex: JsonField = JsonMissing.of(), - @JsonProperty("delta") @ExcludeMissing delta: JsonField = JsonMissing.of(), - @JsonProperty("logprobs") - @ExcludeMissing - logprobs: JsonField> = JsonMissing.of(), - ) : this(eventId, itemId, type, contentIndex, delta, logprobs, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the item. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The event type, must be `conversation.item.input_audio_transcription.delta`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("conversation.item.input_audio_transcription.delta") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * The index of the content part in the item's content array. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun contentIndex(): Optional = contentIndex.getOptional("content_index") - - /** - * The text delta. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun delta(): Optional = delta.getOptional("delta") - - /** - * The log probabilities of the transcription. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun logprobs(): Optional> = logprobs.getOptional("logprobs") - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [contentIndex]. - * - * Unlike [contentIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content_index") - @ExcludeMissing - fun _contentIndex(): JsonField = contentIndex - - /** - * Returns the raw JSON value of [delta]. - * - * Unlike [delta], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("delta") @ExcludeMissing fun _delta(): JsonField = delta - - /** - * Returns the raw JSON value of [logprobs]. - * - * Unlike [logprobs], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("logprobs") @ExcludeMissing fun _logprobs(): JsonField> = logprobs - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [ConversationItemInputAudioTranscriptionDeltaEvent]. - * - * The following fields are required: - * ```java - * .eventId() - * .itemId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItemInputAudioTranscriptionDeltaEvent]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var type: JsonValue = - JsonValue.from("conversation.item.input_audio_transcription.delta") - private var contentIndex: JsonField = JsonMissing.of() - private var delta: JsonField = JsonMissing.of() - private var logprobs: JsonField>? = null - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from( - conversationItemInputAudioTranscriptionDeltaEvent: - ConversationItemInputAudioTranscriptionDeltaEvent - ) = apply { - eventId = conversationItemInputAudioTranscriptionDeltaEvent.eventId - itemId = conversationItemInputAudioTranscriptionDeltaEvent.itemId - type = conversationItemInputAudioTranscriptionDeltaEvent.type - contentIndex = conversationItemInputAudioTranscriptionDeltaEvent.contentIndex - delta = conversationItemInputAudioTranscriptionDeltaEvent.delta - logprobs = - conversationItemInputAudioTranscriptionDeltaEvent.logprobs.map { - it.toMutableList() - } - additionalProperties = - conversationItemInputAudioTranscriptionDeltaEvent.additionalProperties - .toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the item. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("conversation.item.input_audio_transcription.delta") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** The index of the content part in the item's content array. */ - fun contentIndex(contentIndex: Long) = contentIndex(JsonField.of(contentIndex)) - - /** - * Sets [Builder.contentIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.contentIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun contentIndex(contentIndex: JsonField) = apply { this.contentIndex = contentIndex } - - /** The text delta. */ - fun delta(delta: String) = delta(JsonField.of(delta)) - - /** - * Sets [Builder.delta] to an arbitrary JSON value. - * - * You should usually call [Builder.delta] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun delta(delta: JsonField) = apply { this.delta = delta } - - /** The log probabilities of the transcription. */ - fun logprobs(logprobs: List?) = logprobs(JsonField.ofNullable(logprobs)) - - /** Alias for calling [Builder.logprobs] with `logprobs.orElse(null)`. */ - fun logprobs(logprobs: Optional>) = logprobs(logprobs.getOrNull()) - - /** - * Sets [Builder.logprobs] to an arbitrary JSON value. - * - * You should usually call [Builder.logprobs] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun logprobs(logprobs: JsonField>) = apply { - this.logprobs = logprobs.map { it.toMutableList() } - } - - /** - * Adds a single [Logprob] to [logprobs]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addLogprob(logprob: Logprob) = apply { - logprobs = - (logprobs ?: JsonField.of(mutableListOf())).also { - checkKnown("logprobs", it).add(logprob) - } - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItemInputAudioTranscriptionDeltaEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .itemId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ConversationItemInputAudioTranscriptionDeltaEvent = - ConversationItemInputAudioTranscriptionDeltaEvent( - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - type, - contentIndex, - delta, - (logprobs ?: JsonMissing.of()).map { it.toImmutable() }, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItemInputAudioTranscriptionDeltaEvent = apply { - if (validated) { - return@apply - } - - eventId() - itemId() - _type().let { - if (it != JsonValue.from("conversation.item.input_audio_transcription.delta")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - contentIndex() - delta() - logprobs().ifPresent { it.forEach { it.validate() } } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - type.let { - if (it == JsonValue.from("conversation.item.input_audio_transcription.delta")) 1 - else 0 - } + - (if (contentIndex.asKnown().isPresent) 1 else 0) + - (if (delta.asKnown().isPresent) 1 else 0) + - (logprobs.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) - - /** A log probability object. */ - class Logprob - private constructor( - private val token: JsonField, - private val bytes: JsonField>, - private val logprob: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("token") @ExcludeMissing token: JsonField = JsonMissing.of(), - @JsonProperty("bytes") @ExcludeMissing bytes: JsonField> = JsonMissing.of(), - @JsonProperty("logprob") @ExcludeMissing logprob: JsonField = JsonMissing.of(), - ) : this(token, bytes, logprob, mutableMapOf()) - - /** - * The token that was used to generate the log probability. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun token(): String = token.getRequired("token") - - /** - * The bytes that were used to generate the log probability. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun bytes(): List = bytes.getRequired("bytes") - - /** - * The log probability of the token. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun logprob(): Double = logprob.getRequired("logprob") - - /** - * Returns the raw JSON value of [token]. - * - * Unlike [token], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("token") @ExcludeMissing fun _token(): JsonField = token - - /** - * Returns the raw JSON value of [bytes]. - * - * Unlike [bytes], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("bytes") @ExcludeMissing fun _bytes(): JsonField> = bytes - - /** - * Returns the raw JSON value of [logprob]. - * - * Unlike [logprob], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("logprob") @ExcludeMissing fun _logprob(): JsonField = logprob - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [Logprob]. - * - * The following fields are required: - * ```java - * .token() - * .bytes() - * .logprob() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Logprob]. */ - class Builder internal constructor() { - - private var token: JsonField? = null - private var bytes: JsonField>? = null - private var logprob: JsonField? = null - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(logprob: Logprob) = apply { - token = logprob.token - bytes = logprob.bytes.map { it.toMutableList() } - this.logprob = logprob.logprob - additionalProperties = logprob.additionalProperties.toMutableMap() - } - - /** The token that was used to generate the log probability. */ - fun token(token: String) = token(JsonField.of(token)) - - /** - * Sets [Builder.token] to an arbitrary JSON value. - * - * You should usually call [Builder.token] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun token(token: JsonField) = apply { this.token = token } - - /** The bytes that were used to generate the log probability. */ - fun bytes(bytes: List) = bytes(JsonField.of(bytes)) - - /** - * Sets [Builder.bytes] to an arbitrary JSON value. - * - * You should usually call [Builder.bytes] with a well-typed `List` value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun bytes(bytes: JsonField>) = apply { - this.bytes = bytes.map { it.toMutableList() } - } - - /** - * Adds a single [Long] to [bytes]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addByte(byte_: Long) = apply { - bytes = - (bytes ?: JsonField.of(mutableListOf())).also { - checkKnown("bytes", it).add(byte_) - } - } - - /** The log probability of the token. */ - fun logprob(logprob: Double) = logprob(JsonField.of(logprob)) - - /** - * Sets [Builder.logprob] to an arbitrary JSON value. - * - * You should usually call [Builder.logprob] with a well-typed [Double] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun logprob(logprob: JsonField) = apply { this.logprob = logprob } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Logprob]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .token() - * .bytes() - * .logprob() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): Logprob = - Logprob( - checkRequired("token", token), - checkRequired("bytes", bytes).map { it.toImmutable() }, - checkRequired("logprob", logprob), - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): Logprob = apply { - if (validated) { - return@apply - } - - token() - bytes() - logprob() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (token.asKnown().isPresent) 1 else 0) + - (bytes.asKnown().getOrNull()?.size ?: 0) + - (if (logprob.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Logprob && - token == other.token && - bytes == other.bytes && - logprob == other.logprob && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(token, bytes, logprob, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Logprob{token=$token, bytes=$bytes, logprob=$logprob, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItemInputAudioTranscriptionDeltaEvent && - eventId == other.eventId && - itemId == other.itemId && - type == other.type && - contentIndex == other.contentIndex && - delta == other.delta && - logprobs == other.logprobs && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(eventId, itemId, type, contentIndex, delta, logprobs, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItemInputAudioTranscriptionDeltaEvent{eventId=$eventId, itemId=$itemId, type=$type, contentIndex=$contentIndex, delta=$delta, logprobs=$logprobs, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionFailedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionFailedEvent.kt deleted file mode 100644 index f2d9b0e3f..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionFailedEvent.kt +++ /dev/null @@ -1,593 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * Returned when input audio transcription is configured, and a transcription request for a user - * message failed. These events are separate from other `error` events so that the client can - * identify the related Item. - */ -class ConversationItemInputAudioTranscriptionFailedEvent -private constructor( - private val contentIndex: JsonField, - private val error: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("content_index") - @ExcludeMissing - contentIndex: JsonField = JsonMissing.of(), - @JsonProperty("error") @ExcludeMissing error: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(contentIndex, error, eventId, itemId, type, mutableMapOf()) - - /** - * The index of the content part containing the audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun contentIndex(): Long = contentIndex.getRequired("content_index") - - /** - * Details of the transcription error. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun error(): Error = error.getRequired("error") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the user message item. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The event type, must be `conversation.item.input_audio_transcription.failed`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("conversation.item.input_audio_transcription.failed") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [contentIndex]. - * - * Unlike [contentIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content_index") - @ExcludeMissing - fun _contentIndex(): JsonField = contentIndex - - /** - * Returns the raw JSON value of [error]. - * - * Unlike [error], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("error") @ExcludeMissing fun _error(): JsonField = error - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [ConversationItemInputAudioTranscriptionFailedEvent]. - * - * The following fields are required: - * ```java - * .contentIndex() - * .error() - * .eventId() - * .itemId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItemInputAudioTranscriptionFailedEvent]. */ - class Builder internal constructor() { - - private var contentIndex: JsonField? = null - private var error: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var type: JsonValue = - JsonValue.from("conversation.item.input_audio_transcription.failed") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from( - conversationItemInputAudioTranscriptionFailedEvent: - ConversationItemInputAudioTranscriptionFailedEvent - ) = apply { - contentIndex = conversationItemInputAudioTranscriptionFailedEvent.contentIndex - error = conversationItemInputAudioTranscriptionFailedEvent.error - eventId = conversationItemInputAudioTranscriptionFailedEvent.eventId - itemId = conversationItemInputAudioTranscriptionFailedEvent.itemId - type = conversationItemInputAudioTranscriptionFailedEvent.type - additionalProperties = - conversationItemInputAudioTranscriptionFailedEvent.additionalProperties - .toMutableMap() - } - - /** The index of the content part containing the audio. */ - fun contentIndex(contentIndex: Long) = contentIndex(JsonField.of(contentIndex)) - - /** - * Sets [Builder.contentIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.contentIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun contentIndex(contentIndex: JsonField) = apply { this.contentIndex = contentIndex } - - /** Details of the transcription error. */ - fun error(error: Error) = error(JsonField.of(error)) - - /** - * Sets [Builder.error] to an arbitrary JSON value. - * - * You should usually call [Builder.error] with a well-typed [Error] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun error(error: JsonField) = apply { this.error = error } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the user message item. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("conversation.item.input_audio_transcription.failed") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItemInputAudioTranscriptionFailedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .contentIndex() - * .error() - * .eventId() - * .itemId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ConversationItemInputAudioTranscriptionFailedEvent = - ConversationItemInputAudioTranscriptionFailedEvent( - checkRequired("contentIndex", contentIndex), - checkRequired("error", error), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItemInputAudioTranscriptionFailedEvent = apply { - if (validated) { - return@apply - } - - contentIndex() - error().validate() - eventId() - itemId() - _type().let { - if (it != JsonValue.from("conversation.item.input_audio_transcription.failed")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (contentIndex.asKnown().isPresent) 1 else 0) + - (error.asKnown().getOrNull()?.validity() ?: 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - type.let { - if (it == JsonValue.from("conversation.item.input_audio_transcription.failed")) 1 - else 0 - } - - /** Details of the transcription error. */ - class Error - private constructor( - private val code: JsonField, - private val message: JsonField, - private val param: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("code") @ExcludeMissing code: JsonField = JsonMissing.of(), - @JsonProperty("message") @ExcludeMissing message: JsonField = JsonMissing.of(), - @JsonProperty("param") @ExcludeMissing param: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(code, message, param, type, mutableMapOf()) - - /** - * Error code, if any. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun code(): Optional = code.getOptional("code") - - /** - * A human-readable error message. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun message(): Optional = message.getOptional("message") - - /** - * Parameter related to the error, if any. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun param(): Optional = param.getOptional("param") - - /** - * The type of error. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [code]. - * - * Unlike [code], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("code") @ExcludeMissing fun _code(): JsonField = code - - /** - * Returns the raw JSON value of [message]. - * - * Unlike [message], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("message") @ExcludeMissing fun _message(): JsonField = message - - /** - * Returns the raw JSON value of [param]. - * - * Unlike [param], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("param") @ExcludeMissing fun _param(): JsonField = param - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Error]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Error]. */ - class Builder internal constructor() { - - private var code: JsonField = JsonMissing.of() - private var message: JsonField = JsonMissing.of() - private var param: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(error: Error) = apply { - code = error.code - message = error.message - param = error.param - type = error.type - additionalProperties = error.additionalProperties.toMutableMap() - } - - /** Error code, if any. */ - fun code(code: String) = code(JsonField.of(code)) - - /** - * Sets [Builder.code] to an arbitrary JSON value. - * - * You should usually call [Builder.code] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun code(code: JsonField) = apply { this.code = code } - - /** A human-readable error message. */ - fun message(message: String) = message(JsonField.of(message)) - - /** - * Sets [Builder.message] to an arbitrary JSON value. - * - * You should usually call [Builder.message] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun message(message: JsonField) = apply { this.message = message } - - /** Parameter related to the error, if any. */ - fun param(param: String) = param(JsonField.of(param)) - - /** - * Sets [Builder.param] to an arbitrary JSON value. - * - * You should usually call [Builder.param] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun param(param: JsonField) = apply { this.param = param } - - /** The type of error. */ - fun type(type: String) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Error]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Error = - Error(code, message, param, type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): Error = apply { - if (validated) { - return@apply - } - - code() - message() - param() - type() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (code.asKnown().isPresent) 1 else 0) + - (if (message.asKnown().isPresent) 1 else 0) + - (if (param.asKnown().isPresent) 1 else 0) + - (if (type.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Error && - code == other.code && - message == other.message && - param == other.param && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(code, message, param, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Error{code=$code, message=$message, param=$param, type=$type, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItemInputAudioTranscriptionFailedEvent && - contentIndex == other.contentIndex && - error == other.error && - eventId == other.eventId && - itemId == other.itemId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(contentIndex, error, eventId, itemId, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItemInputAudioTranscriptionFailedEvent{contentIndex=$contentIndex, error=$error, eventId=$eventId, itemId=$itemId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemRetrieveEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemRetrieveEvent.kt deleted file mode 100644 index ac554b083..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemRetrieveEvent.kt +++ /dev/null @@ -1,255 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional - -/** - * Send this event when you want to retrieve the server's representation of a specific item in the - * conversation history. This is useful, for example, to inspect user audio after noise cancellation - * and VAD. The server will respond with a `conversation.item.retrieved` event, unless the item does - * not exist in the conversation history, in which case the server will respond with an error. - */ -class ConversationItemRetrieveEvent -private constructor( - private val itemId: JsonField, - private val type: JsonValue, - private val eventId: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - ) : this(itemId, type, eventId, mutableMapOf()) - - /** - * The ID of the item to retrieve. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The event type, must be `conversation.item.retrieve`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("conversation.item.retrieve") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Optional client-generated ID used to identify this event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eventId(): Optional = eventId.getOptional("event_id") - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [ConversationItemRetrieveEvent]. - * - * The following fields are required: - * ```java - * .itemId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItemRetrieveEvent]. */ - class Builder internal constructor() { - - private var itemId: JsonField? = null - private var type: JsonValue = JsonValue.from("conversation.item.retrieve") - private var eventId: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(conversationItemRetrieveEvent: ConversationItemRetrieveEvent) = apply { - itemId = conversationItemRetrieveEvent.itemId - type = conversationItemRetrieveEvent.type - eventId = conversationItemRetrieveEvent.eventId - additionalProperties = conversationItemRetrieveEvent.additionalProperties.toMutableMap() - } - - /** The ID of the item to retrieve. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("conversation.item.retrieve") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** Optional client-generated ID used to identify this event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItemRetrieveEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .itemId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ConversationItemRetrieveEvent = - ConversationItemRetrieveEvent( - checkRequired("itemId", itemId), - type, - eventId, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItemRetrieveEvent = apply { - if (validated) { - return@apply - } - - itemId() - _type().let { - if (it != JsonValue.from("conversation.item.retrieve")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - eventId() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (itemId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("conversation.item.retrieve")) 1 else 0 } + - (if (eventId.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItemRetrieveEvent && - itemId == other.itemId && - type == other.type && - eventId == other.eventId && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(itemId, type, eventId, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItemRetrieveEvent{itemId=$itemId, type=$type, eventId=$eventId, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemTruncateEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemTruncateEvent.kt deleted file mode 100644 index 08a9c546e..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemTruncateEvent.kt +++ /dev/null @@ -1,349 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional - -/** - * Send this event to truncate a previous assistant message’s audio. The server will produce audio - * faster than realtime, so this event is useful when the user interrupts to truncate audio that has - * already been sent to the client but not yet played. This will synchronize the server's - * understanding of the audio with the client's playback. - * - * Truncating audio will delete the server-side text transcript to ensure there is not text in the - * context that hasn't been heard by the user. - * - * If successful, the server will respond with a `conversation.item.truncated` event. - */ -class ConversationItemTruncateEvent -private constructor( - private val audioEndMs: JsonField, - private val contentIndex: JsonField, - private val itemId: JsonField, - private val type: JsonValue, - private val eventId: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("audio_end_ms") - @ExcludeMissing - audioEndMs: JsonField = JsonMissing.of(), - @JsonProperty("content_index") - @ExcludeMissing - contentIndex: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - ) : this(audioEndMs, contentIndex, itemId, type, eventId, mutableMapOf()) - - /** - * Inclusive duration up to which audio is truncated, in milliseconds. If the audio_end_ms is - * greater than the actual audio duration, the server will respond with an error. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun audioEndMs(): Long = audioEndMs.getRequired("audio_end_ms") - - /** - * The index of the content part to truncate. Set this to 0. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun contentIndex(): Long = contentIndex.getRequired("content_index") - - /** - * The ID of the assistant message item to truncate. Only assistant message items can be - * truncated. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The event type, must be `conversation.item.truncate`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("conversation.item.truncate") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Optional client-generated ID used to identify this event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eventId(): Optional = eventId.getOptional("event_id") - - /** - * Returns the raw JSON value of [audioEndMs]. - * - * Unlike [audioEndMs], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("audio_end_ms") @ExcludeMissing fun _audioEndMs(): JsonField = audioEndMs - - /** - * Returns the raw JSON value of [contentIndex]. - * - * Unlike [contentIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content_index") - @ExcludeMissing - fun _contentIndex(): JsonField = contentIndex - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [ConversationItemTruncateEvent]. - * - * The following fields are required: - * ```java - * .audioEndMs() - * .contentIndex() - * .itemId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItemTruncateEvent]. */ - class Builder internal constructor() { - - private var audioEndMs: JsonField? = null - private var contentIndex: JsonField? = null - private var itemId: JsonField? = null - private var type: JsonValue = JsonValue.from("conversation.item.truncate") - private var eventId: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(conversationItemTruncateEvent: ConversationItemTruncateEvent) = apply { - audioEndMs = conversationItemTruncateEvent.audioEndMs - contentIndex = conversationItemTruncateEvent.contentIndex - itemId = conversationItemTruncateEvent.itemId - type = conversationItemTruncateEvent.type - eventId = conversationItemTruncateEvent.eventId - additionalProperties = conversationItemTruncateEvent.additionalProperties.toMutableMap() - } - - /** - * Inclusive duration up to which audio is truncated, in milliseconds. If the audio_end_ms - * is greater than the actual audio duration, the server will respond with an error. - */ - fun audioEndMs(audioEndMs: Long) = audioEndMs(JsonField.of(audioEndMs)) - - /** - * Sets [Builder.audioEndMs] to an arbitrary JSON value. - * - * You should usually call [Builder.audioEndMs] with a well-typed [Long] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun audioEndMs(audioEndMs: JsonField) = apply { this.audioEndMs = audioEndMs } - - /** The index of the content part to truncate. Set this to 0. */ - fun contentIndex(contentIndex: Long) = contentIndex(JsonField.of(contentIndex)) - - /** - * Sets [Builder.contentIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.contentIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun contentIndex(contentIndex: JsonField) = apply { this.contentIndex = contentIndex } - - /** - * The ID of the assistant message item to truncate. Only assistant message items can be - * truncated. - */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("conversation.item.truncate") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** Optional client-generated ID used to identify this event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItemTruncateEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .audioEndMs() - * .contentIndex() - * .itemId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ConversationItemTruncateEvent = - ConversationItemTruncateEvent( - checkRequired("audioEndMs", audioEndMs), - checkRequired("contentIndex", contentIndex), - checkRequired("itemId", itemId), - type, - eventId, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItemTruncateEvent = apply { - if (validated) { - return@apply - } - - audioEndMs() - contentIndex() - itemId() - _type().let { - if (it != JsonValue.from("conversation.item.truncate")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - eventId() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (audioEndMs.asKnown().isPresent) 1 else 0) + - (if (contentIndex.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("conversation.item.truncate")) 1 else 0 } + - (if (eventId.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItemTruncateEvent && - audioEndMs == other.audioEndMs && - contentIndex == other.contentIndex && - itemId == other.itemId && - type == other.type && - eventId == other.eventId && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(audioEndMs, contentIndex, itemId, type, eventId, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItemTruncateEvent{audioEndMs=$audioEndMs, contentIndex=$contentIndex, itemId=$itemId, type=$type, eventId=$eventId, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemTruncatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemTruncatedEvent.kt deleted file mode 100644 index 1d3bbf426..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemTruncatedEvent.kt +++ /dev/null @@ -1,340 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects - -/** - * Returned when an earlier assistant audio message item is truncated by the client with a - * `conversation.item.truncate` event. This event is used to synchronize the server's understanding - * of the audio with the client's playback. - * - * This action will truncate the audio and remove the server-side text transcript to ensure there is - * no text in the context that hasn't been heard by the user. - */ -class ConversationItemTruncatedEvent -private constructor( - private val audioEndMs: JsonField, - private val contentIndex: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("audio_end_ms") - @ExcludeMissing - audioEndMs: JsonField = JsonMissing.of(), - @JsonProperty("content_index") - @ExcludeMissing - contentIndex: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(audioEndMs, contentIndex, eventId, itemId, type, mutableMapOf()) - - /** - * The duration up to which the audio was truncated, in milliseconds. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun audioEndMs(): Long = audioEndMs.getRequired("audio_end_ms") - - /** - * The index of the content part that was truncated. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun contentIndex(): Long = contentIndex.getRequired("content_index") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the assistant message item that was truncated. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The event type, must be `conversation.item.truncated`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("conversation.item.truncated") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [audioEndMs]. - * - * Unlike [audioEndMs], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("audio_end_ms") @ExcludeMissing fun _audioEndMs(): JsonField = audioEndMs - - /** - * Returns the raw JSON value of [contentIndex]. - * - * Unlike [contentIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content_index") - @ExcludeMissing - fun _contentIndex(): JsonField = contentIndex - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [ConversationItemTruncatedEvent]. - * - * The following fields are required: - * ```java - * .audioEndMs() - * .contentIndex() - * .eventId() - * .itemId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItemTruncatedEvent]. */ - class Builder internal constructor() { - - private var audioEndMs: JsonField? = null - private var contentIndex: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var type: JsonValue = JsonValue.from("conversation.item.truncated") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(conversationItemTruncatedEvent: ConversationItemTruncatedEvent) = apply { - audioEndMs = conversationItemTruncatedEvent.audioEndMs - contentIndex = conversationItemTruncatedEvent.contentIndex - eventId = conversationItemTruncatedEvent.eventId - itemId = conversationItemTruncatedEvent.itemId - type = conversationItemTruncatedEvent.type - additionalProperties = - conversationItemTruncatedEvent.additionalProperties.toMutableMap() - } - - /** The duration up to which the audio was truncated, in milliseconds. */ - fun audioEndMs(audioEndMs: Long) = audioEndMs(JsonField.of(audioEndMs)) - - /** - * Sets [Builder.audioEndMs] to an arbitrary JSON value. - * - * You should usually call [Builder.audioEndMs] with a well-typed [Long] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun audioEndMs(audioEndMs: JsonField) = apply { this.audioEndMs = audioEndMs } - - /** The index of the content part that was truncated. */ - fun contentIndex(contentIndex: Long) = contentIndex(JsonField.of(contentIndex)) - - /** - * Sets [Builder.contentIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.contentIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun contentIndex(contentIndex: JsonField) = apply { this.contentIndex = contentIndex } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the assistant message item that was truncated. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("conversation.item.truncated") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItemTruncatedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .audioEndMs() - * .contentIndex() - * .eventId() - * .itemId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ConversationItemTruncatedEvent = - ConversationItemTruncatedEvent( - checkRequired("audioEndMs", audioEndMs), - checkRequired("contentIndex", contentIndex), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItemTruncatedEvent = apply { - if (validated) { - return@apply - } - - audioEndMs() - contentIndex() - eventId() - itemId() - _type().let { - if (it != JsonValue.from("conversation.item.truncated")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (audioEndMs.asKnown().isPresent) 1 else 0) + - (if (contentIndex.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("conversation.item.truncated")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItemTruncatedEvent && - audioEndMs == other.audioEndMs && - contentIndex == other.contentIndex && - eventId == other.eventId && - itemId == other.itemId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(audioEndMs, contentIndex, eventId, itemId, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItemTruncatedEvent{audioEndMs=$audioEndMs, contentIndex=$contentIndex, eventId=$eventId, itemId=$itemId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemWithReference.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemWithReference.kt deleted file mode 100644 index 2b7a05463..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ConversationItemWithReference.kt +++ /dev/null @@ -1,1518 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkKnown -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** The item to add to the conversation. */ -class ConversationItemWithReference -private constructor( - private val id: JsonField, - private val arguments: JsonField, - private val callId: JsonField, - private val content: JsonField>, - private val name: JsonField, - private val object_: JsonField, - private val output: JsonField, - private val role: JsonField, - private val status: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("id") @ExcludeMissing id: JsonField = JsonMissing.of(), - @JsonProperty("arguments") @ExcludeMissing arguments: JsonField = JsonMissing.of(), - @JsonProperty("call_id") @ExcludeMissing callId: JsonField = JsonMissing.of(), - @JsonProperty("content") - @ExcludeMissing - content: JsonField> = JsonMissing.of(), - @JsonProperty("name") @ExcludeMissing name: JsonField = JsonMissing.of(), - @JsonProperty("object") @ExcludeMissing object_: JsonField = JsonMissing.of(), - @JsonProperty("output") @ExcludeMissing output: JsonField = JsonMissing.of(), - @JsonProperty("role") @ExcludeMissing role: JsonField = JsonMissing.of(), - @JsonProperty("status") @ExcludeMissing status: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this( - id, - arguments, - callId, - content, - name, - object_, - output, - role, - status, - type, - mutableMapOf(), - ) - - /** - * For an item of type (`message` | `function_call` | `function_call_output`) this field allows - * the client to assign the unique ID of the item. It is not required because the server will - * generate one if not provided. - * - * For an item of type `item_reference`, this field is required and is a reference to any item - * that has previously existed in the conversation. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun id(): Optional = id.getOptional("id") - - /** - * The arguments of the function call (for `function_call` items). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun arguments(): Optional = arguments.getOptional("arguments") - - /** - * The ID of the function call (for `function_call` and `function_call_output` items). If passed - * on a `function_call_output` item, the server will check that a `function_call` item with the - * same ID exists in the conversation history. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun callId(): Optional = callId.getOptional("call_id") - - /** - * The content of the message, applicable for `message` items. - * - Message items of role `system` support only `input_text` content - * - Message items of role `user` support `input_text` and `input_audio` content - * - Message items of role `assistant` support `text` content. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun content(): Optional> = content.getOptional("content") - - /** - * The name of the function being called (for `function_call` items). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun name(): Optional = name.getOptional("name") - - /** - * Identifier for the API object being returned - always `realtime.item`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun object_(): Optional = object_.getOptional("object") - - /** - * The output of the function call (for `function_call_output` items). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun output(): Optional = output.getOptional("output") - - /** - * The role of the message sender (`user`, `assistant`, `system`), only applicable for `message` - * items. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun role(): Optional = role.getOptional("role") - - /** - * The status of the item (`completed`, `incomplete`, `in_progress`). These have no effect on - * the conversation, but are accepted for consistency with the `conversation.item.created` - * event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun status(): Optional = status.getOptional("status") - - /** - * The type of the item (`message`, `function_call`, `function_call_output`, `item_reference`). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [id]. - * - * Unlike [id], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("id") @ExcludeMissing fun _id(): JsonField = id - - /** - * Returns the raw JSON value of [arguments]. - * - * Unlike [arguments], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("arguments") @ExcludeMissing fun _arguments(): JsonField = arguments - - /** - * Returns the raw JSON value of [callId]. - * - * Unlike [callId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("call_id") @ExcludeMissing fun _callId(): JsonField = callId - - /** - * Returns the raw JSON value of [content]. - * - * Unlike [content], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content") @ExcludeMissing fun _content(): JsonField> = content - - /** - * Returns the raw JSON value of [name]. - * - * Unlike [name], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("name") @ExcludeMissing fun _name(): JsonField = name - - /** - * Returns the raw JSON value of [object_]. - * - * Unlike [object_], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("object") @ExcludeMissing fun _object_(): JsonField = object_ - - /** - * Returns the raw JSON value of [output]. - * - * Unlike [output], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output") @ExcludeMissing fun _output(): JsonField = output - - /** - * Returns the raw JSON value of [role]. - * - * Unlike [role], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("role") @ExcludeMissing fun _role(): JsonField = role - - /** - * Returns the raw JSON value of [status]. - * - * Unlike [status], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("status") @ExcludeMissing fun _status(): JsonField = status - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [ConversationItemWithReference]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItemWithReference]. */ - class Builder internal constructor() { - - private var id: JsonField = JsonMissing.of() - private var arguments: JsonField = JsonMissing.of() - private var callId: JsonField = JsonMissing.of() - private var content: JsonField>? = null - private var name: JsonField = JsonMissing.of() - private var object_: JsonField = JsonMissing.of() - private var output: JsonField = JsonMissing.of() - private var role: JsonField = JsonMissing.of() - private var status: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(conversationItemWithReference: ConversationItemWithReference) = apply { - id = conversationItemWithReference.id - arguments = conversationItemWithReference.arguments - callId = conversationItemWithReference.callId - content = conversationItemWithReference.content.map { it.toMutableList() } - name = conversationItemWithReference.name - object_ = conversationItemWithReference.object_ - output = conversationItemWithReference.output - role = conversationItemWithReference.role - status = conversationItemWithReference.status - type = conversationItemWithReference.type - additionalProperties = conversationItemWithReference.additionalProperties.toMutableMap() - } - - /** - * For an item of type (`message` | `function_call` | `function_call_output`) this field - * allows the client to assign the unique ID of the item. It is not required because the - * server will generate one if not provided. - * - * For an item of type `item_reference`, this field is required and is a reference to any - * item that has previously existed in the conversation. - */ - fun id(id: String) = id(JsonField.of(id)) - - /** - * Sets [Builder.id] to an arbitrary JSON value. - * - * You should usually call [Builder.id] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun id(id: JsonField) = apply { this.id = id } - - /** The arguments of the function call (for `function_call` items). */ - fun arguments(arguments: String) = arguments(JsonField.of(arguments)) - - /** - * Sets [Builder.arguments] to an arbitrary JSON value. - * - * You should usually call [Builder.arguments] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun arguments(arguments: JsonField) = apply { this.arguments = arguments } - - /** - * The ID of the function call (for `function_call` and `function_call_output` items). If - * passed on a `function_call_output` item, the server will check that a `function_call` - * item with the same ID exists in the conversation history. - */ - fun callId(callId: String) = callId(JsonField.of(callId)) - - /** - * Sets [Builder.callId] to an arbitrary JSON value. - * - * You should usually call [Builder.callId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun callId(callId: JsonField) = apply { this.callId = callId } - - /** - * The content of the message, applicable for `message` items. - * - Message items of role `system` support only `input_text` content - * - Message items of role `user` support `input_text` and `input_audio` content - * - Message items of role `assistant` support `text` content. - */ - fun content(content: List) = content(JsonField.of(content)) - - /** - * Sets [Builder.content] to an arbitrary JSON value. - * - * You should usually call [Builder.content] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun content(content: JsonField>) = apply { - this.content = content.map { it.toMutableList() } - } - - /** - * Adds a single [Content] to [Builder.content]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addContent(content: Content) = apply { - this.content = - (this.content ?: JsonField.of(mutableListOf())).also { - checkKnown("content", it).add(content) - } - } - - /** The name of the function being called (for `function_call` items). */ - fun name(name: String) = name(JsonField.of(name)) - - /** - * Sets [Builder.name] to an arbitrary JSON value. - * - * You should usually call [Builder.name] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun name(name: JsonField) = apply { this.name = name } - - /** Identifier for the API object being returned - always `realtime.item`. */ - fun object_(object_: Object) = object_(JsonField.of(object_)) - - /** - * Sets [Builder.object_] to an arbitrary JSON value. - * - * You should usually call [Builder.object_] with a well-typed [Object] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun object_(object_: JsonField) = apply { this.object_ = object_ } - - /** The output of the function call (for `function_call_output` items). */ - fun output(output: String) = output(JsonField.of(output)) - - /** - * Sets [Builder.output] to an arbitrary JSON value. - * - * You should usually call [Builder.output] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun output(output: JsonField) = apply { this.output = output } - - /** - * The role of the message sender (`user`, `assistant`, `system`), only applicable for - * `message` items. - */ - fun role(role: Role) = role(JsonField.of(role)) - - /** - * Sets [Builder.role] to an arbitrary JSON value. - * - * You should usually call [Builder.role] with a well-typed [Role] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun role(role: JsonField) = apply { this.role = role } - - /** - * The status of the item (`completed`, `incomplete`, `in_progress`). These have no effect - * on the conversation, but are accepted for consistency with the - * `conversation.item.created` event. - */ - fun status(status: Status) = status(JsonField.of(status)) - - /** - * Sets [Builder.status] to an arbitrary JSON value. - * - * You should usually call [Builder.status] with a well-typed [Status] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun status(status: JsonField) = apply { this.status = status } - - /** - * The type of the item (`message`, `function_call`, `function_call_output`, - * `item_reference`). - */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItemWithReference]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): ConversationItemWithReference = - ConversationItemWithReference( - id, - arguments, - callId, - (content ?: JsonMissing.of()).map { it.toImmutable() }, - name, - object_, - output, - role, - status, - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItemWithReference = apply { - if (validated) { - return@apply - } - - id() - arguments() - callId() - content().ifPresent { it.forEach { it.validate() } } - name() - object_().ifPresent { it.validate() } - output() - role().ifPresent { it.validate() } - status().ifPresent { it.validate() } - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (id.asKnown().isPresent) 1 else 0) + - (if (arguments.asKnown().isPresent) 1 else 0) + - (if (callId.asKnown().isPresent) 1 else 0) + - (content.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (if (name.asKnown().isPresent) 1 else 0) + - (object_.asKnown().getOrNull()?.validity() ?: 0) + - (if (output.asKnown().isPresent) 1 else 0) + - (role.asKnown().getOrNull()?.validity() ?: 0) + - (status.asKnown().getOrNull()?.validity() ?: 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - class Content - private constructor( - private val id: JsonField, - private val audio: JsonField, - private val text: JsonField, - private val transcript: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("id") @ExcludeMissing id: JsonField = JsonMissing.of(), - @JsonProperty("audio") @ExcludeMissing audio: JsonField = JsonMissing.of(), - @JsonProperty("text") @ExcludeMissing text: JsonField = JsonMissing.of(), - @JsonProperty("transcript") - @ExcludeMissing - transcript: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(id, audio, text, transcript, type, mutableMapOf()) - - /** - * ID of a previous conversation item to reference (for `item_reference` content types in - * `response.create` events). These can reference both client and server created items. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun id(): Optional = id.getOptional("id") - - /** - * Base64-encoded audio bytes, used for `input_audio` content type. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun audio(): Optional = audio.getOptional("audio") - - /** - * The text content, used for `input_text` and `text` content types. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun text(): Optional = text.getOptional("text") - - /** - * The transcript of the audio, used for `input_audio` content type. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun transcript(): Optional = transcript.getOptional("transcript") - - /** - * The content type (`input_text`, `input_audio`, `item_reference`, `text`). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [id]. - * - * Unlike [id], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("id") @ExcludeMissing fun _id(): JsonField = id - - /** - * Returns the raw JSON value of [audio]. - * - * Unlike [audio], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("audio") @ExcludeMissing fun _audio(): JsonField = audio - - /** - * Returns the raw JSON value of [text]. - * - * Unlike [text], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("text") @ExcludeMissing fun _text(): JsonField = text - - /** - * Returns the raw JSON value of [transcript]. - * - * Unlike [transcript], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("transcript") - @ExcludeMissing - fun _transcript(): JsonField = transcript - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Content]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Content]. */ - class Builder internal constructor() { - - private var id: JsonField = JsonMissing.of() - private var audio: JsonField = JsonMissing.of() - private var text: JsonField = JsonMissing.of() - private var transcript: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(content: Content) = apply { - id = content.id - audio = content.audio - text = content.text - transcript = content.transcript - type = content.type - additionalProperties = content.additionalProperties.toMutableMap() - } - - /** - * ID of a previous conversation item to reference (for `item_reference` content types - * in `response.create` events). These can reference both client and server created - * items. - */ - fun id(id: String) = id(JsonField.of(id)) - - /** - * Sets [Builder.id] to an arbitrary JSON value. - * - * You should usually call [Builder.id] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun id(id: JsonField) = apply { this.id = id } - - /** Base64-encoded audio bytes, used for `input_audio` content type. */ - fun audio(audio: String) = audio(JsonField.of(audio)) - - /** - * Sets [Builder.audio] to an arbitrary JSON value. - * - * You should usually call [Builder.audio] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun audio(audio: JsonField) = apply { this.audio = audio } - - /** The text content, used for `input_text` and `text` content types. */ - fun text(text: String) = text(JsonField.of(text)) - - /** - * Sets [Builder.text] to an arbitrary JSON value. - * - * You should usually call [Builder.text] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun text(text: JsonField) = apply { this.text = text } - - /** The transcript of the audio, used for `input_audio` content type. */ - fun transcript(transcript: String) = transcript(JsonField.of(transcript)) - - /** - * Sets [Builder.transcript] to an arbitrary JSON value. - * - * You should usually call [Builder.transcript] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun transcript(transcript: JsonField) = apply { this.transcript = transcript } - - /** The content type (`input_text`, `input_audio`, `item_reference`, `text`). */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Content]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Content = - Content(id, audio, text, transcript, type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): Content = apply { - if (validated) { - return@apply - } - - id() - audio() - text() - transcript() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (id.asKnown().isPresent) 1 else 0) + - (if (audio.asKnown().isPresent) 1 else 0) + - (if (text.asKnown().isPresent) 1 else 0) + - (if (transcript.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** The content type (`input_text`, `input_audio`, `item_reference`, `text`). */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val INPUT_TEXT = of("input_text") - - @JvmField val INPUT_AUDIO = of("input_audio") - - @JvmField val ITEM_REFERENCE = of("item_reference") - - @JvmField val TEXT = of("text") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - INPUT_TEXT, - INPUT_AUDIO, - ITEM_REFERENCE, - TEXT, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - INPUT_TEXT, - INPUT_AUDIO, - ITEM_REFERENCE, - TEXT, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - INPUT_TEXT -> Value.INPUT_TEXT - INPUT_AUDIO -> Value.INPUT_AUDIO - ITEM_REFERENCE -> Value.ITEM_REFERENCE - TEXT -> Value.TEXT - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - INPUT_TEXT -> Known.INPUT_TEXT - INPUT_AUDIO -> Known.INPUT_AUDIO - ITEM_REFERENCE -> Known.ITEM_REFERENCE - TEXT -> Known.TEXT - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Content && - id == other.id && - audio == other.audio && - text == other.text && - transcript == other.transcript && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(id, audio, text, transcript, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Content{id=$id, audio=$audio, text=$text, transcript=$transcript, type=$type, additionalProperties=$additionalProperties}" - } - - /** Identifier for the API object being returned - always `realtime.item`. */ - class Object @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val REALTIME_ITEM = of("realtime.item") - - @JvmStatic fun of(value: String) = Object(JsonField.of(value)) - } - - /** An enum containing [Object]'s known values. */ - enum class Known { - REALTIME_ITEM - } - - /** - * An enum containing [Object]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Object] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - REALTIME_ITEM, - /** An enum member indicating that [Object] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - REALTIME_ITEM -> Value.REALTIME_ITEM - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - REALTIME_ITEM -> Known.REALTIME_ITEM - else -> throw OpenAIInvalidDataException("Unknown Object: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Object = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Object && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * The role of the message sender (`user`, `assistant`, `system`), only applicable for `message` - * items. - */ - class Role @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val USER = of("user") - - @JvmField val ASSISTANT = of("assistant") - - @JvmField val SYSTEM = of("system") - - @JvmStatic fun of(value: String) = Role(JsonField.of(value)) - } - - /** An enum containing [Role]'s known values. */ - enum class Known { - USER, - ASSISTANT, - SYSTEM, - } - - /** - * An enum containing [Role]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Role] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - USER, - ASSISTANT, - SYSTEM, - /** An enum member indicating that [Role] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - USER -> Value.USER - ASSISTANT -> Value.ASSISTANT - SYSTEM -> Value.SYSTEM - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - USER -> Known.USER - ASSISTANT -> Known.ASSISTANT - SYSTEM -> Known.SYSTEM - else -> throw OpenAIInvalidDataException("Unknown Role: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Role = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Role && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * The status of the item (`completed`, `incomplete`, `in_progress`). These have no effect on - * the conversation, but are accepted for consistency with the `conversation.item.created` - * event. - */ - class Status @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val COMPLETED = of("completed") - - @JvmField val INCOMPLETE = of("incomplete") - - @JvmField val IN_PROGRESS = of("in_progress") - - @JvmStatic fun of(value: String) = Status(JsonField.of(value)) - } - - /** An enum containing [Status]'s known values. */ - enum class Known { - COMPLETED, - INCOMPLETE, - IN_PROGRESS, - } - - /** - * An enum containing [Status]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Status] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - COMPLETED, - INCOMPLETE, - IN_PROGRESS, - /** An enum member indicating that [Status] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - COMPLETED -> Value.COMPLETED - INCOMPLETE -> Value.INCOMPLETE - IN_PROGRESS -> Value.IN_PROGRESS - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - COMPLETED -> Known.COMPLETED - INCOMPLETE -> Known.INCOMPLETE - IN_PROGRESS -> Known.IN_PROGRESS - else -> throw OpenAIInvalidDataException("Unknown Status: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Status = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Status && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * The type of the item (`message`, `function_call`, `function_call_output`, `item_reference`). - */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val MESSAGE = of("message") - - @JvmField val FUNCTION_CALL = of("function_call") - - @JvmField val FUNCTION_CALL_OUTPUT = of("function_call_output") - - @JvmField val ITEM_REFERENCE = of("item_reference") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - MESSAGE, - FUNCTION_CALL, - FUNCTION_CALL_OUTPUT, - ITEM_REFERENCE, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - MESSAGE, - FUNCTION_CALL, - FUNCTION_CALL_OUTPUT, - ITEM_REFERENCE, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - MESSAGE -> Value.MESSAGE - FUNCTION_CALL -> Value.FUNCTION_CALL - FUNCTION_CALL_OUTPUT -> Value.FUNCTION_CALL_OUTPUT - ITEM_REFERENCE -> Value.ITEM_REFERENCE - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - MESSAGE -> Known.MESSAGE - FUNCTION_CALL -> Known.FUNCTION_CALL - FUNCTION_CALL_OUTPUT -> Known.FUNCTION_CALL_OUTPUT - ITEM_REFERENCE -> Known.ITEM_REFERENCE - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItemWithReference && - id == other.id && - arguments == other.arguments && - callId == other.callId && - content == other.content && - name == other.name && - object_ == other.object_ && - output == other.output && - role == other.role && - status == other.status && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - id, - arguments, - callId, - content, - name, - object_, - output, - role, - status, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItemWithReference{id=$id, arguments=$arguments, callId=$callId, content=$content, name=$name, object_=$object_, output=$output, role=$role, status=$status, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ErrorEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ErrorEvent.kt deleted file mode 100644 index c8d9a075c..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ErrorEvent.kt +++ /dev/null @@ -1,570 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * Returned when an error occurs, which could be a client problem or a server problem. Most errors - * are recoverable and the session will stay open, we recommend to implementors to monitor and log - * error messages by default. - */ -class ErrorEvent -private constructor( - private val error: JsonField, - private val eventId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("error") @ExcludeMissing error: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(error, eventId, type, mutableMapOf()) - - /** - * Details of the error. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun error(): Error = error.getRequired("error") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The event type, must be `error`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("error") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [error]. - * - * Unlike [error], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("error") @ExcludeMissing fun _error(): JsonField = error - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ErrorEvent]. - * - * The following fields are required: - * ```java - * .error() - * .eventId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ErrorEvent]. */ - class Builder internal constructor() { - - private var error: JsonField? = null - private var eventId: JsonField? = null - private var type: JsonValue = JsonValue.from("error") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(errorEvent: ErrorEvent) = apply { - error = errorEvent.error - eventId = errorEvent.eventId - type = errorEvent.type - additionalProperties = errorEvent.additionalProperties.toMutableMap() - } - - /** Details of the error. */ - fun error(error: Error) = error(JsonField.of(error)) - - /** - * Sets [Builder.error] to an arbitrary JSON value. - * - * You should usually call [Builder.error] with a well-typed [Error] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun error(error: JsonField) = apply { this.error = error } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("error") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ErrorEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .error() - * .eventId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ErrorEvent = - ErrorEvent( - checkRequired("error", error), - checkRequired("eventId", eventId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ErrorEvent = apply { - if (validated) { - return@apply - } - - error().validate() - eventId() - _type().let { - if (it != JsonValue.from("error")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (error.asKnown().getOrNull()?.validity() ?: 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("error")) 1 else 0 } - - /** Details of the error. */ - class Error - private constructor( - private val message: JsonField, - private val type: JsonField, - private val code: JsonField, - private val eventId: JsonField, - private val param: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("message") @ExcludeMissing message: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - @JsonProperty("code") @ExcludeMissing code: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("param") @ExcludeMissing param: JsonField = JsonMissing.of(), - ) : this(message, type, code, eventId, param, mutableMapOf()) - - /** - * A human-readable error message. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun message(): String = message.getRequired("message") - - /** - * The type of error (e.g., "invalid_request_error", "server_error"). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun type(): String = type.getRequired("type") - - /** - * Error code, if any. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun code(): Optional = code.getOptional("code") - - /** - * The event_id of the client event that caused the error, if applicable. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eventId(): Optional = eventId.getOptional("event_id") - - /** - * Parameter related to the error, if any. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun param(): Optional = param.getOptional("param") - - /** - * Returns the raw JSON value of [message]. - * - * Unlike [message], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("message") @ExcludeMissing fun _message(): JsonField = message - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - /** - * Returns the raw JSON value of [code]. - * - * Unlike [code], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("code") @ExcludeMissing fun _code(): JsonField = code - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [param]. - * - * Unlike [param], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("param") @ExcludeMissing fun _param(): JsonField = param - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [Error]. - * - * The following fields are required: - * ```java - * .message() - * .type() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Error]. */ - class Builder internal constructor() { - - private var message: JsonField? = null - private var type: JsonField? = null - private var code: JsonField = JsonMissing.of() - private var eventId: JsonField = JsonMissing.of() - private var param: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(error: Error) = apply { - message = error.message - type = error.type - code = error.code - eventId = error.eventId - param = error.param - additionalProperties = error.additionalProperties.toMutableMap() - } - - /** A human-readable error message. */ - fun message(message: String) = message(JsonField.of(message)) - - /** - * Sets [Builder.message] to an arbitrary JSON value. - * - * You should usually call [Builder.message] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun message(message: JsonField) = apply { this.message = message } - - /** The type of error (e.g., "invalid_request_error", "server_error"). */ - fun type(type: String) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - /** Error code, if any. */ - fun code(code: String?) = code(JsonField.ofNullable(code)) - - /** Alias for calling [Builder.code] with `code.orElse(null)`. */ - fun code(code: Optional) = code(code.getOrNull()) - - /** - * Sets [Builder.code] to an arbitrary JSON value. - * - * You should usually call [Builder.code] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun code(code: JsonField) = apply { this.code = code } - - /** The event_id of the client event that caused the error, if applicable. */ - fun eventId(eventId: String?) = eventId(JsonField.ofNullable(eventId)) - - /** Alias for calling [Builder.eventId] with `eventId.orElse(null)`. */ - fun eventId(eventId: Optional) = eventId(eventId.getOrNull()) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** Parameter related to the error, if any. */ - fun param(param: String?) = param(JsonField.ofNullable(param)) - - /** Alias for calling [Builder.param] with `param.orElse(null)`. */ - fun param(param: Optional) = param(param.getOrNull()) - - /** - * Sets [Builder.param] to an arbitrary JSON value. - * - * You should usually call [Builder.param] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun param(param: JsonField) = apply { this.param = param } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Error]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .message() - * .type() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): Error = - Error( - checkRequired("message", message), - checkRequired("type", type), - code, - eventId, - param, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): Error = apply { - if (validated) { - return@apply - } - - message() - type() - code() - eventId() - param() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (message.asKnown().isPresent) 1 else 0) + - (if (type.asKnown().isPresent) 1 else 0) + - (if (code.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (param.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Error && - message == other.message && - type == other.type && - code == other.code && - eventId == other.eventId && - param == other.param && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(message, type, code, eventId, param, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Error{message=$message, type=$type, code=$code, eventId=$eventId, param=$param, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ErrorEvent && - error == other.error && - eventId == other.eventId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(error, eventId, type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ErrorEvent{error=$error, eventId=$eventId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferAppendEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferAppendEvent.kt deleted file mode 100644 index a9f94a368..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferAppendEvent.kt +++ /dev/null @@ -1,262 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional - -/** - * Send this event to append audio bytes to the input audio buffer. The audio buffer is temporary - * storage you can write to and later commit. In Server VAD mode, the audio buffer is used to detect - * speech and the server will decide when to commit. When Server VAD is disabled, you must commit - * the audio buffer manually. - * - * The client may choose how much audio to place in each event up to a maximum of 15 MiB, for - * example streaming smaller chunks from the client may allow the VAD to be more responsive. Unlike - * made other client events, the server will not send a confirmation response to this event. - */ -class InputAudioBufferAppendEvent -private constructor( - private val audio: JsonField, - private val type: JsonValue, - private val eventId: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("audio") @ExcludeMissing audio: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - ) : this(audio, type, eventId, mutableMapOf()) - - /** - * Base64-encoded audio bytes. This must be in the format specified by the `input_audio_format` - * field in the session configuration. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun audio(): String = audio.getRequired("audio") - - /** - * The event type, must be `input_audio_buffer.append`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("input_audio_buffer.append") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Optional client-generated ID used to identify this event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eventId(): Optional = eventId.getOptional("event_id") - - /** - * Returns the raw JSON value of [audio]. - * - * Unlike [audio], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("audio") @ExcludeMissing fun _audio(): JsonField = audio - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [InputAudioBufferAppendEvent]. - * - * The following fields are required: - * ```java - * .audio() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioBufferAppendEvent]. */ - class Builder internal constructor() { - - private var audio: JsonField? = null - private var type: JsonValue = JsonValue.from("input_audio_buffer.append") - private var eventId: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioBufferAppendEvent: InputAudioBufferAppendEvent) = apply { - audio = inputAudioBufferAppendEvent.audio - type = inputAudioBufferAppendEvent.type - eventId = inputAudioBufferAppendEvent.eventId - additionalProperties = inputAudioBufferAppendEvent.additionalProperties.toMutableMap() - } - - /** - * Base64-encoded audio bytes. This must be in the format specified by the - * `input_audio_format` field in the session configuration. - */ - fun audio(audio: String) = audio(JsonField.of(audio)) - - /** - * Sets [Builder.audio] to an arbitrary JSON value. - * - * You should usually call [Builder.audio] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun audio(audio: JsonField) = apply { this.audio = audio } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("input_audio_buffer.append") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** Optional client-generated ID used to identify this event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioBufferAppendEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .audio() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): InputAudioBufferAppendEvent = - InputAudioBufferAppendEvent( - checkRequired("audio", audio), - type, - eventId, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): InputAudioBufferAppendEvent = apply { - if (validated) { - return@apply - } - - audio() - _type().let { - if (it != JsonValue.from("input_audio_buffer.append")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - eventId() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (audio.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("input_audio_buffer.append")) 1 else 0 } + - (if (eventId.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioBufferAppendEvent && - audio == other.audio && - type == other.type && - eventId == other.eventId && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(audio, type, eventId, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioBufferAppendEvent{audio=$audio, type=$type, eventId=$eventId, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearEvent.kt deleted file mode 100644 index 86de27e7b..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearEvent.kt +++ /dev/null @@ -1,201 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional - -/** - * Send this event to clear the audio bytes in the buffer. The server will respond with an - * `input_audio_buffer.cleared` event. - */ -class InputAudioBufferClearEvent -private constructor( - private val type: JsonValue, - private val eventId: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - ) : this(type, eventId, mutableMapOf()) - - /** - * The event type, must be `input_audio_buffer.clear`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("input_audio_buffer.clear") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Optional client-generated ID used to identify this event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eventId(): Optional = eventId.getOptional("event_id") - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [InputAudioBufferClearEvent]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioBufferClearEvent]. */ - class Builder internal constructor() { - - private var type: JsonValue = JsonValue.from("input_audio_buffer.clear") - private var eventId: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioBufferClearEvent: InputAudioBufferClearEvent) = apply { - type = inputAudioBufferClearEvent.type - eventId = inputAudioBufferClearEvent.eventId - additionalProperties = inputAudioBufferClearEvent.additionalProperties.toMutableMap() - } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("input_audio_buffer.clear") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** Optional client-generated ID used to identify this event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioBufferClearEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioBufferClearEvent = - InputAudioBufferClearEvent(type, eventId, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): InputAudioBufferClearEvent = apply { - if (validated) { - return@apply - } - - _type().let { - if (it != JsonValue.from("input_audio_buffer.clear")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - eventId() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - type.let { if (it == JsonValue.from("input_audio_buffer.clear")) 1 else 0 } + - (if (eventId.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioBufferClearEvent && - type == other.type && - eventId == other.eventId && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(type, eventId, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioBufferClearEvent{type=$type, eventId=$eventId, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearedEvent.kt deleted file mode 100644 index 950b01c37..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearedEvent.kt +++ /dev/null @@ -1,217 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects - -/** - * Returned when the input audio buffer is cleared by the client with a `input_audio_buffer.clear` - * event. - */ -class InputAudioBufferClearedEvent -private constructor( - private val eventId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The event type, must be `input_audio_buffer.cleared`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("input_audio_buffer.cleared") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [InputAudioBufferClearedEvent]. - * - * The following fields are required: - * ```java - * .eventId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioBufferClearedEvent]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var type: JsonValue = JsonValue.from("input_audio_buffer.cleared") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioBufferClearedEvent: InputAudioBufferClearedEvent) = apply { - eventId = inputAudioBufferClearedEvent.eventId - type = inputAudioBufferClearedEvent.type - additionalProperties = inputAudioBufferClearedEvent.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("input_audio_buffer.cleared") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioBufferClearedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): InputAudioBufferClearedEvent = - InputAudioBufferClearedEvent( - checkRequired("eventId", eventId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): InputAudioBufferClearedEvent = apply { - if (validated) { - return@apply - } - - eventId() - _type().let { - if (it != JsonValue.from("input_audio_buffer.cleared")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("input_audio_buffer.cleared")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioBufferClearedEvent && - eventId == other.eventId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(eventId, type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioBufferClearedEvent{eventId=$eventId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommitEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommitEvent.kt deleted file mode 100644 index 93a78f5ee..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommitEvent.kt +++ /dev/null @@ -1,207 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional - -/** - * Send this event to commit the user input audio buffer, which will create a new user message item - * in the conversation. This event will produce an error if the input audio buffer is empty. When in - * Server VAD mode, the client does not need to send this event, the server will commit the audio - * buffer automatically. - * - * Committing the input audio buffer will trigger input audio transcription (if enabled in session - * configuration), but it will not create a response from the model. The server will respond with an - * `input_audio_buffer.committed` event. - */ -class InputAudioBufferCommitEvent -private constructor( - private val type: JsonValue, - private val eventId: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - ) : this(type, eventId, mutableMapOf()) - - /** - * The event type, must be `input_audio_buffer.commit`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("input_audio_buffer.commit") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Optional client-generated ID used to identify this event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eventId(): Optional = eventId.getOptional("event_id") - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [InputAudioBufferCommitEvent]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioBufferCommitEvent]. */ - class Builder internal constructor() { - - private var type: JsonValue = JsonValue.from("input_audio_buffer.commit") - private var eventId: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioBufferCommitEvent: InputAudioBufferCommitEvent) = apply { - type = inputAudioBufferCommitEvent.type - eventId = inputAudioBufferCommitEvent.eventId - additionalProperties = inputAudioBufferCommitEvent.additionalProperties.toMutableMap() - } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("input_audio_buffer.commit") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** Optional client-generated ID used to identify this event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioBufferCommitEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioBufferCommitEvent = - InputAudioBufferCommitEvent(type, eventId, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): InputAudioBufferCommitEvent = apply { - if (validated) { - return@apply - } - - _type().let { - if (it != JsonValue.from("input_audio_buffer.commit")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - eventId() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - type.let { if (it == JsonValue.from("input_audio_buffer.commit")) 1 else 0 } + - (if (eventId.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioBufferCommitEvent && - type == other.type && - eventId == other.eventId && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(type, eventId, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioBufferCommitEvent{type=$type, eventId=$eventId, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommittedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommittedEvent.kt deleted file mode 100644 index 385f98a24..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommittedEvent.kt +++ /dev/null @@ -1,310 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * Returned when an input audio buffer is committed, either by the client or automatically in server - * VAD mode. The `item_id` property is the ID of the user message item that will be created, thus a - * `conversation.item.created` event will also be sent to the client. - */ -class InputAudioBufferCommittedEvent -private constructor( - private val eventId: JsonField, - private val itemId: JsonField, - private val type: JsonValue, - private val previousItemId: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("previous_item_id") - @ExcludeMissing - previousItemId: JsonField = JsonMissing.of(), - ) : this(eventId, itemId, type, previousItemId, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the user message item that will be created. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The event type, must be `input_audio_buffer.committed`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("input_audio_buffer.committed") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * The ID of the preceding item after which the new item will be inserted. Can be `null` if the - * item has no predecessor. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun previousItemId(): Optional = previousItemId.getOptional("previous_item_id") - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [previousItemId]. - * - * Unlike [previousItemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("previous_item_id") - @ExcludeMissing - fun _previousItemId(): JsonField = previousItemId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [InputAudioBufferCommittedEvent]. - * - * The following fields are required: - * ```java - * .eventId() - * .itemId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioBufferCommittedEvent]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var type: JsonValue = JsonValue.from("input_audio_buffer.committed") - private var previousItemId: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioBufferCommittedEvent: InputAudioBufferCommittedEvent) = apply { - eventId = inputAudioBufferCommittedEvent.eventId - itemId = inputAudioBufferCommittedEvent.itemId - type = inputAudioBufferCommittedEvent.type - previousItemId = inputAudioBufferCommittedEvent.previousItemId - additionalProperties = - inputAudioBufferCommittedEvent.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the user message item that will be created. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("input_audio_buffer.committed") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** - * The ID of the preceding item after which the new item will be inserted. Can be `null` if - * the item has no predecessor. - */ - fun previousItemId(previousItemId: String?) = - previousItemId(JsonField.ofNullable(previousItemId)) - - /** Alias for calling [Builder.previousItemId] with `previousItemId.orElse(null)`. */ - fun previousItemId(previousItemId: Optional) = - previousItemId(previousItemId.getOrNull()) - - /** - * Sets [Builder.previousItemId] to an arbitrary JSON value. - * - * You should usually call [Builder.previousItemId] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun previousItemId(previousItemId: JsonField) = apply { - this.previousItemId = previousItemId - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioBufferCommittedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .itemId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): InputAudioBufferCommittedEvent = - InputAudioBufferCommittedEvent( - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - type, - previousItemId, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): InputAudioBufferCommittedEvent = apply { - if (validated) { - return@apply - } - - eventId() - itemId() - _type().let { - if (it != JsonValue.from("input_audio_buffer.committed")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - previousItemId() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("input_audio_buffer.committed")) 1 else 0 } + - (if (previousItemId.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioBufferCommittedEvent && - eventId == other.eventId && - itemId == other.itemId && - type == other.type && - previousItemId == other.previousItemId && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(eventId, itemId, type, previousItemId, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioBufferCommittedEvent{eventId=$eventId, itemId=$itemId, type=$type, previousItemId=$previousItemId, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStartedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStartedEvent.kt deleted file mode 100644 index 3f0605c98..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStartedEvent.kt +++ /dev/null @@ -1,312 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects - -/** - * Sent by the server when in `server_vad` mode to indicate that speech has been detected in the - * audio buffer. This can happen any time audio is added to the buffer (unless speech is already - * detected). The client may want to use this event to interrupt audio playback or provide visual - * feedback to the user. - * - * The client should expect to receive a `input_audio_buffer.speech_stopped` event when speech - * stops. The `item_id` property is the ID of the user message item that will be created when speech - * stops and will also be included in the `input_audio_buffer.speech_stopped` event (unless the - * client manually commits the audio buffer during VAD activation). - */ -class InputAudioBufferSpeechStartedEvent -private constructor( - private val audioStartMs: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("audio_start_ms") - @ExcludeMissing - audioStartMs: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(audioStartMs, eventId, itemId, type, mutableMapOf()) - - /** - * Milliseconds from the start of all audio written to the buffer during the session when speech - * was first detected. This will correspond to the beginning of audio sent to the model, and - * thus includes the `prefix_padding_ms` configured in the Session. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun audioStartMs(): Long = audioStartMs.getRequired("audio_start_ms") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the user message item that will be created when speech stops. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The event type, must be `input_audio_buffer.speech_started`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("input_audio_buffer.speech_started") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [audioStartMs]. - * - * Unlike [audioStartMs], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("audio_start_ms") - @ExcludeMissing - fun _audioStartMs(): JsonField = audioStartMs - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [InputAudioBufferSpeechStartedEvent]. - * - * The following fields are required: - * ```java - * .audioStartMs() - * .eventId() - * .itemId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioBufferSpeechStartedEvent]. */ - class Builder internal constructor() { - - private var audioStartMs: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var type: JsonValue = JsonValue.from("input_audio_buffer.speech_started") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioBufferSpeechStartedEvent: InputAudioBufferSpeechStartedEvent) = - apply { - audioStartMs = inputAudioBufferSpeechStartedEvent.audioStartMs - eventId = inputAudioBufferSpeechStartedEvent.eventId - itemId = inputAudioBufferSpeechStartedEvent.itemId - type = inputAudioBufferSpeechStartedEvent.type - additionalProperties = - inputAudioBufferSpeechStartedEvent.additionalProperties.toMutableMap() - } - - /** - * Milliseconds from the start of all audio written to the buffer during the session when - * speech was first detected. This will correspond to the beginning of audio sent to the - * model, and thus includes the `prefix_padding_ms` configured in the Session. - */ - fun audioStartMs(audioStartMs: Long) = audioStartMs(JsonField.of(audioStartMs)) - - /** - * Sets [Builder.audioStartMs] to an arbitrary JSON value. - * - * You should usually call [Builder.audioStartMs] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun audioStartMs(audioStartMs: JsonField) = apply { this.audioStartMs = audioStartMs } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the user message item that will be created when speech stops. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("input_audio_buffer.speech_started") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioBufferSpeechStartedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .audioStartMs() - * .eventId() - * .itemId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): InputAudioBufferSpeechStartedEvent = - InputAudioBufferSpeechStartedEvent( - checkRequired("audioStartMs", audioStartMs), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): InputAudioBufferSpeechStartedEvent = apply { - if (validated) { - return@apply - } - - audioStartMs() - eventId() - itemId() - _type().let { - if (it != JsonValue.from("input_audio_buffer.speech_started")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (audioStartMs.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("input_audio_buffer.speech_started")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioBufferSpeechStartedEvent && - audioStartMs == other.audioStartMs && - eventId == other.eventId && - itemId == other.itemId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(audioStartMs, eventId, itemId, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioBufferSpeechStartedEvent{audioStartMs=$audioStartMs, eventId=$eventId, itemId=$itemId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStoppedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStoppedEvent.kt deleted file mode 100644 index 154982233..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStoppedEvent.kt +++ /dev/null @@ -1,303 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects - -/** - * Returned in `server_vad` mode when the server detects the end of speech in the audio buffer. The - * server will also send an `conversation.item.created` event with the user message item that is - * created from the audio buffer. - */ -class InputAudioBufferSpeechStoppedEvent -private constructor( - private val audioEndMs: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("audio_end_ms") - @ExcludeMissing - audioEndMs: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(audioEndMs, eventId, itemId, type, mutableMapOf()) - - /** - * Milliseconds since the session started when speech stopped. This will correspond to the end - * of audio sent to the model, and thus includes the `min_silence_duration_ms` configured in the - * Session. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun audioEndMs(): Long = audioEndMs.getRequired("audio_end_ms") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the user message item that will be created. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The event type, must be `input_audio_buffer.speech_stopped`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("input_audio_buffer.speech_stopped") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [audioEndMs]. - * - * Unlike [audioEndMs], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("audio_end_ms") @ExcludeMissing fun _audioEndMs(): JsonField = audioEndMs - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [InputAudioBufferSpeechStoppedEvent]. - * - * The following fields are required: - * ```java - * .audioEndMs() - * .eventId() - * .itemId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioBufferSpeechStoppedEvent]. */ - class Builder internal constructor() { - - private var audioEndMs: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var type: JsonValue = JsonValue.from("input_audio_buffer.speech_stopped") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioBufferSpeechStoppedEvent: InputAudioBufferSpeechStoppedEvent) = - apply { - audioEndMs = inputAudioBufferSpeechStoppedEvent.audioEndMs - eventId = inputAudioBufferSpeechStoppedEvent.eventId - itemId = inputAudioBufferSpeechStoppedEvent.itemId - type = inputAudioBufferSpeechStoppedEvent.type - additionalProperties = - inputAudioBufferSpeechStoppedEvent.additionalProperties.toMutableMap() - } - - /** - * Milliseconds since the session started when speech stopped. This will correspond to the - * end of audio sent to the model, and thus includes the `min_silence_duration_ms` - * configured in the Session. - */ - fun audioEndMs(audioEndMs: Long) = audioEndMs(JsonField.of(audioEndMs)) - - /** - * Sets [Builder.audioEndMs] to an arbitrary JSON value. - * - * You should usually call [Builder.audioEndMs] with a well-typed [Long] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun audioEndMs(audioEndMs: JsonField) = apply { this.audioEndMs = audioEndMs } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the user message item that will be created. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("input_audio_buffer.speech_stopped") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioBufferSpeechStoppedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .audioEndMs() - * .eventId() - * .itemId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): InputAudioBufferSpeechStoppedEvent = - InputAudioBufferSpeechStoppedEvent( - checkRequired("audioEndMs", audioEndMs), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): InputAudioBufferSpeechStoppedEvent = apply { - if (validated) { - return@apply - } - - audioEndMs() - eventId() - itemId() - _type().let { - if (it != JsonValue.from("input_audio_buffer.speech_stopped")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (audioEndMs.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("input_audio_buffer.speech_stopped")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioBufferSpeechStoppedEvent && - audioEndMs == other.audioEndMs && - eventId == other.eventId && - itemId == other.itemId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(audioEndMs, eventId, itemId, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioBufferSpeechStoppedEvent{audioEndMs=$audioEndMs, eventId=$eventId, itemId=$itemId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RateLimitsUpdatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RateLimitsUpdatedEvent.kt deleted file mode 100644 index b4a715134..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RateLimitsUpdatedEvent.kt +++ /dev/null @@ -1,664 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkKnown -import com.openai.core.checkRequired -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * Emitted at the beginning of a Response to indicate the updated rate limits. When a Response is - * created some tokens will be "reserved" for the output tokens, the rate limits shown here reflect - * that reservation, which is then adjusted accordingly once the Response is completed. - */ -class RateLimitsUpdatedEvent -private constructor( - private val eventId: JsonField, - private val rateLimits: JsonField>, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("rate_limits") - @ExcludeMissing - rateLimits: JsonField> = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, rateLimits, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * List of rate limit information. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun rateLimits(): List = rateLimits.getRequired("rate_limits") - - /** - * The event type, must be `rate_limits.updated`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("rate_limits.updated") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [rateLimits]. - * - * Unlike [rateLimits], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("rate_limits") - @ExcludeMissing - fun _rateLimits(): JsonField> = rateLimits - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [RateLimitsUpdatedEvent]. - * - * The following fields are required: - * ```java - * .eventId() - * .rateLimits() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [RateLimitsUpdatedEvent]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var rateLimits: JsonField>? = null - private var type: JsonValue = JsonValue.from("rate_limits.updated") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(rateLimitsUpdatedEvent: RateLimitsUpdatedEvent) = apply { - eventId = rateLimitsUpdatedEvent.eventId - rateLimits = rateLimitsUpdatedEvent.rateLimits.map { it.toMutableList() } - type = rateLimitsUpdatedEvent.type - additionalProperties = rateLimitsUpdatedEvent.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** List of rate limit information. */ - fun rateLimits(rateLimits: List) = rateLimits(JsonField.of(rateLimits)) - - /** - * Sets [Builder.rateLimits] to an arbitrary JSON value. - * - * You should usually call [Builder.rateLimits] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun rateLimits(rateLimits: JsonField>) = apply { - this.rateLimits = rateLimits.map { it.toMutableList() } - } - - /** - * Adds a single [RateLimit] to [rateLimits]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addRateLimit(rateLimit: RateLimit) = apply { - rateLimits = - (rateLimits ?: JsonField.of(mutableListOf())).also { - checkKnown("rateLimits", it).add(rateLimit) - } - } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("rate_limits.updated") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [RateLimitsUpdatedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .rateLimits() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): RateLimitsUpdatedEvent = - RateLimitsUpdatedEvent( - checkRequired("eventId", eventId), - checkRequired("rateLimits", rateLimits).map { it.toImmutable() }, - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): RateLimitsUpdatedEvent = apply { - if (validated) { - return@apply - } - - eventId() - rateLimits().forEach { it.validate() } - _type().let { - if (it != JsonValue.from("rate_limits.updated")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (rateLimits.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - type.let { if (it == JsonValue.from("rate_limits.updated")) 1 else 0 } - - class RateLimit - private constructor( - private val limit: JsonField, - private val name: JsonField, - private val remaining: JsonField, - private val resetSeconds: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("limit") @ExcludeMissing limit: JsonField = JsonMissing.of(), - @JsonProperty("name") @ExcludeMissing name: JsonField = JsonMissing.of(), - @JsonProperty("remaining") - @ExcludeMissing - remaining: JsonField = JsonMissing.of(), - @JsonProperty("reset_seconds") - @ExcludeMissing - resetSeconds: JsonField = JsonMissing.of(), - ) : this(limit, name, remaining, resetSeconds, mutableMapOf()) - - /** - * The maximum allowed value for the rate limit. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun limit(): Optional = limit.getOptional("limit") - - /** - * The name of the rate limit (`requests`, `tokens`). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun name(): Optional = name.getOptional("name") - - /** - * The remaining value before the limit is reached. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun remaining(): Optional = remaining.getOptional("remaining") - - /** - * Seconds until the rate limit resets. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun resetSeconds(): Optional = resetSeconds.getOptional("reset_seconds") - - /** - * Returns the raw JSON value of [limit]. - * - * Unlike [limit], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("limit") @ExcludeMissing fun _limit(): JsonField = limit - - /** - * Returns the raw JSON value of [name]. - * - * Unlike [name], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("name") @ExcludeMissing fun _name(): JsonField = name - - /** - * Returns the raw JSON value of [remaining]. - * - * Unlike [remaining], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("remaining") @ExcludeMissing fun _remaining(): JsonField = remaining - - /** - * Returns the raw JSON value of [resetSeconds]. - * - * Unlike [resetSeconds], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("reset_seconds") - @ExcludeMissing - fun _resetSeconds(): JsonField = resetSeconds - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [RateLimit]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [RateLimit]. */ - class Builder internal constructor() { - - private var limit: JsonField = JsonMissing.of() - private var name: JsonField = JsonMissing.of() - private var remaining: JsonField = JsonMissing.of() - private var resetSeconds: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(rateLimit: RateLimit) = apply { - limit = rateLimit.limit - name = rateLimit.name - remaining = rateLimit.remaining - resetSeconds = rateLimit.resetSeconds - additionalProperties = rateLimit.additionalProperties.toMutableMap() - } - - /** The maximum allowed value for the rate limit. */ - fun limit(limit: Long) = limit(JsonField.of(limit)) - - /** - * Sets [Builder.limit] to an arbitrary JSON value. - * - * You should usually call [Builder.limit] with a well-typed [Long] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun limit(limit: JsonField) = apply { this.limit = limit } - - /** The name of the rate limit (`requests`, `tokens`). */ - fun name(name: Name) = name(JsonField.of(name)) - - /** - * Sets [Builder.name] to an arbitrary JSON value. - * - * You should usually call [Builder.name] with a well-typed [Name] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun name(name: JsonField) = apply { this.name = name } - - /** The remaining value before the limit is reached. */ - fun remaining(remaining: Long) = remaining(JsonField.of(remaining)) - - /** - * Sets [Builder.remaining] to an arbitrary JSON value. - * - * You should usually call [Builder.remaining] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun remaining(remaining: JsonField) = apply { this.remaining = remaining } - - /** Seconds until the rate limit resets. */ - fun resetSeconds(resetSeconds: Double) = resetSeconds(JsonField.of(resetSeconds)) - - /** - * Sets [Builder.resetSeconds] to an arbitrary JSON value. - * - * You should usually call [Builder.resetSeconds] with a well-typed [Double] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun resetSeconds(resetSeconds: JsonField) = apply { - this.resetSeconds = resetSeconds - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [RateLimit]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): RateLimit = - RateLimit(limit, name, remaining, resetSeconds, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): RateLimit = apply { - if (validated) { - return@apply - } - - limit() - name().ifPresent { it.validate() } - remaining() - resetSeconds() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (limit.asKnown().isPresent) 1 else 0) + - (name.asKnown().getOrNull()?.validity() ?: 0) + - (if (remaining.asKnown().isPresent) 1 else 0) + - (if (resetSeconds.asKnown().isPresent) 1 else 0) - - /** The name of the rate limit (`requests`, `tokens`). */ - class Name @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val REQUESTS = of("requests") - - @JvmField val TOKENS = of("tokens") - - @JvmStatic fun of(value: String) = Name(JsonField.of(value)) - } - - /** An enum containing [Name]'s known values. */ - enum class Known { - REQUESTS, - TOKENS, - } - - /** - * An enum containing [Name]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Name] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - REQUESTS, - TOKENS, - /** An enum member indicating that [Name] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - REQUESTS -> Value.REQUESTS - TOKENS -> Value.TOKENS - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - REQUESTS -> Known.REQUESTS - TOKENS -> Known.TOKENS - else -> throw OpenAIInvalidDataException("Unknown Name: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Name = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Name && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is RateLimit && - limit == other.limit && - name == other.name && - remaining == other.remaining && - resetSeconds == other.resetSeconds && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(limit, name, remaining, resetSeconds, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "RateLimit{limit=$limit, name=$name, remaining=$remaining, resetSeconds=$resetSeconds, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is RateLimitsUpdatedEvent && - eventId == other.eventId && - rateLimits == other.rateLimits && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(eventId, rateLimits, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "RateLimitsUpdatedEvent{eventId=$eventId, rateLimits=$rateLimits, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeClientEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeClientEvent.kt deleted file mode 100644 index 93fda4123..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeClientEvent.kt +++ /dev/null @@ -1,1146 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.ObjectCodec -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.BaseDeserializer -import com.openai.core.BaseSerializer -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.getOrThrow -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** A realtime client event. */ -@JsonDeserialize(using = RealtimeClientEvent.Deserializer::class) -@JsonSerialize(using = RealtimeClientEvent.Serializer::class) -class RealtimeClientEvent -private constructor( - private val conversationItemCreate: ConversationItemCreateEvent? = null, - private val conversationItemDelete: ConversationItemDeleteEvent? = null, - private val conversationItemRetrieve: ConversationItemRetrieveEvent? = null, - private val conversationItemTruncate: ConversationItemTruncateEvent? = null, - private val inputAudioBufferAppend: InputAudioBufferAppendEvent? = null, - private val inputAudioBufferClear: InputAudioBufferClearEvent? = null, - private val outputAudioBufferClear: OutputAudioBufferClear? = null, - private val inputAudioBufferCommit: InputAudioBufferCommitEvent? = null, - private val responseCancel: ResponseCancelEvent? = null, - private val responseCreate: ResponseCreateEvent? = null, - private val sessionUpdate: SessionUpdateEvent? = null, - private val transcriptionSessionUpdate: TranscriptionSessionUpdate? = null, - private val _json: JsonValue? = null, -) { - - /** - * Add a new Item to the Conversation's context, including messages, function calls, and - * function call responses. This event can be used both to populate a "history" of the - * conversation and to add new items mid-stream, but has the current limitation that it cannot - * populate assistant audio messages. - * - * If successful, the server will respond with a `conversation.item.created` event, otherwise an - * `error` event will be sent. - */ - fun conversationItemCreate(): Optional = - Optional.ofNullable(conversationItemCreate) - - /** - * Send this event when you want to remove any item from the conversation history. The server - * will respond with a `conversation.item.deleted` event, unless the item does not exist in the - * conversation history, in which case the server will respond with an error. - */ - fun conversationItemDelete(): Optional = - Optional.ofNullable(conversationItemDelete) - - /** - * Send this event when you want to retrieve the server's representation of a specific item in - * the conversation history. This is useful, for example, to inspect user audio after noise - * cancellation and VAD. The server will respond with a `conversation.item.retrieved` event, - * unless the item does not exist in the conversation history, in which case the server will - * respond with an error. - */ - fun conversationItemRetrieve(): Optional = - Optional.ofNullable(conversationItemRetrieve) - - /** - * Send this event to truncate a previous assistant message’s audio. The server will produce - * audio faster than realtime, so this event is useful when the user interrupts to truncate - * audio that has already been sent to the client but not yet played. This will synchronize the - * server's understanding of the audio with the client's playback. - * - * Truncating audio will delete the server-side text transcript to ensure there is not text in - * the context that hasn't been heard by the user. - * - * If successful, the server will respond with a `conversation.item.truncated` event. - */ - fun conversationItemTruncate(): Optional = - Optional.ofNullable(conversationItemTruncate) - - /** - * Send this event to append audio bytes to the input audio buffer. The audio buffer is - * temporary storage you can write to and later commit. In Server VAD mode, the audio buffer is - * used to detect speech and the server will decide when to commit. When Server VAD is disabled, - * you must commit the audio buffer manually. - * - * The client may choose how much audio to place in each event up to a maximum of 15 MiB, for - * example streaming smaller chunks from the client may allow the VAD to be more responsive. - * Unlike made other client events, the server will not send a confirmation response to this - * event. - */ - fun inputAudioBufferAppend(): Optional = - Optional.ofNullable(inputAudioBufferAppend) - - /** - * Send this event to clear the audio bytes in the buffer. The server will respond with an - * `input_audio_buffer.cleared` event. - */ - fun inputAudioBufferClear(): Optional = - Optional.ofNullable(inputAudioBufferClear) - - /** - * **WebRTC Only:** Emit to cut off the current audio response. This will trigger the server to - * stop generating audio and emit a `output_audio_buffer.cleared` event. This event should be - * preceded by a `response.cancel` client event to stop the generation of the current response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - fun outputAudioBufferClear(): Optional = - Optional.ofNullable(outputAudioBufferClear) - - /** - * Send this event to commit the user input audio buffer, which will create a new user message - * item in the conversation. This event will produce an error if the input audio buffer is - * empty. When in Server VAD mode, the client does not need to send this event, the server will - * commit the audio buffer automatically. - * - * Committing the input audio buffer will trigger input audio transcription (if enabled in - * session configuration), but it will not create a response from the model. The server will - * respond with an `input_audio_buffer.committed` event. - */ - fun inputAudioBufferCommit(): Optional = - Optional.ofNullable(inputAudioBufferCommit) - - /** - * Send this event to cancel an in-progress response. The server will respond with a - * `response.done` event with a status of `response.status=cancelled`. If there is no response - * to cancel, the server will respond with an error. - */ - fun responseCancel(): Optional = Optional.ofNullable(responseCancel) - - /** - * This event instructs the server to create a Response, which means triggering model inference. - * When in Server VAD mode, the server will create Responses automatically. - * - * A Response will include at least one Item, and may have two, in which case the second will be - * a function call. These Items will be appended to the conversation history. - * - * The server will respond with a `response.created` event, events for Items and content - * created, and finally a `response.done` event to indicate the Response is complete. - * - * The `response.create` event includes inference configuration like `instructions`, and - * `temperature`. These fields will override the Session's configuration for this Response only. - */ - fun responseCreate(): Optional = Optional.ofNullable(responseCreate) - - /** - * Send this event to update the session’s default configuration. The client may send this event - * at any time to update any field, except for `voice`. However, note that once a session has - * been initialized with a particular `model`, it can’t be changed to another model using - * `session.update`. - * - * When the server receives a `session.update`, it will respond with a `session.updated` event - * showing the full, effective configuration. Only the fields that are present are updated. To - * clear a field like `instructions`, pass an empty string. - */ - fun sessionUpdate(): Optional = Optional.ofNullable(sessionUpdate) - - /** Send this event to update a transcription session. */ - fun transcriptionSessionUpdate(): Optional = - Optional.ofNullable(transcriptionSessionUpdate) - - fun isConversationItemCreate(): Boolean = conversationItemCreate != null - - fun isConversationItemDelete(): Boolean = conversationItemDelete != null - - fun isConversationItemRetrieve(): Boolean = conversationItemRetrieve != null - - fun isConversationItemTruncate(): Boolean = conversationItemTruncate != null - - fun isInputAudioBufferAppend(): Boolean = inputAudioBufferAppend != null - - fun isInputAudioBufferClear(): Boolean = inputAudioBufferClear != null - - fun isOutputAudioBufferClear(): Boolean = outputAudioBufferClear != null - - fun isInputAudioBufferCommit(): Boolean = inputAudioBufferCommit != null - - fun isResponseCancel(): Boolean = responseCancel != null - - fun isResponseCreate(): Boolean = responseCreate != null - - fun isSessionUpdate(): Boolean = sessionUpdate != null - - fun isTranscriptionSessionUpdate(): Boolean = transcriptionSessionUpdate != null - - /** - * Add a new Item to the Conversation's context, including messages, function calls, and - * function call responses. This event can be used both to populate a "history" of the - * conversation and to add new items mid-stream, but has the current limitation that it cannot - * populate assistant audio messages. - * - * If successful, the server will respond with a `conversation.item.created` event, otherwise an - * `error` event will be sent. - */ - fun asConversationItemCreate(): ConversationItemCreateEvent = - conversationItemCreate.getOrThrow("conversationItemCreate") - - /** - * Send this event when you want to remove any item from the conversation history. The server - * will respond with a `conversation.item.deleted` event, unless the item does not exist in the - * conversation history, in which case the server will respond with an error. - */ - fun asConversationItemDelete(): ConversationItemDeleteEvent = - conversationItemDelete.getOrThrow("conversationItemDelete") - - /** - * Send this event when you want to retrieve the server's representation of a specific item in - * the conversation history. This is useful, for example, to inspect user audio after noise - * cancellation and VAD. The server will respond with a `conversation.item.retrieved` event, - * unless the item does not exist in the conversation history, in which case the server will - * respond with an error. - */ - fun asConversationItemRetrieve(): ConversationItemRetrieveEvent = - conversationItemRetrieve.getOrThrow("conversationItemRetrieve") - - /** - * Send this event to truncate a previous assistant message’s audio. The server will produce - * audio faster than realtime, so this event is useful when the user interrupts to truncate - * audio that has already been sent to the client but not yet played. This will synchronize the - * server's understanding of the audio with the client's playback. - * - * Truncating audio will delete the server-side text transcript to ensure there is not text in - * the context that hasn't been heard by the user. - * - * If successful, the server will respond with a `conversation.item.truncated` event. - */ - fun asConversationItemTruncate(): ConversationItemTruncateEvent = - conversationItemTruncate.getOrThrow("conversationItemTruncate") - - /** - * Send this event to append audio bytes to the input audio buffer. The audio buffer is - * temporary storage you can write to and later commit. In Server VAD mode, the audio buffer is - * used to detect speech and the server will decide when to commit. When Server VAD is disabled, - * you must commit the audio buffer manually. - * - * The client may choose how much audio to place in each event up to a maximum of 15 MiB, for - * example streaming smaller chunks from the client may allow the VAD to be more responsive. - * Unlike made other client events, the server will not send a confirmation response to this - * event. - */ - fun asInputAudioBufferAppend(): InputAudioBufferAppendEvent = - inputAudioBufferAppend.getOrThrow("inputAudioBufferAppend") - - /** - * Send this event to clear the audio bytes in the buffer. The server will respond with an - * `input_audio_buffer.cleared` event. - */ - fun asInputAudioBufferClear(): InputAudioBufferClearEvent = - inputAudioBufferClear.getOrThrow("inputAudioBufferClear") - - /** - * **WebRTC Only:** Emit to cut off the current audio response. This will trigger the server to - * stop generating audio and emit a `output_audio_buffer.cleared` event. This event should be - * preceded by a `response.cancel` client event to stop the generation of the current response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - fun asOutputAudioBufferClear(): OutputAudioBufferClear = - outputAudioBufferClear.getOrThrow("outputAudioBufferClear") - - /** - * Send this event to commit the user input audio buffer, which will create a new user message - * item in the conversation. This event will produce an error if the input audio buffer is - * empty. When in Server VAD mode, the client does not need to send this event, the server will - * commit the audio buffer automatically. - * - * Committing the input audio buffer will trigger input audio transcription (if enabled in - * session configuration), but it will not create a response from the model. The server will - * respond with an `input_audio_buffer.committed` event. - */ - fun asInputAudioBufferCommit(): InputAudioBufferCommitEvent = - inputAudioBufferCommit.getOrThrow("inputAudioBufferCommit") - - /** - * Send this event to cancel an in-progress response. The server will respond with a - * `response.done` event with a status of `response.status=cancelled`. If there is no response - * to cancel, the server will respond with an error. - */ - fun asResponseCancel(): ResponseCancelEvent = responseCancel.getOrThrow("responseCancel") - - /** - * This event instructs the server to create a Response, which means triggering model inference. - * When in Server VAD mode, the server will create Responses automatically. - * - * A Response will include at least one Item, and may have two, in which case the second will be - * a function call. These Items will be appended to the conversation history. - * - * The server will respond with a `response.created` event, events for Items and content - * created, and finally a `response.done` event to indicate the Response is complete. - * - * The `response.create` event includes inference configuration like `instructions`, and - * `temperature`. These fields will override the Session's configuration for this Response only. - */ - fun asResponseCreate(): ResponseCreateEvent = responseCreate.getOrThrow("responseCreate") - - /** - * Send this event to update the session’s default configuration. The client may send this event - * at any time to update any field, except for `voice`. However, note that once a session has - * been initialized with a particular `model`, it can’t be changed to another model using - * `session.update`. - * - * When the server receives a `session.update`, it will respond with a `session.updated` event - * showing the full, effective configuration. Only the fields that are present are updated. To - * clear a field like `instructions`, pass an empty string. - */ - fun asSessionUpdate(): SessionUpdateEvent = sessionUpdate.getOrThrow("sessionUpdate") - - /** Send this event to update a transcription session. */ - fun asTranscriptionSessionUpdate(): TranscriptionSessionUpdate = - transcriptionSessionUpdate.getOrThrow("transcriptionSessionUpdate") - - fun _json(): Optional = Optional.ofNullable(_json) - - fun accept(visitor: Visitor): T = - when { - conversationItemCreate != null -> - visitor.visitConversationItemCreate(conversationItemCreate) - conversationItemDelete != null -> - visitor.visitConversationItemDelete(conversationItemDelete) - conversationItemRetrieve != null -> - visitor.visitConversationItemRetrieve(conversationItemRetrieve) - conversationItemTruncate != null -> - visitor.visitConversationItemTruncate(conversationItemTruncate) - inputAudioBufferAppend != null -> - visitor.visitInputAudioBufferAppend(inputAudioBufferAppend) - inputAudioBufferClear != null -> - visitor.visitInputAudioBufferClear(inputAudioBufferClear) - outputAudioBufferClear != null -> - visitor.visitOutputAudioBufferClear(outputAudioBufferClear) - inputAudioBufferCommit != null -> - visitor.visitInputAudioBufferCommit(inputAudioBufferCommit) - responseCancel != null -> visitor.visitResponseCancel(responseCancel) - responseCreate != null -> visitor.visitResponseCreate(responseCreate) - sessionUpdate != null -> visitor.visitSessionUpdate(sessionUpdate) - transcriptionSessionUpdate != null -> - visitor.visitTranscriptionSessionUpdate(transcriptionSessionUpdate) - else -> visitor.unknown(_json) - } - - private var validated: Boolean = false - - fun validate(): RealtimeClientEvent = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitConversationItemCreate( - conversationItemCreate: ConversationItemCreateEvent - ) { - conversationItemCreate.validate() - } - - override fun visitConversationItemDelete( - conversationItemDelete: ConversationItemDeleteEvent - ) { - conversationItemDelete.validate() - } - - override fun visitConversationItemRetrieve( - conversationItemRetrieve: ConversationItemRetrieveEvent - ) { - conversationItemRetrieve.validate() - } - - override fun visitConversationItemTruncate( - conversationItemTruncate: ConversationItemTruncateEvent - ) { - conversationItemTruncate.validate() - } - - override fun visitInputAudioBufferAppend( - inputAudioBufferAppend: InputAudioBufferAppendEvent - ) { - inputAudioBufferAppend.validate() - } - - override fun visitInputAudioBufferClear( - inputAudioBufferClear: InputAudioBufferClearEvent - ) { - inputAudioBufferClear.validate() - } - - override fun visitOutputAudioBufferClear( - outputAudioBufferClear: OutputAudioBufferClear - ) { - outputAudioBufferClear.validate() - } - - override fun visitInputAudioBufferCommit( - inputAudioBufferCommit: InputAudioBufferCommitEvent - ) { - inputAudioBufferCommit.validate() - } - - override fun visitResponseCancel(responseCancel: ResponseCancelEvent) { - responseCancel.validate() - } - - override fun visitResponseCreate(responseCreate: ResponseCreateEvent) { - responseCreate.validate() - } - - override fun visitSessionUpdate(sessionUpdate: SessionUpdateEvent) { - sessionUpdate.validate() - } - - override fun visitTranscriptionSessionUpdate( - transcriptionSessionUpdate: TranscriptionSessionUpdate - ) { - transcriptionSessionUpdate.validate() - } - } - ) - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - accept( - object : Visitor { - override fun visitConversationItemCreate( - conversationItemCreate: ConversationItemCreateEvent - ) = conversationItemCreate.validity() - - override fun visitConversationItemDelete( - conversationItemDelete: ConversationItemDeleteEvent - ) = conversationItemDelete.validity() - - override fun visitConversationItemRetrieve( - conversationItemRetrieve: ConversationItemRetrieveEvent - ) = conversationItemRetrieve.validity() - - override fun visitConversationItemTruncate( - conversationItemTruncate: ConversationItemTruncateEvent - ) = conversationItemTruncate.validity() - - override fun visitInputAudioBufferAppend( - inputAudioBufferAppend: InputAudioBufferAppendEvent - ) = inputAudioBufferAppend.validity() - - override fun visitInputAudioBufferClear( - inputAudioBufferClear: InputAudioBufferClearEvent - ) = inputAudioBufferClear.validity() - - override fun visitOutputAudioBufferClear( - outputAudioBufferClear: OutputAudioBufferClear - ) = outputAudioBufferClear.validity() - - override fun visitInputAudioBufferCommit( - inputAudioBufferCommit: InputAudioBufferCommitEvent - ) = inputAudioBufferCommit.validity() - - override fun visitResponseCancel(responseCancel: ResponseCancelEvent) = - responseCancel.validity() - - override fun visitResponseCreate(responseCreate: ResponseCreateEvent) = - responseCreate.validity() - - override fun visitSessionUpdate(sessionUpdate: SessionUpdateEvent) = - sessionUpdate.validity() - - override fun visitTranscriptionSessionUpdate( - transcriptionSessionUpdate: TranscriptionSessionUpdate - ) = transcriptionSessionUpdate.validity() - - override fun unknown(json: JsonValue?) = 0 - } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is RealtimeClientEvent && - conversationItemCreate == other.conversationItemCreate && - conversationItemDelete == other.conversationItemDelete && - conversationItemRetrieve == other.conversationItemRetrieve && - conversationItemTruncate == other.conversationItemTruncate && - inputAudioBufferAppend == other.inputAudioBufferAppend && - inputAudioBufferClear == other.inputAudioBufferClear && - outputAudioBufferClear == other.outputAudioBufferClear && - inputAudioBufferCommit == other.inputAudioBufferCommit && - responseCancel == other.responseCancel && - responseCreate == other.responseCreate && - sessionUpdate == other.sessionUpdate && - transcriptionSessionUpdate == other.transcriptionSessionUpdate - } - - override fun hashCode(): Int = - Objects.hash( - conversationItemCreate, - conversationItemDelete, - conversationItemRetrieve, - conversationItemTruncate, - inputAudioBufferAppend, - inputAudioBufferClear, - outputAudioBufferClear, - inputAudioBufferCommit, - responseCancel, - responseCreate, - sessionUpdate, - transcriptionSessionUpdate, - ) - - override fun toString(): String = - when { - conversationItemCreate != null -> - "RealtimeClientEvent{conversationItemCreate=$conversationItemCreate}" - conversationItemDelete != null -> - "RealtimeClientEvent{conversationItemDelete=$conversationItemDelete}" - conversationItemRetrieve != null -> - "RealtimeClientEvent{conversationItemRetrieve=$conversationItemRetrieve}" - conversationItemTruncate != null -> - "RealtimeClientEvent{conversationItemTruncate=$conversationItemTruncate}" - inputAudioBufferAppend != null -> - "RealtimeClientEvent{inputAudioBufferAppend=$inputAudioBufferAppend}" - inputAudioBufferClear != null -> - "RealtimeClientEvent{inputAudioBufferClear=$inputAudioBufferClear}" - outputAudioBufferClear != null -> - "RealtimeClientEvent{outputAudioBufferClear=$outputAudioBufferClear}" - inputAudioBufferCommit != null -> - "RealtimeClientEvent{inputAudioBufferCommit=$inputAudioBufferCommit}" - responseCancel != null -> "RealtimeClientEvent{responseCancel=$responseCancel}" - responseCreate != null -> "RealtimeClientEvent{responseCreate=$responseCreate}" - sessionUpdate != null -> "RealtimeClientEvent{sessionUpdate=$sessionUpdate}" - transcriptionSessionUpdate != null -> - "RealtimeClientEvent{transcriptionSessionUpdate=$transcriptionSessionUpdate}" - _json != null -> "RealtimeClientEvent{_unknown=$_json}" - else -> throw IllegalStateException("Invalid RealtimeClientEvent") - } - - companion object { - - /** - * Add a new Item to the Conversation's context, including messages, function calls, and - * function call responses. This event can be used both to populate a "history" of the - * conversation and to add new items mid-stream, but has the current limitation that it - * cannot populate assistant audio messages. - * - * If successful, the server will respond with a `conversation.item.created` event, - * otherwise an `error` event will be sent. - */ - @JvmStatic - fun ofConversationItemCreate(conversationItemCreate: ConversationItemCreateEvent) = - RealtimeClientEvent(conversationItemCreate = conversationItemCreate) - - /** - * Send this event when you want to remove any item from the conversation history. The - * server will respond with a `conversation.item.deleted` event, unless the item does not - * exist in the conversation history, in which case the server will respond with an error. - */ - @JvmStatic - fun ofConversationItemDelete(conversationItemDelete: ConversationItemDeleteEvent) = - RealtimeClientEvent(conversationItemDelete = conversationItemDelete) - - /** - * Send this event when you want to retrieve the server's representation of a specific item - * in the conversation history. This is useful, for example, to inspect user audio after - * noise cancellation and VAD. The server will respond with a `conversation.item.retrieved` - * event, unless the item does not exist in the conversation history, in which case the - * server will respond with an error. - */ - @JvmStatic - fun ofConversationItemRetrieve(conversationItemRetrieve: ConversationItemRetrieveEvent) = - RealtimeClientEvent(conversationItemRetrieve = conversationItemRetrieve) - - /** - * Send this event to truncate a previous assistant message’s audio. The server will produce - * audio faster than realtime, so this event is useful when the user interrupts to truncate - * audio that has already been sent to the client but not yet played. This will synchronize - * the server's understanding of the audio with the client's playback. - * - * Truncating audio will delete the server-side text transcript to ensure there is not text - * in the context that hasn't been heard by the user. - * - * If successful, the server will respond with a `conversation.item.truncated` event. - */ - @JvmStatic - fun ofConversationItemTruncate(conversationItemTruncate: ConversationItemTruncateEvent) = - RealtimeClientEvent(conversationItemTruncate = conversationItemTruncate) - - /** - * Send this event to append audio bytes to the input audio buffer. The audio buffer is - * temporary storage you can write to and later commit. In Server VAD mode, the audio buffer - * is used to detect speech and the server will decide when to commit. When Server VAD is - * disabled, you must commit the audio buffer manually. - * - * The client may choose how much audio to place in each event up to a maximum of 15 MiB, - * for example streaming smaller chunks from the client may allow the VAD to be more - * responsive. Unlike made other client events, the server will not send a confirmation - * response to this event. - */ - @JvmStatic - fun ofInputAudioBufferAppend(inputAudioBufferAppend: InputAudioBufferAppendEvent) = - RealtimeClientEvent(inputAudioBufferAppend = inputAudioBufferAppend) - - /** - * Send this event to clear the audio bytes in the buffer. The server will respond with an - * `input_audio_buffer.cleared` event. - */ - @JvmStatic - fun ofInputAudioBufferClear(inputAudioBufferClear: InputAudioBufferClearEvent) = - RealtimeClientEvent(inputAudioBufferClear = inputAudioBufferClear) - - /** - * **WebRTC Only:** Emit to cut off the current audio response. This will trigger the server - * to stop generating audio and emit a `output_audio_buffer.cleared` event. This event - * should be preceded by a `response.cancel` client event to stop the generation of the - * current response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - @JvmStatic - fun ofOutputAudioBufferClear(outputAudioBufferClear: OutputAudioBufferClear) = - RealtimeClientEvent(outputAudioBufferClear = outputAudioBufferClear) - - /** - * Send this event to commit the user input audio buffer, which will create a new user - * message item in the conversation. This event will produce an error if the input audio - * buffer is empty. When in Server VAD mode, the client does not need to send this event, - * the server will commit the audio buffer automatically. - * - * Committing the input audio buffer will trigger input audio transcription (if enabled in - * session configuration), but it will not create a response from the model. The server will - * respond with an `input_audio_buffer.committed` event. - */ - @JvmStatic - fun ofInputAudioBufferCommit(inputAudioBufferCommit: InputAudioBufferCommitEvent) = - RealtimeClientEvent(inputAudioBufferCommit = inputAudioBufferCommit) - - /** - * Send this event to cancel an in-progress response. The server will respond with a - * `response.done` event with a status of `response.status=cancelled`. If there is no - * response to cancel, the server will respond with an error. - */ - @JvmStatic - fun ofResponseCancel(responseCancel: ResponseCancelEvent) = - RealtimeClientEvent(responseCancel = responseCancel) - - /** - * This event instructs the server to create a Response, which means triggering model - * inference. When in Server VAD mode, the server will create Responses automatically. - * - * A Response will include at least one Item, and may have two, in which case the second - * will be a function call. These Items will be appended to the conversation history. - * - * The server will respond with a `response.created` event, events for Items and content - * created, and finally a `response.done` event to indicate the Response is complete. - * - * The `response.create` event includes inference configuration like `instructions`, and - * `temperature`. These fields will override the Session's configuration for this Response - * only. - */ - @JvmStatic - fun ofResponseCreate(responseCreate: ResponseCreateEvent) = - RealtimeClientEvent(responseCreate = responseCreate) - - /** - * Send this event to update the session’s default configuration. The client may send this - * event at any time to update any field, except for `voice`. However, note that once a - * session has been initialized with a particular `model`, it can’t be changed to another - * model using `session.update`. - * - * When the server receives a `session.update`, it will respond with a `session.updated` - * event showing the full, effective configuration. Only the fields that are present are - * updated. To clear a field like `instructions`, pass an empty string. - */ - @JvmStatic - fun ofSessionUpdate(sessionUpdate: SessionUpdateEvent) = - RealtimeClientEvent(sessionUpdate = sessionUpdate) - - /** Send this event to update a transcription session. */ - @JvmStatic - fun ofTranscriptionSessionUpdate(transcriptionSessionUpdate: TranscriptionSessionUpdate) = - RealtimeClientEvent(transcriptionSessionUpdate = transcriptionSessionUpdate) - } - - /** - * An interface that defines how to map each variant of [RealtimeClientEvent] to a value of type - * [T]. - */ - interface Visitor { - - /** - * Add a new Item to the Conversation's context, including messages, function calls, and - * function call responses. This event can be used both to populate a "history" of the - * conversation and to add new items mid-stream, but has the current limitation that it - * cannot populate assistant audio messages. - * - * If successful, the server will respond with a `conversation.item.created` event, - * otherwise an `error` event will be sent. - */ - fun visitConversationItemCreate(conversationItemCreate: ConversationItemCreateEvent): T - - /** - * Send this event when you want to remove any item from the conversation history. The - * server will respond with a `conversation.item.deleted` event, unless the item does not - * exist in the conversation history, in which case the server will respond with an error. - */ - fun visitConversationItemDelete(conversationItemDelete: ConversationItemDeleteEvent): T - - /** - * Send this event when you want to retrieve the server's representation of a specific item - * in the conversation history. This is useful, for example, to inspect user audio after - * noise cancellation and VAD. The server will respond with a `conversation.item.retrieved` - * event, unless the item does not exist in the conversation history, in which case the - * server will respond with an error. - */ - fun visitConversationItemRetrieve( - conversationItemRetrieve: ConversationItemRetrieveEvent - ): T - - /** - * Send this event to truncate a previous assistant message’s audio. The server will produce - * audio faster than realtime, so this event is useful when the user interrupts to truncate - * audio that has already been sent to the client but not yet played. This will synchronize - * the server's understanding of the audio with the client's playback. - * - * Truncating audio will delete the server-side text transcript to ensure there is not text - * in the context that hasn't been heard by the user. - * - * If successful, the server will respond with a `conversation.item.truncated` event. - */ - fun visitConversationItemTruncate( - conversationItemTruncate: ConversationItemTruncateEvent - ): T - - /** - * Send this event to append audio bytes to the input audio buffer. The audio buffer is - * temporary storage you can write to and later commit. In Server VAD mode, the audio buffer - * is used to detect speech and the server will decide when to commit. When Server VAD is - * disabled, you must commit the audio buffer manually. - * - * The client may choose how much audio to place in each event up to a maximum of 15 MiB, - * for example streaming smaller chunks from the client may allow the VAD to be more - * responsive. Unlike made other client events, the server will not send a confirmation - * response to this event. - */ - fun visitInputAudioBufferAppend(inputAudioBufferAppend: InputAudioBufferAppendEvent): T - - /** - * Send this event to clear the audio bytes in the buffer. The server will respond with an - * `input_audio_buffer.cleared` event. - */ - fun visitInputAudioBufferClear(inputAudioBufferClear: InputAudioBufferClearEvent): T - - /** - * **WebRTC Only:** Emit to cut off the current audio response. This will trigger the server - * to stop generating audio and emit a `output_audio_buffer.cleared` event. This event - * should be preceded by a `response.cancel` client event to stop the generation of the - * current response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - fun visitOutputAudioBufferClear(outputAudioBufferClear: OutputAudioBufferClear): T - - /** - * Send this event to commit the user input audio buffer, which will create a new user - * message item in the conversation. This event will produce an error if the input audio - * buffer is empty. When in Server VAD mode, the client does not need to send this event, - * the server will commit the audio buffer automatically. - * - * Committing the input audio buffer will trigger input audio transcription (if enabled in - * session configuration), but it will not create a response from the model. The server will - * respond with an `input_audio_buffer.committed` event. - */ - fun visitInputAudioBufferCommit(inputAudioBufferCommit: InputAudioBufferCommitEvent): T - - /** - * Send this event to cancel an in-progress response. The server will respond with a - * `response.done` event with a status of `response.status=cancelled`. If there is no - * response to cancel, the server will respond with an error. - */ - fun visitResponseCancel(responseCancel: ResponseCancelEvent): T - - /** - * This event instructs the server to create a Response, which means triggering model - * inference. When in Server VAD mode, the server will create Responses automatically. - * - * A Response will include at least one Item, and may have two, in which case the second - * will be a function call. These Items will be appended to the conversation history. - * - * The server will respond with a `response.created` event, events for Items and content - * created, and finally a `response.done` event to indicate the Response is complete. - * - * The `response.create` event includes inference configuration like `instructions`, and - * `temperature`. These fields will override the Session's configuration for this Response - * only. - */ - fun visitResponseCreate(responseCreate: ResponseCreateEvent): T - - /** - * Send this event to update the session’s default configuration. The client may send this - * event at any time to update any field, except for `voice`. However, note that once a - * session has been initialized with a particular `model`, it can’t be changed to another - * model using `session.update`. - * - * When the server receives a `session.update`, it will respond with a `session.updated` - * event showing the full, effective configuration. Only the fields that are present are - * updated. To clear a field like `instructions`, pass an empty string. - */ - fun visitSessionUpdate(sessionUpdate: SessionUpdateEvent): T - - /** Send this event to update a transcription session. */ - fun visitTranscriptionSessionUpdate( - transcriptionSessionUpdate: TranscriptionSessionUpdate - ): T - - /** - * Maps an unknown variant of [RealtimeClientEvent] to a value of type [T]. - * - * An instance of [RealtimeClientEvent] can contain an unknown variant if it was - * deserialized from data that doesn't match any known variant. For example, if the SDK is - * on an older version than the API, then the API may respond with new variants that the SDK - * is unaware of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown RealtimeClientEvent: $json") - } - } - - internal class Deserializer : - BaseDeserializer(RealtimeClientEvent::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): RealtimeClientEvent { - val json = JsonValue.fromJsonNode(node) - val type = json.asObject().getOrNull()?.get("type")?.asString()?.getOrNull() - - when (type) { - "conversation.item.create" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeClientEvent(conversationItemCreate = it, _json = json) } - ?: RealtimeClientEvent(_json = json) - } - "conversation.item.delete" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeClientEvent(conversationItemDelete = it, _json = json) } - ?: RealtimeClientEvent(_json = json) - } - "conversation.item.retrieve" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeClientEvent(conversationItemRetrieve = it, _json = json) } - ?: RealtimeClientEvent(_json = json) - } - "conversation.item.truncate" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeClientEvent(conversationItemTruncate = it, _json = json) } - ?: RealtimeClientEvent(_json = json) - } - "input_audio_buffer.append" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeClientEvent(inputAudioBufferAppend = it, _json = json) } - ?: RealtimeClientEvent(_json = json) - } - "input_audio_buffer.clear" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeClientEvent(inputAudioBufferClear = it, _json = json) - } ?: RealtimeClientEvent(_json = json) - } - "output_audio_buffer.clear" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeClientEvent(outputAudioBufferClear = it, _json = json) - } ?: RealtimeClientEvent(_json = json) - } - "input_audio_buffer.commit" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeClientEvent(inputAudioBufferCommit = it, _json = json) } - ?: RealtimeClientEvent(_json = json) - } - "response.cancel" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeClientEvent(responseCancel = it, _json = json) - } ?: RealtimeClientEvent(_json = json) - } - "response.create" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeClientEvent(responseCreate = it, _json = json) - } ?: RealtimeClientEvent(_json = json) - } - "session.update" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeClientEvent(sessionUpdate = it, _json = json) - } ?: RealtimeClientEvent(_json = json) - } - "transcription_session.update" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeClientEvent(transcriptionSessionUpdate = it, _json = json) - } ?: RealtimeClientEvent(_json = json) - } - } - - return RealtimeClientEvent(_json = json) - } - } - - internal class Serializer : BaseSerializer(RealtimeClientEvent::class) { - - override fun serialize( - value: RealtimeClientEvent, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.conversationItemCreate != null -> - generator.writeObject(value.conversationItemCreate) - value.conversationItemDelete != null -> - generator.writeObject(value.conversationItemDelete) - value.conversationItemRetrieve != null -> - generator.writeObject(value.conversationItemRetrieve) - value.conversationItemTruncate != null -> - generator.writeObject(value.conversationItemTruncate) - value.inputAudioBufferAppend != null -> - generator.writeObject(value.inputAudioBufferAppend) - value.inputAudioBufferClear != null -> - generator.writeObject(value.inputAudioBufferClear) - value.outputAudioBufferClear != null -> - generator.writeObject(value.outputAudioBufferClear) - value.inputAudioBufferCommit != null -> - generator.writeObject(value.inputAudioBufferCommit) - value.responseCancel != null -> generator.writeObject(value.responseCancel) - value.responseCreate != null -> generator.writeObject(value.responseCreate) - value.sessionUpdate != null -> generator.writeObject(value.sessionUpdate) - value.transcriptionSessionUpdate != null -> - generator.writeObject(value.transcriptionSessionUpdate) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid RealtimeClientEvent") - } - } - } - - /** - * **WebRTC Only:** Emit to cut off the current audio response. This will trigger the server to - * stop generating audio and emit a `output_audio_buffer.cleared` event. This event should be - * preceded by a `response.cancel` client event to stop the generation of the current response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - class OutputAudioBufferClear - private constructor( - private val type: JsonValue, - private val eventId: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - ) : this(type, eventId, mutableMapOf()) - - /** - * The event type, must be `output_audio_buffer.clear`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("output_audio_buffer.clear") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server - * responded with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * The unique ID of the client event used for error handling. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eventId(): Optional = eventId.getOptional("event_id") - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [OutputAudioBufferClear]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [OutputAudioBufferClear]. */ - class Builder internal constructor() { - - private var type: JsonValue = JsonValue.from("output_audio_buffer.clear") - private var eventId: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(outputAudioBufferClear: OutputAudioBufferClear) = apply { - type = outputAudioBufferClear.type - eventId = outputAudioBufferClear.eventId - additionalProperties = outputAudioBufferClear.additionalProperties.toMutableMap() - } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("output_audio_buffer.clear") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** The unique ID of the client event used for error handling. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [OutputAudioBufferClear]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): OutputAudioBufferClear = - OutputAudioBufferClear(type, eventId, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): OutputAudioBufferClear = apply { - if (validated) { - return@apply - } - - _type().let { - if (it != JsonValue.from("output_audio_buffer.clear")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - eventId() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - type.let { if (it == JsonValue.from("output_audio_buffer.clear")) 1 else 0 } + - (if (eventId.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is OutputAudioBufferClear && - type == other.type && - eventId == other.eventId && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(type, eventId, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "OutputAudioBufferClear{type=$type, eventId=$eventId, additionalProperties=$additionalProperties}" - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeResponse.kt deleted file mode 100644 index 5cb8be54f..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeResponse.kt +++ /dev/null @@ -1,1744 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.ObjectCodec -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.BaseDeserializer -import com.openai.core.BaseSerializer -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.allMaxBy -import com.openai.core.checkKnown -import com.openai.core.getOrThrow -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** The response resource. */ -class RealtimeResponse -private constructor( - private val id: JsonField, - private val conversationId: JsonField, - private val maxOutputTokens: JsonField, - private val metadata: JsonField, - private val modalities: JsonField>, - private val object_: JsonField, - private val output: JsonField>, - private val outputAudioFormat: JsonField, - private val status: JsonField, - private val statusDetails: JsonField, - private val temperature: JsonField, - private val usage: JsonField, - private val voice: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("id") @ExcludeMissing id: JsonField = JsonMissing.of(), - @JsonProperty("conversation_id") - @ExcludeMissing - conversationId: JsonField = JsonMissing.of(), - @JsonProperty("max_output_tokens") - @ExcludeMissing - maxOutputTokens: JsonField = JsonMissing.of(), - @JsonProperty("metadata") @ExcludeMissing metadata: JsonField = JsonMissing.of(), - @JsonProperty("modalities") - @ExcludeMissing - modalities: JsonField> = JsonMissing.of(), - @JsonProperty("object") @ExcludeMissing object_: JsonField = JsonMissing.of(), - @JsonProperty("output") - @ExcludeMissing - output: JsonField> = JsonMissing.of(), - @JsonProperty("output_audio_format") - @ExcludeMissing - outputAudioFormat: JsonField = JsonMissing.of(), - @JsonProperty("status") @ExcludeMissing status: JsonField = JsonMissing.of(), - @JsonProperty("status_details") - @ExcludeMissing - statusDetails: JsonField = JsonMissing.of(), - @JsonProperty("temperature") - @ExcludeMissing - temperature: JsonField = JsonMissing.of(), - @JsonProperty("usage") - @ExcludeMissing - usage: JsonField = JsonMissing.of(), - @JsonProperty("voice") @ExcludeMissing voice: JsonField = JsonMissing.of(), - ) : this( - id, - conversationId, - maxOutputTokens, - metadata, - modalities, - object_, - output, - outputAudioFormat, - status, - statusDetails, - temperature, - usage, - voice, - mutableMapOf(), - ) - - /** - * The unique ID of the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun id(): Optional = id.getOptional("id") - - /** - * Which conversation the response is added to, determined by the `conversation` field in the - * `response.create` event. If `auto`, the response will be added to the default conversation - * and the value of `conversation_id` will be an id like `conv_1234`. If `none`, the response - * will not be added to any conversation and the value of `conversation_id` will be `null`. If - * responses are being triggered by server VAD, the response will be added to the default - * conversation, thus the `conversation_id` will be an id like `conv_1234`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun conversationId(): Optional = conversationId.getOptional("conversation_id") - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls, - * that was used in this response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun maxOutputTokens(): Optional = - maxOutputTokens.getOptional("max_output_tokens") - - /** - * Set of 16 key-value pairs that can be attached to an object. This can be useful for storing - * additional information about the object in a structured format, and querying for objects via - * API or the dashboard. - * - * Keys are strings with a maximum length of 64 characters. Values are strings with a maximum - * length of 512 characters. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun metadata(): Optional = metadata.getOptional("metadata") - - /** - * The set of modalities the model used to respond. If there are multiple modalities, the model - * will pick one, for example if `modalities` is `["text", "audio"]`, the model could be - * responding in either text or audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun modalities(): Optional> = modalities.getOptional("modalities") - - /** - * The object type, must be `realtime.response`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun object_(): Optional = object_.getOptional("object") - - /** - * The list of output items generated by the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun output(): Optional> = output.getOptional("output") - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun outputAudioFormat(): Optional = - outputAudioFormat.getOptional("output_audio_format") - - /** - * The final status of the response (`completed`, `cancelled`, `failed`, or `incomplete`, - * `in_progress`). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun status(): Optional = status.getOptional("status") - - /** - * Additional details about the status. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun statusDetails(): Optional = - statusDetails.getOptional("status_details") - - /** - * Sampling temperature for the model, limited to [0.6, 1.2]. Defaults to 0.8. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun temperature(): Optional = temperature.getOptional("temperature") - - /** - * Usage statistics for the Response, this will correspond to billing. A Realtime API session - * will maintain a conversation context and append new Items to the Conversation, thus output - * from previous turns (text and audio tokens) will become the input for later turns. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun usage(): Optional = usage.getOptional("usage") - - /** - * The voice the model used to respond. Current voice options are `alloy`, `ash`, `ballad`, - * `coral`, `echo`, `sage`, `shimmer`, and `verse`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun voice(): Optional = voice.getOptional("voice") - - /** - * Returns the raw JSON value of [id]. - * - * Unlike [id], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("id") @ExcludeMissing fun _id(): JsonField = id - - /** - * Returns the raw JSON value of [conversationId]. - * - * Unlike [conversationId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("conversation_id") - @ExcludeMissing - fun _conversationId(): JsonField = conversationId - - /** - * Returns the raw JSON value of [maxOutputTokens]. - * - * Unlike [maxOutputTokens], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("max_output_tokens") - @ExcludeMissing - fun _maxOutputTokens(): JsonField = maxOutputTokens - - /** - * Returns the raw JSON value of [metadata]. - * - * Unlike [metadata], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("metadata") @ExcludeMissing fun _metadata(): JsonField = metadata - - /** - * Returns the raw JSON value of [modalities]. - * - * Unlike [modalities], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("modalities") - @ExcludeMissing - fun _modalities(): JsonField> = modalities - - /** - * Returns the raw JSON value of [object_]. - * - * Unlike [object_], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("object") @ExcludeMissing fun _object_(): JsonField = object_ - - /** - * Returns the raw JSON value of [output]. - * - * Unlike [output], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output") - @ExcludeMissing - fun _output(): JsonField> = output - - /** - * Returns the raw JSON value of [outputAudioFormat]. - * - * Unlike [outputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("output_audio_format") - @ExcludeMissing - fun _outputAudioFormat(): JsonField = outputAudioFormat - - /** - * Returns the raw JSON value of [status]. - * - * Unlike [status], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("status") @ExcludeMissing fun _status(): JsonField = status - - /** - * Returns the raw JSON value of [statusDetails]. - * - * Unlike [statusDetails], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("status_details") - @ExcludeMissing - fun _statusDetails(): JsonField = statusDetails - - /** - * Returns the raw JSON value of [temperature]. - * - * Unlike [temperature], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("temperature") @ExcludeMissing fun _temperature(): JsonField = temperature - - /** - * Returns the raw JSON value of [usage]. - * - * Unlike [usage], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("usage") @ExcludeMissing fun _usage(): JsonField = usage - - /** - * Returns the raw JSON value of [voice]. - * - * Unlike [voice], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("voice") @ExcludeMissing fun _voice(): JsonField = voice - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [RealtimeResponse]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [RealtimeResponse]. */ - class Builder internal constructor() { - - private var id: JsonField = JsonMissing.of() - private var conversationId: JsonField = JsonMissing.of() - private var maxOutputTokens: JsonField = JsonMissing.of() - private var metadata: JsonField = JsonMissing.of() - private var modalities: JsonField>? = null - private var object_: JsonField = JsonMissing.of() - private var output: JsonField>? = null - private var outputAudioFormat: JsonField = JsonMissing.of() - private var status: JsonField = JsonMissing.of() - private var statusDetails: JsonField = JsonMissing.of() - private var temperature: JsonField = JsonMissing.of() - private var usage: JsonField = JsonMissing.of() - private var voice: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(realtimeResponse: RealtimeResponse) = apply { - id = realtimeResponse.id - conversationId = realtimeResponse.conversationId - maxOutputTokens = realtimeResponse.maxOutputTokens - metadata = realtimeResponse.metadata - modalities = realtimeResponse.modalities.map { it.toMutableList() } - object_ = realtimeResponse.object_ - output = realtimeResponse.output.map { it.toMutableList() } - outputAudioFormat = realtimeResponse.outputAudioFormat - status = realtimeResponse.status - statusDetails = realtimeResponse.statusDetails - temperature = realtimeResponse.temperature - usage = realtimeResponse.usage - voice = realtimeResponse.voice - additionalProperties = realtimeResponse.additionalProperties.toMutableMap() - } - - /** The unique ID of the response. */ - fun id(id: String) = id(JsonField.of(id)) - - /** - * Sets [Builder.id] to an arbitrary JSON value. - * - * You should usually call [Builder.id] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun id(id: JsonField) = apply { this.id = id } - - /** - * Which conversation the response is added to, determined by the `conversation` field in - * the `response.create` event. If `auto`, the response will be added to the default - * conversation and the value of `conversation_id` will be an id like `conv_1234`. If - * `none`, the response will not be added to any conversation and the value of - * `conversation_id` will be `null`. If responses are being triggered by server VAD, the - * response will be added to the default conversation, thus the `conversation_id` will be an - * id like `conv_1234`. - */ - fun conversationId(conversationId: String) = conversationId(JsonField.of(conversationId)) - - /** - * Sets [Builder.conversationId] to an arbitrary JSON value. - * - * You should usually call [Builder.conversationId] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun conversationId(conversationId: JsonField) = apply { - this.conversationId = conversationId - } - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls, - * that was used in this response. - */ - fun maxOutputTokens(maxOutputTokens: MaxOutputTokens) = - maxOutputTokens(JsonField.of(maxOutputTokens)) - - /** - * Sets [Builder.maxOutputTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.maxOutputTokens] with a well-typed [MaxOutputTokens] - * value instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun maxOutputTokens(maxOutputTokens: JsonField) = apply { - this.maxOutputTokens = maxOutputTokens - } - - /** Alias for calling [maxOutputTokens] with `MaxOutputTokens.ofInteger(integer)`. */ - fun maxOutputTokens(integer: Long) = maxOutputTokens(MaxOutputTokens.ofInteger(integer)) - - /** Alias for calling [maxOutputTokens] with `MaxOutputTokens.ofInf()`. */ - fun maxOutputTokensInf() = maxOutputTokens(MaxOutputTokens.ofInf()) - - /** - * Set of 16 key-value pairs that can be attached to an object. This can be useful for - * storing additional information about the object in a structured format, and querying for - * objects via API or the dashboard. - * - * Keys are strings with a maximum length of 64 characters. Values are strings with a - * maximum length of 512 characters. - */ - fun metadata(metadata: Metadata?) = metadata(JsonField.ofNullable(metadata)) - - /** Alias for calling [Builder.metadata] with `metadata.orElse(null)`. */ - fun metadata(metadata: Optional) = metadata(metadata.getOrNull()) - - /** - * Sets [Builder.metadata] to an arbitrary JSON value. - * - * You should usually call [Builder.metadata] with a well-typed [Metadata] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun metadata(metadata: JsonField) = apply { this.metadata = metadata } - - /** - * The set of modalities the model used to respond. If there are multiple modalities, the - * model will pick one, for example if `modalities` is `["text", "audio"]`, the model could - * be responding in either text or audio. - */ - fun modalities(modalities: List) = modalities(JsonField.of(modalities)) - - /** - * Sets [Builder.modalities] to an arbitrary JSON value. - * - * You should usually call [Builder.modalities] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun modalities(modalities: JsonField>) = apply { - this.modalities = modalities.map { it.toMutableList() } - } - - /** - * Adds a single [Modality] to [modalities]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addModality(modality: Modality) = apply { - modalities = - (modalities ?: JsonField.of(mutableListOf())).also { - checkKnown("modalities", it).add(modality) - } - } - - /** The object type, must be `realtime.response`. */ - fun object_(object_: Object) = object_(JsonField.of(object_)) - - /** - * Sets [Builder.object_] to an arbitrary JSON value. - * - * You should usually call [Builder.object_] with a well-typed [Object] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun object_(object_: JsonField) = apply { this.object_ = object_ } - - /** The list of output items generated by the response. */ - fun output(output: List) = output(JsonField.of(output)) - - /** - * Sets [Builder.output] to an arbitrary JSON value. - * - * You should usually call [Builder.output] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun output(output: JsonField>) = apply { - this.output = output.map { it.toMutableList() } - } - - /** - * Adds a single [ConversationItem] to [Builder.output]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addOutput(output: ConversationItem) = apply { - this.output = - (this.output ?: JsonField.of(mutableListOf())).also { - checkKnown("output", it).add(output) - } - } - - /** The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. */ - fun outputAudioFormat(outputAudioFormat: OutputAudioFormat) = - outputAudioFormat(JsonField.of(outputAudioFormat)) - - /** - * Sets [Builder.outputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.outputAudioFormat] with a well-typed [OutputAudioFormat] - * value instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun outputAudioFormat(outputAudioFormat: JsonField) = apply { - this.outputAudioFormat = outputAudioFormat - } - - /** - * The final status of the response (`completed`, `cancelled`, `failed`, or `incomplete`, - * `in_progress`). - */ - fun status(status: Status) = status(JsonField.of(status)) - - /** - * Sets [Builder.status] to an arbitrary JSON value. - * - * You should usually call [Builder.status] with a well-typed [Status] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun status(status: JsonField) = apply { this.status = status } - - /** Additional details about the status. */ - fun statusDetails(statusDetails: RealtimeResponseStatus) = - statusDetails(JsonField.of(statusDetails)) - - /** - * Sets [Builder.statusDetails] to an arbitrary JSON value. - * - * You should usually call [Builder.statusDetails] with a well-typed - * [RealtimeResponseStatus] value instead. This method is primarily for setting the field to - * an undocumented or not yet supported value. - */ - fun statusDetails(statusDetails: JsonField) = apply { - this.statusDetails = statusDetails - } - - /** Sampling temperature for the model, limited to [0.6, 1.2]. Defaults to 0.8. */ - fun temperature(temperature: Double) = temperature(JsonField.of(temperature)) - - /** - * Sets [Builder.temperature] to an arbitrary JSON value. - * - * You should usually call [Builder.temperature] with a well-typed [Double] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun temperature(temperature: JsonField) = apply { this.temperature = temperature } - - /** - * Usage statistics for the Response, this will correspond to billing. A Realtime API - * session will maintain a conversation context and append new Items to the Conversation, - * thus output from previous turns (text and audio tokens) will become the input for later - * turns. - */ - fun usage(usage: RealtimeResponseUsage) = usage(JsonField.of(usage)) - - /** - * Sets [Builder.usage] to an arbitrary JSON value. - * - * You should usually call [Builder.usage] with a well-typed [RealtimeResponseUsage] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun usage(usage: JsonField) = apply { this.usage = usage } - - /** - * The voice the model used to respond. Current voice options are `alloy`, `ash`, `ballad`, - * `coral`, `echo`, `sage`, `shimmer`, and `verse`. - */ - fun voice(voice: Voice) = voice(JsonField.of(voice)) - - /** - * Sets [Builder.voice] to an arbitrary JSON value. - * - * You should usually call [Builder.voice] with a well-typed [Voice] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun voice(voice: JsonField) = apply { this.voice = voice } - - /** - * Sets [voice] to an arbitrary [String]. - * - * You should usually call [voice] with a well-typed [Voice] constant instead. This method - * is primarily for setting the field to an undocumented or not yet supported value. - */ - fun voice(value: String) = voice(Voice.of(value)) - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [RealtimeResponse]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): RealtimeResponse = - RealtimeResponse( - id, - conversationId, - maxOutputTokens, - metadata, - (modalities ?: JsonMissing.of()).map { it.toImmutable() }, - object_, - (output ?: JsonMissing.of()).map { it.toImmutable() }, - outputAudioFormat, - status, - statusDetails, - temperature, - usage, - voice, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): RealtimeResponse = apply { - if (validated) { - return@apply - } - - id() - conversationId() - maxOutputTokens().ifPresent { it.validate() } - metadata().ifPresent { it.validate() } - modalities().ifPresent { it.forEach { it.validate() } } - object_().ifPresent { it.validate() } - output().ifPresent { it.forEach { it.validate() } } - outputAudioFormat().ifPresent { it.validate() } - status().ifPresent { it.validate() } - statusDetails().ifPresent { it.validate() } - temperature() - usage().ifPresent { it.validate() } - voice() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (id.asKnown().isPresent) 1 else 0) + - (if (conversationId.asKnown().isPresent) 1 else 0) + - (maxOutputTokens.asKnown().getOrNull()?.validity() ?: 0) + - (metadata.asKnown().getOrNull()?.validity() ?: 0) + - (modalities.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (object_.asKnown().getOrNull()?.validity() ?: 0) + - (output.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (outputAudioFormat.asKnown().getOrNull()?.validity() ?: 0) + - (status.asKnown().getOrNull()?.validity() ?: 0) + - (statusDetails.asKnown().getOrNull()?.validity() ?: 0) + - (if (temperature.asKnown().isPresent) 1 else 0) + - (usage.asKnown().getOrNull()?.validity() ?: 0) + - (if (voice.asKnown().isPresent) 1 else 0) - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls, - * that was used in this response. - */ - @JsonDeserialize(using = MaxOutputTokens.Deserializer::class) - @JsonSerialize(using = MaxOutputTokens.Serializer::class) - class MaxOutputTokens - private constructor( - private val integer: Long? = null, - private val inf: JsonValue? = null, - private val _json: JsonValue? = null, - ) { - - fun integer(): Optional = Optional.ofNullable(integer) - - fun inf(): Optional = Optional.ofNullable(inf) - - fun isInteger(): Boolean = integer != null - - fun isInf(): Boolean = inf != null - - fun asInteger(): Long = integer.getOrThrow("integer") - - fun asInf(): JsonValue = inf.getOrThrow("inf") - - fun _json(): Optional = Optional.ofNullable(_json) - - fun accept(visitor: Visitor): T = - when { - integer != null -> visitor.visitInteger(integer) - inf != null -> visitor.visitInf(inf) - else -> visitor.unknown(_json) - } - - private var validated: Boolean = false - - fun validate(): MaxOutputTokens = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitInteger(integer: Long) {} - - override fun visitInf(inf: JsonValue) { - inf.let { - if (it != JsonValue.from("inf")) { - throw OpenAIInvalidDataException("'inf' is invalid, received $it") - } - } - } - } - ) - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - accept( - object : Visitor { - override fun visitInteger(integer: Long) = 1 - - override fun visitInf(inf: JsonValue) = - inf.let { if (it == JsonValue.from("inf")) 1 else 0 } - - override fun unknown(json: JsonValue?) = 0 - } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is MaxOutputTokens && integer == other.integer && inf == other.inf - } - - override fun hashCode(): Int = Objects.hash(integer, inf) - - override fun toString(): String = - when { - integer != null -> "MaxOutputTokens{integer=$integer}" - inf != null -> "MaxOutputTokens{inf=$inf}" - _json != null -> "MaxOutputTokens{_unknown=$_json}" - else -> throw IllegalStateException("Invalid MaxOutputTokens") - } - - companion object { - - @JvmStatic fun ofInteger(integer: Long) = MaxOutputTokens(integer = integer) - - @JvmStatic fun ofInf() = MaxOutputTokens(inf = JsonValue.from("inf")) - } - - /** - * An interface that defines how to map each variant of [MaxOutputTokens] to a value of type - * [T]. - */ - interface Visitor { - - fun visitInteger(integer: Long): T - - fun visitInf(inf: JsonValue): T - - /** - * Maps an unknown variant of [MaxOutputTokens] to a value of type [T]. - * - * An instance of [MaxOutputTokens] can contain an unknown variant if it was - * deserialized from data that doesn't match any known variant. For example, if the SDK - * is on an older version than the API, then the API may respond with new variants that - * the SDK is unaware of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown MaxOutputTokens: $json") - } - } - - internal class Deserializer : BaseDeserializer(MaxOutputTokens::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): MaxOutputTokens { - val json = JsonValue.fromJsonNode(node) - - val bestMatches = - sequenceOf( - tryDeserialize(node, jacksonTypeRef()) - ?.let { MaxOutputTokens(inf = it, _json = json) } - ?.takeIf { it.isValid() }, - tryDeserialize(node, jacksonTypeRef())?.let { - MaxOutputTokens(integer = it, _json = json) - }, - ) - .filterNotNull() - .allMaxBy { it.validity() } - .toList() - return when (bestMatches.size) { - // This can happen if what we're deserializing is completely incompatible with - // all the possible variants (e.g. deserializing from object). - 0 -> MaxOutputTokens(_json = json) - 1 -> bestMatches.single() - // If there's more than one match with the highest validity, then use the first - // completely valid match, or simply the first match if none are completely - // valid. - else -> bestMatches.firstOrNull { it.isValid() } ?: bestMatches.first() - } - } - } - - internal class Serializer : BaseSerializer(MaxOutputTokens::class) { - - override fun serialize( - value: MaxOutputTokens, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.integer != null -> generator.writeObject(value.integer) - value.inf != null -> generator.writeObject(value.inf) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid MaxOutputTokens") - } - } - } - } - - /** - * Set of 16 key-value pairs that can be attached to an object. This can be useful for storing - * additional information about the object in a structured format, and querying for objects via - * API or the dashboard. - * - * Keys are strings with a maximum length of 64 characters. Values are strings with a maximum - * length of 512 characters. - */ - class Metadata - @JsonCreator - private constructor( - @com.fasterxml.jackson.annotation.JsonValue - private val additionalProperties: Map - ) { - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = additionalProperties - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Metadata]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Metadata]. */ - class Builder internal constructor() { - - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(metadata: Metadata) = apply { - additionalProperties = metadata.additionalProperties.toMutableMap() - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Metadata]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Metadata = Metadata(additionalProperties.toImmutable()) - } - - private var validated: Boolean = false - - fun validate(): Metadata = apply { - if (validated) { - return@apply - } - - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - additionalProperties.count { (_, value) -> !value.isNull() && !value.isMissing() } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Metadata && additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = "Metadata{additionalProperties=$additionalProperties}" - } - - class Modality @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val TEXT = of("text") - - @JvmField val AUDIO = of("audio") - - @JvmStatic fun of(value: String) = Modality(JsonField.of(value)) - } - - /** An enum containing [Modality]'s known values. */ - enum class Known { - TEXT, - AUDIO, - } - - /** - * An enum containing [Modality]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Modality] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - TEXT, - AUDIO, - /** An enum member indicating that [Modality] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - TEXT -> Value.TEXT - AUDIO -> Value.AUDIO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - TEXT -> Known.TEXT - AUDIO -> Known.AUDIO - else -> throw OpenAIInvalidDataException("Unknown Modality: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Modality = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Modality && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** The object type, must be `realtime.response`. */ - class Object @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val REALTIME_RESPONSE = of("realtime.response") - - @JvmStatic fun of(value: String) = Object(JsonField.of(value)) - } - - /** An enum containing [Object]'s known values. */ - enum class Known { - REALTIME_RESPONSE - } - - /** - * An enum containing [Object]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Object] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - REALTIME_RESPONSE, - /** An enum member indicating that [Object] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - REALTIME_RESPONSE -> Value.REALTIME_RESPONSE - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - REALTIME_RESPONSE -> Known.REALTIME_RESPONSE - else -> throw OpenAIInvalidDataException("Unknown Object: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Object = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Object && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. */ - class OutputAudioFormat @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val PCM16 = of("pcm16") - - @JvmField val G711_ULAW = of("g711_ulaw") - - @JvmField val G711_ALAW = of("g711_alaw") - - @JvmStatic fun of(value: String) = OutputAudioFormat(JsonField.of(value)) - } - - /** An enum containing [OutputAudioFormat]'s known values. */ - enum class Known { - PCM16, - G711_ULAW, - G711_ALAW, - } - - /** - * An enum containing [OutputAudioFormat]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [OutputAudioFormat] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - PCM16, - G711_ULAW, - G711_ALAW, - /** - * An enum member indicating that [OutputAudioFormat] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - PCM16 -> Value.PCM16 - G711_ULAW -> Value.G711_ULAW - G711_ALAW -> Value.G711_ALAW - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - PCM16 -> Known.PCM16 - G711_ULAW -> Known.G711_ULAW - G711_ALAW -> Known.G711_ALAW - else -> throw OpenAIInvalidDataException("Unknown OutputAudioFormat: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): OutputAudioFormat = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is OutputAudioFormat && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * The final status of the response (`completed`, `cancelled`, `failed`, or `incomplete`, - * `in_progress`). - */ - class Status @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val COMPLETED = of("completed") - - @JvmField val CANCELLED = of("cancelled") - - @JvmField val FAILED = of("failed") - - @JvmField val INCOMPLETE = of("incomplete") - - @JvmField val IN_PROGRESS = of("in_progress") - - @JvmStatic fun of(value: String) = Status(JsonField.of(value)) - } - - /** An enum containing [Status]'s known values. */ - enum class Known { - COMPLETED, - CANCELLED, - FAILED, - INCOMPLETE, - IN_PROGRESS, - } - - /** - * An enum containing [Status]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Status] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - COMPLETED, - CANCELLED, - FAILED, - INCOMPLETE, - IN_PROGRESS, - /** An enum member indicating that [Status] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - COMPLETED -> Value.COMPLETED - CANCELLED -> Value.CANCELLED - FAILED -> Value.FAILED - INCOMPLETE -> Value.INCOMPLETE - IN_PROGRESS -> Value.IN_PROGRESS - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - COMPLETED -> Known.COMPLETED - CANCELLED -> Known.CANCELLED - FAILED -> Known.FAILED - INCOMPLETE -> Known.INCOMPLETE - IN_PROGRESS -> Known.IN_PROGRESS - else -> throw OpenAIInvalidDataException("Unknown Status: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Status = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Status && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * The voice the model used to respond. Current voice options are `alloy`, `ash`, `ballad`, - * `coral`, `echo`, `sage`, `shimmer`, and `verse`. - */ - class Voice @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val ALLOY = of("alloy") - - @JvmField val ASH = of("ash") - - @JvmField val BALLAD = of("ballad") - - @JvmField val CORAL = of("coral") - - @JvmField val ECHO = of("echo") - - @JvmField val SAGE = of("sage") - - @JvmField val SHIMMER = of("shimmer") - - @JvmField val VERSE = of("verse") - - @JvmStatic fun of(value: String) = Voice(JsonField.of(value)) - } - - /** An enum containing [Voice]'s known values. */ - enum class Known { - ALLOY, - ASH, - BALLAD, - CORAL, - ECHO, - SAGE, - SHIMMER, - VERSE, - } - - /** - * An enum containing [Voice]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Voice] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - ALLOY, - ASH, - BALLAD, - CORAL, - ECHO, - SAGE, - SHIMMER, - VERSE, - /** An enum member indicating that [Voice] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - ALLOY -> Value.ALLOY - ASH -> Value.ASH - BALLAD -> Value.BALLAD - CORAL -> Value.CORAL - ECHO -> Value.ECHO - SAGE -> Value.SAGE - SHIMMER -> Value.SHIMMER - VERSE -> Value.VERSE - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - ALLOY -> Known.ALLOY - ASH -> Known.ASH - BALLAD -> Known.BALLAD - CORAL -> Known.CORAL - ECHO -> Known.ECHO - SAGE -> Known.SAGE - SHIMMER -> Known.SHIMMER - VERSE -> Known.VERSE - else -> throw OpenAIInvalidDataException("Unknown Voice: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Voice = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Voice && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is RealtimeResponse && - id == other.id && - conversationId == other.conversationId && - maxOutputTokens == other.maxOutputTokens && - metadata == other.metadata && - modalities == other.modalities && - object_ == other.object_ && - output == other.output && - outputAudioFormat == other.outputAudioFormat && - status == other.status && - statusDetails == other.statusDetails && - temperature == other.temperature && - usage == other.usage && - voice == other.voice && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - id, - conversationId, - maxOutputTokens, - metadata, - modalities, - object_, - output, - outputAudioFormat, - status, - statusDetails, - temperature, - usage, - voice, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "RealtimeResponse{id=$id, conversationId=$conversationId, maxOutputTokens=$maxOutputTokens, metadata=$metadata, modalities=$modalities, object_=$object_, output=$output, outputAudioFormat=$outputAudioFormat, status=$status, statusDetails=$statusDetails, temperature=$temperature, usage=$usage, voice=$voice, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeResponseStatus.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeResponseStatus.kt deleted file mode 100644 index d54964501..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeResponseStatus.kt +++ /dev/null @@ -1,706 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** Additional details about the status. */ -class RealtimeResponseStatus -private constructor( - private val error: JsonField, - private val reason: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("error") @ExcludeMissing error: JsonField = JsonMissing.of(), - @JsonProperty("reason") @ExcludeMissing reason: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(error, reason, type, mutableMapOf()) - - /** - * A description of the error that caused the response to fail, populated when the `status` is - * `failed`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun error(): Optional = error.getOptional("error") - - /** - * The reason the Response did not complete. For a `cancelled` Response, one of `turn_detected` - * (the server VAD detected a new start of speech) or `client_cancelled` (the client sent a - * cancel event). For an `incomplete` Response, one of `max_output_tokens` or `content_filter` - * (the server-side safety filter activated and cut off the response). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun reason(): Optional = reason.getOptional("reason") - - /** - * The type of error that caused the response to fail, corresponding with the `status` field - * (`completed`, `cancelled`, `incomplete`, `failed`). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [error]. - * - * Unlike [error], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("error") @ExcludeMissing fun _error(): JsonField = error - - /** - * Returns the raw JSON value of [reason]. - * - * Unlike [reason], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("reason") @ExcludeMissing fun _reason(): JsonField = reason - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [RealtimeResponseStatus]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [RealtimeResponseStatus]. */ - class Builder internal constructor() { - - private var error: JsonField = JsonMissing.of() - private var reason: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(realtimeResponseStatus: RealtimeResponseStatus) = apply { - error = realtimeResponseStatus.error - reason = realtimeResponseStatus.reason - type = realtimeResponseStatus.type - additionalProperties = realtimeResponseStatus.additionalProperties.toMutableMap() - } - - /** - * A description of the error that caused the response to fail, populated when the `status` - * is `failed`. - */ - fun error(error: Error) = error(JsonField.of(error)) - - /** - * Sets [Builder.error] to an arbitrary JSON value. - * - * You should usually call [Builder.error] with a well-typed [Error] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun error(error: JsonField) = apply { this.error = error } - - /** - * The reason the Response did not complete. For a `cancelled` Response, one of - * `turn_detected` (the server VAD detected a new start of speech) or `client_cancelled` - * (the client sent a cancel event). For an `incomplete` Response, one of - * `max_output_tokens` or `content_filter` (the server-side safety filter activated and cut - * off the response). - */ - fun reason(reason: Reason) = reason(JsonField.of(reason)) - - /** - * Sets [Builder.reason] to an arbitrary JSON value. - * - * You should usually call [Builder.reason] with a well-typed [Reason] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun reason(reason: JsonField) = apply { this.reason = reason } - - /** - * The type of error that caused the response to fail, corresponding with the `status` field - * (`completed`, `cancelled`, `incomplete`, `failed`). - */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [RealtimeResponseStatus]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): RealtimeResponseStatus = - RealtimeResponseStatus(error, reason, type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): RealtimeResponseStatus = apply { - if (validated) { - return@apply - } - - error().ifPresent { it.validate() } - reason().ifPresent { it.validate() } - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (error.asKnown().getOrNull()?.validity() ?: 0) + - (reason.asKnown().getOrNull()?.validity() ?: 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** - * A description of the error that caused the response to fail, populated when the `status` is - * `failed`. - */ - class Error - private constructor( - private val code: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("code") @ExcludeMissing code: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(code, type, mutableMapOf()) - - /** - * Error code, if any. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun code(): Optional = code.getOptional("code") - - /** - * The type of error. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [code]. - * - * Unlike [code], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("code") @ExcludeMissing fun _code(): JsonField = code - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Error]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Error]. */ - class Builder internal constructor() { - - private var code: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(error: Error) = apply { - code = error.code - type = error.type - additionalProperties = error.additionalProperties.toMutableMap() - } - - /** Error code, if any. */ - fun code(code: String) = code(JsonField.of(code)) - - /** - * Sets [Builder.code] to an arbitrary JSON value. - * - * You should usually call [Builder.code] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun code(code: JsonField) = apply { this.code = code } - - /** The type of error. */ - fun type(type: String) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Error]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Error = Error(code, type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): Error = apply { - if (validated) { - return@apply - } - - code() - type() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (code.asKnown().isPresent) 1 else 0) + (if (type.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Error && - code == other.code && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(code, type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Error{code=$code, type=$type, additionalProperties=$additionalProperties}" - } - - /** - * The reason the Response did not complete. For a `cancelled` Response, one of `turn_detected` - * (the server VAD detected a new start of speech) or `client_cancelled` (the client sent a - * cancel event). For an `incomplete` Response, one of `max_output_tokens` or `content_filter` - * (the server-side safety filter activated and cut off the response). - */ - class Reason @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val TURN_DETECTED = of("turn_detected") - - @JvmField val CLIENT_CANCELLED = of("client_cancelled") - - @JvmField val MAX_OUTPUT_TOKENS = of("max_output_tokens") - - @JvmField val CONTENT_FILTER = of("content_filter") - - @JvmStatic fun of(value: String) = Reason(JsonField.of(value)) - } - - /** An enum containing [Reason]'s known values. */ - enum class Known { - TURN_DETECTED, - CLIENT_CANCELLED, - MAX_OUTPUT_TOKENS, - CONTENT_FILTER, - } - - /** - * An enum containing [Reason]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Reason] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - TURN_DETECTED, - CLIENT_CANCELLED, - MAX_OUTPUT_TOKENS, - CONTENT_FILTER, - /** An enum member indicating that [Reason] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - TURN_DETECTED -> Value.TURN_DETECTED - CLIENT_CANCELLED -> Value.CLIENT_CANCELLED - MAX_OUTPUT_TOKENS -> Value.MAX_OUTPUT_TOKENS - CONTENT_FILTER -> Value.CONTENT_FILTER - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - TURN_DETECTED -> Known.TURN_DETECTED - CLIENT_CANCELLED -> Known.CLIENT_CANCELLED - MAX_OUTPUT_TOKENS -> Known.MAX_OUTPUT_TOKENS - CONTENT_FILTER -> Known.CONTENT_FILTER - else -> throw OpenAIInvalidDataException("Unknown Reason: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Reason = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Reason && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * The type of error that caused the response to fail, corresponding with the `status` field - * (`completed`, `cancelled`, `incomplete`, `failed`). - */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val COMPLETED = of("completed") - - @JvmField val CANCELLED = of("cancelled") - - @JvmField val INCOMPLETE = of("incomplete") - - @JvmField val FAILED = of("failed") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - COMPLETED, - CANCELLED, - INCOMPLETE, - FAILED, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - COMPLETED, - CANCELLED, - INCOMPLETE, - FAILED, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - COMPLETED -> Value.COMPLETED - CANCELLED -> Value.CANCELLED - INCOMPLETE -> Value.INCOMPLETE - FAILED -> Value.FAILED - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - COMPLETED -> Known.COMPLETED - CANCELLED -> Known.CANCELLED - INCOMPLETE -> Known.INCOMPLETE - FAILED -> Known.FAILED - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is RealtimeResponseStatus && - error == other.error && - reason == other.reason && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(error, reason, type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "RealtimeResponseStatus{error=$error, reason=$reason, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeResponseUsage.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeResponseUsage.kt deleted file mode 100644 index b97bfb74f..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeResponseUsage.kt +++ /dev/null @@ -1,770 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * Usage statistics for the Response, this will correspond to billing. A Realtime API session will - * maintain a conversation context and append new Items to the Conversation, thus output from - * previous turns (text and audio tokens) will become the input for later turns. - */ -class RealtimeResponseUsage -private constructor( - private val inputTokenDetails: JsonField, - private val inputTokens: JsonField, - private val outputTokenDetails: JsonField, - private val outputTokens: JsonField, - private val totalTokens: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("input_token_details") - @ExcludeMissing - inputTokenDetails: JsonField = JsonMissing.of(), - @JsonProperty("input_tokens") - @ExcludeMissing - inputTokens: JsonField = JsonMissing.of(), - @JsonProperty("output_token_details") - @ExcludeMissing - outputTokenDetails: JsonField = JsonMissing.of(), - @JsonProperty("output_tokens") - @ExcludeMissing - outputTokens: JsonField = JsonMissing.of(), - @JsonProperty("total_tokens") - @ExcludeMissing - totalTokens: JsonField = JsonMissing.of(), - ) : this( - inputTokenDetails, - inputTokens, - outputTokenDetails, - outputTokens, - totalTokens, - mutableMapOf(), - ) - - /** - * Details about the input tokens used in the Response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputTokenDetails(): Optional = - inputTokenDetails.getOptional("input_token_details") - - /** - * The number of input tokens used in the Response, including text and audio tokens. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputTokens(): Optional = inputTokens.getOptional("input_tokens") - - /** - * Details about the output tokens used in the Response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun outputTokenDetails(): Optional = - outputTokenDetails.getOptional("output_token_details") - - /** - * The number of output tokens sent in the Response, including text and audio tokens. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun outputTokens(): Optional = outputTokens.getOptional("output_tokens") - - /** - * The total number of tokens in the Response including input and output text and audio tokens. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun totalTokens(): Optional = totalTokens.getOptional("total_tokens") - - /** - * Returns the raw JSON value of [inputTokenDetails]. - * - * Unlike [inputTokenDetails], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("input_token_details") - @ExcludeMissing - fun _inputTokenDetails(): JsonField = inputTokenDetails - - /** - * Returns the raw JSON value of [inputTokens]. - * - * Unlike [inputTokens], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("input_tokens") @ExcludeMissing fun _inputTokens(): JsonField = inputTokens - - /** - * Returns the raw JSON value of [outputTokenDetails]. - * - * Unlike [outputTokenDetails], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("output_token_details") - @ExcludeMissing - fun _outputTokenDetails(): JsonField = outputTokenDetails - - /** - * Returns the raw JSON value of [outputTokens]. - * - * Unlike [outputTokens], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output_tokens") - @ExcludeMissing - fun _outputTokens(): JsonField = outputTokens - - /** - * Returns the raw JSON value of [totalTokens]. - * - * Unlike [totalTokens], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("total_tokens") @ExcludeMissing fun _totalTokens(): JsonField = totalTokens - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [RealtimeResponseUsage]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [RealtimeResponseUsage]. */ - class Builder internal constructor() { - - private var inputTokenDetails: JsonField = JsonMissing.of() - private var inputTokens: JsonField = JsonMissing.of() - private var outputTokenDetails: JsonField = JsonMissing.of() - private var outputTokens: JsonField = JsonMissing.of() - private var totalTokens: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(realtimeResponseUsage: RealtimeResponseUsage) = apply { - inputTokenDetails = realtimeResponseUsage.inputTokenDetails - inputTokens = realtimeResponseUsage.inputTokens - outputTokenDetails = realtimeResponseUsage.outputTokenDetails - outputTokens = realtimeResponseUsage.outputTokens - totalTokens = realtimeResponseUsage.totalTokens - additionalProperties = realtimeResponseUsage.additionalProperties.toMutableMap() - } - - /** Details about the input tokens used in the Response. */ - fun inputTokenDetails(inputTokenDetails: InputTokenDetails) = - inputTokenDetails(JsonField.of(inputTokenDetails)) - - /** - * Sets [Builder.inputTokenDetails] to an arbitrary JSON value. - * - * You should usually call [Builder.inputTokenDetails] with a well-typed [InputTokenDetails] - * value instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun inputTokenDetails(inputTokenDetails: JsonField) = apply { - this.inputTokenDetails = inputTokenDetails - } - - /** The number of input tokens used in the Response, including text and audio tokens. */ - fun inputTokens(inputTokens: Long) = inputTokens(JsonField.of(inputTokens)) - - /** - * Sets [Builder.inputTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.inputTokens] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun inputTokens(inputTokens: JsonField) = apply { this.inputTokens = inputTokens } - - /** Details about the output tokens used in the Response. */ - fun outputTokenDetails(outputTokenDetails: OutputTokenDetails) = - outputTokenDetails(JsonField.of(outputTokenDetails)) - - /** - * Sets [Builder.outputTokenDetails] to an arbitrary JSON value. - * - * You should usually call [Builder.outputTokenDetails] with a well-typed - * [OutputTokenDetails] value instead. This method is primarily for setting the field to an - * undocumented or not yet supported value. - */ - fun outputTokenDetails(outputTokenDetails: JsonField) = apply { - this.outputTokenDetails = outputTokenDetails - } - - /** The number of output tokens sent in the Response, including text and audio tokens. */ - fun outputTokens(outputTokens: Long) = outputTokens(JsonField.of(outputTokens)) - - /** - * Sets [Builder.outputTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.outputTokens] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun outputTokens(outputTokens: JsonField) = apply { this.outputTokens = outputTokens } - - /** - * The total number of tokens in the Response including input and output text and audio - * tokens. - */ - fun totalTokens(totalTokens: Long) = totalTokens(JsonField.of(totalTokens)) - - /** - * Sets [Builder.totalTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.totalTokens] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun totalTokens(totalTokens: JsonField) = apply { this.totalTokens = totalTokens } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [RealtimeResponseUsage]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): RealtimeResponseUsage = - RealtimeResponseUsage( - inputTokenDetails, - inputTokens, - outputTokenDetails, - outputTokens, - totalTokens, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): RealtimeResponseUsage = apply { - if (validated) { - return@apply - } - - inputTokenDetails().ifPresent { it.validate() } - inputTokens() - outputTokenDetails().ifPresent { it.validate() } - outputTokens() - totalTokens() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (inputTokenDetails.asKnown().getOrNull()?.validity() ?: 0) + - (if (inputTokens.asKnown().isPresent) 1 else 0) + - (outputTokenDetails.asKnown().getOrNull()?.validity() ?: 0) + - (if (outputTokens.asKnown().isPresent) 1 else 0) + - (if (totalTokens.asKnown().isPresent) 1 else 0) - - /** Details about the input tokens used in the Response. */ - class InputTokenDetails - private constructor( - private val audioTokens: JsonField, - private val cachedTokens: JsonField, - private val textTokens: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("audio_tokens") - @ExcludeMissing - audioTokens: JsonField = JsonMissing.of(), - @JsonProperty("cached_tokens") - @ExcludeMissing - cachedTokens: JsonField = JsonMissing.of(), - @JsonProperty("text_tokens") - @ExcludeMissing - textTokens: JsonField = JsonMissing.of(), - ) : this(audioTokens, cachedTokens, textTokens, mutableMapOf()) - - /** - * The number of audio tokens used in the Response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun audioTokens(): Optional = audioTokens.getOptional("audio_tokens") - - /** - * The number of cached tokens used in the Response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun cachedTokens(): Optional = cachedTokens.getOptional("cached_tokens") - - /** - * The number of text tokens used in the Response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun textTokens(): Optional = textTokens.getOptional("text_tokens") - - /** - * Returns the raw JSON value of [audioTokens]. - * - * Unlike [audioTokens], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("audio_tokens") - @ExcludeMissing - fun _audioTokens(): JsonField = audioTokens - - /** - * Returns the raw JSON value of [cachedTokens]. - * - * Unlike [cachedTokens], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("cached_tokens") - @ExcludeMissing - fun _cachedTokens(): JsonField = cachedTokens - - /** - * Returns the raw JSON value of [textTokens]. - * - * Unlike [textTokens], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("text_tokens") @ExcludeMissing fun _textTokens(): JsonField = textTokens - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [InputTokenDetails]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputTokenDetails]. */ - class Builder internal constructor() { - - private var audioTokens: JsonField = JsonMissing.of() - private var cachedTokens: JsonField = JsonMissing.of() - private var textTokens: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputTokenDetails: InputTokenDetails) = apply { - audioTokens = inputTokenDetails.audioTokens - cachedTokens = inputTokenDetails.cachedTokens - textTokens = inputTokenDetails.textTokens - additionalProperties = inputTokenDetails.additionalProperties.toMutableMap() - } - - /** The number of audio tokens used in the Response. */ - fun audioTokens(audioTokens: Long) = audioTokens(JsonField.of(audioTokens)) - - /** - * Sets [Builder.audioTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.audioTokens] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun audioTokens(audioTokens: JsonField) = apply { this.audioTokens = audioTokens } - - /** The number of cached tokens used in the Response. */ - fun cachedTokens(cachedTokens: Long) = cachedTokens(JsonField.of(cachedTokens)) - - /** - * Sets [Builder.cachedTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.cachedTokens] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun cachedTokens(cachedTokens: JsonField) = apply { - this.cachedTokens = cachedTokens - } - - /** The number of text tokens used in the Response. */ - fun textTokens(textTokens: Long) = textTokens(JsonField.of(textTokens)) - - /** - * Sets [Builder.textTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.textTokens] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun textTokens(textTokens: JsonField) = apply { this.textTokens = textTokens } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputTokenDetails]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputTokenDetails = - InputTokenDetails( - audioTokens, - cachedTokens, - textTokens, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): InputTokenDetails = apply { - if (validated) { - return@apply - } - - audioTokens() - cachedTokens() - textTokens() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (audioTokens.asKnown().isPresent) 1 else 0) + - (if (cachedTokens.asKnown().isPresent) 1 else 0) + - (if (textTokens.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputTokenDetails && - audioTokens == other.audioTokens && - cachedTokens == other.cachedTokens && - textTokens == other.textTokens && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(audioTokens, cachedTokens, textTokens, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputTokenDetails{audioTokens=$audioTokens, cachedTokens=$cachedTokens, textTokens=$textTokens, additionalProperties=$additionalProperties}" - } - - /** Details about the output tokens used in the Response. */ - class OutputTokenDetails - private constructor( - private val audioTokens: JsonField, - private val textTokens: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("audio_tokens") - @ExcludeMissing - audioTokens: JsonField = JsonMissing.of(), - @JsonProperty("text_tokens") - @ExcludeMissing - textTokens: JsonField = JsonMissing.of(), - ) : this(audioTokens, textTokens, mutableMapOf()) - - /** - * The number of audio tokens used in the Response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun audioTokens(): Optional = audioTokens.getOptional("audio_tokens") - - /** - * The number of text tokens used in the Response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun textTokens(): Optional = textTokens.getOptional("text_tokens") - - /** - * Returns the raw JSON value of [audioTokens]. - * - * Unlike [audioTokens], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("audio_tokens") - @ExcludeMissing - fun _audioTokens(): JsonField = audioTokens - - /** - * Returns the raw JSON value of [textTokens]. - * - * Unlike [textTokens], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("text_tokens") @ExcludeMissing fun _textTokens(): JsonField = textTokens - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [OutputTokenDetails]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [OutputTokenDetails]. */ - class Builder internal constructor() { - - private var audioTokens: JsonField = JsonMissing.of() - private var textTokens: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(outputTokenDetails: OutputTokenDetails) = apply { - audioTokens = outputTokenDetails.audioTokens - textTokens = outputTokenDetails.textTokens - additionalProperties = outputTokenDetails.additionalProperties.toMutableMap() - } - - /** The number of audio tokens used in the Response. */ - fun audioTokens(audioTokens: Long) = audioTokens(JsonField.of(audioTokens)) - - /** - * Sets [Builder.audioTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.audioTokens] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun audioTokens(audioTokens: JsonField) = apply { this.audioTokens = audioTokens } - - /** The number of text tokens used in the Response. */ - fun textTokens(textTokens: Long) = textTokens(JsonField.of(textTokens)) - - /** - * Sets [Builder.textTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.textTokens] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun textTokens(textTokens: JsonField) = apply { this.textTokens = textTokens } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [OutputTokenDetails]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): OutputTokenDetails = - OutputTokenDetails(audioTokens, textTokens, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): OutputTokenDetails = apply { - if (validated) { - return@apply - } - - audioTokens() - textTokens() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (audioTokens.asKnown().isPresent) 1 else 0) + - (if (textTokens.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is OutputTokenDetails && - audioTokens == other.audioTokens && - textTokens == other.textTokens && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(audioTokens, textTokens, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "OutputTokenDetails{audioTokens=$audioTokens, textTokens=$textTokens, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is RealtimeResponseUsage && - inputTokenDetails == other.inputTokenDetails && - inputTokens == other.inputTokens && - outputTokenDetails == other.outputTokenDetails && - outputTokens == other.outputTokens && - totalTokens == other.totalTokens && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - inputTokenDetails, - inputTokens, - outputTokenDetails, - outputTokens, - totalTokens, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "RealtimeResponseUsage{inputTokenDetails=$inputTokenDetails, inputTokens=$inputTokens, outputTokenDetails=$outputTokenDetails, outputTokens=$outputTokens, totalTokens=$totalTokens, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeServerEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeServerEvent.kt deleted file mode 100644 index 8dca7a887..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/RealtimeServerEvent.kt +++ /dev/null @@ -1,3101 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.ObjectCodec -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.BaseDeserializer -import com.openai.core.BaseSerializer -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.core.getOrThrow -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** A realtime server event. */ -@JsonDeserialize(using = RealtimeServerEvent.Deserializer::class) -@JsonSerialize(using = RealtimeServerEvent.Serializer::class) -class RealtimeServerEvent -private constructor( - private val conversationCreated: ConversationCreatedEvent? = null, - private val conversationItemCreated: ConversationItemCreatedEvent? = null, - private val conversationItemDeleted: ConversationItemDeletedEvent? = null, - private val conversationItemInputAudioTranscriptionCompleted: - ConversationItemInputAudioTranscriptionCompletedEvent? = - null, - private val conversationItemInputAudioTranscriptionDelta: - ConversationItemInputAudioTranscriptionDeltaEvent? = - null, - private val conversationItemInputAudioTranscriptionFailed: - ConversationItemInputAudioTranscriptionFailedEvent? = - null, - private val conversationItemRetrieved: ConversationItemRetrieved? = null, - private val conversationItemTruncated: ConversationItemTruncatedEvent? = null, - private val error: ErrorEvent? = null, - private val inputAudioBufferCleared: InputAudioBufferClearedEvent? = null, - private val inputAudioBufferCommitted: InputAudioBufferCommittedEvent? = null, - private val inputAudioBufferSpeechStarted: InputAudioBufferSpeechStartedEvent? = null, - private val inputAudioBufferSpeechStopped: InputAudioBufferSpeechStoppedEvent? = null, - private val rateLimitsUpdated: RateLimitsUpdatedEvent? = null, - private val responseAudioDelta: ResponseAudioDeltaEvent? = null, - private val responseAudioDone: ResponseAudioDoneEvent? = null, - private val responseAudioTranscriptDelta: ResponseAudioTranscriptDeltaEvent? = null, - private val responseAudioTranscriptDone: ResponseAudioTranscriptDoneEvent? = null, - private val responseContentPartAdded: ResponseContentPartAddedEvent? = null, - private val responseContentPartDone: ResponseContentPartDoneEvent? = null, - private val responseCreated: ResponseCreatedEvent? = null, - private val responseDone: ResponseDoneEvent? = null, - private val responseFunctionCallArgumentsDelta: ResponseFunctionCallArgumentsDeltaEvent? = null, - private val responseFunctionCallArgumentsDone: ResponseFunctionCallArgumentsDoneEvent? = null, - private val responseOutputItemAdded: ResponseOutputItemAddedEvent? = null, - private val responseOutputItemDone: ResponseOutputItemDoneEvent? = null, - private val responseTextDelta: ResponseTextDeltaEvent? = null, - private val responseTextDone: ResponseTextDoneEvent? = null, - private val sessionCreated: SessionCreatedEvent? = null, - private val sessionUpdated: SessionUpdatedEvent? = null, - private val transcriptionSessionUpdated: TranscriptionSessionUpdatedEvent? = null, - private val outputAudioBufferStarted: OutputAudioBufferStarted? = null, - private val outputAudioBufferStopped: OutputAudioBufferStopped? = null, - private val outputAudioBufferCleared: OutputAudioBufferCleared? = null, - private val _json: JsonValue? = null, -) { - - /** Returned when a conversation is created. Emitted right after session creation. */ - fun conversationCreated(): Optional = - Optional.ofNullable(conversationCreated) - - /** - * Returned when a conversation item is created. There are several scenarios that produce this - * event: - * - The server is generating a Response, which if successful will produce either one or two - * Items, which will be of type `message` (role `assistant`) or type `function_call`. - * - The input audio buffer has been committed, either by the client or the server (in - * `server_vad` mode). The server will take the content of the input audio buffer and add it - * to a new user message Item. - * - The client has sent a `conversation.item.create` event to add a new Item to the - * Conversation. - */ - fun conversationItemCreated(): Optional = - Optional.ofNullable(conversationItemCreated) - - /** - * Returned when an item in the conversation is deleted by the client with a - * `conversation.item.delete` event. This event is used to synchronize the server's - * understanding of the conversation history with the client's view. - */ - fun conversationItemDeleted(): Optional = - Optional.ofNullable(conversationItemDeleted) - - /** - * This event is the output of audio transcription for user audio written to the user audio - * buffer. Transcription begins when the input audio buffer is committed by the client or server - * (in `server_vad` mode). Transcription runs asynchronously with Response creation, so this - * event may come before or after the Response events. - * - * Realtime API models accept audio natively, and thus input transcription is a separate process - * run on a separate ASR (Automatic Speech Recognition) model. The transcript may diverge - * somewhat from the model's interpretation, and should be treated as a rough guide. - */ - fun conversationItemInputAudioTranscriptionCompleted(): - Optional = - Optional.ofNullable(conversationItemInputAudioTranscriptionCompleted) - - /** Returned when the text value of an input audio transcription content part is updated. */ - fun conversationItemInputAudioTranscriptionDelta(): - Optional = - Optional.ofNullable(conversationItemInputAudioTranscriptionDelta) - - /** - * Returned when input audio transcription is configured, and a transcription request for a user - * message failed. These events are separate from other `error` events so that the client can - * identify the related Item. - */ - fun conversationItemInputAudioTranscriptionFailed(): - Optional = - Optional.ofNullable(conversationItemInputAudioTranscriptionFailed) - - /** Returned when a conversation item is retrieved with `conversation.item.retrieve`. */ - fun conversationItemRetrieved(): Optional = - Optional.ofNullable(conversationItemRetrieved) - - /** - * Returned when an earlier assistant audio message item is truncated by the client with a - * `conversation.item.truncate` event. This event is used to synchronize the server's - * understanding of the audio with the client's playback. - * - * This action will truncate the audio and remove the server-side text transcript to ensure - * there is no text in the context that hasn't been heard by the user. - */ - fun conversationItemTruncated(): Optional = - Optional.ofNullable(conversationItemTruncated) - - /** - * Returned when an error occurs, which could be a client problem or a server problem. Most - * errors are recoverable and the session will stay open, we recommend to implementors to - * monitor and log error messages by default. - */ - fun error(): Optional = Optional.ofNullable(error) - - /** - * Returned when the input audio buffer is cleared by the client with a - * `input_audio_buffer.clear` event. - */ - fun inputAudioBufferCleared(): Optional = - Optional.ofNullable(inputAudioBufferCleared) - - /** - * Returned when an input audio buffer is committed, either by the client or automatically in - * server VAD mode. The `item_id` property is the ID of the user message item that will be - * created, thus a `conversation.item.created` event will also be sent to the client. - */ - fun inputAudioBufferCommitted(): Optional = - Optional.ofNullable(inputAudioBufferCommitted) - - /** - * Sent by the server when in `server_vad` mode to indicate that speech has been detected in the - * audio buffer. This can happen any time audio is added to the buffer (unless speech is already - * detected). The client may want to use this event to interrupt audio playback or provide - * visual feedback to the user. - * - * The client should expect to receive a `input_audio_buffer.speech_stopped` event when speech - * stops. The `item_id` property is the ID of the user message item that will be created when - * speech stops and will also be included in the `input_audio_buffer.speech_stopped` event - * (unless the client manually commits the audio buffer during VAD activation). - */ - fun inputAudioBufferSpeechStarted(): Optional = - Optional.ofNullable(inputAudioBufferSpeechStarted) - - /** - * Returned in `server_vad` mode when the server detects the end of speech in the audio buffer. - * The server will also send an `conversation.item.created` event with the user message item - * that is created from the audio buffer. - */ - fun inputAudioBufferSpeechStopped(): Optional = - Optional.ofNullable(inputAudioBufferSpeechStopped) - - /** - * Emitted at the beginning of a Response to indicate the updated rate limits. When a Response - * is created some tokens will be "reserved" for the output tokens, the rate limits shown here - * reflect that reservation, which is then adjusted accordingly once the Response is completed. - */ - fun rateLimitsUpdated(): Optional = - Optional.ofNullable(rateLimitsUpdated) - - /** Returned when the model-generated audio is updated. */ - fun responseAudioDelta(): Optional = - Optional.ofNullable(responseAudioDelta) - - /** - * Returned when the model-generated audio is done. Also emitted when a Response is interrupted, - * incomplete, or cancelled. - */ - fun responseAudioDone(): Optional = - Optional.ofNullable(responseAudioDone) - - /** Returned when the model-generated transcription of audio output is updated. */ - fun responseAudioTranscriptDelta(): Optional = - Optional.ofNullable(responseAudioTranscriptDelta) - - /** - * Returned when the model-generated transcription of audio output is done streaming. Also - * emitted when a Response is interrupted, incomplete, or cancelled. - */ - fun responseAudioTranscriptDone(): Optional = - Optional.ofNullable(responseAudioTranscriptDone) - - /** - * Returned when a new content part is added to an assistant message item during response - * generation. - */ - fun responseContentPartAdded(): Optional = - Optional.ofNullable(responseContentPartAdded) - - /** - * Returned when a content part is done streaming in an assistant message item. Also emitted - * when a Response is interrupted, incomplete, or cancelled. - */ - fun responseContentPartDone(): Optional = - Optional.ofNullable(responseContentPartDone) - - /** - * Returned when a new Response is created. The first event of response creation, where the - * response is in an initial state of `in_progress`. - */ - fun responseCreated(): Optional = Optional.ofNullable(responseCreated) - - /** - * Returned when a Response is done streaming. Always emitted, no matter the final state. The - * Response object included in the `response.done` event will include all output Items in the - * Response but will omit the raw audio data. - */ - fun responseDone(): Optional = Optional.ofNullable(responseDone) - - /** Returned when the model-generated function call arguments are updated. */ - fun responseFunctionCallArgumentsDelta(): Optional = - Optional.ofNullable(responseFunctionCallArgumentsDelta) - - /** - * Returned when the model-generated function call arguments are done streaming. Also emitted - * when a Response is interrupted, incomplete, or cancelled. - */ - fun responseFunctionCallArgumentsDone(): Optional = - Optional.ofNullable(responseFunctionCallArgumentsDone) - - /** Returned when a new Item is created during Response generation. */ - fun responseOutputItemAdded(): Optional = - Optional.ofNullable(responseOutputItemAdded) - - /** - * Returned when an Item is done streaming. Also emitted when a Response is interrupted, - * incomplete, or cancelled. - */ - fun responseOutputItemDone(): Optional = - Optional.ofNullable(responseOutputItemDone) - - /** Returned when the text value of a "text" content part is updated. */ - fun responseTextDelta(): Optional = - Optional.ofNullable(responseTextDelta) - - /** - * Returned when the text value of a "text" content part is done streaming. Also emitted when a - * Response is interrupted, incomplete, or cancelled. - */ - fun responseTextDone(): Optional = Optional.ofNullable(responseTextDone) - - /** - * Returned when a Session is created. Emitted automatically when a new connection is - * established as the first server event. This event will contain the default Session - * configuration. - */ - fun sessionCreated(): Optional = Optional.ofNullable(sessionCreated) - - /** - * Returned when a session is updated with a `session.update` event, unless there is an error. - */ - fun sessionUpdated(): Optional = Optional.ofNullable(sessionUpdated) - - /** - * Returned when a transcription session is updated with a `transcription_session.update` event, - * unless there is an error. - */ - fun transcriptionSessionUpdated(): Optional = - Optional.ofNullable(transcriptionSessionUpdated) - - /** - * **WebRTC Only:** Emitted when the server begins streaming audio to the client. This event is - * emitted after an audio content part has been added (`response.content_part.added`) to the - * response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - fun outputAudioBufferStarted(): Optional = - Optional.ofNullable(outputAudioBufferStarted) - - /** - * **WebRTC Only:** Emitted when the output audio buffer has been completely drained on the - * server, and no more audio is forthcoming. This event is emitted after the full response data - * has been sent to the client (`response.done`). - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - fun outputAudioBufferStopped(): Optional = - Optional.ofNullable(outputAudioBufferStopped) - - /** - * **WebRTC Only:** Emitted when the output audio buffer is cleared. This happens either in VAD - * mode when the user has interrupted (`input_audio_buffer.speech_started`), or when the client - * has emitted the `output_audio_buffer.clear` event to manually cut off the current audio - * response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - fun outputAudioBufferCleared(): Optional = - Optional.ofNullable(outputAudioBufferCleared) - - fun isConversationCreated(): Boolean = conversationCreated != null - - fun isConversationItemCreated(): Boolean = conversationItemCreated != null - - fun isConversationItemDeleted(): Boolean = conversationItemDeleted != null - - fun isConversationItemInputAudioTranscriptionCompleted(): Boolean = - conversationItemInputAudioTranscriptionCompleted != null - - fun isConversationItemInputAudioTranscriptionDelta(): Boolean = - conversationItemInputAudioTranscriptionDelta != null - - fun isConversationItemInputAudioTranscriptionFailed(): Boolean = - conversationItemInputAudioTranscriptionFailed != null - - fun isConversationItemRetrieved(): Boolean = conversationItemRetrieved != null - - fun isConversationItemTruncated(): Boolean = conversationItemTruncated != null - - fun isError(): Boolean = error != null - - fun isInputAudioBufferCleared(): Boolean = inputAudioBufferCleared != null - - fun isInputAudioBufferCommitted(): Boolean = inputAudioBufferCommitted != null - - fun isInputAudioBufferSpeechStarted(): Boolean = inputAudioBufferSpeechStarted != null - - fun isInputAudioBufferSpeechStopped(): Boolean = inputAudioBufferSpeechStopped != null - - fun isRateLimitsUpdated(): Boolean = rateLimitsUpdated != null - - fun isResponseAudioDelta(): Boolean = responseAudioDelta != null - - fun isResponseAudioDone(): Boolean = responseAudioDone != null - - fun isResponseAudioTranscriptDelta(): Boolean = responseAudioTranscriptDelta != null - - fun isResponseAudioTranscriptDone(): Boolean = responseAudioTranscriptDone != null - - fun isResponseContentPartAdded(): Boolean = responseContentPartAdded != null - - fun isResponseContentPartDone(): Boolean = responseContentPartDone != null - - fun isResponseCreated(): Boolean = responseCreated != null - - fun isResponseDone(): Boolean = responseDone != null - - fun isResponseFunctionCallArgumentsDelta(): Boolean = responseFunctionCallArgumentsDelta != null - - fun isResponseFunctionCallArgumentsDone(): Boolean = responseFunctionCallArgumentsDone != null - - fun isResponseOutputItemAdded(): Boolean = responseOutputItemAdded != null - - fun isResponseOutputItemDone(): Boolean = responseOutputItemDone != null - - fun isResponseTextDelta(): Boolean = responseTextDelta != null - - fun isResponseTextDone(): Boolean = responseTextDone != null - - fun isSessionCreated(): Boolean = sessionCreated != null - - fun isSessionUpdated(): Boolean = sessionUpdated != null - - fun isTranscriptionSessionUpdated(): Boolean = transcriptionSessionUpdated != null - - fun isOutputAudioBufferStarted(): Boolean = outputAudioBufferStarted != null - - fun isOutputAudioBufferStopped(): Boolean = outputAudioBufferStopped != null - - fun isOutputAudioBufferCleared(): Boolean = outputAudioBufferCleared != null - - /** Returned when a conversation is created. Emitted right after session creation. */ - fun asConversationCreated(): ConversationCreatedEvent = - conversationCreated.getOrThrow("conversationCreated") - - /** - * Returned when a conversation item is created. There are several scenarios that produce this - * event: - * - The server is generating a Response, which if successful will produce either one or two - * Items, which will be of type `message` (role `assistant`) or type `function_call`. - * - The input audio buffer has been committed, either by the client or the server (in - * `server_vad` mode). The server will take the content of the input audio buffer and add it - * to a new user message Item. - * - The client has sent a `conversation.item.create` event to add a new Item to the - * Conversation. - */ - fun asConversationItemCreated(): ConversationItemCreatedEvent = - conversationItemCreated.getOrThrow("conversationItemCreated") - - /** - * Returned when an item in the conversation is deleted by the client with a - * `conversation.item.delete` event. This event is used to synchronize the server's - * understanding of the conversation history with the client's view. - */ - fun asConversationItemDeleted(): ConversationItemDeletedEvent = - conversationItemDeleted.getOrThrow("conversationItemDeleted") - - /** - * This event is the output of audio transcription for user audio written to the user audio - * buffer. Transcription begins when the input audio buffer is committed by the client or server - * (in `server_vad` mode). Transcription runs asynchronously with Response creation, so this - * event may come before or after the Response events. - * - * Realtime API models accept audio natively, and thus input transcription is a separate process - * run on a separate ASR (Automatic Speech Recognition) model. The transcript may diverge - * somewhat from the model's interpretation, and should be treated as a rough guide. - */ - fun asConversationItemInputAudioTranscriptionCompleted(): - ConversationItemInputAudioTranscriptionCompletedEvent = - conversationItemInputAudioTranscriptionCompleted.getOrThrow( - "conversationItemInputAudioTranscriptionCompleted" - ) - - /** Returned when the text value of an input audio transcription content part is updated. */ - fun asConversationItemInputAudioTranscriptionDelta(): - ConversationItemInputAudioTranscriptionDeltaEvent = - conversationItemInputAudioTranscriptionDelta.getOrThrow( - "conversationItemInputAudioTranscriptionDelta" - ) - - /** - * Returned when input audio transcription is configured, and a transcription request for a user - * message failed. These events are separate from other `error` events so that the client can - * identify the related Item. - */ - fun asConversationItemInputAudioTranscriptionFailed(): - ConversationItemInputAudioTranscriptionFailedEvent = - conversationItemInputAudioTranscriptionFailed.getOrThrow( - "conversationItemInputAudioTranscriptionFailed" - ) - - /** Returned when a conversation item is retrieved with `conversation.item.retrieve`. */ - fun asConversationItemRetrieved(): ConversationItemRetrieved = - conversationItemRetrieved.getOrThrow("conversationItemRetrieved") - - /** - * Returned when an earlier assistant audio message item is truncated by the client with a - * `conversation.item.truncate` event. This event is used to synchronize the server's - * understanding of the audio with the client's playback. - * - * This action will truncate the audio and remove the server-side text transcript to ensure - * there is no text in the context that hasn't been heard by the user. - */ - fun asConversationItemTruncated(): ConversationItemTruncatedEvent = - conversationItemTruncated.getOrThrow("conversationItemTruncated") - - /** - * Returned when an error occurs, which could be a client problem or a server problem. Most - * errors are recoverable and the session will stay open, we recommend to implementors to - * monitor and log error messages by default. - */ - fun asError(): ErrorEvent = error.getOrThrow("error") - - /** - * Returned when the input audio buffer is cleared by the client with a - * `input_audio_buffer.clear` event. - */ - fun asInputAudioBufferCleared(): InputAudioBufferClearedEvent = - inputAudioBufferCleared.getOrThrow("inputAudioBufferCleared") - - /** - * Returned when an input audio buffer is committed, either by the client or automatically in - * server VAD mode. The `item_id` property is the ID of the user message item that will be - * created, thus a `conversation.item.created` event will also be sent to the client. - */ - fun asInputAudioBufferCommitted(): InputAudioBufferCommittedEvent = - inputAudioBufferCommitted.getOrThrow("inputAudioBufferCommitted") - - /** - * Sent by the server when in `server_vad` mode to indicate that speech has been detected in the - * audio buffer. This can happen any time audio is added to the buffer (unless speech is already - * detected). The client may want to use this event to interrupt audio playback or provide - * visual feedback to the user. - * - * The client should expect to receive a `input_audio_buffer.speech_stopped` event when speech - * stops. The `item_id` property is the ID of the user message item that will be created when - * speech stops and will also be included in the `input_audio_buffer.speech_stopped` event - * (unless the client manually commits the audio buffer during VAD activation). - */ - fun asInputAudioBufferSpeechStarted(): InputAudioBufferSpeechStartedEvent = - inputAudioBufferSpeechStarted.getOrThrow("inputAudioBufferSpeechStarted") - - /** - * Returned in `server_vad` mode when the server detects the end of speech in the audio buffer. - * The server will also send an `conversation.item.created` event with the user message item - * that is created from the audio buffer. - */ - fun asInputAudioBufferSpeechStopped(): InputAudioBufferSpeechStoppedEvent = - inputAudioBufferSpeechStopped.getOrThrow("inputAudioBufferSpeechStopped") - - /** - * Emitted at the beginning of a Response to indicate the updated rate limits. When a Response - * is created some tokens will be "reserved" for the output tokens, the rate limits shown here - * reflect that reservation, which is then adjusted accordingly once the Response is completed. - */ - fun asRateLimitsUpdated(): RateLimitsUpdatedEvent = - rateLimitsUpdated.getOrThrow("rateLimitsUpdated") - - /** Returned when the model-generated audio is updated. */ - fun asResponseAudioDelta(): ResponseAudioDeltaEvent = - responseAudioDelta.getOrThrow("responseAudioDelta") - - /** - * Returned when the model-generated audio is done. Also emitted when a Response is interrupted, - * incomplete, or cancelled. - */ - fun asResponseAudioDone(): ResponseAudioDoneEvent = - responseAudioDone.getOrThrow("responseAudioDone") - - /** Returned when the model-generated transcription of audio output is updated. */ - fun asResponseAudioTranscriptDelta(): ResponseAudioTranscriptDeltaEvent = - responseAudioTranscriptDelta.getOrThrow("responseAudioTranscriptDelta") - - /** - * Returned when the model-generated transcription of audio output is done streaming. Also - * emitted when a Response is interrupted, incomplete, or cancelled. - */ - fun asResponseAudioTranscriptDone(): ResponseAudioTranscriptDoneEvent = - responseAudioTranscriptDone.getOrThrow("responseAudioTranscriptDone") - - /** - * Returned when a new content part is added to an assistant message item during response - * generation. - */ - fun asResponseContentPartAdded(): ResponseContentPartAddedEvent = - responseContentPartAdded.getOrThrow("responseContentPartAdded") - - /** - * Returned when a content part is done streaming in an assistant message item. Also emitted - * when a Response is interrupted, incomplete, or cancelled. - */ - fun asResponseContentPartDone(): ResponseContentPartDoneEvent = - responseContentPartDone.getOrThrow("responseContentPartDone") - - /** - * Returned when a new Response is created. The first event of response creation, where the - * response is in an initial state of `in_progress`. - */ - fun asResponseCreated(): ResponseCreatedEvent = responseCreated.getOrThrow("responseCreated") - - /** - * Returned when a Response is done streaming. Always emitted, no matter the final state. The - * Response object included in the `response.done` event will include all output Items in the - * Response but will omit the raw audio data. - */ - fun asResponseDone(): ResponseDoneEvent = responseDone.getOrThrow("responseDone") - - /** Returned when the model-generated function call arguments are updated. */ - fun asResponseFunctionCallArgumentsDelta(): ResponseFunctionCallArgumentsDeltaEvent = - responseFunctionCallArgumentsDelta.getOrThrow("responseFunctionCallArgumentsDelta") - - /** - * Returned when the model-generated function call arguments are done streaming. Also emitted - * when a Response is interrupted, incomplete, or cancelled. - */ - fun asResponseFunctionCallArgumentsDone(): ResponseFunctionCallArgumentsDoneEvent = - responseFunctionCallArgumentsDone.getOrThrow("responseFunctionCallArgumentsDone") - - /** Returned when a new Item is created during Response generation. */ - fun asResponseOutputItemAdded(): ResponseOutputItemAddedEvent = - responseOutputItemAdded.getOrThrow("responseOutputItemAdded") - - /** - * Returned when an Item is done streaming. Also emitted when a Response is interrupted, - * incomplete, or cancelled. - */ - fun asResponseOutputItemDone(): ResponseOutputItemDoneEvent = - responseOutputItemDone.getOrThrow("responseOutputItemDone") - - /** Returned when the text value of a "text" content part is updated. */ - fun asResponseTextDelta(): ResponseTextDeltaEvent = - responseTextDelta.getOrThrow("responseTextDelta") - - /** - * Returned when the text value of a "text" content part is done streaming. Also emitted when a - * Response is interrupted, incomplete, or cancelled. - */ - fun asResponseTextDone(): ResponseTextDoneEvent = - responseTextDone.getOrThrow("responseTextDone") - - /** - * Returned when a Session is created. Emitted automatically when a new connection is - * established as the first server event. This event will contain the default Session - * configuration. - */ - fun asSessionCreated(): SessionCreatedEvent = sessionCreated.getOrThrow("sessionCreated") - - /** - * Returned when a session is updated with a `session.update` event, unless there is an error. - */ - fun asSessionUpdated(): SessionUpdatedEvent = sessionUpdated.getOrThrow("sessionUpdated") - - /** - * Returned when a transcription session is updated with a `transcription_session.update` event, - * unless there is an error. - */ - fun asTranscriptionSessionUpdated(): TranscriptionSessionUpdatedEvent = - transcriptionSessionUpdated.getOrThrow("transcriptionSessionUpdated") - - /** - * **WebRTC Only:** Emitted when the server begins streaming audio to the client. This event is - * emitted after an audio content part has been added (`response.content_part.added`) to the - * response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - fun asOutputAudioBufferStarted(): OutputAudioBufferStarted = - outputAudioBufferStarted.getOrThrow("outputAudioBufferStarted") - - /** - * **WebRTC Only:** Emitted when the output audio buffer has been completely drained on the - * server, and no more audio is forthcoming. This event is emitted after the full response data - * has been sent to the client (`response.done`). - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - fun asOutputAudioBufferStopped(): OutputAudioBufferStopped = - outputAudioBufferStopped.getOrThrow("outputAudioBufferStopped") - - /** - * **WebRTC Only:** Emitted when the output audio buffer is cleared. This happens either in VAD - * mode when the user has interrupted (`input_audio_buffer.speech_started`), or when the client - * has emitted the `output_audio_buffer.clear` event to manually cut off the current audio - * response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - fun asOutputAudioBufferCleared(): OutputAudioBufferCleared = - outputAudioBufferCleared.getOrThrow("outputAudioBufferCleared") - - fun _json(): Optional = Optional.ofNullable(_json) - - fun accept(visitor: Visitor): T = - when { - conversationCreated != null -> visitor.visitConversationCreated(conversationCreated) - conversationItemCreated != null -> - visitor.visitConversationItemCreated(conversationItemCreated) - conversationItemDeleted != null -> - visitor.visitConversationItemDeleted(conversationItemDeleted) - conversationItemInputAudioTranscriptionCompleted != null -> - visitor.visitConversationItemInputAudioTranscriptionCompleted( - conversationItemInputAudioTranscriptionCompleted - ) - conversationItemInputAudioTranscriptionDelta != null -> - visitor.visitConversationItemInputAudioTranscriptionDelta( - conversationItemInputAudioTranscriptionDelta - ) - conversationItemInputAudioTranscriptionFailed != null -> - visitor.visitConversationItemInputAudioTranscriptionFailed( - conversationItemInputAudioTranscriptionFailed - ) - conversationItemRetrieved != null -> - visitor.visitConversationItemRetrieved(conversationItemRetrieved) - conversationItemTruncated != null -> - visitor.visitConversationItemTruncated(conversationItemTruncated) - error != null -> visitor.visitError(error) - inputAudioBufferCleared != null -> - visitor.visitInputAudioBufferCleared(inputAudioBufferCleared) - inputAudioBufferCommitted != null -> - visitor.visitInputAudioBufferCommitted(inputAudioBufferCommitted) - inputAudioBufferSpeechStarted != null -> - visitor.visitInputAudioBufferSpeechStarted(inputAudioBufferSpeechStarted) - inputAudioBufferSpeechStopped != null -> - visitor.visitInputAudioBufferSpeechStopped(inputAudioBufferSpeechStopped) - rateLimitsUpdated != null -> visitor.visitRateLimitsUpdated(rateLimitsUpdated) - responseAudioDelta != null -> visitor.visitResponseAudioDelta(responseAudioDelta) - responseAudioDone != null -> visitor.visitResponseAudioDone(responseAudioDone) - responseAudioTranscriptDelta != null -> - visitor.visitResponseAudioTranscriptDelta(responseAudioTranscriptDelta) - responseAudioTranscriptDone != null -> - visitor.visitResponseAudioTranscriptDone(responseAudioTranscriptDone) - responseContentPartAdded != null -> - visitor.visitResponseContentPartAdded(responseContentPartAdded) - responseContentPartDone != null -> - visitor.visitResponseContentPartDone(responseContentPartDone) - responseCreated != null -> visitor.visitResponseCreated(responseCreated) - responseDone != null -> visitor.visitResponseDone(responseDone) - responseFunctionCallArgumentsDelta != null -> - visitor.visitResponseFunctionCallArgumentsDelta(responseFunctionCallArgumentsDelta) - responseFunctionCallArgumentsDone != null -> - visitor.visitResponseFunctionCallArgumentsDone(responseFunctionCallArgumentsDone) - responseOutputItemAdded != null -> - visitor.visitResponseOutputItemAdded(responseOutputItemAdded) - responseOutputItemDone != null -> - visitor.visitResponseOutputItemDone(responseOutputItemDone) - responseTextDelta != null -> visitor.visitResponseTextDelta(responseTextDelta) - responseTextDone != null -> visitor.visitResponseTextDone(responseTextDone) - sessionCreated != null -> visitor.visitSessionCreated(sessionCreated) - sessionUpdated != null -> visitor.visitSessionUpdated(sessionUpdated) - transcriptionSessionUpdated != null -> - visitor.visitTranscriptionSessionUpdated(transcriptionSessionUpdated) - outputAudioBufferStarted != null -> - visitor.visitOutputAudioBufferStarted(outputAudioBufferStarted) - outputAudioBufferStopped != null -> - visitor.visitOutputAudioBufferStopped(outputAudioBufferStopped) - outputAudioBufferCleared != null -> - visitor.visitOutputAudioBufferCleared(outputAudioBufferCleared) - else -> visitor.unknown(_json) - } - - private var validated: Boolean = false - - fun validate(): RealtimeServerEvent = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitConversationCreated( - conversationCreated: ConversationCreatedEvent - ) { - conversationCreated.validate() - } - - override fun visitConversationItemCreated( - conversationItemCreated: ConversationItemCreatedEvent - ) { - conversationItemCreated.validate() - } - - override fun visitConversationItemDeleted( - conversationItemDeleted: ConversationItemDeletedEvent - ) { - conversationItemDeleted.validate() - } - - override fun visitConversationItemInputAudioTranscriptionCompleted( - conversationItemInputAudioTranscriptionCompleted: - ConversationItemInputAudioTranscriptionCompletedEvent - ) { - conversationItemInputAudioTranscriptionCompleted.validate() - } - - override fun visitConversationItemInputAudioTranscriptionDelta( - conversationItemInputAudioTranscriptionDelta: - ConversationItemInputAudioTranscriptionDeltaEvent - ) { - conversationItemInputAudioTranscriptionDelta.validate() - } - - override fun visitConversationItemInputAudioTranscriptionFailed( - conversationItemInputAudioTranscriptionFailed: - ConversationItemInputAudioTranscriptionFailedEvent - ) { - conversationItemInputAudioTranscriptionFailed.validate() - } - - override fun visitConversationItemRetrieved( - conversationItemRetrieved: ConversationItemRetrieved - ) { - conversationItemRetrieved.validate() - } - - override fun visitConversationItemTruncated( - conversationItemTruncated: ConversationItemTruncatedEvent - ) { - conversationItemTruncated.validate() - } - - override fun visitError(error: ErrorEvent) { - error.validate() - } - - override fun visitInputAudioBufferCleared( - inputAudioBufferCleared: InputAudioBufferClearedEvent - ) { - inputAudioBufferCleared.validate() - } - - override fun visitInputAudioBufferCommitted( - inputAudioBufferCommitted: InputAudioBufferCommittedEvent - ) { - inputAudioBufferCommitted.validate() - } - - override fun visitInputAudioBufferSpeechStarted( - inputAudioBufferSpeechStarted: InputAudioBufferSpeechStartedEvent - ) { - inputAudioBufferSpeechStarted.validate() - } - - override fun visitInputAudioBufferSpeechStopped( - inputAudioBufferSpeechStopped: InputAudioBufferSpeechStoppedEvent - ) { - inputAudioBufferSpeechStopped.validate() - } - - override fun visitRateLimitsUpdated(rateLimitsUpdated: RateLimitsUpdatedEvent) { - rateLimitsUpdated.validate() - } - - override fun visitResponseAudioDelta(responseAudioDelta: ResponseAudioDeltaEvent) { - responseAudioDelta.validate() - } - - override fun visitResponseAudioDone(responseAudioDone: ResponseAudioDoneEvent) { - responseAudioDone.validate() - } - - override fun visitResponseAudioTranscriptDelta( - responseAudioTranscriptDelta: ResponseAudioTranscriptDeltaEvent - ) { - responseAudioTranscriptDelta.validate() - } - - override fun visitResponseAudioTranscriptDone( - responseAudioTranscriptDone: ResponseAudioTranscriptDoneEvent - ) { - responseAudioTranscriptDone.validate() - } - - override fun visitResponseContentPartAdded( - responseContentPartAdded: ResponseContentPartAddedEvent - ) { - responseContentPartAdded.validate() - } - - override fun visitResponseContentPartDone( - responseContentPartDone: ResponseContentPartDoneEvent - ) { - responseContentPartDone.validate() - } - - override fun visitResponseCreated(responseCreated: ResponseCreatedEvent) { - responseCreated.validate() - } - - override fun visitResponseDone(responseDone: ResponseDoneEvent) { - responseDone.validate() - } - - override fun visitResponseFunctionCallArgumentsDelta( - responseFunctionCallArgumentsDelta: ResponseFunctionCallArgumentsDeltaEvent - ) { - responseFunctionCallArgumentsDelta.validate() - } - - override fun visitResponseFunctionCallArgumentsDone( - responseFunctionCallArgumentsDone: ResponseFunctionCallArgumentsDoneEvent - ) { - responseFunctionCallArgumentsDone.validate() - } - - override fun visitResponseOutputItemAdded( - responseOutputItemAdded: ResponseOutputItemAddedEvent - ) { - responseOutputItemAdded.validate() - } - - override fun visitResponseOutputItemDone( - responseOutputItemDone: ResponseOutputItemDoneEvent - ) { - responseOutputItemDone.validate() - } - - override fun visitResponseTextDelta(responseTextDelta: ResponseTextDeltaEvent) { - responseTextDelta.validate() - } - - override fun visitResponseTextDone(responseTextDone: ResponseTextDoneEvent) { - responseTextDone.validate() - } - - override fun visitSessionCreated(sessionCreated: SessionCreatedEvent) { - sessionCreated.validate() - } - - override fun visitSessionUpdated(sessionUpdated: SessionUpdatedEvent) { - sessionUpdated.validate() - } - - override fun visitTranscriptionSessionUpdated( - transcriptionSessionUpdated: TranscriptionSessionUpdatedEvent - ) { - transcriptionSessionUpdated.validate() - } - - override fun visitOutputAudioBufferStarted( - outputAudioBufferStarted: OutputAudioBufferStarted - ) { - outputAudioBufferStarted.validate() - } - - override fun visitOutputAudioBufferStopped( - outputAudioBufferStopped: OutputAudioBufferStopped - ) { - outputAudioBufferStopped.validate() - } - - override fun visitOutputAudioBufferCleared( - outputAudioBufferCleared: OutputAudioBufferCleared - ) { - outputAudioBufferCleared.validate() - } - } - ) - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - accept( - object : Visitor { - override fun visitConversationCreated( - conversationCreated: ConversationCreatedEvent - ) = conversationCreated.validity() - - override fun visitConversationItemCreated( - conversationItemCreated: ConversationItemCreatedEvent - ) = conversationItemCreated.validity() - - override fun visitConversationItemDeleted( - conversationItemDeleted: ConversationItemDeletedEvent - ) = conversationItemDeleted.validity() - - override fun visitConversationItemInputAudioTranscriptionCompleted( - conversationItemInputAudioTranscriptionCompleted: - ConversationItemInputAudioTranscriptionCompletedEvent - ) = conversationItemInputAudioTranscriptionCompleted.validity() - - override fun visitConversationItemInputAudioTranscriptionDelta( - conversationItemInputAudioTranscriptionDelta: - ConversationItemInputAudioTranscriptionDeltaEvent - ) = conversationItemInputAudioTranscriptionDelta.validity() - - override fun visitConversationItemInputAudioTranscriptionFailed( - conversationItemInputAudioTranscriptionFailed: - ConversationItemInputAudioTranscriptionFailedEvent - ) = conversationItemInputAudioTranscriptionFailed.validity() - - override fun visitConversationItemRetrieved( - conversationItemRetrieved: ConversationItemRetrieved - ) = conversationItemRetrieved.validity() - - override fun visitConversationItemTruncated( - conversationItemTruncated: ConversationItemTruncatedEvent - ) = conversationItemTruncated.validity() - - override fun visitError(error: ErrorEvent) = error.validity() - - override fun visitInputAudioBufferCleared( - inputAudioBufferCleared: InputAudioBufferClearedEvent - ) = inputAudioBufferCleared.validity() - - override fun visitInputAudioBufferCommitted( - inputAudioBufferCommitted: InputAudioBufferCommittedEvent - ) = inputAudioBufferCommitted.validity() - - override fun visitInputAudioBufferSpeechStarted( - inputAudioBufferSpeechStarted: InputAudioBufferSpeechStartedEvent - ) = inputAudioBufferSpeechStarted.validity() - - override fun visitInputAudioBufferSpeechStopped( - inputAudioBufferSpeechStopped: InputAudioBufferSpeechStoppedEvent - ) = inputAudioBufferSpeechStopped.validity() - - override fun visitRateLimitsUpdated(rateLimitsUpdated: RateLimitsUpdatedEvent) = - rateLimitsUpdated.validity() - - override fun visitResponseAudioDelta(responseAudioDelta: ResponseAudioDeltaEvent) = - responseAudioDelta.validity() - - override fun visitResponseAudioDone(responseAudioDone: ResponseAudioDoneEvent) = - responseAudioDone.validity() - - override fun visitResponseAudioTranscriptDelta( - responseAudioTranscriptDelta: ResponseAudioTranscriptDeltaEvent - ) = responseAudioTranscriptDelta.validity() - - override fun visitResponseAudioTranscriptDone( - responseAudioTranscriptDone: ResponseAudioTranscriptDoneEvent - ) = responseAudioTranscriptDone.validity() - - override fun visitResponseContentPartAdded( - responseContentPartAdded: ResponseContentPartAddedEvent - ) = responseContentPartAdded.validity() - - override fun visitResponseContentPartDone( - responseContentPartDone: ResponseContentPartDoneEvent - ) = responseContentPartDone.validity() - - override fun visitResponseCreated(responseCreated: ResponseCreatedEvent) = - responseCreated.validity() - - override fun visitResponseDone(responseDone: ResponseDoneEvent) = - responseDone.validity() - - override fun visitResponseFunctionCallArgumentsDelta( - responseFunctionCallArgumentsDelta: ResponseFunctionCallArgumentsDeltaEvent - ) = responseFunctionCallArgumentsDelta.validity() - - override fun visitResponseFunctionCallArgumentsDone( - responseFunctionCallArgumentsDone: ResponseFunctionCallArgumentsDoneEvent - ) = responseFunctionCallArgumentsDone.validity() - - override fun visitResponseOutputItemAdded( - responseOutputItemAdded: ResponseOutputItemAddedEvent - ) = responseOutputItemAdded.validity() - - override fun visitResponseOutputItemDone( - responseOutputItemDone: ResponseOutputItemDoneEvent - ) = responseOutputItemDone.validity() - - override fun visitResponseTextDelta(responseTextDelta: ResponseTextDeltaEvent) = - responseTextDelta.validity() - - override fun visitResponseTextDone(responseTextDone: ResponseTextDoneEvent) = - responseTextDone.validity() - - override fun visitSessionCreated(sessionCreated: SessionCreatedEvent) = - sessionCreated.validity() - - override fun visitSessionUpdated(sessionUpdated: SessionUpdatedEvent) = - sessionUpdated.validity() - - override fun visitTranscriptionSessionUpdated( - transcriptionSessionUpdated: TranscriptionSessionUpdatedEvent - ) = transcriptionSessionUpdated.validity() - - override fun visitOutputAudioBufferStarted( - outputAudioBufferStarted: OutputAudioBufferStarted - ) = outputAudioBufferStarted.validity() - - override fun visitOutputAudioBufferStopped( - outputAudioBufferStopped: OutputAudioBufferStopped - ) = outputAudioBufferStopped.validity() - - override fun visitOutputAudioBufferCleared( - outputAudioBufferCleared: OutputAudioBufferCleared - ) = outputAudioBufferCleared.validity() - - override fun unknown(json: JsonValue?) = 0 - } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is RealtimeServerEvent && - conversationCreated == other.conversationCreated && - conversationItemCreated == other.conversationItemCreated && - conversationItemDeleted == other.conversationItemDeleted && - conversationItemInputAudioTranscriptionCompleted == - other.conversationItemInputAudioTranscriptionCompleted && - conversationItemInputAudioTranscriptionDelta == - other.conversationItemInputAudioTranscriptionDelta && - conversationItemInputAudioTranscriptionFailed == - other.conversationItemInputAudioTranscriptionFailed && - conversationItemRetrieved == other.conversationItemRetrieved && - conversationItemTruncated == other.conversationItemTruncated && - error == other.error && - inputAudioBufferCleared == other.inputAudioBufferCleared && - inputAudioBufferCommitted == other.inputAudioBufferCommitted && - inputAudioBufferSpeechStarted == other.inputAudioBufferSpeechStarted && - inputAudioBufferSpeechStopped == other.inputAudioBufferSpeechStopped && - rateLimitsUpdated == other.rateLimitsUpdated && - responseAudioDelta == other.responseAudioDelta && - responseAudioDone == other.responseAudioDone && - responseAudioTranscriptDelta == other.responseAudioTranscriptDelta && - responseAudioTranscriptDone == other.responseAudioTranscriptDone && - responseContentPartAdded == other.responseContentPartAdded && - responseContentPartDone == other.responseContentPartDone && - responseCreated == other.responseCreated && - responseDone == other.responseDone && - responseFunctionCallArgumentsDelta == other.responseFunctionCallArgumentsDelta && - responseFunctionCallArgumentsDone == other.responseFunctionCallArgumentsDone && - responseOutputItemAdded == other.responseOutputItemAdded && - responseOutputItemDone == other.responseOutputItemDone && - responseTextDelta == other.responseTextDelta && - responseTextDone == other.responseTextDone && - sessionCreated == other.sessionCreated && - sessionUpdated == other.sessionUpdated && - transcriptionSessionUpdated == other.transcriptionSessionUpdated && - outputAudioBufferStarted == other.outputAudioBufferStarted && - outputAudioBufferStopped == other.outputAudioBufferStopped && - outputAudioBufferCleared == other.outputAudioBufferCleared - } - - override fun hashCode(): Int = - Objects.hash( - conversationCreated, - conversationItemCreated, - conversationItemDeleted, - conversationItemInputAudioTranscriptionCompleted, - conversationItemInputAudioTranscriptionDelta, - conversationItemInputAudioTranscriptionFailed, - conversationItemRetrieved, - conversationItemTruncated, - error, - inputAudioBufferCleared, - inputAudioBufferCommitted, - inputAudioBufferSpeechStarted, - inputAudioBufferSpeechStopped, - rateLimitsUpdated, - responseAudioDelta, - responseAudioDone, - responseAudioTranscriptDelta, - responseAudioTranscriptDone, - responseContentPartAdded, - responseContentPartDone, - responseCreated, - responseDone, - responseFunctionCallArgumentsDelta, - responseFunctionCallArgumentsDone, - responseOutputItemAdded, - responseOutputItemDone, - responseTextDelta, - responseTextDone, - sessionCreated, - sessionUpdated, - transcriptionSessionUpdated, - outputAudioBufferStarted, - outputAudioBufferStopped, - outputAudioBufferCleared, - ) - - override fun toString(): String = - when { - conversationCreated != null -> - "RealtimeServerEvent{conversationCreated=$conversationCreated}" - conversationItemCreated != null -> - "RealtimeServerEvent{conversationItemCreated=$conversationItemCreated}" - conversationItemDeleted != null -> - "RealtimeServerEvent{conversationItemDeleted=$conversationItemDeleted}" - conversationItemInputAudioTranscriptionCompleted != null -> - "RealtimeServerEvent{conversationItemInputAudioTranscriptionCompleted=$conversationItemInputAudioTranscriptionCompleted}" - conversationItemInputAudioTranscriptionDelta != null -> - "RealtimeServerEvent{conversationItemInputAudioTranscriptionDelta=$conversationItemInputAudioTranscriptionDelta}" - conversationItemInputAudioTranscriptionFailed != null -> - "RealtimeServerEvent{conversationItemInputAudioTranscriptionFailed=$conversationItemInputAudioTranscriptionFailed}" - conversationItemRetrieved != null -> - "RealtimeServerEvent{conversationItemRetrieved=$conversationItemRetrieved}" - conversationItemTruncated != null -> - "RealtimeServerEvent{conversationItemTruncated=$conversationItemTruncated}" - error != null -> "RealtimeServerEvent{error=$error}" - inputAudioBufferCleared != null -> - "RealtimeServerEvent{inputAudioBufferCleared=$inputAudioBufferCleared}" - inputAudioBufferCommitted != null -> - "RealtimeServerEvent{inputAudioBufferCommitted=$inputAudioBufferCommitted}" - inputAudioBufferSpeechStarted != null -> - "RealtimeServerEvent{inputAudioBufferSpeechStarted=$inputAudioBufferSpeechStarted}" - inputAudioBufferSpeechStopped != null -> - "RealtimeServerEvent{inputAudioBufferSpeechStopped=$inputAudioBufferSpeechStopped}" - rateLimitsUpdated != null -> "RealtimeServerEvent{rateLimitsUpdated=$rateLimitsUpdated}" - responseAudioDelta != null -> - "RealtimeServerEvent{responseAudioDelta=$responseAudioDelta}" - responseAudioDone != null -> "RealtimeServerEvent{responseAudioDone=$responseAudioDone}" - responseAudioTranscriptDelta != null -> - "RealtimeServerEvent{responseAudioTranscriptDelta=$responseAudioTranscriptDelta}" - responseAudioTranscriptDone != null -> - "RealtimeServerEvent{responseAudioTranscriptDone=$responseAudioTranscriptDone}" - responseContentPartAdded != null -> - "RealtimeServerEvent{responseContentPartAdded=$responseContentPartAdded}" - responseContentPartDone != null -> - "RealtimeServerEvent{responseContentPartDone=$responseContentPartDone}" - responseCreated != null -> "RealtimeServerEvent{responseCreated=$responseCreated}" - responseDone != null -> "RealtimeServerEvent{responseDone=$responseDone}" - responseFunctionCallArgumentsDelta != null -> - "RealtimeServerEvent{responseFunctionCallArgumentsDelta=$responseFunctionCallArgumentsDelta}" - responseFunctionCallArgumentsDone != null -> - "RealtimeServerEvent{responseFunctionCallArgumentsDone=$responseFunctionCallArgumentsDone}" - responseOutputItemAdded != null -> - "RealtimeServerEvent{responseOutputItemAdded=$responseOutputItemAdded}" - responseOutputItemDone != null -> - "RealtimeServerEvent{responseOutputItemDone=$responseOutputItemDone}" - responseTextDelta != null -> "RealtimeServerEvent{responseTextDelta=$responseTextDelta}" - responseTextDone != null -> "RealtimeServerEvent{responseTextDone=$responseTextDone}" - sessionCreated != null -> "RealtimeServerEvent{sessionCreated=$sessionCreated}" - sessionUpdated != null -> "RealtimeServerEvent{sessionUpdated=$sessionUpdated}" - transcriptionSessionUpdated != null -> - "RealtimeServerEvent{transcriptionSessionUpdated=$transcriptionSessionUpdated}" - outputAudioBufferStarted != null -> - "RealtimeServerEvent{outputAudioBufferStarted=$outputAudioBufferStarted}" - outputAudioBufferStopped != null -> - "RealtimeServerEvent{outputAudioBufferStopped=$outputAudioBufferStopped}" - outputAudioBufferCleared != null -> - "RealtimeServerEvent{outputAudioBufferCleared=$outputAudioBufferCleared}" - _json != null -> "RealtimeServerEvent{_unknown=$_json}" - else -> throw IllegalStateException("Invalid RealtimeServerEvent") - } - - companion object { - - /** Returned when a conversation is created. Emitted right after session creation. */ - @JvmStatic - fun ofConversationCreated(conversationCreated: ConversationCreatedEvent) = - RealtimeServerEvent(conversationCreated = conversationCreated) - - /** - * Returned when a conversation item is created. There are several scenarios that produce - * this event: - * - The server is generating a Response, which if successful will produce either one or two - * Items, which will be of type `message` (role `assistant`) or type `function_call`. - * - The input audio buffer has been committed, either by the client or the server (in - * `server_vad` mode). The server will take the content of the input audio buffer and add - * it to a new user message Item. - * - The client has sent a `conversation.item.create` event to add a new Item to the - * Conversation. - */ - @JvmStatic - fun ofConversationItemCreated(conversationItemCreated: ConversationItemCreatedEvent) = - RealtimeServerEvent(conversationItemCreated = conversationItemCreated) - - /** - * Returned when an item in the conversation is deleted by the client with a - * `conversation.item.delete` event. This event is used to synchronize the server's - * understanding of the conversation history with the client's view. - */ - @JvmStatic - fun ofConversationItemDeleted(conversationItemDeleted: ConversationItemDeletedEvent) = - RealtimeServerEvent(conversationItemDeleted = conversationItemDeleted) - - /** - * This event is the output of audio transcription for user audio written to the user audio - * buffer. Transcription begins when the input audio buffer is committed by the client or - * server (in `server_vad` mode). Transcription runs asynchronously with Response creation, - * so this event may come before or after the Response events. - * - * Realtime API models accept audio natively, and thus input transcription is a separate - * process run on a separate ASR (Automatic Speech Recognition) model. The transcript may - * diverge somewhat from the model's interpretation, and should be treated as a rough guide. - */ - @JvmStatic - fun ofConversationItemInputAudioTranscriptionCompleted( - conversationItemInputAudioTranscriptionCompleted: - ConversationItemInputAudioTranscriptionCompletedEvent - ) = - RealtimeServerEvent( - conversationItemInputAudioTranscriptionCompleted = - conversationItemInputAudioTranscriptionCompleted - ) - - /** Returned when the text value of an input audio transcription content part is updated. */ - @JvmStatic - fun ofConversationItemInputAudioTranscriptionDelta( - conversationItemInputAudioTranscriptionDelta: - ConversationItemInputAudioTranscriptionDeltaEvent - ) = - RealtimeServerEvent( - conversationItemInputAudioTranscriptionDelta = - conversationItemInputAudioTranscriptionDelta - ) - - /** - * Returned when input audio transcription is configured, and a transcription request for a - * user message failed. These events are separate from other `error` events so that the - * client can identify the related Item. - */ - @JvmStatic - fun ofConversationItemInputAudioTranscriptionFailed( - conversationItemInputAudioTranscriptionFailed: - ConversationItemInputAudioTranscriptionFailedEvent - ) = - RealtimeServerEvent( - conversationItemInputAudioTranscriptionFailed = - conversationItemInputAudioTranscriptionFailed - ) - - /** Returned when a conversation item is retrieved with `conversation.item.retrieve`. */ - @JvmStatic - fun ofConversationItemRetrieved(conversationItemRetrieved: ConversationItemRetrieved) = - RealtimeServerEvent(conversationItemRetrieved = conversationItemRetrieved) - - /** - * Returned when an earlier assistant audio message item is truncated by the client with a - * `conversation.item.truncate` event. This event is used to synchronize the server's - * understanding of the audio with the client's playback. - * - * This action will truncate the audio and remove the server-side text transcript to ensure - * there is no text in the context that hasn't been heard by the user. - */ - @JvmStatic - fun ofConversationItemTruncated(conversationItemTruncated: ConversationItemTruncatedEvent) = - RealtimeServerEvent(conversationItemTruncated = conversationItemTruncated) - - /** - * Returned when an error occurs, which could be a client problem or a server problem. Most - * errors are recoverable and the session will stay open, we recommend to implementors to - * monitor and log error messages by default. - */ - @JvmStatic fun ofError(error: ErrorEvent) = RealtimeServerEvent(error = error) - - /** - * Returned when the input audio buffer is cleared by the client with a - * `input_audio_buffer.clear` event. - */ - @JvmStatic - fun ofInputAudioBufferCleared(inputAudioBufferCleared: InputAudioBufferClearedEvent) = - RealtimeServerEvent(inputAudioBufferCleared = inputAudioBufferCleared) - - /** - * Returned when an input audio buffer is committed, either by the client or automatically - * in server VAD mode. The `item_id` property is the ID of the user message item that will - * be created, thus a `conversation.item.created` event will also be sent to the client. - */ - @JvmStatic - fun ofInputAudioBufferCommitted(inputAudioBufferCommitted: InputAudioBufferCommittedEvent) = - RealtimeServerEvent(inputAudioBufferCommitted = inputAudioBufferCommitted) - - /** - * Sent by the server when in `server_vad` mode to indicate that speech has been detected in - * the audio buffer. This can happen any time audio is added to the buffer (unless speech is - * already detected). The client may want to use this event to interrupt audio playback or - * provide visual feedback to the user. - * - * The client should expect to receive a `input_audio_buffer.speech_stopped` event when - * speech stops. The `item_id` property is the ID of the user message item that will be - * created when speech stops and will also be included in the - * `input_audio_buffer.speech_stopped` event (unless the client manually commits the audio - * buffer during VAD activation). - */ - @JvmStatic - fun ofInputAudioBufferSpeechStarted( - inputAudioBufferSpeechStarted: InputAudioBufferSpeechStartedEvent - ) = RealtimeServerEvent(inputAudioBufferSpeechStarted = inputAudioBufferSpeechStarted) - - /** - * Returned in `server_vad` mode when the server detects the end of speech in the audio - * buffer. The server will also send an `conversation.item.created` event with the user - * message item that is created from the audio buffer. - */ - @JvmStatic - fun ofInputAudioBufferSpeechStopped( - inputAudioBufferSpeechStopped: InputAudioBufferSpeechStoppedEvent - ) = RealtimeServerEvent(inputAudioBufferSpeechStopped = inputAudioBufferSpeechStopped) - - /** - * Emitted at the beginning of a Response to indicate the updated rate limits. When a - * Response is created some tokens will be "reserved" for the output tokens, the rate limits - * shown here reflect that reservation, which is then adjusted accordingly once the Response - * is completed. - */ - @JvmStatic - fun ofRateLimitsUpdated(rateLimitsUpdated: RateLimitsUpdatedEvent) = - RealtimeServerEvent(rateLimitsUpdated = rateLimitsUpdated) - - /** Returned when the model-generated audio is updated. */ - @JvmStatic - fun ofResponseAudioDelta(responseAudioDelta: ResponseAudioDeltaEvent) = - RealtimeServerEvent(responseAudioDelta = responseAudioDelta) - - /** - * Returned when the model-generated audio is done. Also emitted when a Response is - * interrupted, incomplete, or cancelled. - */ - @JvmStatic - fun ofResponseAudioDone(responseAudioDone: ResponseAudioDoneEvent) = - RealtimeServerEvent(responseAudioDone = responseAudioDone) - - /** Returned when the model-generated transcription of audio output is updated. */ - @JvmStatic - fun ofResponseAudioTranscriptDelta( - responseAudioTranscriptDelta: ResponseAudioTranscriptDeltaEvent - ) = RealtimeServerEvent(responseAudioTranscriptDelta = responseAudioTranscriptDelta) - - /** - * Returned when the model-generated transcription of audio output is done streaming. Also - * emitted when a Response is interrupted, incomplete, or cancelled. - */ - @JvmStatic - fun ofResponseAudioTranscriptDone( - responseAudioTranscriptDone: ResponseAudioTranscriptDoneEvent - ) = RealtimeServerEvent(responseAudioTranscriptDone = responseAudioTranscriptDone) - - /** - * Returned when a new content part is added to an assistant message item during response - * generation. - */ - @JvmStatic - fun ofResponseContentPartAdded(responseContentPartAdded: ResponseContentPartAddedEvent) = - RealtimeServerEvent(responseContentPartAdded = responseContentPartAdded) - - /** - * Returned when a content part is done streaming in an assistant message item. Also emitted - * when a Response is interrupted, incomplete, or cancelled. - */ - @JvmStatic - fun ofResponseContentPartDone(responseContentPartDone: ResponseContentPartDoneEvent) = - RealtimeServerEvent(responseContentPartDone = responseContentPartDone) - - /** - * Returned when a new Response is created. The first event of response creation, where the - * response is in an initial state of `in_progress`. - */ - @JvmStatic - fun ofResponseCreated(responseCreated: ResponseCreatedEvent) = - RealtimeServerEvent(responseCreated = responseCreated) - - /** - * Returned when a Response is done streaming. Always emitted, no matter the final state. - * The Response object included in the `response.done` event will include all output Items - * in the Response but will omit the raw audio data. - */ - @JvmStatic - fun ofResponseDone(responseDone: ResponseDoneEvent) = - RealtimeServerEvent(responseDone = responseDone) - - /** Returned when the model-generated function call arguments are updated. */ - @JvmStatic - fun ofResponseFunctionCallArgumentsDelta( - responseFunctionCallArgumentsDelta: ResponseFunctionCallArgumentsDeltaEvent - ) = - RealtimeServerEvent( - responseFunctionCallArgumentsDelta = responseFunctionCallArgumentsDelta - ) - - /** - * Returned when the model-generated function call arguments are done streaming. Also - * emitted when a Response is interrupted, incomplete, or cancelled. - */ - @JvmStatic - fun ofResponseFunctionCallArgumentsDone( - responseFunctionCallArgumentsDone: ResponseFunctionCallArgumentsDoneEvent - ) = - RealtimeServerEvent( - responseFunctionCallArgumentsDone = responseFunctionCallArgumentsDone - ) - - /** Returned when a new Item is created during Response generation. */ - @JvmStatic - fun ofResponseOutputItemAdded(responseOutputItemAdded: ResponseOutputItemAddedEvent) = - RealtimeServerEvent(responseOutputItemAdded = responseOutputItemAdded) - - /** - * Returned when an Item is done streaming. Also emitted when a Response is interrupted, - * incomplete, or cancelled. - */ - @JvmStatic - fun ofResponseOutputItemDone(responseOutputItemDone: ResponseOutputItemDoneEvent) = - RealtimeServerEvent(responseOutputItemDone = responseOutputItemDone) - - /** Returned when the text value of a "text" content part is updated. */ - @JvmStatic - fun ofResponseTextDelta(responseTextDelta: ResponseTextDeltaEvent) = - RealtimeServerEvent(responseTextDelta = responseTextDelta) - - /** - * Returned when the text value of a "text" content part is done streaming. Also emitted - * when a Response is interrupted, incomplete, or cancelled. - */ - @JvmStatic - fun ofResponseTextDone(responseTextDone: ResponseTextDoneEvent) = - RealtimeServerEvent(responseTextDone = responseTextDone) - - /** - * Returned when a Session is created. Emitted automatically when a new connection is - * established as the first server event. This event will contain the default Session - * configuration. - */ - @JvmStatic - fun ofSessionCreated(sessionCreated: SessionCreatedEvent) = - RealtimeServerEvent(sessionCreated = sessionCreated) - - /** - * Returned when a session is updated with a `session.update` event, unless there is an - * error. - */ - @JvmStatic - fun ofSessionUpdated(sessionUpdated: SessionUpdatedEvent) = - RealtimeServerEvent(sessionUpdated = sessionUpdated) - - /** - * Returned when a transcription session is updated with a `transcription_session.update` - * event, unless there is an error. - */ - @JvmStatic - fun ofTranscriptionSessionUpdated( - transcriptionSessionUpdated: TranscriptionSessionUpdatedEvent - ) = RealtimeServerEvent(transcriptionSessionUpdated = transcriptionSessionUpdated) - - /** - * **WebRTC Only:** Emitted when the server begins streaming audio to the client. This event - * is emitted after an audio content part has been added (`response.content_part.added`) to - * the response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - @JvmStatic - fun ofOutputAudioBufferStarted(outputAudioBufferStarted: OutputAudioBufferStarted) = - RealtimeServerEvent(outputAudioBufferStarted = outputAudioBufferStarted) - - /** - * **WebRTC Only:** Emitted when the output audio buffer has been completely drained on the - * server, and no more audio is forthcoming. This event is emitted after the full response - * data has been sent to the client (`response.done`). - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - @JvmStatic - fun ofOutputAudioBufferStopped(outputAudioBufferStopped: OutputAudioBufferStopped) = - RealtimeServerEvent(outputAudioBufferStopped = outputAudioBufferStopped) - - /** - * **WebRTC Only:** Emitted when the output audio buffer is cleared. This happens either in - * VAD mode when the user has interrupted (`input_audio_buffer.speech_started`), or when the - * client has emitted the `output_audio_buffer.clear` event to manually cut off the current - * audio response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - @JvmStatic - fun ofOutputAudioBufferCleared(outputAudioBufferCleared: OutputAudioBufferCleared) = - RealtimeServerEvent(outputAudioBufferCleared = outputAudioBufferCleared) - } - - /** - * An interface that defines how to map each variant of [RealtimeServerEvent] to a value of type - * [T]. - */ - interface Visitor { - - /** Returned when a conversation is created. Emitted right after session creation. */ - fun visitConversationCreated(conversationCreated: ConversationCreatedEvent): T - - /** - * Returned when a conversation item is created. There are several scenarios that produce - * this event: - * - The server is generating a Response, which if successful will produce either one or two - * Items, which will be of type `message` (role `assistant`) or type `function_call`. - * - The input audio buffer has been committed, either by the client or the server (in - * `server_vad` mode). The server will take the content of the input audio buffer and add - * it to a new user message Item. - * - The client has sent a `conversation.item.create` event to add a new Item to the - * Conversation. - */ - fun visitConversationItemCreated(conversationItemCreated: ConversationItemCreatedEvent): T - - /** - * Returned when an item in the conversation is deleted by the client with a - * `conversation.item.delete` event. This event is used to synchronize the server's - * understanding of the conversation history with the client's view. - */ - fun visitConversationItemDeleted(conversationItemDeleted: ConversationItemDeletedEvent): T - - /** - * This event is the output of audio transcription for user audio written to the user audio - * buffer. Transcription begins when the input audio buffer is committed by the client or - * server (in `server_vad` mode). Transcription runs asynchronously with Response creation, - * so this event may come before or after the Response events. - * - * Realtime API models accept audio natively, and thus input transcription is a separate - * process run on a separate ASR (Automatic Speech Recognition) model. The transcript may - * diverge somewhat from the model's interpretation, and should be treated as a rough guide. - */ - fun visitConversationItemInputAudioTranscriptionCompleted( - conversationItemInputAudioTranscriptionCompleted: - ConversationItemInputAudioTranscriptionCompletedEvent - ): T - - /** Returned when the text value of an input audio transcription content part is updated. */ - fun visitConversationItemInputAudioTranscriptionDelta( - conversationItemInputAudioTranscriptionDelta: - ConversationItemInputAudioTranscriptionDeltaEvent - ): T - - /** - * Returned when input audio transcription is configured, and a transcription request for a - * user message failed. These events are separate from other `error` events so that the - * client can identify the related Item. - */ - fun visitConversationItemInputAudioTranscriptionFailed( - conversationItemInputAudioTranscriptionFailed: - ConversationItemInputAudioTranscriptionFailedEvent - ): T - - /** Returned when a conversation item is retrieved with `conversation.item.retrieve`. */ - fun visitConversationItemRetrieved(conversationItemRetrieved: ConversationItemRetrieved): T - - /** - * Returned when an earlier assistant audio message item is truncated by the client with a - * `conversation.item.truncate` event. This event is used to synchronize the server's - * understanding of the audio with the client's playback. - * - * This action will truncate the audio and remove the server-side text transcript to ensure - * there is no text in the context that hasn't been heard by the user. - */ - fun visitConversationItemTruncated( - conversationItemTruncated: ConversationItemTruncatedEvent - ): T - - /** - * Returned when an error occurs, which could be a client problem or a server problem. Most - * errors are recoverable and the session will stay open, we recommend to implementors to - * monitor and log error messages by default. - */ - fun visitError(error: ErrorEvent): T - - /** - * Returned when the input audio buffer is cleared by the client with a - * `input_audio_buffer.clear` event. - */ - fun visitInputAudioBufferCleared(inputAudioBufferCleared: InputAudioBufferClearedEvent): T - - /** - * Returned when an input audio buffer is committed, either by the client or automatically - * in server VAD mode. The `item_id` property is the ID of the user message item that will - * be created, thus a `conversation.item.created` event will also be sent to the client. - */ - fun visitInputAudioBufferCommitted( - inputAudioBufferCommitted: InputAudioBufferCommittedEvent - ): T - - /** - * Sent by the server when in `server_vad` mode to indicate that speech has been detected in - * the audio buffer. This can happen any time audio is added to the buffer (unless speech is - * already detected). The client may want to use this event to interrupt audio playback or - * provide visual feedback to the user. - * - * The client should expect to receive a `input_audio_buffer.speech_stopped` event when - * speech stops. The `item_id` property is the ID of the user message item that will be - * created when speech stops and will also be included in the - * `input_audio_buffer.speech_stopped` event (unless the client manually commits the audio - * buffer during VAD activation). - */ - fun visitInputAudioBufferSpeechStarted( - inputAudioBufferSpeechStarted: InputAudioBufferSpeechStartedEvent - ): T - - /** - * Returned in `server_vad` mode when the server detects the end of speech in the audio - * buffer. The server will also send an `conversation.item.created` event with the user - * message item that is created from the audio buffer. - */ - fun visitInputAudioBufferSpeechStopped( - inputAudioBufferSpeechStopped: InputAudioBufferSpeechStoppedEvent - ): T - - /** - * Emitted at the beginning of a Response to indicate the updated rate limits. When a - * Response is created some tokens will be "reserved" for the output tokens, the rate limits - * shown here reflect that reservation, which is then adjusted accordingly once the Response - * is completed. - */ - fun visitRateLimitsUpdated(rateLimitsUpdated: RateLimitsUpdatedEvent): T - - /** Returned when the model-generated audio is updated. */ - fun visitResponseAudioDelta(responseAudioDelta: ResponseAudioDeltaEvent): T - - /** - * Returned when the model-generated audio is done. Also emitted when a Response is - * interrupted, incomplete, or cancelled. - */ - fun visitResponseAudioDone(responseAudioDone: ResponseAudioDoneEvent): T - - /** Returned when the model-generated transcription of audio output is updated. */ - fun visitResponseAudioTranscriptDelta( - responseAudioTranscriptDelta: ResponseAudioTranscriptDeltaEvent - ): T - - /** - * Returned when the model-generated transcription of audio output is done streaming. Also - * emitted when a Response is interrupted, incomplete, or cancelled. - */ - fun visitResponseAudioTranscriptDone( - responseAudioTranscriptDone: ResponseAudioTranscriptDoneEvent - ): T - - /** - * Returned when a new content part is added to an assistant message item during response - * generation. - */ - fun visitResponseContentPartAdded( - responseContentPartAdded: ResponseContentPartAddedEvent - ): T - - /** - * Returned when a content part is done streaming in an assistant message item. Also emitted - * when a Response is interrupted, incomplete, or cancelled. - */ - fun visitResponseContentPartDone(responseContentPartDone: ResponseContentPartDoneEvent): T - - /** - * Returned when a new Response is created. The first event of response creation, where the - * response is in an initial state of `in_progress`. - */ - fun visitResponseCreated(responseCreated: ResponseCreatedEvent): T - - /** - * Returned when a Response is done streaming. Always emitted, no matter the final state. - * The Response object included in the `response.done` event will include all output Items - * in the Response but will omit the raw audio data. - */ - fun visitResponseDone(responseDone: ResponseDoneEvent): T - - /** Returned when the model-generated function call arguments are updated. */ - fun visitResponseFunctionCallArgumentsDelta( - responseFunctionCallArgumentsDelta: ResponseFunctionCallArgumentsDeltaEvent - ): T - - /** - * Returned when the model-generated function call arguments are done streaming. Also - * emitted when a Response is interrupted, incomplete, or cancelled. - */ - fun visitResponseFunctionCallArgumentsDone( - responseFunctionCallArgumentsDone: ResponseFunctionCallArgumentsDoneEvent - ): T - - /** Returned when a new Item is created during Response generation. */ - fun visitResponseOutputItemAdded(responseOutputItemAdded: ResponseOutputItemAddedEvent): T - - /** - * Returned when an Item is done streaming. Also emitted when a Response is interrupted, - * incomplete, or cancelled. - */ - fun visitResponseOutputItemDone(responseOutputItemDone: ResponseOutputItemDoneEvent): T - - /** Returned when the text value of a "text" content part is updated. */ - fun visitResponseTextDelta(responseTextDelta: ResponseTextDeltaEvent): T - - /** - * Returned when the text value of a "text" content part is done streaming. Also emitted - * when a Response is interrupted, incomplete, or cancelled. - */ - fun visitResponseTextDone(responseTextDone: ResponseTextDoneEvent): T - - /** - * Returned when a Session is created. Emitted automatically when a new connection is - * established as the first server event. This event will contain the default Session - * configuration. - */ - fun visitSessionCreated(sessionCreated: SessionCreatedEvent): T - - /** - * Returned when a session is updated with a `session.update` event, unless there is an - * error. - */ - fun visitSessionUpdated(sessionUpdated: SessionUpdatedEvent): T - - /** - * Returned when a transcription session is updated with a `transcription_session.update` - * event, unless there is an error. - */ - fun visitTranscriptionSessionUpdated( - transcriptionSessionUpdated: TranscriptionSessionUpdatedEvent - ): T - - /** - * **WebRTC Only:** Emitted when the server begins streaming audio to the client. This event - * is emitted after an audio content part has been added (`response.content_part.added`) to - * the response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - fun visitOutputAudioBufferStarted(outputAudioBufferStarted: OutputAudioBufferStarted): T - - /** - * **WebRTC Only:** Emitted when the output audio buffer has been completely drained on the - * server, and no more audio is forthcoming. This event is emitted after the full response - * data has been sent to the client (`response.done`). - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - fun visitOutputAudioBufferStopped(outputAudioBufferStopped: OutputAudioBufferStopped): T - - /** - * **WebRTC Only:** Emitted when the output audio buffer is cleared. This happens either in - * VAD mode when the user has interrupted (`input_audio_buffer.speech_started`), or when the - * client has emitted the `output_audio_buffer.clear` event to manually cut off the current - * audio response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - fun visitOutputAudioBufferCleared(outputAudioBufferCleared: OutputAudioBufferCleared): T - - /** - * Maps an unknown variant of [RealtimeServerEvent] to a value of type [T]. - * - * An instance of [RealtimeServerEvent] can contain an unknown variant if it was - * deserialized from data that doesn't match any known variant. For example, if the SDK is - * on an older version than the API, then the API may respond with new variants that the SDK - * is unaware of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown RealtimeServerEvent: $json") - } - } - - internal class Deserializer : - BaseDeserializer(RealtimeServerEvent::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): RealtimeServerEvent { - val json = JsonValue.fromJsonNode(node) - val type = json.asObject().getOrNull()?.get("type")?.asString()?.getOrNull() - - when (type) { - "conversation.created" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(conversationCreated = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "conversation.item.created" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeServerEvent(conversationItemCreated = it, _json = json) } - ?: RealtimeServerEvent(_json = json) - } - "conversation.item.deleted" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeServerEvent(conversationItemDeleted = it, _json = json) } - ?: RealtimeServerEvent(_json = json) - } - "conversation.item.input_audio_transcription.completed" -> { - return tryDeserialize( - node, - jacksonTypeRef(), - ) - ?.let { - RealtimeServerEvent( - conversationItemInputAudioTranscriptionCompleted = it, - _json = json, - ) - } ?: RealtimeServerEvent(_json = json) - } - "conversation.item.input_audio_transcription.delta" -> { - return tryDeserialize( - node, - jacksonTypeRef(), - ) - ?.let { - RealtimeServerEvent( - conversationItemInputAudioTranscriptionDelta = it, - _json = json, - ) - } ?: RealtimeServerEvent(_json = json) - } - "conversation.item.input_audio_transcription.failed" -> { - return tryDeserialize( - node, - jacksonTypeRef(), - ) - ?.let { - RealtimeServerEvent( - conversationItemInputAudioTranscriptionFailed = it, - _json = json, - ) - } ?: RealtimeServerEvent(_json = json) - } - "conversation.item.retrieved" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(conversationItemRetrieved = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "conversation.item.truncated" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeServerEvent(conversationItemTruncated = it, _json = json) } - ?: RealtimeServerEvent(_json = json) - } - "error" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(error = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "input_audio_buffer.cleared" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeServerEvent(inputAudioBufferCleared = it, _json = json) } - ?: RealtimeServerEvent(_json = json) - } - "input_audio_buffer.committed" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeServerEvent(inputAudioBufferCommitted = it, _json = json) } - ?: RealtimeServerEvent(_json = json) - } - "input_audio_buffer.speech_started" -> { - return tryDeserialize( - node, - jacksonTypeRef(), - ) - ?.let { - RealtimeServerEvent(inputAudioBufferSpeechStarted = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "input_audio_buffer.speech_stopped" -> { - return tryDeserialize( - node, - jacksonTypeRef(), - ) - ?.let { - RealtimeServerEvent(inputAudioBufferSpeechStopped = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "rate_limits.updated" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(rateLimitsUpdated = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "response.audio.delta" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(responseAudioDelta = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "response.audio.done" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(responseAudioDone = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "response.audio_transcript.delta" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { - RealtimeServerEvent(responseAudioTranscriptDelta = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "response.audio_transcript.done" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { - RealtimeServerEvent(responseAudioTranscriptDone = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "response.content_part.added" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeServerEvent(responseContentPartAdded = it, _json = json) } - ?: RealtimeServerEvent(_json = json) - } - "response.content_part.done" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeServerEvent(responseContentPartDone = it, _json = json) } - ?: RealtimeServerEvent(_json = json) - } - "response.created" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(responseCreated = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "response.done" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(responseDone = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "response.function_call_arguments.delta" -> { - return tryDeserialize( - node, - jacksonTypeRef(), - ) - ?.let { - RealtimeServerEvent( - responseFunctionCallArgumentsDelta = it, - _json = json, - ) - } ?: RealtimeServerEvent(_json = json) - } - "response.function_call_arguments.done" -> { - return tryDeserialize( - node, - jacksonTypeRef(), - ) - ?.let { - RealtimeServerEvent( - responseFunctionCallArgumentsDone = it, - _json = json, - ) - } ?: RealtimeServerEvent(_json = json) - } - "response.output_item.added" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeServerEvent(responseOutputItemAdded = it, _json = json) } - ?: RealtimeServerEvent(_json = json) - } - "response.output_item.done" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { RealtimeServerEvent(responseOutputItemDone = it, _json = json) } - ?: RealtimeServerEvent(_json = json) - } - "response.text.delta" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(responseTextDelta = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "response.text.done" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(responseTextDone = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "session.created" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(sessionCreated = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "session.updated" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(sessionUpdated = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "transcription_session.updated" -> { - return tryDeserialize(node, jacksonTypeRef()) - ?.let { - RealtimeServerEvent(transcriptionSessionUpdated = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "output_audio_buffer.started" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(outputAudioBufferStarted = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "output_audio_buffer.stopped" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(outputAudioBufferStopped = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - "output_audio_buffer.cleared" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { - RealtimeServerEvent(outputAudioBufferCleared = it, _json = json) - } ?: RealtimeServerEvent(_json = json) - } - } - - return RealtimeServerEvent(_json = json) - } - } - - internal class Serializer : BaseSerializer(RealtimeServerEvent::class) { - - override fun serialize( - value: RealtimeServerEvent, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.conversationCreated != null -> - generator.writeObject(value.conversationCreated) - value.conversationItemCreated != null -> - generator.writeObject(value.conversationItemCreated) - value.conversationItemDeleted != null -> - generator.writeObject(value.conversationItemDeleted) - value.conversationItemInputAudioTranscriptionCompleted != null -> - generator.writeObject(value.conversationItemInputAudioTranscriptionCompleted) - value.conversationItemInputAudioTranscriptionDelta != null -> - generator.writeObject(value.conversationItemInputAudioTranscriptionDelta) - value.conversationItemInputAudioTranscriptionFailed != null -> - generator.writeObject(value.conversationItemInputAudioTranscriptionFailed) - value.conversationItemRetrieved != null -> - generator.writeObject(value.conversationItemRetrieved) - value.conversationItemTruncated != null -> - generator.writeObject(value.conversationItemTruncated) - value.error != null -> generator.writeObject(value.error) - value.inputAudioBufferCleared != null -> - generator.writeObject(value.inputAudioBufferCleared) - value.inputAudioBufferCommitted != null -> - generator.writeObject(value.inputAudioBufferCommitted) - value.inputAudioBufferSpeechStarted != null -> - generator.writeObject(value.inputAudioBufferSpeechStarted) - value.inputAudioBufferSpeechStopped != null -> - generator.writeObject(value.inputAudioBufferSpeechStopped) - value.rateLimitsUpdated != null -> generator.writeObject(value.rateLimitsUpdated) - value.responseAudioDelta != null -> generator.writeObject(value.responseAudioDelta) - value.responseAudioDone != null -> generator.writeObject(value.responseAudioDone) - value.responseAudioTranscriptDelta != null -> - generator.writeObject(value.responseAudioTranscriptDelta) - value.responseAudioTranscriptDone != null -> - generator.writeObject(value.responseAudioTranscriptDone) - value.responseContentPartAdded != null -> - generator.writeObject(value.responseContentPartAdded) - value.responseContentPartDone != null -> - generator.writeObject(value.responseContentPartDone) - value.responseCreated != null -> generator.writeObject(value.responseCreated) - value.responseDone != null -> generator.writeObject(value.responseDone) - value.responseFunctionCallArgumentsDelta != null -> - generator.writeObject(value.responseFunctionCallArgumentsDelta) - value.responseFunctionCallArgumentsDone != null -> - generator.writeObject(value.responseFunctionCallArgumentsDone) - value.responseOutputItemAdded != null -> - generator.writeObject(value.responseOutputItemAdded) - value.responseOutputItemDone != null -> - generator.writeObject(value.responseOutputItemDone) - value.responseTextDelta != null -> generator.writeObject(value.responseTextDelta) - value.responseTextDone != null -> generator.writeObject(value.responseTextDone) - value.sessionCreated != null -> generator.writeObject(value.sessionCreated) - value.sessionUpdated != null -> generator.writeObject(value.sessionUpdated) - value.transcriptionSessionUpdated != null -> - generator.writeObject(value.transcriptionSessionUpdated) - value.outputAudioBufferStarted != null -> - generator.writeObject(value.outputAudioBufferStarted) - value.outputAudioBufferStopped != null -> - generator.writeObject(value.outputAudioBufferStopped) - value.outputAudioBufferCleared != null -> - generator.writeObject(value.outputAudioBufferCleared) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid RealtimeServerEvent") - } - } - } - - /** Returned when a conversation item is retrieved with `conversation.item.retrieve`. */ - class ConversationItemRetrieved - private constructor( - private val eventId: JsonField, - private val item: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item") - @ExcludeMissing - item: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, item, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The item to add to the conversation. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun item(): ConversationItem = item.getRequired("item") - - /** - * The event type, must be `conversation.item.retrieved`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("conversation.item.retrieved") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server - * responded with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [item]. - * - * Unlike [item], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item") @ExcludeMissing fun _item(): JsonField = item - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [ConversationItemRetrieved]. - * - * The following fields are required: - * ```java - * .eventId() - * .item() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ConversationItemRetrieved]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var item: JsonField? = null - private var type: JsonValue = JsonValue.from("conversation.item.retrieved") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(conversationItemRetrieved: ConversationItemRetrieved) = apply { - eventId = conversationItemRetrieved.eventId - item = conversationItemRetrieved.item - type = conversationItemRetrieved.type - additionalProperties = conversationItemRetrieved.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The item to add to the conversation. */ - fun item(item: ConversationItem) = item(JsonField.of(item)) - - /** - * Sets [Builder.item] to an arbitrary JSON value. - * - * You should usually call [Builder.item] with a well-typed [ConversationItem] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun item(item: JsonField) = apply { this.item = item } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("conversation.item.retrieved") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ConversationItemRetrieved]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .item() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ConversationItemRetrieved = - ConversationItemRetrieved( - checkRequired("eventId", eventId), - checkRequired("item", item), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ConversationItemRetrieved = apply { - if (validated) { - return@apply - } - - eventId() - item().validate() - _type().let { - if (it != JsonValue.from("conversation.item.retrieved")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (item.asKnown().getOrNull()?.validity() ?: 0) + - type.let { if (it == JsonValue.from("conversation.item.retrieved")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ConversationItemRetrieved && - eventId == other.eventId && - item == other.item && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(eventId, item, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ConversationItemRetrieved{eventId=$eventId, item=$item, type=$type, additionalProperties=$additionalProperties}" - } - - /** - * **WebRTC Only:** Emitted when the server begins streaming audio to the client. This event is - * emitted after an audio content part has been added (`response.content_part.added`) to the - * response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - class OutputAudioBufferStarted - private constructor( - private val eventId: JsonField, - private val responseId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, responseId, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The unique ID of the response that produced the audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The event type, must be `output_audio_buffer.started`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("output_audio_buffer.started") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server - * responded with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") - @ExcludeMissing - fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [OutputAudioBufferStarted]. - * - * The following fields are required: - * ```java - * .eventId() - * .responseId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [OutputAudioBufferStarted]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var responseId: JsonField? = null - private var type: JsonValue = JsonValue.from("output_audio_buffer.started") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(outputAudioBufferStarted: OutputAudioBufferStarted) = apply { - eventId = outputAudioBufferStarted.eventId - responseId = outputAudioBufferStarted.responseId - type = outputAudioBufferStarted.type - additionalProperties = outputAudioBufferStarted.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The unique ID of the response that produced the audio. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("output_audio_buffer.started") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [OutputAudioBufferStarted]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .responseId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): OutputAudioBufferStarted = - OutputAudioBufferStarted( - checkRequired("eventId", eventId), - checkRequired("responseId", responseId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): OutputAudioBufferStarted = apply { - if (validated) { - return@apply - } - - eventId() - responseId() - _type().let { - if (it != JsonValue.from("output_audio_buffer.started")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("output_audio_buffer.started")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is OutputAudioBufferStarted && - eventId == other.eventId && - responseId == other.responseId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(eventId, responseId, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "OutputAudioBufferStarted{eventId=$eventId, responseId=$responseId, type=$type, additionalProperties=$additionalProperties}" - } - - /** - * **WebRTC Only:** Emitted when the output audio buffer has been completely drained on the - * server, and no more audio is forthcoming. This event is emitted after the full response data - * has been sent to the client (`response.done`). - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - class OutputAudioBufferStopped - private constructor( - private val eventId: JsonField, - private val responseId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, responseId, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The unique ID of the response that produced the audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The event type, must be `output_audio_buffer.stopped`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("output_audio_buffer.stopped") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server - * responded with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") - @ExcludeMissing - fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [OutputAudioBufferStopped]. - * - * The following fields are required: - * ```java - * .eventId() - * .responseId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [OutputAudioBufferStopped]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var responseId: JsonField? = null - private var type: JsonValue = JsonValue.from("output_audio_buffer.stopped") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(outputAudioBufferStopped: OutputAudioBufferStopped) = apply { - eventId = outputAudioBufferStopped.eventId - responseId = outputAudioBufferStopped.responseId - type = outputAudioBufferStopped.type - additionalProperties = outputAudioBufferStopped.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The unique ID of the response that produced the audio. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("output_audio_buffer.stopped") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [OutputAudioBufferStopped]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .responseId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): OutputAudioBufferStopped = - OutputAudioBufferStopped( - checkRequired("eventId", eventId), - checkRequired("responseId", responseId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): OutputAudioBufferStopped = apply { - if (validated) { - return@apply - } - - eventId() - responseId() - _type().let { - if (it != JsonValue.from("output_audio_buffer.stopped")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("output_audio_buffer.stopped")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is OutputAudioBufferStopped && - eventId == other.eventId && - responseId == other.responseId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(eventId, responseId, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "OutputAudioBufferStopped{eventId=$eventId, responseId=$responseId, type=$type, additionalProperties=$additionalProperties}" - } - - /** - * **WebRTC Only:** Emitted when the output audio buffer is cleared. This happens either in VAD - * mode when the user has interrupted (`input_audio_buffer.speech_started`), or when the client - * has emitted the `output_audio_buffer.clear` event to manually cut off the current audio - * response. - * [Learn more](https://platform.openai.com/docs/guides/realtime-conversations#client-and-server-events-for-audio-in-webrtc). - */ - class OutputAudioBufferCleared - private constructor( - private val eventId: JsonField, - private val responseId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, responseId, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The unique ID of the response that produced the audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The event type, must be `output_audio_buffer.cleared`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("output_audio_buffer.cleared") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server - * responded with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") - @ExcludeMissing - fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [OutputAudioBufferCleared]. - * - * The following fields are required: - * ```java - * .eventId() - * .responseId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [OutputAudioBufferCleared]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var responseId: JsonField? = null - private var type: JsonValue = JsonValue.from("output_audio_buffer.cleared") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(outputAudioBufferCleared: OutputAudioBufferCleared) = apply { - eventId = outputAudioBufferCleared.eventId - responseId = outputAudioBufferCleared.responseId - type = outputAudioBufferCleared.type - additionalProperties = outputAudioBufferCleared.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The unique ID of the response that produced the audio. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("output_audio_buffer.cleared") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [OutputAudioBufferCleared]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .responseId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): OutputAudioBufferCleared = - OutputAudioBufferCleared( - checkRequired("eventId", eventId), - checkRequired("responseId", responseId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): OutputAudioBufferCleared = apply { - if (validated) { - return@apply - } - - eventId() - responseId() - _type().let { - if (it != JsonValue.from("output_audio_buffer.cleared")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("output_audio_buffer.cleared")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is OutputAudioBufferCleared && - eventId == other.eventId && - responseId == other.responseId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(eventId, responseId, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "OutputAudioBufferCleared{eventId=$eventId, responseId=$responseId, type=$type, additionalProperties=$additionalProperties}" - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioDeltaEvent.kt deleted file mode 100644 index b039c9753..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioDeltaEvent.kt +++ /dev/null @@ -1,416 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects - -/** Returned when the model-generated audio is updated. */ -class ResponseAudioDeltaEvent -private constructor( - private val contentIndex: JsonField, - private val delta: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val outputIndex: JsonField, - private val responseId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("content_index") - @ExcludeMissing - contentIndex: JsonField = JsonMissing.of(), - @JsonProperty("delta") @ExcludeMissing delta: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("output_index") - @ExcludeMissing - outputIndex: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(contentIndex, delta, eventId, itemId, outputIndex, responseId, type, mutableMapOf()) - - /** - * The index of the content part in the item's content array. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun contentIndex(): Long = contentIndex.getRequired("content_index") - - /** - * Base64-encoded audio data delta. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun delta(): String = delta.getRequired("delta") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the item. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The index of the output item in the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun outputIndex(): Long = outputIndex.getRequired("output_index") - - /** - * The ID of the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The event type, must be `response.audio.delta`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.audio.delta") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [contentIndex]. - * - * Unlike [contentIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content_index") - @ExcludeMissing - fun _contentIndex(): JsonField = contentIndex - - /** - * Returns the raw JSON value of [delta]. - * - * Unlike [delta], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("delta") @ExcludeMissing fun _delta(): JsonField = delta - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [outputIndex]. - * - * Unlike [outputIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output_index") @ExcludeMissing fun _outputIndex(): JsonField = outputIndex - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") @ExcludeMissing fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ResponseAudioDeltaEvent]. - * - * The following fields are required: - * ```java - * .contentIndex() - * .delta() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseAudioDeltaEvent]. */ - class Builder internal constructor() { - - private var contentIndex: JsonField? = null - private var delta: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var outputIndex: JsonField? = null - private var responseId: JsonField? = null - private var type: JsonValue = JsonValue.from("response.audio.delta") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseAudioDeltaEvent: ResponseAudioDeltaEvent) = apply { - contentIndex = responseAudioDeltaEvent.contentIndex - delta = responseAudioDeltaEvent.delta - eventId = responseAudioDeltaEvent.eventId - itemId = responseAudioDeltaEvent.itemId - outputIndex = responseAudioDeltaEvent.outputIndex - responseId = responseAudioDeltaEvent.responseId - type = responseAudioDeltaEvent.type - additionalProperties = responseAudioDeltaEvent.additionalProperties.toMutableMap() - } - - /** The index of the content part in the item's content array. */ - fun contentIndex(contentIndex: Long) = contentIndex(JsonField.of(contentIndex)) - - /** - * Sets [Builder.contentIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.contentIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun contentIndex(contentIndex: JsonField) = apply { this.contentIndex = contentIndex } - - /** Base64-encoded audio data delta. */ - fun delta(delta: String) = delta(JsonField.of(delta)) - - /** - * Sets [Builder.delta] to an arbitrary JSON value. - * - * You should usually call [Builder.delta] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun delta(delta: JsonField) = apply { this.delta = delta } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the item. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** The index of the output item in the response. */ - fun outputIndex(outputIndex: Long) = outputIndex(JsonField.of(outputIndex)) - - /** - * Sets [Builder.outputIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.outputIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun outputIndex(outputIndex: JsonField) = apply { this.outputIndex = outputIndex } - - /** The ID of the response. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.audio.delta") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseAudioDeltaEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .contentIndex() - * .delta() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseAudioDeltaEvent = - ResponseAudioDeltaEvent( - checkRequired("contentIndex", contentIndex), - checkRequired("delta", delta), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - checkRequired("outputIndex", outputIndex), - checkRequired("responseId", responseId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseAudioDeltaEvent = apply { - if (validated) { - return@apply - } - - contentIndex() - delta() - eventId() - itemId() - outputIndex() - responseId() - _type().let { - if (it != JsonValue.from("response.audio.delta")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (contentIndex.asKnown().isPresent) 1 else 0) + - (if (delta.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - (if (outputIndex.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("response.audio.delta")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseAudioDeltaEvent && - contentIndex == other.contentIndex && - delta == other.delta && - eventId == other.eventId && - itemId == other.itemId && - outputIndex == other.outputIndex && - responseId == other.responseId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - contentIndex, - delta, - eventId, - itemId, - outputIndex, - responseId, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseAudioDeltaEvent{contentIndex=$contentIndex, delta=$delta, eventId=$eventId, itemId=$itemId, outputIndex=$outputIndex, responseId=$responseId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioDoneEvent.kt deleted file mode 100644 index 098959c89..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioDoneEvent.kt +++ /dev/null @@ -1,382 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects - -/** - * Returned when the model-generated audio is done. Also emitted when a Response is interrupted, - * incomplete, or cancelled. - */ -class ResponseAudioDoneEvent -private constructor( - private val contentIndex: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val outputIndex: JsonField, - private val responseId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("content_index") - @ExcludeMissing - contentIndex: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("output_index") - @ExcludeMissing - outputIndex: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(contentIndex, eventId, itemId, outputIndex, responseId, type, mutableMapOf()) - - /** - * The index of the content part in the item's content array. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun contentIndex(): Long = contentIndex.getRequired("content_index") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the item. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The index of the output item in the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun outputIndex(): Long = outputIndex.getRequired("output_index") - - /** - * The ID of the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The event type, must be `response.audio.done`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.audio.done") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [contentIndex]. - * - * Unlike [contentIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content_index") - @ExcludeMissing - fun _contentIndex(): JsonField = contentIndex - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [outputIndex]. - * - * Unlike [outputIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output_index") @ExcludeMissing fun _outputIndex(): JsonField = outputIndex - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") @ExcludeMissing fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ResponseAudioDoneEvent]. - * - * The following fields are required: - * ```java - * .contentIndex() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseAudioDoneEvent]. */ - class Builder internal constructor() { - - private var contentIndex: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var outputIndex: JsonField? = null - private var responseId: JsonField? = null - private var type: JsonValue = JsonValue.from("response.audio.done") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseAudioDoneEvent: ResponseAudioDoneEvent) = apply { - contentIndex = responseAudioDoneEvent.contentIndex - eventId = responseAudioDoneEvent.eventId - itemId = responseAudioDoneEvent.itemId - outputIndex = responseAudioDoneEvent.outputIndex - responseId = responseAudioDoneEvent.responseId - type = responseAudioDoneEvent.type - additionalProperties = responseAudioDoneEvent.additionalProperties.toMutableMap() - } - - /** The index of the content part in the item's content array. */ - fun contentIndex(contentIndex: Long) = contentIndex(JsonField.of(contentIndex)) - - /** - * Sets [Builder.contentIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.contentIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun contentIndex(contentIndex: JsonField) = apply { this.contentIndex = contentIndex } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the item. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** The index of the output item in the response. */ - fun outputIndex(outputIndex: Long) = outputIndex(JsonField.of(outputIndex)) - - /** - * Sets [Builder.outputIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.outputIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun outputIndex(outputIndex: JsonField) = apply { this.outputIndex = outputIndex } - - /** The ID of the response. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.audio.done") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseAudioDoneEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .contentIndex() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseAudioDoneEvent = - ResponseAudioDoneEvent( - checkRequired("contentIndex", contentIndex), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - checkRequired("outputIndex", outputIndex), - checkRequired("responseId", responseId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseAudioDoneEvent = apply { - if (validated) { - return@apply - } - - contentIndex() - eventId() - itemId() - outputIndex() - responseId() - _type().let { - if (it != JsonValue.from("response.audio.done")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (contentIndex.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - (if (outputIndex.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("response.audio.done")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseAudioDoneEvent && - contentIndex == other.contentIndex && - eventId == other.eventId && - itemId == other.itemId && - outputIndex == other.outputIndex && - responseId == other.responseId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - contentIndex, - eventId, - itemId, - outputIndex, - responseId, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseAudioDoneEvent{contentIndex=$contentIndex, eventId=$eventId, itemId=$itemId, outputIndex=$outputIndex, responseId=$responseId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDeltaEvent.kt deleted file mode 100644 index 05426b897..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDeltaEvent.kt +++ /dev/null @@ -1,419 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects - -/** Returned when the model-generated transcription of audio output is updated. */ -class ResponseAudioTranscriptDeltaEvent -private constructor( - private val contentIndex: JsonField, - private val delta: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val outputIndex: JsonField, - private val responseId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("content_index") - @ExcludeMissing - contentIndex: JsonField = JsonMissing.of(), - @JsonProperty("delta") @ExcludeMissing delta: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("output_index") - @ExcludeMissing - outputIndex: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(contentIndex, delta, eventId, itemId, outputIndex, responseId, type, mutableMapOf()) - - /** - * The index of the content part in the item's content array. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun contentIndex(): Long = contentIndex.getRequired("content_index") - - /** - * The transcript delta. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun delta(): String = delta.getRequired("delta") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the item. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The index of the output item in the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun outputIndex(): Long = outputIndex.getRequired("output_index") - - /** - * The ID of the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The event type, must be `response.audio_transcript.delta`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.audio_transcript.delta") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [contentIndex]. - * - * Unlike [contentIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content_index") - @ExcludeMissing - fun _contentIndex(): JsonField = contentIndex - - /** - * Returns the raw JSON value of [delta]. - * - * Unlike [delta], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("delta") @ExcludeMissing fun _delta(): JsonField = delta - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [outputIndex]. - * - * Unlike [outputIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output_index") @ExcludeMissing fun _outputIndex(): JsonField = outputIndex - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") @ExcludeMissing fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [ResponseAudioTranscriptDeltaEvent]. - * - * The following fields are required: - * ```java - * .contentIndex() - * .delta() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseAudioTranscriptDeltaEvent]. */ - class Builder internal constructor() { - - private var contentIndex: JsonField? = null - private var delta: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var outputIndex: JsonField? = null - private var responseId: JsonField? = null - private var type: JsonValue = JsonValue.from("response.audio_transcript.delta") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseAudioTranscriptDeltaEvent: ResponseAudioTranscriptDeltaEvent) = - apply { - contentIndex = responseAudioTranscriptDeltaEvent.contentIndex - delta = responseAudioTranscriptDeltaEvent.delta - eventId = responseAudioTranscriptDeltaEvent.eventId - itemId = responseAudioTranscriptDeltaEvent.itemId - outputIndex = responseAudioTranscriptDeltaEvent.outputIndex - responseId = responseAudioTranscriptDeltaEvent.responseId - type = responseAudioTranscriptDeltaEvent.type - additionalProperties = - responseAudioTranscriptDeltaEvent.additionalProperties.toMutableMap() - } - - /** The index of the content part in the item's content array. */ - fun contentIndex(contentIndex: Long) = contentIndex(JsonField.of(contentIndex)) - - /** - * Sets [Builder.contentIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.contentIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun contentIndex(contentIndex: JsonField) = apply { this.contentIndex = contentIndex } - - /** The transcript delta. */ - fun delta(delta: String) = delta(JsonField.of(delta)) - - /** - * Sets [Builder.delta] to an arbitrary JSON value. - * - * You should usually call [Builder.delta] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun delta(delta: JsonField) = apply { this.delta = delta } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the item. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** The index of the output item in the response. */ - fun outputIndex(outputIndex: Long) = outputIndex(JsonField.of(outputIndex)) - - /** - * Sets [Builder.outputIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.outputIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun outputIndex(outputIndex: JsonField) = apply { this.outputIndex = outputIndex } - - /** The ID of the response. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.audio_transcript.delta") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseAudioTranscriptDeltaEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .contentIndex() - * .delta() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseAudioTranscriptDeltaEvent = - ResponseAudioTranscriptDeltaEvent( - checkRequired("contentIndex", contentIndex), - checkRequired("delta", delta), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - checkRequired("outputIndex", outputIndex), - checkRequired("responseId", responseId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseAudioTranscriptDeltaEvent = apply { - if (validated) { - return@apply - } - - contentIndex() - delta() - eventId() - itemId() - outputIndex() - responseId() - _type().let { - if (it != JsonValue.from("response.audio_transcript.delta")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (contentIndex.asKnown().isPresent) 1 else 0) + - (if (delta.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - (if (outputIndex.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("response.audio_transcript.delta")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseAudioTranscriptDeltaEvent && - contentIndex == other.contentIndex && - delta == other.delta && - eventId == other.eventId && - itemId == other.itemId && - outputIndex == other.outputIndex && - responseId == other.responseId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - contentIndex, - delta, - eventId, - itemId, - outputIndex, - responseId, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseAudioTranscriptDeltaEvent{contentIndex=$contentIndex, delta=$delta, eventId=$eventId, itemId=$itemId, outputIndex=$outputIndex, responseId=$responseId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDoneEvent.kt deleted file mode 100644 index 1b8a6556a..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDoneEvent.kt +++ /dev/null @@ -1,434 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects - -/** - * Returned when the model-generated transcription of audio output is done streaming. Also emitted - * when a Response is interrupted, incomplete, or cancelled. - */ -class ResponseAudioTranscriptDoneEvent -private constructor( - private val contentIndex: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val outputIndex: JsonField, - private val responseId: JsonField, - private val transcript: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("content_index") - @ExcludeMissing - contentIndex: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("output_index") - @ExcludeMissing - outputIndex: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("transcript") - @ExcludeMissing - transcript: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this( - contentIndex, - eventId, - itemId, - outputIndex, - responseId, - transcript, - type, - mutableMapOf(), - ) - - /** - * The index of the content part in the item's content array. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun contentIndex(): Long = contentIndex.getRequired("content_index") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the item. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The index of the output item in the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun outputIndex(): Long = outputIndex.getRequired("output_index") - - /** - * The ID of the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The final transcript of the audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun transcript(): String = transcript.getRequired("transcript") - - /** - * The event type, must be `response.audio_transcript.done`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.audio_transcript.done") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [contentIndex]. - * - * Unlike [contentIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content_index") - @ExcludeMissing - fun _contentIndex(): JsonField = contentIndex - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [outputIndex]. - * - * Unlike [outputIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output_index") @ExcludeMissing fun _outputIndex(): JsonField = outputIndex - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") @ExcludeMissing fun _responseId(): JsonField = responseId - - /** - * Returns the raw JSON value of [transcript]. - * - * Unlike [transcript], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("transcript") @ExcludeMissing fun _transcript(): JsonField = transcript - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [ResponseAudioTranscriptDoneEvent]. - * - * The following fields are required: - * ```java - * .contentIndex() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * .transcript() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseAudioTranscriptDoneEvent]. */ - class Builder internal constructor() { - - private var contentIndex: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var outputIndex: JsonField? = null - private var responseId: JsonField? = null - private var transcript: JsonField? = null - private var type: JsonValue = JsonValue.from("response.audio_transcript.done") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseAudioTranscriptDoneEvent: ResponseAudioTranscriptDoneEvent) = - apply { - contentIndex = responseAudioTranscriptDoneEvent.contentIndex - eventId = responseAudioTranscriptDoneEvent.eventId - itemId = responseAudioTranscriptDoneEvent.itemId - outputIndex = responseAudioTranscriptDoneEvent.outputIndex - responseId = responseAudioTranscriptDoneEvent.responseId - transcript = responseAudioTranscriptDoneEvent.transcript - type = responseAudioTranscriptDoneEvent.type - additionalProperties = - responseAudioTranscriptDoneEvent.additionalProperties.toMutableMap() - } - - /** The index of the content part in the item's content array. */ - fun contentIndex(contentIndex: Long) = contentIndex(JsonField.of(contentIndex)) - - /** - * Sets [Builder.contentIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.contentIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun contentIndex(contentIndex: JsonField) = apply { this.contentIndex = contentIndex } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the item. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** The index of the output item in the response. */ - fun outputIndex(outputIndex: Long) = outputIndex(JsonField.of(outputIndex)) - - /** - * Sets [Builder.outputIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.outputIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun outputIndex(outputIndex: JsonField) = apply { this.outputIndex = outputIndex } - - /** The ID of the response. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** The final transcript of the audio. */ - fun transcript(transcript: String) = transcript(JsonField.of(transcript)) - - /** - * Sets [Builder.transcript] to an arbitrary JSON value. - * - * You should usually call [Builder.transcript] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun transcript(transcript: JsonField) = apply { this.transcript = transcript } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.audio_transcript.done") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseAudioTranscriptDoneEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .contentIndex() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * .transcript() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseAudioTranscriptDoneEvent = - ResponseAudioTranscriptDoneEvent( - checkRequired("contentIndex", contentIndex), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - checkRequired("outputIndex", outputIndex), - checkRequired("responseId", responseId), - checkRequired("transcript", transcript), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseAudioTranscriptDoneEvent = apply { - if (validated) { - return@apply - } - - contentIndex() - eventId() - itemId() - outputIndex() - responseId() - transcript() - _type().let { - if (it != JsonValue.from("response.audio_transcript.done")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (contentIndex.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - (if (outputIndex.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - (if (transcript.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("response.audio_transcript.done")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseAudioTranscriptDoneEvent && - contentIndex == other.contentIndex && - eventId == other.eventId && - itemId == other.itemId && - outputIndex == other.outputIndex && - responseId == other.responseId && - transcript == other.transcript && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - contentIndex, - eventId, - itemId, - outputIndex, - responseId, - transcript, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseAudioTranscriptDoneEvent{contentIndex=$contentIndex, eventId=$eventId, itemId=$itemId, outputIndex=$outputIndex, responseId=$responseId, transcript=$transcript, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseCancelEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseCancelEvent.kt deleted file mode 100644 index 580f08fcd..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseCancelEvent.kt +++ /dev/null @@ -1,242 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional - -/** - * Send this event to cancel an in-progress response. The server will respond with a `response.done` - * event with a status of `response.status=cancelled`. If there is no response to cancel, the server - * will respond with an error. - */ -class ResponseCancelEvent -private constructor( - private val type: JsonValue, - private val eventId: JsonField, - private val responseId: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - ) : this(type, eventId, responseId, mutableMapOf()) - - /** - * The event type, must be `response.cancel`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.cancel") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Optional client-generated ID used to identify this event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eventId(): Optional = eventId.getOptional("event_id") - - /** - * A specific response ID to cancel - if not provided, will cancel an in-progress response in - * the default conversation. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun responseId(): Optional = responseId.getOptional("response_id") - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") @ExcludeMissing fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [ResponseCancelEvent]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseCancelEvent]. */ - class Builder internal constructor() { - - private var type: JsonValue = JsonValue.from("response.cancel") - private var eventId: JsonField = JsonMissing.of() - private var responseId: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseCancelEvent: ResponseCancelEvent) = apply { - type = responseCancelEvent.type - eventId = responseCancelEvent.eventId - responseId = responseCancelEvent.responseId - additionalProperties = responseCancelEvent.additionalProperties.toMutableMap() - } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.cancel") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** Optional client-generated ID used to identify this event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** - * A specific response ID to cancel - if not provided, will cancel an in-progress response - * in the default conversation. - */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseCancelEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): ResponseCancelEvent = - ResponseCancelEvent(type, eventId, responseId, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): ResponseCancelEvent = apply { - if (validated) { - return@apply - } - - _type().let { - if (it != JsonValue.from("response.cancel")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - eventId() - responseId() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - type.let { if (it == JsonValue.from("response.cancel")) 1 else 0 } + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseCancelEvent && - type == other.type && - eventId == other.eventId && - responseId == other.responseId && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(type, eventId, responseId, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseCancelEvent{type=$type, eventId=$eventId, responseId=$responseId, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseContentPartAddedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseContentPartAddedEvent.kt deleted file mode 100644 index e270a5377..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseContentPartAddedEvent.kt +++ /dev/null @@ -1,803 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * Returned when a new content part is added to an assistant message item during response - * generation. - */ -class ResponseContentPartAddedEvent -private constructor( - private val contentIndex: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val outputIndex: JsonField, - private val part: JsonField, - private val responseId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("content_index") - @ExcludeMissing - contentIndex: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("output_index") - @ExcludeMissing - outputIndex: JsonField = JsonMissing.of(), - @JsonProperty("part") @ExcludeMissing part: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(contentIndex, eventId, itemId, outputIndex, part, responseId, type, mutableMapOf()) - - /** - * The index of the content part in the item's content array. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun contentIndex(): Long = contentIndex.getRequired("content_index") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the item to which the content part was added. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The index of the output item in the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun outputIndex(): Long = outputIndex.getRequired("output_index") - - /** - * The content part that was added. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun part(): Part = part.getRequired("part") - - /** - * The ID of the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The event type, must be `response.content_part.added`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.content_part.added") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [contentIndex]. - * - * Unlike [contentIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content_index") - @ExcludeMissing - fun _contentIndex(): JsonField = contentIndex - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [outputIndex]. - * - * Unlike [outputIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output_index") @ExcludeMissing fun _outputIndex(): JsonField = outputIndex - - /** - * Returns the raw JSON value of [part]. - * - * Unlike [part], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("part") @ExcludeMissing fun _part(): JsonField = part - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") @ExcludeMissing fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [ResponseContentPartAddedEvent]. - * - * The following fields are required: - * ```java - * .contentIndex() - * .eventId() - * .itemId() - * .outputIndex() - * .part() - * .responseId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseContentPartAddedEvent]. */ - class Builder internal constructor() { - - private var contentIndex: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var outputIndex: JsonField? = null - private var part: JsonField? = null - private var responseId: JsonField? = null - private var type: JsonValue = JsonValue.from("response.content_part.added") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseContentPartAddedEvent: ResponseContentPartAddedEvent) = apply { - contentIndex = responseContentPartAddedEvent.contentIndex - eventId = responseContentPartAddedEvent.eventId - itemId = responseContentPartAddedEvent.itemId - outputIndex = responseContentPartAddedEvent.outputIndex - part = responseContentPartAddedEvent.part - responseId = responseContentPartAddedEvent.responseId - type = responseContentPartAddedEvent.type - additionalProperties = responseContentPartAddedEvent.additionalProperties.toMutableMap() - } - - /** The index of the content part in the item's content array. */ - fun contentIndex(contentIndex: Long) = contentIndex(JsonField.of(contentIndex)) - - /** - * Sets [Builder.contentIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.contentIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun contentIndex(contentIndex: JsonField) = apply { this.contentIndex = contentIndex } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the item to which the content part was added. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** The index of the output item in the response. */ - fun outputIndex(outputIndex: Long) = outputIndex(JsonField.of(outputIndex)) - - /** - * Sets [Builder.outputIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.outputIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun outputIndex(outputIndex: JsonField) = apply { this.outputIndex = outputIndex } - - /** The content part that was added. */ - fun part(part: Part) = part(JsonField.of(part)) - - /** - * Sets [Builder.part] to an arbitrary JSON value. - * - * You should usually call [Builder.part] with a well-typed [Part] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun part(part: JsonField) = apply { this.part = part } - - /** The ID of the response. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.content_part.added") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseContentPartAddedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .contentIndex() - * .eventId() - * .itemId() - * .outputIndex() - * .part() - * .responseId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseContentPartAddedEvent = - ResponseContentPartAddedEvent( - checkRequired("contentIndex", contentIndex), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - checkRequired("outputIndex", outputIndex), - checkRequired("part", part), - checkRequired("responseId", responseId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseContentPartAddedEvent = apply { - if (validated) { - return@apply - } - - contentIndex() - eventId() - itemId() - outputIndex() - part().validate() - responseId() - _type().let { - if (it != JsonValue.from("response.content_part.added")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (contentIndex.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - (if (outputIndex.asKnown().isPresent) 1 else 0) + - (part.asKnown().getOrNull()?.validity() ?: 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("response.content_part.added")) 1 else 0 } - - /** The content part that was added. */ - class Part - private constructor( - private val audio: JsonField, - private val text: JsonField, - private val transcript: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("audio") @ExcludeMissing audio: JsonField = JsonMissing.of(), - @JsonProperty("text") @ExcludeMissing text: JsonField = JsonMissing.of(), - @JsonProperty("transcript") - @ExcludeMissing - transcript: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(audio, text, transcript, type, mutableMapOf()) - - /** - * Base64-encoded audio data (if type is "audio"). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun audio(): Optional = audio.getOptional("audio") - - /** - * The text content (if type is "text"). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun text(): Optional = text.getOptional("text") - - /** - * The transcript of the audio (if type is "audio"). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun transcript(): Optional = transcript.getOptional("transcript") - - /** - * The content type ("text", "audio"). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [audio]. - * - * Unlike [audio], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("audio") @ExcludeMissing fun _audio(): JsonField = audio - - /** - * Returns the raw JSON value of [text]. - * - * Unlike [text], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("text") @ExcludeMissing fun _text(): JsonField = text - - /** - * Returns the raw JSON value of [transcript]. - * - * Unlike [transcript], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("transcript") - @ExcludeMissing - fun _transcript(): JsonField = transcript - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Part]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Part]. */ - class Builder internal constructor() { - - private var audio: JsonField = JsonMissing.of() - private var text: JsonField = JsonMissing.of() - private var transcript: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(part: Part) = apply { - audio = part.audio - text = part.text - transcript = part.transcript - type = part.type - additionalProperties = part.additionalProperties.toMutableMap() - } - - /** Base64-encoded audio data (if type is "audio"). */ - fun audio(audio: String) = audio(JsonField.of(audio)) - - /** - * Sets [Builder.audio] to an arbitrary JSON value. - * - * You should usually call [Builder.audio] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun audio(audio: JsonField) = apply { this.audio = audio } - - /** The text content (if type is "text"). */ - fun text(text: String) = text(JsonField.of(text)) - - /** - * Sets [Builder.text] to an arbitrary JSON value. - * - * You should usually call [Builder.text] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun text(text: JsonField) = apply { this.text = text } - - /** The transcript of the audio (if type is "audio"). */ - fun transcript(transcript: String) = transcript(JsonField.of(transcript)) - - /** - * Sets [Builder.transcript] to an arbitrary JSON value. - * - * You should usually call [Builder.transcript] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun transcript(transcript: JsonField) = apply { this.transcript = transcript } - - /** The content type ("text", "audio"). */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Part]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Part = - Part(audio, text, transcript, type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): Part = apply { - if (validated) { - return@apply - } - - audio() - text() - transcript() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (audio.asKnown().isPresent) 1 else 0) + - (if (text.asKnown().isPresent) 1 else 0) + - (if (transcript.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** The content type ("text", "audio"). */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val TEXT = of("text") - - @JvmField val AUDIO = of("audio") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - TEXT, - AUDIO, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - TEXT, - AUDIO, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - TEXT -> Value.TEXT - AUDIO -> Value.AUDIO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - TEXT -> Known.TEXT - AUDIO -> Known.AUDIO - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Part && - audio == other.audio && - text == other.text && - transcript == other.transcript && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(audio, text, transcript, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Part{audio=$audio, text=$text, transcript=$transcript, type=$type, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseContentPartAddedEvent && - contentIndex == other.contentIndex && - eventId == other.eventId && - itemId == other.itemId && - outputIndex == other.outputIndex && - part == other.part && - responseId == other.responseId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - contentIndex, - eventId, - itemId, - outputIndex, - part, - responseId, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseContentPartAddedEvent{contentIndex=$contentIndex, eventId=$eventId, itemId=$itemId, outputIndex=$outputIndex, part=$part, responseId=$responseId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseContentPartDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseContentPartDoneEvent.kt deleted file mode 100644 index f8d4239eb..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseContentPartDoneEvent.kt +++ /dev/null @@ -1,802 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * Returned when a content part is done streaming in an assistant message item. Also emitted when a - * Response is interrupted, incomplete, or cancelled. - */ -class ResponseContentPartDoneEvent -private constructor( - private val contentIndex: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val outputIndex: JsonField, - private val part: JsonField, - private val responseId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("content_index") - @ExcludeMissing - contentIndex: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("output_index") - @ExcludeMissing - outputIndex: JsonField = JsonMissing.of(), - @JsonProperty("part") @ExcludeMissing part: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(contentIndex, eventId, itemId, outputIndex, part, responseId, type, mutableMapOf()) - - /** - * The index of the content part in the item's content array. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun contentIndex(): Long = contentIndex.getRequired("content_index") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the item. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The index of the output item in the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun outputIndex(): Long = outputIndex.getRequired("output_index") - - /** - * The content part that is done. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun part(): Part = part.getRequired("part") - - /** - * The ID of the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The event type, must be `response.content_part.done`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.content_part.done") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [contentIndex]. - * - * Unlike [contentIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content_index") - @ExcludeMissing - fun _contentIndex(): JsonField = contentIndex - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [outputIndex]. - * - * Unlike [outputIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output_index") @ExcludeMissing fun _outputIndex(): JsonField = outputIndex - - /** - * Returns the raw JSON value of [part]. - * - * Unlike [part], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("part") @ExcludeMissing fun _part(): JsonField = part - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") @ExcludeMissing fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ResponseContentPartDoneEvent]. - * - * The following fields are required: - * ```java - * .contentIndex() - * .eventId() - * .itemId() - * .outputIndex() - * .part() - * .responseId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseContentPartDoneEvent]. */ - class Builder internal constructor() { - - private var contentIndex: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var outputIndex: JsonField? = null - private var part: JsonField? = null - private var responseId: JsonField? = null - private var type: JsonValue = JsonValue.from("response.content_part.done") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseContentPartDoneEvent: ResponseContentPartDoneEvent) = apply { - contentIndex = responseContentPartDoneEvent.contentIndex - eventId = responseContentPartDoneEvent.eventId - itemId = responseContentPartDoneEvent.itemId - outputIndex = responseContentPartDoneEvent.outputIndex - part = responseContentPartDoneEvent.part - responseId = responseContentPartDoneEvent.responseId - type = responseContentPartDoneEvent.type - additionalProperties = responseContentPartDoneEvent.additionalProperties.toMutableMap() - } - - /** The index of the content part in the item's content array. */ - fun contentIndex(contentIndex: Long) = contentIndex(JsonField.of(contentIndex)) - - /** - * Sets [Builder.contentIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.contentIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun contentIndex(contentIndex: JsonField) = apply { this.contentIndex = contentIndex } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the item. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** The index of the output item in the response. */ - fun outputIndex(outputIndex: Long) = outputIndex(JsonField.of(outputIndex)) - - /** - * Sets [Builder.outputIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.outputIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun outputIndex(outputIndex: JsonField) = apply { this.outputIndex = outputIndex } - - /** The content part that is done. */ - fun part(part: Part) = part(JsonField.of(part)) - - /** - * Sets [Builder.part] to an arbitrary JSON value. - * - * You should usually call [Builder.part] with a well-typed [Part] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun part(part: JsonField) = apply { this.part = part } - - /** The ID of the response. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.content_part.done") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseContentPartDoneEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .contentIndex() - * .eventId() - * .itemId() - * .outputIndex() - * .part() - * .responseId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseContentPartDoneEvent = - ResponseContentPartDoneEvent( - checkRequired("contentIndex", contentIndex), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - checkRequired("outputIndex", outputIndex), - checkRequired("part", part), - checkRequired("responseId", responseId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseContentPartDoneEvent = apply { - if (validated) { - return@apply - } - - contentIndex() - eventId() - itemId() - outputIndex() - part().validate() - responseId() - _type().let { - if (it != JsonValue.from("response.content_part.done")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (contentIndex.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - (if (outputIndex.asKnown().isPresent) 1 else 0) + - (part.asKnown().getOrNull()?.validity() ?: 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("response.content_part.done")) 1 else 0 } - - /** The content part that is done. */ - class Part - private constructor( - private val audio: JsonField, - private val text: JsonField, - private val transcript: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("audio") @ExcludeMissing audio: JsonField = JsonMissing.of(), - @JsonProperty("text") @ExcludeMissing text: JsonField = JsonMissing.of(), - @JsonProperty("transcript") - @ExcludeMissing - transcript: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(audio, text, transcript, type, mutableMapOf()) - - /** - * Base64-encoded audio data (if type is "audio"). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun audio(): Optional = audio.getOptional("audio") - - /** - * The text content (if type is "text"). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun text(): Optional = text.getOptional("text") - - /** - * The transcript of the audio (if type is "audio"). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun transcript(): Optional = transcript.getOptional("transcript") - - /** - * The content type ("text", "audio"). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [audio]. - * - * Unlike [audio], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("audio") @ExcludeMissing fun _audio(): JsonField = audio - - /** - * Returns the raw JSON value of [text]. - * - * Unlike [text], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("text") @ExcludeMissing fun _text(): JsonField = text - - /** - * Returns the raw JSON value of [transcript]. - * - * Unlike [transcript], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("transcript") - @ExcludeMissing - fun _transcript(): JsonField = transcript - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Part]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Part]. */ - class Builder internal constructor() { - - private var audio: JsonField = JsonMissing.of() - private var text: JsonField = JsonMissing.of() - private var transcript: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(part: Part) = apply { - audio = part.audio - text = part.text - transcript = part.transcript - type = part.type - additionalProperties = part.additionalProperties.toMutableMap() - } - - /** Base64-encoded audio data (if type is "audio"). */ - fun audio(audio: String) = audio(JsonField.of(audio)) - - /** - * Sets [Builder.audio] to an arbitrary JSON value. - * - * You should usually call [Builder.audio] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun audio(audio: JsonField) = apply { this.audio = audio } - - /** The text content (if type is "text"). */ - fun text(text: String) = text(JsonField.of(text)) - - /** - * Sets [Builder.text] to an arbitrary JSON value. - * - * You should usually call [Builder.text] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun text(text: JsonField) = apply { this.text = text } - - /** The transcript of the audio (if type is "audio"). */ - fun transcript(transcript: String) = transcript(JsonField.of(transcript)) - - /** - * Sets [Builder.transcript] to an arbitrary JSON value. - * - * You should usually call [Builder.transcript] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun transcript(transcript: JsonField) = apply { this.transcript = transcript } - - /** The content type ("text", "audio"). */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Part]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Part = - Part(audio, text, transcript, type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): Part = apply { - if (validated) { - return@apply - } - - audio() - text() - transcript() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (audio.asKnown().isPresent) 1 else 0) + - (if (text.asKnown().isPresent) 1 else 0) + - (if (transcript.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** The content type ("text", "audio"). */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val TEXT = of("text") - - @JvmField val AUDIO = of("audio") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - TEXT, - AUDIO, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - TEXT, - AUDIO, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - TEXT -> Value.TEXT - AUDIO -> Value.AUDIO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - TEXT -> Known.TEXT - AUDIO -> Known.AUDIO - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Part && - audio == other.audio && - text == other.text && - transcript == other.transcript && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(audio, text, transcript, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Part{audio=$audio, text=$text, transcript=$transcript, type=$type, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseContentPartDoneEvent && - contentIndex == other.contentIndex && - eventId == other.eventId && - itemId == other.itemId && - outputIndex == other.outputIndex && - part == other.part && - responseId == other.responseId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - contentIndex, - eventId, - itemId, - outputIndex, - part, - responseId, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseContentPartDoneEvent{contentIndex=$contentIndex, eventId=$eventId, itemId=$itemId, outputIndex=$outputIndex, part=$part, responseId=$responseId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseCreateEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseCreateEvent.kt deleted file mode 100644 index 4a95d5555..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseCreateEvent.kt +++ /dev/null @@ -1,2220 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.ObjectCodec -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.BaseDeserializer -import com.openai.core.BaseSerializer -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.allMaxBy -import com.openai.core.checkKnown -import com.openai.core.getOrThrow -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * This event instructs the server to create a Response, which means triggering model inference. - * When in Server VAD mode, the server will create Responses automatically. - * - * A Response will include at least one Item, and may have two, in which case the second will be a - * function call. These Items will be appended to the conversation history. - * - * The server will respond with a `response.created` event, events for Items and content created, - * and finally a `response.done` event to indicate the Response is complete. - * - * The `response.create` event includes inference configuration like `instructions`, and - * `temperature`. These fields will override the Session's configuration for this Response only. - */ -class ResponseCreateEvent -private constructor( - private val type: JsonValue, - private val eventId: JsonField, - private val response: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("response") @ExcludeMissing response: JsonField = JsonMissing.of(), - ) : this(type, eventId, response, mutableMapOf()) - - /** - * The event type, must be `response.create`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.create") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Optional client-generated ID used to identify this event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eventId(): Optional = eventId.getOptional("event_id") - - /** - * Create a new Realtime response with these parameters - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun response(): Optional = response.getOptional("response") - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [response]. - * - * Unlike [response], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response") @ExcludeMissing fun _response(): JsonField = response - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [ResponseCreateEvent]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseCreateEvent]. */ - class Builder internal constructor() { - - private var type: JsonValue = JsonValue.from("response.create") - private var eventId: JsonField = JsonMissing.of() - private var response: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseCreateEvent: ResponseCreateEvent) = apply { - type = responseCreateEvent.type - eventId = responseCreateEvent.eventId - response = responseCreateEvent.response - additionalProperties = responseCreateEvent.additionalProperties.toMutableMap() - } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.create") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** Optional client-generated ID used to identify this event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** Create a new Realtime response with these parameters */ - fun response(response: Response) = response(JsonField.of(response)) - - /** - * Sets [Builder.response] to an arbitrary JSON value. - * - * You should usually call [Builder.response] with a well-typed [Response] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun response(response: JsonField) = apply { this.response = response } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseCreateEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): ResponseCreateEvent = - ResponseCreateEvent(type, eventId, response, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): ResponseCreateEvent = apply { - if (validated) { - return@apply - } - - _type().let { - if (it != JsonValue.from("response.create")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - eventId() - response().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - type.let { if (it == JsonValue.from("response.create")) 1 else 0 } + - (if (eventId.asKnown().isPresent) 1 else 0) + - (response.asKnown().getOrNull()?.validity() ?: 0) - - /** Create a new Realtime response with these parameters */ - class Response - private constructor( - private val conversation: JsonField, - private val input: JsonField>, - private val instructions: JsonField, - private val maxResponseOutputTokens: JsonField, - private val metadata: JsonField, - private val modalities: JsonField>, - private val outputAudioFormat: JsonField, - private val temperature: JsonField, - private val toolChoice: JsonField, - private val tools: JsonField>, - private val voice: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("conversation") - @ExcludeMissing - conversation: JsonField = JsonMissing.of(), - @JsonProperty("input") - @ExcludeMissing - input: JsonField> = JsonMissing.of(), - @JsonProperty("instructions") - @ExcludeMissing - instructions: JsonField = JsonMissing.of(), - @JsonProperty("max_response_output_tokens") - @ExcludeMissing - maxResponseOutputTokens: JsonField = JsonMissing.of(), - @JsonProperty("metadata") - @ExcludeMissing - metadata: JsonField = JsonMissing.of(), - @JsonProperty("modalities") - @ExcludeMissing - modalities: JsonField> = JsonMissing.of(), - @JsonProperty("output_audio_format") - @ExcludeMissing - outputAudioFormat: JsonField = JsonMissing.of(), - @JsonProperty("temperature") - @ExcludeMissing - temperature: JsonField = JsonMissing.of(), - @JsonProperty("tool_choice") - @ExcludeMissing - toolChoice: JsonField = JsonMissing.of(), - @JsonProperty("tools") @ExcludeMissing tools: JsonField> = JsonMissing.of(), - @JsonProperty("voice") @ExcludeMissing voice: JsonField = JsonMissing.of(), - ) : this( - conversation, - input, - instructions, - maxResponseOutputTokens, - metadata, - modalities, - outputAudioFormat, - temperature, - toolChoice, - tools, - voice, - mutableMapOf(), - ) - - /** - * Controls which conversation the response is added to. Currently supports `auto` and - * `none`, with `auto` as the default value. The `auto` value means that the contents of the - * response will be added to the default conversation. Set this to `none` to create an - * out-of-band response which will not add items to default conversation. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun conversation(): Optional = conversation.getOptional("conversation") - - /** - * Input items to include in the prompt for the model. Using this field creates a new - * context for this Response instead of using the default conversation. An empty array `[]` - * will clear the context for this Response. Note that this can include references to items - * from the default conversation. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun input(): Optional> = input.getOptional("input") - - /** - * The default system instructions (i.e. system message) prepended to model calls. This - * field allows the client to guide the model on desired responses. The model can be - * instructed on response content and format, (e.g. "be extremely succinct", "act friendly", - * "here are examples of good responses") and on audio behavior (e.g. "talk quickly", - * "inject emotion into your voice", "laugh frequently"). The instructions are not - * guaranteed to be followed by the model, but they provide guidance to the model on the - * desired behavior. - * - * Note that the server sets default instructions which will be used if this field is not - * set and are visible in the `session.created` event at the start of the session. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun instructions(): Optional = instructions.getOptional("instructions") - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun maxResponseOutputTokens(): Optional = - maxResponseOutputTokens.getOptional("max_response_output_tokens") - - /** - * Set of 16 key-value pairs that can be attached to an object. This can be useful for - * storing additional information about the object in a structured format, and querying for - * objects via API or the dashboard. - * - * Keys are strings with a maximum length of 64 characters. Values are strings with a - * maximum length of 512 characters. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun metadata(): Optional = metadata.getOptional("metadata") - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun modalities(): Optional> = modalities.getOptional("modalities") - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun outputAudioFormat(): Optional = - outputAudioFormat.getOptional("output_audio_format") - - /** - * Sampling temperature for the model, limited to [0.6, 1.2]. Defaults to 0.8. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun temperature(): Optional = temperature.getOptional("temperature") - - /** - * How the model chooses tools. Options are `auto`, `none`, `required`, or specify a - * function, like `{"type": "function", "function": {"name": "my_function"}}`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun toolChoice(): Optional = toolChoice.getOptional("tool_choice") - - /** - * Tools (functions) available to the model. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun tools(): Optional> = tools.getOptional("tools") - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun voice(): Optional = voice.getOptional("voice") - - /** - * Returns the raw JSON value of [conversation]. - * - * Unlike [conversation], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("conversation") - @ExcludeMissing - fun _conversation(): JsonField = conversation - - /** - * Returns the raw JSON value of [input]. - * - * Unlike [input], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("input") - @ExcludeMissing - fun _input(): JsonField> = input - - /** - * Returns the raw JSON value of [instructions]. - * - * Unlike [instructions], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("instructions") - @ExcludeMissing - fun _instructions(): JsonField = instructions - - /** - * Returns the raw JSON value of [maxResponseOutputTokens]. - * - * Unlike [maxResponseOutputTokens], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("max_response_output_tokens") - @ExcludeMissing - fun _maxResponseOutputTokens(): JsonField = maxResponseOutputTokens - - /** - * Returns the raw JSON value of [metadata]. - * - * Unlike [metadata], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("metadata") @ExcludeMissing fun _metadata(): JsonField = metadata - - /** - * Returns the raw JSON value of [modalities]. - * - * Unlike [modalities], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("modalities") - @ExcludeMissing - fun _modalities(): JsonField> = modalities - - /** - * Returns the raw JSON value of [outputAudioFormat]. - * - * Unlike [outputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("output_audio_format") - @ExcludeMissing - fun _outputAudioFormat(): JsonField = outputAudioFormat - - /** - * Returns the raw JSON value of [temperature]. - * - * Unlike [temperature], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("temperature") - @ExcludeMissing - fun _temperature(): JsonField = temperature - - /** - * Returns the raw JSON value of [toolChoice]. - * - * Unlike [toolChoice], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tool_choice") - @ExcludeMissing - fun _toolChoice(): JsonField = toolChoice - - /** - * Returns the raw JSON value of [tools]. - * - * Unlike [tools], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tools") @ExcludeMissing fun _tools(): JsonField> = tools - - /** - * Returns the raw JSON value of [voice]. - * - * Unlike [voice], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("voice") @ExcludeMissing fun _voice(): JsonField = voice - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Response]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Response]. */ - class Builder internal constructor() { - - private var conversation: JsonField = JsonMissing.of() - private var input: JsonField>? = null - private var instructions: JsonField = JsonMissing.of() - private var maxResponseOutputTokens: JsonField = - JsonMissing.of() - private var metadata: JsonField = JsonMissing.of() - private var modalities: JsonField>? = null - private var outputAudioFormat: JsonField = JsonMissing.of() - private var temperature: JsonField = JsonMissing.of() - private var toolChoice: JsonField = JsonMissing.of() - private var tools: JsonField>? = null - private var voice: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(response: Response) = apply { - conversation = response.conversation - input = response.input.map { it.toMutableList() } - instructions = response.instructions - maxResponseOutputTokens = response.maxResponseOutputTokens - metadata = response.metadata - modalities = response.modalities.map { it.toMutableList() } - outputAudioFormat = response.outputAudioFormat - temperature = response.temperature - toolChoice = response.toolChoice - tools = response.tools.map { it.toMutableList() } - voice = response.voice - additionalProperties = response.additionalProperties.toMutableMap() - } - - /** - * Controls which conversation the response is added to. Currently supports `auto` and - * `none`, with `auto` as the default value. The `auto` value means that the contents of - * the response will be added to the default conversation. Set this to `none` to create - * an out-of-band response which will not add items to default conversation. - */ - fun conversation(conversation: Conversation) = conversation(JsonField.of(conversation)) - - /** - * Sets [Builder.conversation] to an arbitrary JSON value. - * - * You should usually call [Builder.conversation] with a well-typed [Conversation] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun conversation(conversation: JsonField) = apply { - this.conversation = conversation - } - - /** - * Sets [conversation] to an arbitrary [String]. - * - * You should usually call [conversation] with a well-typed [Conversation] constant - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun conversation(value: String) = conversation(Conversation.of(value)) - - /** - * Input items to include in the prompt for the model. Using this field creates a new - * context for this Response instead of using the default conversation. An empty array - * `[]` will clear the context for this Response. Note that this can include references - * to items from the default conversation. - */ - fun input(input: List) = input(JsonField.of(input)) - - /** - * Sets [Builder.input] to an arbitrary JSON value. - * - * You should usually call [Builder.input] with a well-typed - * `List` value instead. This method is primarily for - * setting the field to an undocumented or not yet supported value. - */ - fun input(input: JsonField>) = apply { - this.input = input.map { it.toMutableList() } - } - - /** - * Adds a single [ConversationItemWithReference] to [Builder.input]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addInput(input: ConversationItemWithReference) = apply { - this.input = - (this.input ?: JsonField.of(mutableListOf())).also { - checkKnown("input", it).add(input) - } - } - - /** - * The default system instructions (i.e. system message) prepended to model calls. This - * field allows the client to guide the model on desired responses. The model can be - * instructed on response content and format, (e.g. "be extremely succinct", "act - * friendly", "here are examples of good responses") and on audio behavior (e.g. "talk - * quickly", "inject emotion into your voice", "laugh frequently"). The instructions are - * not guaranteed to be followed by the model, but they provide guidance to the model on - * the desired behavior. - * - * Note that the server sets default instructions which will be used if this field is - * not set and are visible in the `session.created` event at the start of the session. - */ - fun instructions(instructions: String) = instructions(JsonField.of(instructions)) - - /** - * Sets [Builder.instructions] to an arbitrary JSON value. - * - * You should usually call [Builder.instructions] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun instructions(instructions: JsonField) = apply { - this.instructions = instructions - } - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool - * calls. Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the - * maximum available tokens for a given model. Defaults to `inf`. - */ - fun maxResponseOutputTokens(maxResponseOutputTokens: MaxResponseOutputTokens) = - maxResponseOutputTokens(JsonField.of(maxResponseOutputTokens)) - - /** - * Sets [Builder.maxResponseOutputTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.maxResponseOutputTokens] with a well-typed - * [MaxResponseOutputTokens] value instead. This method is primarily for setting the - * field to an undocumented or not yet supported value. - */ - fun maxResponseOutputTokens( - maxResponseOutputTokens: JsonField - ) = apply { this.maxResponseOutputTokens = maxResponseOutputTokens } - - /** - * Alias for calling [maxResponseOutputTokens] with - * `MaxResponseOutputTokens.ofInteger(integer)`. - */ - fun maxResponseOutputTokens(integer: Long) = - maxResponseOutputTokens(MaxResponseOutputTokens.ofInteger(integer)) - - /** - * Alias for calling [maxResponseOutputTokens] with `MaxResponseOutputTokens.ofInf()`. - */ - fun maxResponseOutputTokensInf() = - maxResponseOutputTokens(MaxResponseOutputTokens.ofInf()) - - /** - * Set of 16 key-value pairs that can be attached to an object. This can be useful for - * storing additional information about the object in a structured format, and querying - * for objects via API or the dashboard. - * - * Keys are strings with a maximum length of 64 characters. Values are strings with a - * maximum length of 512 characters. - */ - fun metadata(metadata: Metadata?) = metadata(JsonField.ofNullable(metadata)) - - /** Alias for calling [Builder.metadata] with `metadata.orElse(null)`. */ - fun metadata(metadata: Optional) = metadata(metadata.getOrNull()) - - /** - * Sets [Builder.metadata] to an arbitrary JSON value. - * - * You should usually call [Builder.metadata] with a well-typed [Metadata] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun metadata(metadata: JsonField) = apply { this.metadata = metadata } - - /** - * The set of modalities the model can respond with. To disable audio, set this to - * ["text"]. - */ - fun modalities(modalities: List) = modalities(JsonField.of(modalities)) - - /** - * Sets [Builder.modalities] to an arbitrary JSON value. - * - * You should usually call [Builder.modalities] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun modalities(modalities: JsonField>) = apply { - this.modalities = modalities.map { it.toMutableList() } - } - - /** - * Adds a single [Modality] to [modalities]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addModality(modality: Modality) = apply { - modalities = - (modalities ?: JsonField.of(mutableListOf())).also { - checkKnown("modalities", it).add(modality) - } - } - - /** The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. */ - fun outputAudioFormat(outputAudioFormat: OutputAudioFormat) = - outputAudioFormat(JsonField.of(outputAudioFormat)) - - /** - * Sets [Builder.outputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.outputAudioFormat] with a well-typed - * [OutputAudioFormat] value instead. This method is primarily for setting the field to - * an undocumented or not yet supported value. - */ - fun outputAudioFormat(outputAudioFormat: JsonField) = apply { - this.outputAudioFormat = outputAudioFormat - } - - /** Sampling temperature for the model, limited to [0.6, 1.2]. Defaults to 0.8. */ - fun temperature(temperature: Double) = temperature(JsonField.of(temperature)) - - /** - * Sets [Builder.temperature] to an arbitrary JSON value. - * - * You should usually call [Builder.temperature] with a well-typed [Double] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun temperature(temperature: JsonField) = apply { - this.temperature = temperature - } - - /** - * How the model chooses tools. Options are `auto`, `none`, `required`, or specify a - * function, like `{"type": "function", "function": {"name": "my_function"}}`. - */ - fun toolChoice(toolChoice: String) = toolChoice(JsonField.of(toolChoice)) - - /** - * Sets [Builder.toolChoice] to an arbitrary JSON value. - * - * You should usually call [Builder.toolChoice] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun toolChoice(toolChoice: JsonField) = apply { this.toolChoice = toolChoice } - - /** Tools (functions) available to the model. */ - fun tools(tools: List) = tools(JsonField.of(tools)) - - /** - * Sets [Builder.tools] to an arbitrary JSON value. - * - * You should usually call [Builder.tools] with a well-typed `List` value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun tools(tools: JsonField>) = apply { - this.tools = tools.map { it.toMutableList() } - } - - /** - * Adds a single [Tool] to [tools]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addTool(tool: Tool) = apply { - tools = - (tools ?: JsonField.of(mutableListOf())).also { - checkKnown("tools", it).add(tool) - } - } - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once - * the model has responded with audio at least once. Current voice options are `alloy`, - * `ash`, `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - */ - fun voice(voice: Voice) = voice(JsonField.of(voice)) - - /** - * Sets [Builder.voice] to an arbitrary JSON value. - * - * You should usually call [Builder.voice] with a well-typed [Voice] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun voice(voice: JsonField) = apply { this.voice = voice } - - /** - * Sets [voice] to an arbitrary [String]. - * - * You should usually call [voice] with a well-typed [Voice] constant instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun voice(value: String) = voice(Voice.of(value)) - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Response]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Response = - Response( - conversation, - (input ?: JsonMissing.of()).map { it.toImmutable() }, - instructions, - maxResponseOutputTokens, - metadata, - (modalities ?: JsonMissing.of()).map { it.toImmutable() }, - outputAudioFormat, - temperature, - toolChoice, - (tools ?: JsonMissing.of()).map { it.toImmutable() }, - voice, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): Response = apply { - if (validated) { - return@apply - } - - conversation() - input().ifPresent { it.forEach { it.validate() } } - instructions() - maxResponseOutputTokens().ifPresent { it.validate() } - metadata().ifPresent { it.validate() } - modalities().ifPresent { it.forEach { it.validate() } } - outputAudioFormat().ifPresent { it.validate() } - temperature() - toolChoice() - tools().ifPresent { it.forEach { it.validate() } } - voice() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (conversation.asKnown().isPresent) 1 else 0) + - (input.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (if (instructions.asKnown().isPresent) 1 else 0) + - (maxResponseOutputTokens.asKnown().getOrNull()?.validity() ?: 0) + - (metadata.asKnown().getOrNull()?.validity() ?: 0) + - (modalities.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (outputAudioFormat.asKnown().getOrNull()?.validity() ?: 0) + - (if (temperature.asKnown().isPresent) 1 else 0) + - (if (toolChoice.asKnown().isPresent) 1 else 0) + - (tools.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (if (voice.asKnown().isPresent) 1 else 0) - - /** - * Controls which conversation the response is added to. Currently supports `auto` and - * `none`, with `auto` as the default value. The `auto` value means that the contents of the - * response will be added to the default conversation. Set this to `none` to create an - * out-of-band response which will not add items to default conversation. - */ - class Conversation @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val AUTO = of("auto") - - @JvmField val NONE = of("none") - - @JvmStatic fun of(value: String) = Conversation(JsonField.of(value)) - } - - /** An enum containing [Conversation]'s known values. */ - enum class Known { - AUTO, - NONE, - } - - /** - * An enum containing [Conversation]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Conversation] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - AUTO, - NONE, - /** - * An enum member indicating that [Conversation] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - AUTO -> Value.AUTO - NONE -> Value.NONE - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - AUTO -> Known.AUTO - NONE -> Known.NONE - else -> throw OpenAIInvalidDataException("Unknown Conversation: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Conversation = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Conversation && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - */ - @JsonDeserialize(using = MaxResponseOutputTokens.Deserializer::class) - @JsonSerialize(using = MaxResponseOutputTokens.Serializer::class) - class MaxResponseOutputTokens - private constructor( - private val integer: Long? = null, - private val inf: JsonValue? = null, - private val _json: JsonValue? = null, - ) { - - fun integer(): Optional = Optional.ofNullable(integer) - - fun inf(): Optional = Optional.ofNullable(inf) - - fun isInteger(): Boolean = integer != null - - fun isInf(): Boolean = inf != null - - fun asInteger(): Long = integer.getOrThrow("integer") - - fun asInf(): JsonValue = inf.getOrThrow("inf") - - fun _json(): Optional = Optional.ofNullable(_json) - - fun accept(visitor: Visitor): T = - when { - integer != null -> visitor.visitInteger(integer) - inf != null -> visitor.visitInf(inf) - else -> visitor.unknown(_json) - } - - private var validated: Boolean = false - - fun validate(): MaxResponseOutputTokens = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitInteger(integer: Long) {} - - override fun visitInf(inf: JsonValue) { - inf.let { - if (it != JsonValue.from("inf")) { - throw OpenAIInvalidDataException( - "'inf' is invalid, received $it" - ) - } - } - } - } - ) - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - accept( - object : Visitor { - override fun visitInteger(integer: Long) = 1 - - override fun visitInf(inf: JsonValue) = - inf.let { if (it == JsonValue.from("inf")) 1 else 0 } - - override fun unknown(json: JsonValue?) = 0 - } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is MaxResponseOutputTokens && - integer == other.integer && - inf == other.inf - } - - override fun hashCode(): Int = Objects.hash(integer, inf) - - override fun toString(): String = - when { - integer != null -> "MaxResponseOutputTokens{integer=$integer}" - inf != null -> "MaxResponseOutputTokens{inf=$inf}" - _json != null -> "MaxResponseOutputTokens{_unknown=$_json}" - else -> throw IllegalStateException("Invalid MaxResponseOutputTokens") - } - - companion object { - - @JvmStatic fun ofInteger(integer: Long) = MaxResponseOutputTokens(integer = integer) - - @JvmStatic fun ofInf() = MaxResponseOutputTokens(inf = JsonValue.from("inf")) - } - - /** - * An interface that defines how to map each variant of [MaxResponseOutputTokens] to a - * value of type [T]. - */ - interface Visitor { - - fun visitInteger(integer: Long): T - - fun visitInf(inf: JsonValue): T - - /** - * Maps an unknown variant of [MaxResponseOutputTokens] to a value of type [T]. - * - * An instance of [MaxResponseOutputTokens] can contain an unknown variant if it was - * deserialized from data that doesn't match any known variant. For example, if the - * SDK is on an older version than the API, then the API may respond with new - * variants that the SDK is unaware of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown MaxResponseOutputTokens: $json") - } - } - - internal class Deserializer : - BaseDeserializer(MaxResponseOutputTokens::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): MaxResponseOutputTokens { - val json = JsonValue.fromJsonNode(node) - - val bestMatches = - sequenceOf( - tryDeserialize(node, jacksonTypeRef()) - ?.let { MaxResponseOutputTokens(inf = it, _json = json) } - ?.takeIf { it.isValid() }, - tryDeserialize(node, jacksonTypeRef())?.let { - MaxResponseOutputTokens(integer = it, _json = json) - }, - ) - .filterNotNull() - .allMaxBy { it.validity() } - .toList() - return when (bestMatches.size) { - // This can happen if what we're deserializing is completely incompatible - // with all the possible variants (e.g. deserializing from object). - 0 -> MaxResponseOutputTokens(_json = json) - 1 -> bestMatches.single() - // If there's more than one match with the highest validity, then use the - // first completely valid match, or simply the first match if none are - // completely valid. - else -> bestMatches.firstOrNull { it.isValid() } ?: bestMatches.first() - } - } - } - - internal class Serializer : - BaseSerializer(MaxResponseOutputTokens::class) { - - override fun serialize( - value: MaxResponseOutputTokens, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.integer != null -> generator.writeObject(value.integer) - value.inf != null -> generator.writeObject(value.inf) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid MaxResponseOutputTokens") - } - } - } - } - - /** - * Set of 16 key-value pairs that can be attached to an object. This can be useful for - * storing additional information about the object in a structured format, and querying for - * objects via API or the dashboard. - * - * Keys are strings with a maximum length of 64 characters. Values are strings with a - * maximum length of 512 characters. - */ - class Metadata - @JsonCreator - private constructor( - @com.fasterxml.jackson.annotation.JsonValue - private val additionalProperties: Map - ) { - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = additionalProperties - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Metadata]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Metadata]. */ - class Builder internal constructor() { - - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(metadata: Metadata) = apply { - additionalProperties = metadata.additionalProperties.toMutableMap() - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Metadata]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Metadata = Metadata(additionalProperties.toImmutable()) - } - - private var validated: Boolean = false - - fun validate(): Metadata = apply { - if (validated) { - return@apply - } - - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - additionalProperties.count { (_, value) -> !value.isNull() && !value.isMissing() } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Metadata && additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = "Metadata{additionalProperties=$additionalProperties}" - } - - class Modality @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val TEXT = of("text") - - @JvmField val AUDIO = of("audio") - - @JvmStatic fun of(value: String) = Modality(JsonField.of(value)) - } - - /** An enum containing [Modality]'s known values. */ - enum class Known { - TEXT, - AUDIO, - } - - /** - * An enum containing [Modality]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Modality] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - TEXT, - AUDIO, - /** - * An enum member indicating that [Modality] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - TEXT -> Value.TEXT - AUDIO -> Value.AUDIO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - TEXT -> Known.TEXT - AUDIO -> Known.AUDIO - else -> throw OpenAIInvalidDataException("Unknown Modality: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Modality = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Modality && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. */ - class OutputAudioFormat - @JsonCreator - private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val PCM16 = of("pcm16") - - @JvmField val G711_ULAW = of("g711_ulaw") - - @JvmField val G711_ALAW = of("g711_alaw") - - @JvmStatic fun of(value: String) = OutputAudioFormat(JsonField.of(value)) - } - - /** An enum containing [OutputAudioFormat]'s known values. */ - enum class Known { - PCM16, - G711_ULAW, - G711_ALAW, - } - - /** - * An enum containing [OutputAudioFormat]'s known values, as well as an [_UNKNOWN] - * member. - * - * An instance of [OutputAudioFormat] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - PCM16, - G711_ULAW, - G711_ALAW, - /** - * An enum member indicating that [OutputAudioFormat] was instantiated with an - * unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - PCM16 -> Value.PCM16 - G711_ULAW -> Value.G711_ULAW - G711_ALAW -> Value.G711_ALAW - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - PCM16 -> Known.PCM16 - G711_ULAW -> Known.G711_ULAW - G711_ALAW -> Known.G711_ALAW - else -> throw OpenAIInvalidDataException("Unknown OutputAudioFormat: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): OutputAudioFormat = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is OutputAudioFormat && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - class Tool - private constructor( - private val description: JsonField, - private val name: JsonField, - private val parameters: JsonValue, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("description") - @ExcludeMissing - description: JsonField = JsonMissing.of(), - @JsonProperty("name") @ExcludeMissing name: JsonField = JsonMissing.of(), - @JsonProperty("parameters") - @ExcludeMissing - parameters: JsonValue = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(description, name, parameters, type, mutableMapOf()) - - /** - * The description of the function, including guidance on when and how to call it, and - * guidance about what to tell the user when calling (if anything). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun description(): Optional = description.getOptional("description") - - /** - * The name of the function. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun name(): Optional = name.getOptional("name") - - /** Parameters of the function in JSON Schema. */ - @JsonProperty("parameters") @ExcludeMissing fun _parameters(): JsonValue = parameters - - /** - * The type of the tool, i.e. `function`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [description]. - * - * Unlike [description], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("description") - @ExcludeMissing - fun _description(): JsonField = description - - /** - * Returns the raw JSON value of [name]. - * - * Unlike [name], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("name") @ExcludeMissing fun _name(): JsonField = name - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Tool]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Tool]. */ - class Builder internal constructor() { - - private var description: JsonField = JsonMissing.of() - private var name: JsonField = JsonMissing.of() - private var parameters: JsonValue = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(tool: Tool) = apply { - description = tool.description - name = tool.name - parameters = tool.parameters - type = tool.type - additionalProperties = tool.additionalProperties.toMutableMap() - } - - /** - * The description of the function, including guidance on when and how to call it, - * and guidance about what to tell the user when calling (if anything). - */ - fun description(description: String) = description(JsonField.of(description)) - - /** - * Sets [Builder.description] to an arbitrary JSON value. - * - * You should usually call [Builder.description] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun description(description: JsonField) = apply { - this.description = description - } - - /** The name of the function. */ - fun name(name: String) = name(JsonField.of(name)) - - /** - * Sets [Builder.name] to an arbitrary JSON value. - * - * You should usually call [Builder.name] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun name(name: JsonField) = apply { this.name = name } - - /** Parameters of the function in JSON Schema. */ - fun parameters(parameters: JsonValue) = apply { this.parameters = parameters } - - /** The type of the tool, i.e. `function`. */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Tool]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Tool = - Tool(description, name, parameters, type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): Tool = apply { - if (validated) { - return@apply - } - - description() - name() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (description.asKnown().isPresent) 1 else 0) + - (if (name.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** The type of the tool, i.e. `function`. */ - class Type @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that - * doesn't match any known member, and you want to know that value. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val FUNCTION = of("function") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - FUNCTION - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, - * if the SDK is on an older version than the API, then the API may respond with - * new members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - FUNCTION, - /** - * An enum member indicating that [Type] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if - * you want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - FUNCTION -> Value.FUNCTION - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a - * known member. - */ - fun known(): Known = - when (this) { - FUNCTION -> Known.FUNCTION - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have - * the expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Tool && - description == other.description && - name == other.name && - parameters == other.parameters && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(description, name, parameters, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Tool{description=$description, name=$name, parameters=$parameters, type=$type, additionalProperties=$additionalProperties}" - } - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - */ - class Voice @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val ALLOY = of("alloy") - - @JvmField val ASH = of("ash") - - @JvmField val BALLAD = of("ballad") - - @JvmField val CORAL = of("coral") - - @JvmField val ECHO = of("echo") - - @JvmField val SAGE = of("sage") - - @JvmField val SHIMMER = of("shimmer") - - @JvmField val VERSE = of("verse") - - @JvmStatic fun of(value: String) = Voice(JsonField.of(value)) - } - - /** An enum containing [Voice]'s known values. */ - enum class Known { - ALLOY, - ASH, - BALLAD, - CORAL, - ECHO, - SAGE, - SHIMMER, - VERSE, - } - - /** - * An enum containing [Voice]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Voice] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - ALLOY, - ASH, - BALLAD, - CORAL, - ECHO, - SAGE, - SHIMMER, - VERSE, - /** - * An enum member indicating that [Voice] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - ALLOY -> Value.ALLOY - ASH -> Value.ASH - BALLAD -> Value.BALLAD - CORAL -> Value.CORAL - ECHO -> Value.ECHO - SAGE -> Value.SAGE - SHIMMER -> Value.SHIMMER - VERSE -> Value.VERSE - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - ALLOY -> Known.ALLOY - ASH -> Known.ASH - BALLAD -> Known.BALLAD - CORAL -> Known.CORAL - ECHO -> Known.ECHO - SAGE -> Known.SAGE - SHIMMER -> Known.SHIMMER - VERSE -> Known.VERSE - else -> throw OpenAIInvalidDataException("Unknown Voice: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Voice = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Voice && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Response && - conversation == other.conversation && - input == other.input && - instructions == other.instructions && - maxResponseOutputTokens == other.maxResponseOutputTokens && - metadata == other.metadata && - modalities == other.modalities && - outputAudioFormat == other.outputAudioFormat && - temperature == other.temperature && - toolChoice == other.toolChoice && - tools == other.tools && - voice == other.voice && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - conversation, - input, - instructions, - maxResponseOutputTokens, - metadata, - modalities, - outputAudioFormat, - temperature, - toolChoice, - tools, - voice, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Response{conversation=$conversation, input=$input, instructions=$instructions, maxResponseOutputTokens=$maxResponseOutputTokens, metadata=$metadata, modalities=$modalities, outputAudioFormat=$outputAudioFormat, temperature=$temperature, toolChoice=$toolChoice, tools=$tools, voice=$voice, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseCreateEvent && - type == other.type && - eventId == other.eventId && - response == other.response && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(type, eventId, response, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseCreateEvent{type=$type, eventId=$eventId, response=$response, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseCreatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseCreatedEvent.kt deleted file mode 100644 index d10624309..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseCreatedEvent.kt +++ /dev/null @@ -1,261 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import kotlin.jvm.optionals.getOrNull - -/** - * Returned when a new Response is created. The first event of response creation, where the response - * is in an initial state of `in_progress`. - */ -class ResponseCreatedEvent -private constructor( - private val eventId: JsonField, - private val response: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("response") - @ExcludeMissing - response: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, response, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The response resource. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun response(): RealtimeResponse = response.getRequired("response") - - /** - * The event type, must be `response.created`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.created") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [response]. - * - * Unlike [response], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response") - @ExcludeMissing - fun _response(): JsonField = response - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ResponseCreatedEvent]. - * - * The following fields are required: - * ```java - * .eventId() - * .response() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseCreatedEvent]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var response: JsonField? = null - private var type: JsonValue = JsonValue.from("response.created") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseCreatedEvent: ResponseCreatedEvent) = apply { - eventId = responseCreatedEvent.eventId - response = responseCreatedEvent.response - type = responseCreatedEvent.type - additionalProperties = responseCreatedEvent.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The response resource. */ - fun response(response: RealtimeResponse) = response(JsonField.of(response)) - - /** - * Sets [Builder.response] to an arbitrary JSON value. - * - * You should usually call [Builder.response] with a well-typed [RealtimeResponse] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun response(response: JsonField) = apply { this.response = response } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.created") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseCreatedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .response() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseCreatedEvent = - ResponseCreatedEvent( - checkRequired("eventId", eventId), - checkRequired("response", response), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseCreatedEvent = apply { - if (validated) { - return@apply - } - - eventId() - response().validate() - _type().let { - if (it != JsonValue.from("response.created")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (response.asKnown().getOrNull()?.validity() ?: 0) + - type.let { if (it == JsonValue.from("response.created")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseCreatedEvent && - eventId == other.eventId && - response == other.response && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(eventId, response, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseCreatedEvent{eventId=$eventId, response=$response, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseDoneEvent.kt deleted file mode 100644 index b39cafcea..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseDoneEvent.kt +++ /dev/null @@ -1,262 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import kotlin.jvm.optionals.getOrNull - -/** - * Returned when a Response is done streaming. Always emitted, no matter the final state. The - * Response object included in the `response.done` event will include all output Items in the - * Response but will omit the raw audio data. - */ -class ResponseDoneEvent -private constructor( - private val eventId: JsonField, - private val response: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("response") - @ExcludeMissing - response: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, response, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The response resource. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun response(): RealtimeResponse = response.getRequired("response") - - /** - * The event type, must be `response.done`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.done") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [response]. - * - * Unlike [response], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response") - @ExcludeMissing - fun _response(): JsonField = response - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ResponseDoneEvent]. - * - * The following fields are required: - * ```java - * .eventId() - * .response() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseDoneEvent]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var response: JsonField? = null - private var type: JsonValue = JsonValue.from("response.done") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseDoneEvent: ResponseDoneEvent) = apply { - eventId = responseDoneEvent.eventId - response = responseDoneEvent.response - type = responseDoneEvent.type - additionalProperties = responseDoneEvent.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The response resource. */ - fun response(response: RealtimeResponse) = response(JsonField.of(response)) - - /** - * Sets [Builder.response] to an arbitrary JSON value. - * - * You should usually call [Builder.response] with a well-typed [RealtimeResponse] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun response(response: JsonField) = apply { this.response = response } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.done") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseDoneEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .response() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseDoneEvent = - ResponseDoneEvent( - checkRequired("eventId", eventId), - checkRequired("response", response), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseDoneEvent = apply { - if (validated) { - return@apply - } - - eventId() - response().validate() - _type().let { - if (it != JsonValue.from("response.done")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (response.asKnown().getOrNull()?.validity() ?: 0) + - type.let { if (it == JsonValue.from("response.done")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseDoneEvent && - eventId == other.eventId && - response == other.response && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(eventId, response, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseDoneEvent{eventId=$eventId, response=$response, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDeltaEvent.kt deleted file mode 100644 index a3bfd86f2..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDeltaEvent.kt +++ /dev/null @@ -1,417 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects - -/** Returned when the model-generated function call arguments are updated. */ -class ResponseFunctionCallArgumentsDeltaEvent -private constructor( - private val callId: JsonField, - private val delta: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val outputIndex: JsonField, - private val responseId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("call_id") @ExcludeMissing callId: JsonField = JsonMissing.of(), - @JsonProperty("delta") @ExcludeMissing delta: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("output_index") - @ExcludeMissing - outputIndex: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(callId, delta, eventId, itemId, outputIndex, responseId, type, mutableMapOf()) - - /** - * The ID of the function call. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun callId(): String = callId.getRequired("call_id") - - /** - * The arguments delta as a JSON string. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun delta(): String = delta.getRequired("delta") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the function call item. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The index of the output item in the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun outputIndex(): Long = outputIndex.getRequired("output_index") - - /** - * The ID of the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The event type, must be `response.function_call_arguments.delta`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.function_call_arguments.delta") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [callId]. - * - * Unlike [callId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("call_id") @ExcludeMissing fun _callId(): JsonField = callId - - /** - * Returns the raw JSON value of [delta]. - * - * Unlike [delta], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("delta") @ExcludeMissing fun _delta(): JsonField = delta - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [outputIndex]. - * - * Unlike [outputIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output_index") @ExcludeMissing fun _outputIndex(): JsonField = outputIndex - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") @ExcludeMissing fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [ResponseFunctionCallArgumentsDeltaEvent]. - * - * The following fields are required: - * ```java - * .callId() - * .delta() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseFunctionCallArgumentsDeltaEvent]. */ - class Builder internal constructor() { - - private var callId: JsonField? = null - private var delta: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var outputIndex: JsonField? = null - private var responseId: JsonField? = null - private var type: JsonValue = JsonValue.from("response.function_call_arguments.delta") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from( - responseFunctionCallArgumentsDeltaEvent: ResponseFunctionCallArgumentsDeltaEvent - ) = apply { - callId = responseFunctionCallArgumentsDeltaEvent.callId - delta = responseFunctionCallArgumentsDeltaEvent.delta - eventId = responseFunctionCallArgumentsDeltaEvent.eventId - itemId = responseFunctionCallArgumentsDeltaEvent.itemId - outputIndex = responseFunctionCallArgumentsDeltaEvent.outputIndex - responseId = responseFunctionCallArgumentsDeltaEvent.responseId - type = responseFunctionCallArgumentsDeltaEvent.type - additionalProperties = - responseFunctionCallArgumentsDeltaEvent.additionalProperties.toMutableMap() - } - - /** The ID of the function call. */ - fun callId(callId: String) = callId(JsonField.of(callId)) - - /** - * Sets [Builder.callId] to an arbitrary JSON value. - * - * You should usually call [Builder.callId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun callId(callId: JsonField) = apply { this.callId = callId } - - /** The arguments delta as a JSON string. */ - fun delta(delta: String) = delta(JsonField.of(delta)) - - /** - * Sets [Builder.delta] to an arbitrary JSON value. - * - * You should usually call [Builder.delta] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun delta(delta: JsonField) = apply { this.delta = delta } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the function call item. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** The index of the output item in the response. */ - fun outputIndex(outputIndex: Long) = outputIndex(JsonField.of(outputIndex)) - - /** - * Sets [Builder.outputIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.outputIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun outputIndex(outputIndex: JsonField) = apply { this.outputIndex = outputIndex } - - /** The ID of the response. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.function_call_arguments.delta") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseFunctionCallArgumentsDeltaEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .callId() - * .delta() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseFunctionCallArgumentsDeltaEvent = - ResponseFunctionCallArgumentsDeltaEvent( - checkRequired("callId", callId), - checkRequired("delta", delta), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - checkRequired("outputIndex", outputIndex), - checkRequired("responseId", responseId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseFunctionCallArgumentsDeltaEvent = apply { - if (validated) { - return@apply - } - - callId() - delta() - eventId() - itemId() - outputIndex() - responseId() - _type().let { - if (it != JsonValue.from("response.function_call_arguments.delta")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (callId.asKnown().isPresent) 1 else 0) + - (if (delta.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - (if (outputIndex.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - type.let { - if (it == JsonValue.from("response.function_call_arguments.delta")) 1 else 0 - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseFunctionCallArgumentsDeltaEvent && - callId == other.callId && - delta == other.delta && - eventId == other.eventId && - itemId == other.itemId && - outputIndex == other.outputIndex && - responseId == other.responseId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - callId, - delta, - eventId, - itemId, - outputIndex, - responseId, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseFunctionCallArgumentsDeltaEvent{callId=$callId, delta=$delta, eventId=$eventId, itemId=$itemId, outputIndex=$outputIndex, responseId=$responseId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDoneEvent.kt deleted file mode 100644 index f83941396..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDoneEvent.kt +++ /dev/null @@ -1,419 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects - -/** - * Returned when the model-generated function call arguments are done streaming. Also emitted when a - * Response is interrupted, incomplete, or cancelled. - */ -class ResponseFunctionCallArgumentsDoneEvent -private constructor( - private val arguments: JsonField, - private val callId: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val outputIndex: JsonField, - private val responseId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("arguments") @ExcludeMissing arguments: JsonField = JsonMissing.of(), - @JsonProperty("call_id") @ExcludeMissing callId: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("output_index") - @ExcludeMissing - outputIndex: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(arguments, callId, eventId, itemId, outputIndex, responseId, type, mutableMapOf()) - - /** - * The final arguments as a JSON string. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun arguments(): String = arguments.getRequired("arguments") - - /** - * The ID of the function call. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun callId(): String = callId.getRequired("call_id") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the function call item. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The index of the output item in the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun outputIndex(): Long = outputIndex.getRequired("output_index") - - /** - * The ID of the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The event type, must be `response.function_call_arguments.done`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.function_call_arguments.done") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [arguments]. - * - * Unlike [arguments], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("arguments") @ExcludeMissing fun _arguments(): JsonField = arguments - - /** - * Returns the raw JSON value of [callId]. - * - * Unlike [callId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("call_id") @ExcludeMissing fun _callId(): JsonField = callId - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [outputIndex]. - * - * Unlike [outputIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output_index") @ExcludeMissing fun _outputIndex(): JsonField = outputIndex - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") @ExcludeMissing fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [ResponseFunctionCallArgumentsDoneEvent]. - * - * The following fields are required: - * ```java - * .arguments() - * .callId() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseFunctionCallArgumentsDoneEvent]. */ - class Builder internal constructor() { - - private var arguments: JsonField? = null - private var callId: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var outputIndex: JsonField? = null - private var responseId: JsonField? = null - private var type: JsonValue = JsonValue.from("response.function_call_arguments.done") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from( - responseFunctionCallArgumentsDoneEvent: ResponseFunctionCallArgumentsDoneEvent - ) = apply { - arguments = responseFunctionCallArgumentsDoneEvent.arguments - callId = responseFunctionCallArgumentsDoneEvent.callId - eventId = responseFunctionCallArgumentsDoneEvent.eventId - itemId = responseFunctionCallArgumentsDoneEvent.itemId - outputIndex = responseFunctionCallArgumentsDoneEvent.outputIndex - responseId = responseFunctionCallArgumentsDoneEvent.responseId - type = responseFunctionCallArgumentsDoneEvent.type - additionalProperties = - responseFunctionCallArgumentsDoneEvent.additionalProperties.toMutableMap() - } - - /** The final arguments as a JSON string. */ - fun arguments(arguments: String) = arguments(JsonField.of(arguments)) - - /** - * Sets [Builder.arguments] to an arbitrary JSON value. - * - * You should usually call [Builder.arguments] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun arguments(arguments: JsonField) = apply { this.arguments = arguments } - - /** The ID of the function call. */ - fun callId(callId: String) = callId(JsonField.of(callId)) - - /** - * Sets [Builder.callId] to an arbitrary JSON value. - * - * You should usually call [Builder.callId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun callId(callId: JsonField) = apply { this.callId = callId } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the function call item. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** The index of the output item in the response. */ - fun outputIndex(outputIndex: Long) = outputIndex(JsonField.of(outputIndex)) - - /** - * Sets [Builder.outputIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.outputIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun outputIndex(outputIndex: JsonField) = apply { this.outputIndex = outputIndex } - - /** The ID of the response. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.function_call_arguments.done") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseFunctionCallArgumentsDoneEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .arguments() - * .callId() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseFunctionCallArgumentsDoneEvent = - ResponseFunctionCallArgumentsDoneEvent( - checkRequired("arguments", arguments), - checkRequired("callId", callId), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - checkRequired("outputIndex", outputIndex), - checkRequired("responseId", responseId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseFunctionCallArgumentsDoneEvent = apply { - if (validated) { - return@apply - } - - arguments() - callId() - eventId() - itemId() - outputIndex() - responseId() - _type().let { - if (it != JsonValue.from("response.function_call_arguments.done")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (arguments.asKnown().isPresent) 1 else 0) + - (if (callId.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - (if (outputIndex.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("response.function_call_arguments.done")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseFunctionCallArgumentsDoneEvent && - arguments == other.arguments && - callId == other.callId && - eventId == other.eventId && - itemId == other.itemId && - outputIndex == other.outputIndex && - responseId == other.responseId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - arguments, - callId, - eventId, - itemId, - outputIndex, - responseId, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseFunctionCallArgumentsDoneEvent{arguments=$arguments, callId=$callId, eventId=$eventId, itemId=$itemId, outputIndex=$outputIndex, responseId=$responseId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseOutputItemAddedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseOutputItemAddedEvent.kt deleted file mode 100644 index 2c73ecb6f..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseOutputItemAddedEvent.kt +++ /dev/null @@ -1,332 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import kotlin.jvm.optionals.getOrNull - -/** Returned when a new Item is created during Response generation. */ -class ResponseOutputItemAddedEvent -private constructor( - private val eventId: JsonField, - private val item: JsonField, - private val outputIndex: JsonField, - private val responseId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item") @ExcludeMissing item: JsonField = JsonMissing.of(), - @JsonProperty("output_index") - @ExcludeMissing - outputIndex: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, item, outputIndex, responseId, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The item to add to the conversation. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun item(): ConversationItem = item.getRequired("item") - - /** - * The index of the output item in the Response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun outputIndex(): Long = outputIndex.getRequired("output_index") - - /** - * The ID of the Response to which the item belongs. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The event type, must be `response.output_item.added`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.output_item.added") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [item]. - * - * Unlike [item], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item") @ExcludeMissing fun _item(): JsonField = item - - /** - * Returns the raw JSON value of [outputIndex]. - * - * Unlike [outputIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output_index") @ExcludeMissing fun _outputIndex(): JsonField = outputIndex - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") @ExcludeMissing fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ResponseOutputItemAddedEvent]. - * - * The following fields are required: - * ```java - * .eventId() - * .item() - * .outputIndex() - * .responseId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseOutputItemAddedEvent]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var item: JsonField? = null - private var outputIndex: JsonField? = null - private var responseId: JsonField? = null - private var type: JsonValue = JsonValue.from("response.output_item.added") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseOutputItemAddedEvent: ResponseOutputItemAddedEvent) = apply { - eventId = responseOutputItemAddedEvent.eventId - item = responseOutputItemAddedEvent.item - outputIndex = responseOutputItemAddedEvent.outputIndex - responseId = responseOutputItemAddedEvent.responseId - type = responseOutputItemAddedEvent.type - additionalProperties = responseOutputItemAddedEvent.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The item to add to the conversation. */ - fun item(item: ConversationItem) = item(JsonField.of(item)) - - /** - * Sets [Builder.item] to an arbitrary JSON value. - * - * You should usually call [Builder.item] with a well-typed [ConversationItem] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun item(item: JsonField) = apply { this.item = item } - - /** The index of the output item in the Response. */ - fun outputIndex(outputIndex: Long) = outputIndex(JsonField.of(outputIndex)) - - /** - * Sets [Builder.outputIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.outputIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun outputIndex(outputIndex: JsonField) = apply { this.outputIndex = outputIndex } - - /** The ID of the Response to which the item belongs. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.output_item.added") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseOutputItemAddedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .item() - * .outputIndex() - * .responseId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseOutputItemAddedEvent = - ResponseOutputItemAddedEvent( - checkRequired("eventId", eventId), - checkRequired("item", item), - checkRequired("outputIndex", outputIndex), - checkRequired("responseId", responseId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseOutputItemAddedEvent = apply { - if (validated) { - return@apply - } - - eventId() - item().validate() - outputIndex() - responseId() - _type().let { - if (it != JsonValue.from("response.output_item.added")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (item.asKnown().getOrNull()?.validity() ?: 0) + - (if (outputIndex.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("response.output_item.added")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseOutputItemAddedEvent && - eventId == other.eventId && - item == other.item && - outputIndex == other.outputIndex && - responseId == other.responseId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(eventId, item, outputIndex, responseId, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseOutputItemAddedEvent{eventId=$eventId, item=$item, outputIndex=$outputIndex, responseId=$responseId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseOutputItemDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseOutputItemDoneEvent.kt deleted file mode 100644 index 05f724c8d..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseOutputItemDoneEvent.kt +++ /dev/null @@ -1,335 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import kotlin.jvm.optionals.getOrNull - -/** - * Returned when an Item is done streaming. Also emitted when a Response is interrupted, incomplete, - * or cancelled. - */ -class ResponseOutputItemDoneEvent -private constructor( - private val eventId: JsonField, - private val item: JsonField, - private val outputIndex: JsonField, - private val responseId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item") @ExcludeMissing item: JsonField = JsonMissing.of(), - @JsonProperty("output_index") - @ExcludeMissing - outputIndex: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, item, outputIndex, responseId, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The item to add to the conversation. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun item(): ConversationItem = item.getRequired("item") - - /** - * The index of the output item in the Response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun outputIndex(): Long = outputIndex.getRequired("output_index") - - /** - * The ID of the Response to which the item belongs. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The event type, must be `response.output_item.done`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.output_item.done") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [item]. - * - * Unlike [item], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item") @ExcludeMissing fun _item(): JsonField = item - - /** - * Returns the raw JSON value of [outputIndex]. - * - * Unlike [outputIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output_index") @ExcludeMissing fun _outputIndex(): JsonField = outputIndex - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") @ExcludeMissing fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ResponseOutputItemDoneEvent]. - * - * The following fields are required: - * ```java - * .eventId() - * .item() - * .outputIndex() - * .responseId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseOutputItemDoneEvent]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var item: JsonField? = null - private var outputIndex: JsonField? = null - private var responseId: JsonField? = null - private var type: JsonValue = JsonValue.from("response.output_item.done") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseOutputItemDoneEvent: ResponseOutputItemDoneEvent) = apply { - eventId = responseOutputItemDoneEvent.eventId - item = responseOutputItemDoneEvent.item - outputIndex = responseOutputItemDoneEvent.outputIndex - responseId = responseOutputItemDoneEvent.responseId - type = responseOutputItemDoneEvent.type - additionalProperties = responseOutputItemDoneEvent.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The item to add to the conversation. */ - fun item(item: ConversationItem) = item(JsonField.of(item)) - - /** - * Sets [Builder.item] to an arbitrary JSON value. - * - * You should usually call [Builder.item] with a well-typed [ConversationItem] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun item(item: JsonField) = apply { this.item = item } - - /** The index of the output item in the Response. */ - fun outputIndex(outputIndex: Long) = outputIndex(JsonField.of(outputIndex)) - - /** - * Sets [Builder.outputIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.outputIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun outputIndex(outputIndex: JsonField) = apply { this.outputIndex = outputIndex } - - /** The ID of the Response to which the item belongs. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.output_item.done") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseOutputItemDoneEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .item() - * .outputIndex() - * .responseId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseOutputItemDoneEvent = - ResponseOutputItemDoneEvent( - checkRequired("eventId", eventId), - checkRequired("item", item), - checkRequired("outputIndex", outputIndex), - checkRequired("responseId", responseId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseOutputItemDoneEvent = apply { - if (validated) { - return@apply - } - - eventId() - item().validate() - outputIndex() - responseId() - _type().let { - if (it != JsonValue.from("response.output_item.done")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (item.asKnown().getOrNull()?.validity() ?: 0) + - (if (outputIndex.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("response.output_item.done")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseOutputItemDoneEvent && - eventId == other.eventId && - item == other.item && - outputIndex == other.outputIndex && - responseId == other.responseId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(eventId, item, outputIndex, responseId, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseOutputItemDoneEvent{eventId=$eventId, item=$item, outputIndex=$outputIndex, responseId=$responseId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseTextDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseTextDeltaEvent.kt deleted file mode 100644 index 33671767b..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseTextDeltaEvent.kt +++ /dev/null @@ -1,416 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects - -/** Returned when the text value of a "text" content part is updated. */ -class ResponseTextDeltaEvent -private constructor( - private val contentIndex: JsonField, - private val delta: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val outputIndex: JsonField, - private val responseId: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("content_index") - @ExcludeMissing - contentIndex: JsonField = JsonMissing.of(), - @JsonProperty("delta") @ExcludeMissing delta: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("output_index") - @ExcludeMissing - outputIndex: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(contentIndex, delta, eventId, itemId, outputIndex, responseId, type, mutableMapOf()) - - /** - * The index of the content part in the item's content array. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun contentIndex(): Long = contentIndex.getRequired("content_index") - - /** - * The text delta. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun delta(): String = delta.getRequired("delta") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the item. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The index of the output item in the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun outputIndex(): Long = outputIndex.getRequired("output_index") - - /** - * The ID of the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The event type, must be `response.text.delta`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.text.delta") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [contentIndex]. - * - * Unlike [contentIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content_index") - @ExcludeMissing - fun _contentIndex(): JsonField = contentIndex - - /** - * Returns the raw JSON value of [delta]. - * - * Unlike [delta], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("delta") @ExcludeMissing fun _delta(): JsonField = delta - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [outputIndex]. - * - * Unlike [outputIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output_index") @ExcludeMissing fun _outputIndex(): JsonField = outputIndex - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") @ExcludeMissing fun _responseId(): JsonField = responseId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ResponseTextDeltaEvent]. - * - * The following fields are required: - * ```java - * .contentIndex() - * .delta() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseTextDeltaEvent]. */ - class Builder internal constructor() { - - private var contentIndex: JsonField? = null - private var delta: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var outputIndex: JsonField? = null - private var responseId: JsonField? = null - private var type: JsonValue = JsonValue.from("response.text.delta") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseTextDeltaEvent: ResponseTextDeltaEvent) = apply { - contentIndex = responseTextDeltaEvent.contentIndex - delta = responseTextDeltaEvent.delta - eventId = responseTextDeltaEvent.eventId - itemId = responseTextDeltaEvent.itemId - outputIndex = responseTextDeltaEvent.outputIndex - responseId = responseTextDeltaEvent.responseId - type = responseTextDeltaEvent.type - additionalProperties = responseTextDeltaEvent.additionalProperties.toMutableMap() - } - - /** The index of the content part in the item's content array. */ - fun contentIndex(contentIndex: Long) = contentIndex(JsonField.of(contentIndex)) - - /** - * Sets [Builder.contentIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.contentIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun contentIndex(contentIndex: JsonField) = apply { this.contentIndex = contentIndex } - - /** The text delta. */ - fun delta(delta: String) = delta(JsonField.of(delta)) - - /** - * Sets [Builder.delta] to an arbitrary JSON value. - * - * You should usually call [Builder.delta] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun delta(delta: JsonField) = apply { this.delta = delta } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the item. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** The index of the output item in the response. */ - fun outputIndex(outputIndex: Long) = outputIndex(JsonField.of(outputIndex)) - - /** - * Sets [Builder.outputIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.outputIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun outputIndex(outputIndex: JsonField) = apply { this.outputIndex = outputIndex } - - /** The ID of the response. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.text.delta") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseTextDeltaEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .contentIndex() - * .delta() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseTextDeltaEvent = - ResponseTextDeltaEvent( - checkRequired("contentIndex", contentIndex), - checkRequired("delta", delta), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - checkRequired("outputIndex", outputIndex), - checkRequired("responseId", responseId), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseTextDeltaEvent = apply { - if (validated) { - return@apply - } - - contentIndex() - delta() - eventId() - itemId() - outputIndex() - responseId() - _type().let { - if (it != JsonValue.from("response.text.delta")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (contentIndex.asKnown().isPresent) 1 else 0) + - (if (delta.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - (if (outputIndex.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("response.text.delta")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseTextDeltaEvent && - contentIndex == other.contentIndex && - delta == other.delta && - eventId == other.eventId && - itemId == other.itemId && - outputIndex == other.outputIndex && - responseId == other.responseId && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - contentIndex, - delta, - eventId, - itemId, - outputIndex, - responseId, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseTextDeltaEvent{contentIndex=$contentIndex, delta=$delta, eventId=$eventId, itemId=$itemId, outputIndex=$outputIndex, responseId=$responseId, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseTextDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseTextDoneEvent.kt deleted file mode 100644 index 92b362532..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/ResponseTextDoneEvent.kt +++ /dev/null @@ -1,419 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects - -/** - * Returned when the text value of a "text" content part is done streaming. Also emitted when a - * Response is interrupted, incomplete, or cancelled. - */ -class ResponseTextDoneEvent -private constructor( - private val contentIndex: JsonField, - private val eventId: JsonField, - private val itemId: JsonField, - private val outputIndex: JsonField, - private val responseId: JsonField, - private val text: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("content_index") - @ExcludeMissing - contentIndex: JsonField = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("item_id") @ExcludeMissing itemId: JsonField = JsonMissing.of(), - @JsonProperty("output_index") - @ExcludeMissing - outputIndex: JsonField = JsonMissing.of(), - @JsonProperty("response_id") - @ExcludeMissing - responseId: JsonField = JsonMissing.of(), - @JsonProperty("text") @ExcludeMissing text: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(contentIndex, eventId, itemId, outputIndex, responseId, text, type, mutableMapOf()) - - /** - * The index of the content part in the item's content array. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun contentIndex(): Long = contentIndex.getRequired("content_index") - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * The ID of the item. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun itemId(): String = itemId.getRequired("item_id") - - /** - * The index of the output item in the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun outputIndex(): Long = outputIndex.getRequired("output_index") - - /** - * The ID of the response. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun responseId(): String = responseId.getRequired("response_id") - - /** - * The final text content. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun text(): String = text.getRequired("text") - - /** - * The event type, must be `response.text.done`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("response.text.done") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [contentIndex]. - * - * Unlike [contentIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("content_index") - @ExcludeMissing - fun _contentIndex(): JsonField = contentIndex - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [itemId]. - * - * Unlike [itemId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("item_id") @ExcludeMissing fun _itemId(): JsonField = itemId - - /** - * Returns the raw JSON value of [outputIndex]. - * - * Unlike [outputIndex], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("output_index") @ExcludeMissing fun _outputIndex(): JsonField = outputIndex - - /** - * Returns the raw JSON value of [responseId]. - * - * Unlike [responseId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("response_id") @ExcludeMissing fun _responseId(): JsonField = responseId - - /** - * Returns the raw JSON value of [text]. - * - * Unlike [text], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("text") @ExcludeMissing fun _text(): JsonField = text - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ResponseTextDoneEvent]. - * - * The following fields are required: - * ```java - * .contentIndex() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * .text() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ResponseTextDoneEvent]. */ - class Builder internal constructor() { - - private var contentIndex: JsonField? = null - private var eventId: JsonField? = null - private var itemId: JsonField? = null - private var outputIndex: JsonField? = null - private var responseId: JsonField? = null - private var text: JsonField? = null - private var type: JsonValue = JsonValue.from("response.text.done") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(responseTextDoneEvent: ResponseTextDoneEvent) = apply { - contentIndex = responseTextDoneEvent.contentIndex - eventId = responseTextDoneEvent.eventId - itemId = responseTextDoneEvent.itemId - outputIndex = responseTextDoneEvent.outputIndex - responseId = responseTextDoneEvent.responseId - text = responseTextDoneEvent.text - type = responseTextDoneEvent.type - additionalProperties = responseTextDoneEvent.additionalProperties.toMutableMap() - } - - /** The index of the content part in the item's content array. */ - fun contentIndex(contentIndex: Long) = contentIndex(JsonField.of(contentIndex)) - - /** - * Sets [Builder.contentIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.contentIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun contentIndex(contentIndex: JsonField) = apply { this.contentIndex = contentIndex } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** The ID of the item. */ - fun itemId(itemId: String) = itemId(JsonField.of(itemId)) - - /** - * Sets [Builder.itemId] to an arbitrary JSON value. - * - * You should usually call [Builder.itemId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun itemId(itemId: JsonField) = apply { this.itemId = itemId } - - /** The index of the output item in the response. */ - fun outputIndex(outputIndex: Long) = outputIndex(JsonField.of(outputIndex)) - - /** - * Sets [Builder.outputIndex] to an arbitrary JSON value. - * - * You should usually call [Builder.outputIndex] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun outputIndex(outputIndex: JsonField) = apply { this.outputIndex = outputIndex } - - /** The ID of the response. */ - fun responseId(responseId: String) = responseId(JsonField.of(responseId)) - - /** - * Sets [Builder.responseId] to an arbitrary JSON value. - * - * You should usually call [Builder.responseId] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun responseId(responseId: JsonField) = apply { this.responseId = responseId } - - /** The final text content. */ - fun text(text: String) = text(JsonField.of(text)) - - /** - * Sets [Builder.text] to an arbitrary JSON value. - * - * You should usually call [Builder.text] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun text(text: JsonField) = apply { this.text = text } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("response.text.done") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ResponseTextDoneEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .contentIndex() - * .eventId() - * .itemId() - * .outputIndex() - * .responseId() - * .text() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ResponseTextDoneEvent = - ResponseTextDoneEvent( - checkRequired("contentIndex", contentIndex), - checkRequired("eventId", eventId), - checkRequired("itemId", itemId), - checkRequired("outputIndex", outputIndex), - checkRequired("responseId", responseId), - checkRequired("text", text), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ResponseTextDoneEvent = apply { - if (validated) { - return@apply - } - - contentIndex() - eventId() - itemId() - outputIndex() - responseId() - text() - _type().let { - if (it != JsonValue.from("response.text.done")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (contentIndex.asKnown().isPresent) 1 else 0) + - (if (eventId.asKnown().isPresent) 1 else 0) + - (if (itemId.asKnown().isPresent) 1 else 0) + - (if (outputIndex.asKnown().isPresent) 1 else 0) + - (if (responseId.asKnown().isPresent) 1 else 0) + - (if (text.asKnown().isPresent) 1 else 0) + - type.let { if (it == JsonValue.from("response.text.done")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ResponseTextDoneEvent && - contentIndex == other.contentIndex && - eventId == other.eventId && - itemId == other.itemId && - outputIndex == other.outputIndex && - responseId == other.responseId && - text == other.text && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - contentIndex, - eventId, - itemId, - outputIndex, - responseId, - text, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ResponseTextDoneEvent{contentIndex=$contentIndex, eventId=$eventId, itemId=$itemId, outputIndex=$outputIndex, responseId=$responseId, text=$text, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/SessionCreatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/SessionCreatedEvent.kt deleted file mode 100644 index fee35a5ff..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/SessionCreatedEvent.kt +++ /dev/null @@ -1,255 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import com.openai.models.beta.realtime.sessions.Session -import java.util.Collections -import java.util.Objects -import kotlin.jvm.optionals.getOrNull - -/** - * Returned when a Session is created. Emitted automatically when a new connection is established as - * the first server event. This event will contain the default Session configuration. - */ -class SessionCreatedEvent -private constructor( - private val eventId: JsonField, - private val session: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("session") @ExcludeMissing session: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, session, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * Realtime session object configuration. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun session(): Session = session.getRequired("session") - - /** - * The event type, must be `session.created`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("session.created") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [session]. - * - * Unlike [session], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("session") @ExcludeMissing fun _session(): JsonField = session - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [SessionCreatedEvent]. - * - * The following fields are required: - * ```java - * .eventId() - * .session() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [SessionCreatedEvent]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var session: JsonField? = null - private var type: JsonValue = JsonValue.from("session.created") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(sessionCreatedEvent: SessionCreatedEvent) = apply { - eventId = sessionCreatedEvent.eventId - session = sessionCreatedEvent.session - type = sessionCreatedEvent.type - additionalProperties = sessionCreatedEvent.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** Realtime session object configuration. */ - fun session(session: Session) = session(JsonField.of(session)) - - /** - * Sets [Builder.session] to an arbitrary JSON value. - * - * You should usually call [Builder.session] with a well-typed [Session] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun session(session: JsonField) = apply { this.session = session } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("session.created") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [SessionCreatedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .session() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): SessionCreatedEvent = - SessionCreatedEvent( - checkRequired("eventId", eventId), - checkRequired("session", session), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): SessionCreatedEvent = apply { - if (validated) { - return@apply - } - - eventId() - session().validate() - _type().let { - if (it != JsonValue.from("session.created")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (session.asKnown().getOrNull()?.validity() ?: 0) + - type.let { if (it == JsonValue.from("session.created")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is SessionCreatedEvent && - eventId == other.eventId && - session == other.session && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(eventId, session, type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "SessionCreatedEvent{eventId=$eventId, session=$session, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/SessionUpdateEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/SessionUpdateEvent.kt deleted file mode 100644 index cde05a224..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/SessionUpdateEvent.kt +++ /dev/null @@ -1,4768 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.ObjectCodec -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.BaseDeserializer -import com.openai.core.BaseSerializer -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.allMaxBy -import com.openai.core.checkKnown -import com.openai.core.checkRequired -import com.openai.core.getOrThrow -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * Send this event to update the session’s default configuration. The client may send this event at - * any time to update any field, except for `voice`. However, note that once a session has been - * initialized with a particular `model`, it can’t be changed to another model using - * `session.update`. - * - * When the server receives a `session.update`, it will respond with a `session.updated` event - * showing the full, effective configuration. Only the fields that are present are updated. To clear - * a field like `instructions`, pass an empty string. - */ -class SessionUpdateEvent -private constructor( - private val session: JsonField, - private val type: JsonValue, - private val eventId: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("session") @ExcludeMissing session: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - ) : this(session, type, eventId, mutableMapOf()) - - /** - * Realtime session object configuration. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun session(): Session = session.getRequired("session") - - /** - * The event type, must be `session.update`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("session.update") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Optional client-generated ID used to identify this event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eventId(): Optional = eventId.getOptional("event_id") - - /** - * Returns the raw JSON value of [session]. - * - * Unlike [session], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("session") @ExcludeMissing fun _session(): JsonField = session - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [SessionUpdateEvent]. - * - * The following fields are required: - * ```java - * .session() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [SessionUpdateEvent]. */ - class Builder internal constructor() { - - private var session: JsonField? = null - private var type: JsonValue = JsonValue.from("session.update") - private var eventId: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(sessionUpdateEvent: SessionUpdateEvent) = apply { - session = sessionUpdateEvent.session - type = sessionUpdateEvent.type - eventId = sessionUpdateEvent.eventId - additionalProperties = sessionUpdateEvent.additionalProperties.toMutableMap() - } - - /** Realtime session object configuration. */ - fun session(session: Session) = session(JsonField.of(session)) - - /** - * Sets [Builder.session] to an arbitrary JSON value. - * - * You should usually call [Builder.session] with a well-typed [Session] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun session(session: JsonField) = apply { this.session = session } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("session.update") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** Optional client-generated ID used to identify this event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [SessionUpdateEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .session() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): SessionUpdateEvent = - SessionUpdateEvent( - checkRequired("session", session), - type, - eventId, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): SessionUpdateEvent = apply { - if (validated) { - return@apply - } - - session().validate() - _type().let { - if (it != JsonValue.from("session.update")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - eventId() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (session.asKnown().getOrNull()?.validity() ?: 0) + - type.let { if (it == JsonValue.from("session.update")) 1 else 0 } + - (if (eventId.asKnown().isPresent) 1 else 0) - - /** Realtime session object configuration. */ - class Session - private constructor( - private val clientSecret: JsonField, - private val inputAudioFormat: JsonField, - private val inputAudioNoiseReduction: JsonField, - private val inputAudioTranscription: JsonField, - private val instructions: JsonField, - private val maxResponseOutputTokens: JsonField, - private val modalities: JsonField>, - private val model: JsonField, - private val outputAudioFormat: JsonField, - private val speed: JsonField, - private val temperature: JsonField, - private val toolChoice: JsonField, - private val tools: JsonField>, - private val tracing: JsonField, - private val turnDetection: JsonField, - private val voice: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("client_secret") - @ExcludeMissing - clientSecret: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_format") - @ExcludeMissing - inputAudioFormat: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_noise_reduction") - @ExcludeMissing - inputAudioNoiseReduction: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_transcription") - @ExcludeMissing - inputAudioTranscription: JsonField = JsonMissing.of(), - @JsonProperty("instructions") - @ExcludeMissing - instructions: JsonField = JsonMissing.of(), - @JsonProperty("max_response_output_tokens") - @ExcludeMissing - maxResponseOutputTokens: JsonField = JsonMissing.of(), - @JsonProperty("modalities") - @ExcludeMissing - modalities: JsonField> = JsonMissing.of(), - @JsonProperty("model") @ExcludeMissing model: JsonField = JsonMissing.of(), - @JsonProperty("output_audio_format") - @ExcludeMissing - outputAudioFormat: JsonField = JsonMissing.of(), - @JsonProperty("speed") @ExcludeMissing speed: JsonField = JsonMissing.of(), - @JsonProperty("temperature") - @ExcludeMissing - temperature: JsonField = JsonMissing.of(), - @JsonProperty("tool_choice") - @ExcludeMissing - toolChoice: JsonField = JsonMissing.of(), - @JsonProperty("tools") @ExcludeMissing tools: JsonField> = JsonMissing.of(), - @JsonProperty("tracing") @ExcludeMissing tracing: JsonField = JsonMissing.of(), - @JsonProperty("turn_detection") - @ExcludeMissing - turnDetection: JsonField = JsonMissing.of(), - @JsonProperty("voice") @ExcludeMissing voice: JsonField = JsonMissing.of(), - ) : this( - clientSecret, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - instructions, - maxResponseOutputTokens, - modalities, - model, - outputAudioFormat, - speed, - temperature, - toolChoice, - tools, - tracing, - turnDetection, - voice, - mutableMapOf(), - ) - - /** - * Configuration options for the generated client secret. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun clientSecret(): Optional = clientSecret.getOptional("client_secret") - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioFormat(): Optional = - inputAudioFormat.getOptional("input_audio_format") - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. - * Noise reduction filters audio added to the input audio buffer before it is sent to VAD - * and the model. Filtering the audio can improve VAD and turn detection accuracy (reducing - * false positives) and model performance by improving perception of the input audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioNoiseReduction(): Optional = - inputAudioNoiseReduction.getOptional("input_audio_noise_reduction") - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` to - * turn off once on. Input audio transcription is not native to the model, since the model - * consumes audio directly. Transcription runs asynchronously through - * [the /audio/transcriptions endpoint](https://platform.openai.com/docs/api-reference/audio/createTranscription) - * and should be treated as guidance of input audio content rather than precisely what the - * model heard. The client can optionally set the language and prompt for transcription, - * these offer additional guidance to the transcription service. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioTranscription(): Optional = - inputAudioTranscription.getOptional("input_audio_transcription") - - /** - * The default system instructions (i.e. system message) prepended to model calls. This - * field allows the client to guide the model on desired responses. The model can be - * instructed on response content and format, (e.g. "be extremely succinct", "act friendly", - * "here are examples of good responses") and on audio behavior (e.g. "talk quickly", - * "inject emotion into your voice", "laugh frequently"). The instructions are not - * guaranteed to be followed by the model, but they provide guidance to the model on the - * desired behavior. - * - * Note that the server sets default instructions which will be used if this field is not - * set and are visible in the `session.created` event at the start of the session. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun instructions(): Optional = instructions.getOptional("instructions") - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun maxResponseOutputTokens(): Optional = - maxResponseOutputTokens.getOptional("max_response_output_tokens") - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun modalities(): Optional> = modalities.getOptional("modalities") - - /** - * The Realtime model used for this session. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun model(): Optional = model.getOptional("model") - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For - * `pcm16`, output audio is sampled at a rate of 24kHz. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun outputAudioFormat(): Optional = - outputAudioFormat.getOptional("output_audio_format") - - /** - * The speed of the model's spoken response. 1.0 is the default speed. 0.25 is the minimum - * speed. 1.5 is the maximum speed. This value can only be changed in between model turns, - * not while a response is in progress. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun speed(): Optional = speed.getOptional("speed") - - /** - * Sampling temperature for the model, limited to [0.6, 1.2]. For audio models a temperature - * of 0.8 is highly recommended for best performance. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun temperature(): Optional = temperature.getOptional("temperature") - - /** - * How the model chooses tools. Options are `auto`, `none`, `required`, or specify a - * function. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun toolChoice(): Optional = toolChoice.getOptional("tool_choice") - - /** - * Tools (functions) available to the model. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun tools(): Optional> = tools.getOptional("tools") - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is - * enabled for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, - * group id, and metadata. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun tracing(): Optional = tracing.getOptional("tracing") - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to - * `null` to turn off, in which case the client must manually trigger model response. Server - * VAD means that the model will detect the start and end of speech based on audio volume - * and respond at the end of user speech. Semantic VAD is more advanced and uses a turn - * detection model (in conjunction with VAD) to semantically estimate whether the user has - * finished speaking, then dynamically sets a timeout based on this probability. For - * example, if user audio trails off with "uhhm", the model will score a low probability of - * turn end and wait longer for the user to continue speaking. This can be useful for more - * natural conversations, but may have a higher latency. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun turnDetection(): Optional = turnDetection.getOptional("turn_detection") - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun voice(): Optional = voice.getOptional("voice") - - /** - * Returns the raw JSON value of [clientSecret]. - * - * Unlike [clientSecret], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("client_secret") - @ExcludeMissing - fun _clientSecret(): JsonField = clientSecret - - /** - * Returns the raw JSON value of [inputAudioFormat]. - * - * Unlike [inputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("input_audio_format") - @ExcludeMissing - fun _inputAudioFormat(): JsonField = inputAudioFormat - - /** - * Returns the raw JSON value of [inputAudioNoiseReduction]. - * - * Unlike [inputAudioNoiseReduction], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("input_audio_noise_reduction") - @ExcludeMissing - fun _inputAudioNoiseReduction(): JsonField = - inputAudioNoiseReduction - - /** - * Returns the raw JSON value of [inputAudioTranscription]. - * - * Unlike [inputAudioTranscription], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("input_audio_transcription") - @ExcludeMissing - fun _inputAudioTranscription(): JsonField = inputAudioTranscription - - /** - * Returns the raw JSON value of [instructions]. - * - * Unlike [instructions], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("instructions") - @ExcludeMissing - fun _instructions(): JsonField = instructions - - /** - * Returns the raw JSON value of [maxResponseOutputTokens]. - * - * Unlike [maxResponseOutputTokens], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("max_response_output_tokens") - @ExcludeMissing - fun _maxResponseOutputTokens(): JsonField = maxResponseOutputTokens - - /** - * Returns the raw JSON value of [modalities]. - * - * Unlike [modalities], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("modalities") - @ExcludeMissing - fun _modalities(): JsonField> = modalities - - /** - * Returns the raw JSON value of [model]. - * - * Unlike [model], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("model") @ExcludeMissing fun _model(): JsonField = model - - /** - * Returns the raw JSON value of [outputAudioFormat]. - * - * Unlike [outputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("output_audio_format") - @ExcludeMissing - fun _outputAudioFormat(): JsonField = outputAudioFormat - - /** - * Returns the raw JSON value of [speed]. - * - * Unlike [speed], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("speed") @ExcludeMissing fun _speed(): JsonField = speed - - /** - * Returns the raw JSON value of [temperature]. - * - * Unlike [temperature], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("temperature") - @ExcludeMissing - fun _temperature(): JsonField = temperature - - /** - * Returns the raw JSON value of [toolChoice]. - * - * Unlike [toolChoice], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tool_choice") - @ExcludeMissing - fun _toolChoice(): JsonField = toolChoice - - /** - * Returns the raw JSON value of [tools]. - * - * Unlike [tools], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tools") @ExcludeMissing fun _tools(): JsonField> = tools - - /** - * Returns the raw JSON value of [tracing]. - * - * Unlike [tracing], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tracing") @ExcludeMissing fun _tracing(): JsonField = tracing - - /** - * Returns the raw JSON value of [turnDetection]. - * - * Unlike [turnDetection], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("turn_detection") - @ExcludeMissing - fun _turnDetection(): JsonField = turnDetection - - /** - * Returns the raw JSON value of [voice]. - * - * Unlike [voice], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("voice") @ExcludeMissing fun _voice(): JsonField = voice - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Session]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Session]. */ - class Builder internal constructor() { - - private var clientSecret: JsonField = JsonMissing.of() - private var inputAudioFormat: JsonField = JsonMissing.of() - private var inputAudioNoiseReduction: JsonField = - JsonMissing.of() - private var inputAudioTranscription: JsonField = - JsonMissing.of() - private var instructions: JsonField = JsonMissing.of() - private var maxResponseOutputTokens: JsonField = - JsonMissing.of() - private var modalities: JsonField>? = null - private var model: JsonField = JsonMissing.of() - private var outputAudioFormat: JsonField = JsonMissing.of() - private var speed: JsonField = JsonMissing.of() - private var temperature: JsonField = JsonMissing.of() - private var toolChoice: JsonField = JsonMissing.of() - private var tools: JsonField>? = null - private var tracing: JsonField = JsonMissing.of() - private var turnDetection: JsonField = JsonMissing.of() - private var voice: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(session: Session) = apply { - clientSecret = session.clientSecret - inputAudioFormat = session.inputAudioFormat - inputAudioNoiseReduction = session.inputAudioNoiseReduction - inputAudioTranscription = session.inputAudioTranscription - instructions = session.instructions - maxResponseOutputTokens = session.maxResponseOutputTokens - modalities = session.modalities.map { it.toMutableList() } - model = session.model - outputAudioFormat = session.outputAudioFormat - speed = session.speed - temperature = session.temperature - toolChoice = session.toolChoice - tools = session.tools.map { it.toMutableList() } - tracing = session.tracing - turnDetection = session.turnDetection - voice = session.voice - additionalProperties = session.additionalProperties.toMutableMap() - } - - /** Configuration options for the generated client secret. */ - fun clientSecret(clientSecret: ClientSecret) = clientSecret(JsonField.of(clientSecret)) - - /** - * Sets [Builder.clientSecret] to an arbitrary JSON value. - * - * You should usually call [Builder.clientSecret] with a well-typed [ClientSecret] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun clientSecret(clientSecret: JsonField) = apply { - this.clientSecret = clientSecret - } - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For - * `pcm16`, input audio must be 16-bit PCM at a 24kHz sample rate, single channel - * (mono), and little-endian byte order. - */ - fun inputAudioFormat(inputAudioFormat: InputAudioFormat) = - inputAudioFormat(JsonField.of(inputAudioFormat)) - - /** - * Sets [Builder.inputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioFormat] with a well-typed - * [InputAudioFormat] value instead. This method is primarily for setting the field to - * an undocumented or not yet supported value. - */ - fun inputAudioFormat(inputAudioFormat: JsonField) = apply { - this.inputAudioFormat = inputAudioFormat - } - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. - * Noise reduction filters audio added to the input audio buffer before it is sent to - * VAD and the model. Filtering the audio can improve VAD and turn detection accuracy - * (reducing false positives) and model performance by improving perception of the input - * audio. - */ - fun inputAudioNoiseReduction(inputAudioNoiseReduction: InputAudioNoiseReduction) = - inputAudioNoiseReduction(JsonField.of(inputAudioNoiseReduction)) - - /** - * Sets [Builder.inputAudioNoiseReduction] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioNoiseReduction] with a well-typed - * [InputAudioNoiseReduction] value instead. This method is primarily for setting the - * field to an undocumented or not yet supported value. - */ - fun inputAudioNoiseReduction( - inputAudioNoiseReduction: JsonField - ) = apply { this.inputAudioNoiseReduction = inputAudioNoiseReduction } - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` - * to turn off once on. Input audio transcription is not native to the model, since the - * model consumes audio directly. Transcription runs asynchronously through - * [the /audio/transcriptions endpoint](https://platform.openai.com/docs/api-reference/audio/createTranscription) - * and should be treated as guidance of input audio content rather than precisely what - * the model heard. The client can optionally set the language and prompt for - * transcription, these offer additional guidance to the transcription service. - */ - fun inputAudioTranscription(inputAudioTranscription: InputAudioTranscription) = - inputAudioTranscription(JsonField.of(inputAudioTranscription)) - - /** - * Sets [Builder.inputAudioTranscription] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioTranscription] with a well-typed - * [InputAudioTranscription] value instead. This method is primarily for setting the - * field to an undocumented or not yet supported value. - */ - fun inputAudioTranscription( - inputAudioTranscription: JsonField - ) = apply { this.inputAudioTranscription = inputAudioTranscription } - - /** - * The default system instructions (i.e. system message) prepended to model calls. This - * field allows the client to guide the model on desired responses. The model can be - * instructed on response content and format, (e.g. "be extremely succinct", "act - * friendly", "here are examples of good responses") and on audio behavior (e.g. "talk - * quickly", "inject emotion into your voice", "laugh frequently"). The instructions are - * not guaranteed to be followed by the model, but they provide guidance to the model on - * the desired behavior. - * - * Note that the server sets default instructions which will be used if this field is - * not set and are visible in the `session.created` event at the start of the session. - */ - fun instructions(instructions: String) = instructions(JsonField.of(instructions)) - - /** - * Sets [Builder.instructions] to an arbitrary JSON value. - * - * You should usually call [Builder.instructions] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun instructions(instructions: JsonField) = apply { - this.instructions = instructions - } - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool - * calls. Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the - * maximum available tokens for a given model. Defaults to `inf`. - */ - fun maxResponseOutputTokens(maxResponseOutputTokens: MaxResponseOutputTokens) = - maxResponseOutputTokens(JsonField.of(maxResponseOutputTokens)) - - /** - * Sets [Builder.maxResponseOutputTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.maxResponseOutputTokens] with a well-typed - * [MaxResponseOutputTokens] value instead. This method is primarily for setting the - * field to an undocumented or not yet supported value. - */ - fun maxResponseOutputTokens( - maxResponseOutputTokens: JsonField - ) = apply { this.maxResponseOutputTokens = maxResponseOutputTokens } - - /** - * Alias for calling [maxResponseOutputTokens] with - * `MaxResponseOutputTokens.ofInteger(integer)`. - */ - fun maxResponseOutputTokens(integer: Long) = - maxResponseOutputTokens(MaxResponseOutputTokens.ofInteger(integer)) - - /** - * Alias for calling [maxResponseOutputTokens] with `MaxResponseOutputTokens.ofInf()`. - */ - fun maxResponseOutputTokensInf() = - maxResponseOutputTokens(MaxResponseOutputTokens.ofInf()) - - /** - * The set of modalities the model can respond with. To disable audio, set this to - * ["text"]. - */ - fun modalities(modalities: List) = modalities(JsonField.of(modalities)) - - /** - * Sets [Builder.modalities] to an arbitrary JSON value. - * - * You should usually call [Builder.modalities] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun modalities(modalities: JsonField>) = apply { - this.modalities = modalities.map { it.toMutableList() } - } - - /** - * Adds a single [Modality] to [modalities]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addModality(modality: Modality) = apply { - modalities = - (modalities ?: JsonField.of(mutableListOf())).also { - checkKnown("modalities", it).add(modality) - } - } - - /** The Realtime model used for this session. */ - fun model(model: Model) = model(JsonField.of(model)) - - /** - * Sets [Builder.model] to an arbitrary JSON value. - * - * You should usually call [Builder.model] with a well-typed [Model] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun model(model: JsonField) = apply { this.model = model } - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For - * `pcm16`, output audio is sampled at a rate of 24kHz. - */ - fun outputAudioFormat(outputAudioFormat: OutputAudioFormat) = - outputAudioFormat(JsonField.of(outputAudioFormat)) - - /** - * Sets [Builder.outputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.outputAudioFormat] with a well-typed - * [OutputAudioFormat] value instead. This method is primarily for setting the field to - * an undocumented or not yet supported value. - */ - fun outputAudioFormat(outputAudioFormat: JsonField) = apply { - this.outputAudioFormat = outputAudioFormat - } - - /** - * The speed of the model's spoken response. 1.0 is the default speed. 0.25 is the - * minimum speed. 1.5 is the maximum speed. This value can only be changed in between - * model turns, not while a response is in progress. - */ - fun speed(speed: Double) = speed(JsonField.of(speed)) - - /** - * Sets [Builder.speed] to an arbitrary JSON value. - * - * You should usually call [Builder.speed] with a well-typed [Double] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun speed(speed: JsonField) = apply { this.speed = speed } - - /** - * Sampling temperature for the model, limited to [0.6, 1.2]. For audio models a - * temperature of 0.8 is highly recommended for best performance. - */ - fun temperature(temperature: Double) = temperature(JsonField.of(temperature)) - - /** - * Sets [Builder.temperature] to an arbitrary JSON value. - * - * You should usually call [Builder.temperature] with a well-typed [Double] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun temperature(temperature: JsonField) = apply { - this.temperature = temperature - } - - /** - * How the model chooses tools. Options are `auto`, `none`, `required`, or specify a - * function. - */ - fun toolChoice(toolChoice: String) = toolChoice(JsonField.of(toolChoice)) - - /** - * Sets [Builder.toolChoice] to an arbitrary JSON value. - * - * You should usually call [Builder.toolChoice] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun toolChoice(toolChoice: JsonField) = apply { this.toolChoice = toolChoice } - - /** Tools (functions) available to the model. */ - fun tools(tools: List) = tools(JsonField.of(tools)) - - /** - * Sets [Builder.tools] to an arbitrary JSON value. - * - * You should usually call [Builder.tools] with a well-typed `List` value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun tools(tools: JsonField>) = apply { - this.tools = tools.map { it.toMutableList() } - } - - /** - * Adds a single [Tool] to [tools]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addTool(tool: Tool) = apply { - tools = - (tools ?: JsonField.of(mutableListOf())).also { - checkKnown("tools", it).add(tool) - } - } - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is - * enabled for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, - * group id, and metadata. - */ - fun tracing(tracing: Tracing) = tracing(JsonField.of(tracing)) - - /** - * Sets [Builder.tracing] to an arbitrary JSON value. - * - * You should usually call [Builder.tracing] with a well-typed [Tracing] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun tracing(tracing: JsonField) = apply { this.tracing = tracing } - - /** Alias for calling [tracing] with `Tracing.ofAuto()`. */ - fun tracingAuto() = tracing(Tracing.ofAuto()) - - /** Alias for calling [tracing] with `Tracing.ofConfiguration(configuration)`. */ - fun tracing(configuration: Tracing.TracingConfiguration) = - tracing(Tracing.ofConfiguration(configuration)) - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set - * to `null` to turn off, in which case the client must manually trigger model response. - * Server VAD means that the model will detect the start and end of speech based on - * audio volume and respond at the end of user speech. Semantic VAD is more advanced and - * uses a turn detection model (in conjunction with VAD) to semantically estimate - * whether the user has finished speaking, then dynamically sets a timeout based on this - * probability. For example, if user audio trails off with "uhhm", the model will score - * a low probability of turn end and wait longer for the user to continue speaking. This - * can be useful for more natural conversations, but may have a higher latency. - */ - fun turnDetection(turnDetection: TurnDetection) = - turnDetection(JsonField.of(turnDetection)) - - /** - * Sets [Builder.turnDetection] to an arbitrary JSON value. - * - * You should usually call [Builder.turnDetection] with a well-typed [TurnDetection] - * value instead. This method is primarily for setting the field to an undocumented or - * not yet supported value. - */ - fun turnDetection(turnDetection: JsonField) = apply { - this.turnDetection = turnDetection - } - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once - * the model has responded with audio at least once. Current voice options are `alloy`, - * `ash`, `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - */ - fun voice(voice: Voice) = voice(JsonField.of(voice)) - - /** - * Sets [Builder.voice] to an arbitrary JSON value. - * - * You should usually call [Builder.voice] with a well-typed [Voice] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun voice(voice: JsonField) = apply { this.voice = voice } - - /** - * Sets [voice] to an arbitrary [String]. - * - * You should usually call [voice] with a well-typed [Voice] constant instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun voice(value: String) = voice(Voice.of(value)) - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Session]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Session = - Session( - clientSecret, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - instructions, - maxResponseOutputTokens, - (modalities ?: JsonMissing.of()).map { it.toImmutable() }, - model, - outputAudioFormat, - speed, - temperature, - toolChoice, - (tools ?: JsonMissing.of()).map { it.toImmutable() }, - tracing, - turnDetection, - voice, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): Session = apply { - if (validated) { - return@apply - } - - clientSecret().ifPresent { it.validate() } - inputAudioFormat().ifPresent { it.validate() } - inputAudioNoiseReduction().ifPresent { it.validate() } - inputAudioTranscription().ifPresent { it.validate() } - instructions() - maxResponseOutputTokens().ifPresent { it.validate() } - modalities().ifPresent { it.forEach { it.validate() } } - model().ifPresent { it.validate() } - outputAudioFormat().ifPresent { it.validate() } - speed() - temperature() - toolChoice() - tools().ifPresent { it.forEach { it.validate() } } - tracing().ifPresent { it.validate() } - turnDetection().ifPresent { it.validate() } - voice() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (clientSecret.asKnown().getOrNull()?.validity() ?: 0) + - (inputAudioFormat.asKnown().getOrNull()?.validity() ?: 0) + - (inputAudioNoiseReduction.asKnown().getOrNull()?.validity() ?: 0) + - (inputAudioTranscription.asKnown().getOrNull()?.validity() ?: 0) + - (if (instructions.asKnown().isPresent) 1 else 0) + - (maxResponseOutputTokens.asKnown().getOrNull()?.validity() ?: 0) + - (modalities.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (model.asKnown().getOrNull()?.validity() ?: 0) + - (outputAudioFormat.asKnown().getOrNull()?.validity() ?: 0) + - (if (speed.asKnown().isPresent) 1 else 0) + - (if (temperature.asKnown().isPresent) 1 else 0) + - (if (toolChoice.asKnown().isPresent) 1 else 0) + - (tools.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (tracing.asKnown().getOrNull()?.validity() ?: 0) + - (turnDetection.asKnown().getOrNull()?.validity() ?: 0) + - (if (voice.asKnown().isPresent) 1 else 0) - - /** Configuration options for the generated client secret. */ - class ClientSecret - private constructor( - private val expiresAfter: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("expires_after") - @ExcludeMissing - expiresAfter: JsonField = JsonMissing.of() - ) : this(expiresAfter, mutableMapOf()) - - /** - * Configuration for the ephemeral token expiration. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun expiresAfter(): Optional = expiresAfter.getOptional("expires_after") - - /** - * Returns the raw JSON value of [expiresAfter]. - * - * Unlike [expiresAfter], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("expires_after") - @ExcludeMissing - fun _expiresAfter(): JsonField = expiresAfter - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [ClientSecret]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ClientSecret]. */ - class Builder internal constructor() { - - private var expiresAfter: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(clientSecret: ClientSecret) = apply { - expiresAfter = clientSecret.expiresAfter - additionalProperties = clientSecret.additionalProperties.toMutableMap() - } - - /** Configuration for the ephemeral token expiration. */ - fun expiresAfter(expiresAfter: ExpiresAfter) = - expiresAfter(JsonField.of(expiresAfter)) - - /** - * Sets [Builder.expiresAfter] to an arbitrary JSON value. - * - * You should usually call [Builder.expiresAfter] with a well-typed [ExpiresAfter] - * value instead. This method is primarily for setting the field to an undocumented - * or not yet supported value. - */ - fun expiresAfter(expiresAfter: JsonField) = apply { - this.expiresAfter = expiresAfter - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ClientSecret]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): ClientSecret = - ClientSecret(expiresAfter, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): ClientSecret = apply { - if (validated) { - return@apply - } - - expiresAfter().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = (expiresAfter.asKnown().getOrNull()?.validity() ?: 0) - - /** Configuration for the ephemeral token expiration. */ - class ExpiresAfter - private constructor( - private val anchor: JsonField, - private val seconds: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("anchor") - @ExcludeMissing - anchor: JsonField = JsonMissing.of(), - @JsonProperty("seconds") - @ExcludeMissing - seconds: JsonField = JsonMissing.of(), - ) : this(anchor, seconds, mutableMapOf()) - - /** - * The anchor point for the ephemeral token expiration. Only `created_at` is - * currently supported. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected - * value). - */ - fun anchor(): Anchor = anchor.getRequired("anchor") - - /** - * The number of seconds from the anchor point to the expiration. Select a value - * between `10` and `7200`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. - * if the server responded with an unexpected value). - */ - fun seconds(): Optional = seconds.getOptional("seconds") - - /** - * Returns the raw JSON value of [anchor]. - * - * Unlike [anchor], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("anchor") @ExcludeMissing fun _anchor(): JsonField = anchor - - /** - * Returns the raw JSON value of [seconds]. - * - * Unlike [seconds], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("seconds") @ExcludeMissing fun _seconds(): JsonField = seconds - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ExpiresAfter]. - * - * The following fields are required: - * ```java - * .anchor() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ExpiresAfter]. */ - class Builder internal constructor() { - - private var anchor: JsonField? = null - private var seconds: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(expiresAfter: ExpiresAfter) = apply { - anchor = expiresAfter.anchor - seconds = expiresAfter.seconds - additionalProperties = expiresAfter.additionalProperties.toMutableMap() - } - - /** - * The anchor point for the ephemeral token expiration. Only `created_at` is - * currently supported. - */ - fun anchor(anchor: Anchor) = anchor(JsonField.of(anchor)) - - /** - * Sets [Builder.anchor] to an arbitrary JSON value. - * - * You should usually call [Builder.anchor] with a well-typed [Anchor] value - * instead. This method is primarily for setting the field to an undocumented or - * not yet supported value. - */ - fun anchor(anchor: JsonField) = apply { this.anchor = anchor } - - /** - * The number of seconds from the anchor point to the expiration. Select a value - * between `10` and `7200`. - */ - fun seconds(seconds: Long) = seconds(JsonField.of(seconds)) - - /** - * Sets [Builder.seconds] to an arbitrary JSON value. - * - * You should usually call [Builder.seconds] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or - * not yet supported value. - */ - fun seconds(seconds: JsonField) = apply { this.seconds = seconds } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ExpiresAfter]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .anchor() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ExpiresAfter = - ExpiresAfter( - checkRequired("anchor", anchor), - seconds, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ExpiresAfter = apply { - if (validated) { - return@apply - } - - anchor().validate() - seconds() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (anchor.asKnown().getOrNull()?.validity() ?: 0) + - (if (seconds.asKnown().isPresent) 1 else 0) - - /** - * The anchor point for the ephemeral token expiration. Only `created_at` is - * currently supported. - */ - class Anchor - @JsonCreator - private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that - * doesn't match any known member, and you want to know that value. For example, - * if the SDK is on an older version than the API, then the API may respond with - * new members that the SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue - fun _value(): JsonField = value - - companion object { - - @JvmField val CREATED_AT = of("created_at") - - @JvmStatic fun of(value: String) = Anchor(JsonField.of(value)) - } - - /** An enum containing [Anchor]'s known values. */ - enum class Known { - CREATED_AT - } - - /** - * An enum containing [Anchor]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Anchor] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For - * example, if the SDK is on an older version than the API, then the API may - * respond with new members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - CREATED_AT, - /** - * An enum member indicating that [Anchor] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or - * if you want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - CREATED_AT -> Value.CREATED_AT - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known - * and don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a - * known member. - */ - fun known(): Known = - when (this) { - CREATED_AT -> Known.CREATED_AT - else -> throw OpenAIInvalidDataException("Unknown Anchor: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not - * have the expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Anchor = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Anchor && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ExpiresAfter && - anchor == other.anchor && - seconds == other.seconds && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(anchor, seconds, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ExpiresAfter{anchor=$anchor, seconds=$seconds, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ClientSecret && - expiresAfter == other.expiresAfter && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(expiresAfter, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ClientSecret{expiresAfter=$expiresAfter, additionalProperties=$additionalProperties}" - } - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - */ - class InputAudioFormat - @JsonCreator - private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val PCM16 = of("pcm16") - - @JvmField val G711_ULAW = of("g711_ulaw") - - @JvmField val G711_ALAW = of("g711_alaw") - - @JvmStatic fun of(value: String) = InputAudioFormat(JsonField.of(value)) - } - - /** An enum containing [InputAudioFormat]'s known values. */ - enum class Known { - PCM16, - G711_ULAW, - G711_ALAW, - } - - /** - * An enum containing [InputAudioFormat]'s known values, as well as an [_UNKNOWN] - * member. - * - * An instance of [InputAudioFormat] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - PCM16, - G711_ULAW, - G711_ALAW, - /** - * An enum member indicating that [InputAudioFormat] was instantiated with an - * unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - PCM16 -> Value.PCM16 - G711_ULAW -> Value.G711_ULAW - G711_ALAW -> Value.G711_ALAW - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - PCM16 -> Known.PCM16 - G711_ULAW -> Known.G711_ULAW - G711_ALAW -> Known.G711_ALAW - else -> throw OpenAIInvalidDataException("Unknown InputAudioFormat: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): InputAudioFormat = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioFormat && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. - * Noise reduction filters audio added to the input audio buffer before it is sent to VAD - * and the model. Filtering the audio can improve VAD and turn detection accuracy (reducing - * false positives) and model performance by improving perception of the input audio. - */ - class InputAudioNoiseReduction - private constructor( - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of() - ) : this(type, mutableMapOf()) - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference - * room microphones. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [InputAudioNoiseReduction]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioNoiseReduction]. */ - class Builder internal constructor() { - - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioNoiseReduction: InputAudioNoiseReduction) = apply { - type = inputAudioNoiseReduction.type - additionalProperties = - inputAudioNoiseReduction.additionalProperties.toMutableMap() - } - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference - * room microphones. - */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioNoiseReduction]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioNoiseReduction = - InputAudioNoiseReduction(type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): InputAudioNoiseReduction = apply { - if (validated) { - return@apply - } - - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = (type.asKnown().getOrNull()?.validity() ?: 0) - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference - * room microphones. - */ - class Type @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that - * doesn't match any known member, and you want to know that value. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val NEAR_FIELD = of("near_field") - - @JvmField val FAR_FIELD = of("far_field") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - NEAR_FIELD, - FAR_FIELD, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, - * if the SDK is on an older version than the API, then the API may respond with - * new members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - NEAR_FIELD, - FAR_FIELD, - /** - * An enum member indicating that [Type] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if - * you want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - NEAR_FIELD -> Value.NEAR_FIELD - FAR_FIELD -> Value.FAR_FIELD - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a - * known member. - */ - fun known(): Known = - when (this) { - NEAR_FIELD -> Known.NEAR_FIELD - FAR_FIELD -> Known.FAR_FIELD - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have - * the expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioNoiseReduction && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioNoiseReduction{type=$type, additionalProperties=$additionalProperties}" - } - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` to - * turn off once on. Input audio transcription is not native to the model, since the model - * consumes audio directly. Transcription runs asynchronously through - * [the /audio/transcriptions endpoint](https://platform.openai.com/docs/api-reference/audio/createTranscription) - * and should be treated as guidance of input audio content rather than precisely what the - * model heard. The client can optionally set the language and prompt for transcription, - * these offer additional guidance to the transcription service. - */ - class InputAudioTranscription - private constructor( - private val language: JsonField, - private val model: JsonField, - private val prompt: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("language") - @ExcludeMissing - language: JsonField = JsonMissing.of(), - @JsonProperty("model") @ExcludeMissing model: JsonField = JsonMissing.of(), - @JsonProperty("prompt") @ExcludeMissing prompt: JsonField = JsonMissing.of(), - ) : this(language, model, prompt, mutableMapOf()) - - /** - * The language of the input audio. Supplying the input language in - * [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`) format - * will improve accuracy and latency. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun language(): Optional = language.getOptional("language") - - /** - * The model to use for transcription, current options are `gpt-4o-transcribe`, - * `gpt-4o-mini-transcribe`, and `whisper-1`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun model(): Optional = model.getOptional("model") - - /** - * An optional text to guide the model's style or continue a previous audio segment. For - * `whisper-1`, the - * [prompt is a list of keywords](https://platform.openai.com/docs/guides/speech-to-text#prompting). - * For `gpt-4o-transcribe` models, the prompt is a free text string, for example "expect - * words related to technology". - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun prompt(): Optional = prompt.getOptional("prompt") - - /** - * Returns the raw JSON value of [language]. - * - * Unlike [language], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("language") @ExcludeMissing fun _language(): JsonField = language - - /** - * Returns the raw JSON value of [model]. - * - * Unlike [model], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("model") @ExcludeMissing fun _model(): JsonField = model - - /** - * Returns the raw JSON value of [prompt]. - * - * Unlike [prompt], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("prompt") @ExcludeMissing fun _prompt(): JsonField = prompt - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [InputAudioTranscription]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioTranscription]. */ - class Builder internal constructor() { - - private var language: JsonField = JsonMissing.of() - private var model: JsonField = JsonMissing.of() - private var prompt: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioTranscription: InputAudioTranscription) = apply { - language = inputAudioTranscription.language - model = inputAudioTranscription.model - prompt = inputAudioTranscription.prompt - additionalProperties = - inputAudioTranscription.additionalProperties.toMutableMap() - } - - /** - * The language of the input audio. Supplying the input language in - * [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`) - * format will improve accuracy and latency. - */ - fun language(language: String) = language(JsonField.of(language)) - - /** - * Sets [Builder.language] to an arbitrary JSON value. - * - * You should usually call [Builder.language] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun language(language: JsonField) = apply { this.language = language } - - /** - * The model to use for transcription, current options are `gpt-4o-transcribe`, - * `gpt-4o-mini-transcribe`, and `whisper-1`. - */ - fun model(model: String) = model(JsonField.of(model)) - - /** - * Sets [Builder.model] to an arbitrary JSON value. - * - * You should usually call [Builder.model] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun model(model: JsonField) = apply { this.model = model } - - /** - * An optional text to guide the model's style or continue a previous audio segment. - * For `whisper-1`, the - * [prompt is a list of keywords](https://platform.openai.com/docs/guides/speech-to-text#prompting). - * For `gpt-4o-transcribe` models, the prompt is a free text string, for example - * "expect words related to technology". - */ - fun prompt(prompt: String) = prompt(JsonField.of(prompt)) - - /** - * Sets [Builder.prompt] to an arbitrary JSON value. - * - * You should usually call [Builder.prompt] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun prompt(prompt: JsonField) = apply { this.prompt = prompt } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioTranscription]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioTranscription = - InputAudioTranscription( - language, - model, - prompt, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): InputAudioTranscription = apply { - if (validated) { - return@apply - } - - language() - model() - prompt() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (language.asKnown().isPresent) 1 else 0) + - (if (model.asKnown().isPresent) 1 else 0) + - (if (prompt.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioTranscription && - language == other.language && - model == other.model && - prompt == other.prompt && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(language, model, prompt, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioTranscription{language=$language, model=$model, prompt=$prompt, additionalProperties=$additionalProperties}" - } - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - */ - @JsonDeserialize(using = MaxResponseOutputTokens.Deserializer::class) - @JsonSerialize(using = MaxResponseOutputTokens.Serializer::class) - class MaxResponseOutputTokens - private constructor( - private val integer: Long? = null, - private val inf: JsonValue? = null, - private val _json: JsonValue? = null, - ) { - - fun integer(): Optional = Optional.ofNullable(integer) - - fun inf(): Optional = Optional.ofNullable(inf) - - fun isInteger(): Boolean = integer != null - - fun isInf(): Boolean = inf != null - - fun asInteger(): Long = integer.getOrThrow("integer") - - fun asInf(): JsonValue = inf.getOrThrow("inf") - - fun _json(): Optional = Optional.ofNullable(_json) - - fun accept(visitor: Visitor): T = - when { - integer != null -> visitor.visitInteger(integer) - inf != null -> visitor.visitInf(inf) - else -> visitor.unknown(_json) - } - - private var validated: Boolean = false - - fun validate(): MaxResponseOutputTokens = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitInteger(integer: Long) {} - - override fun visitInf(inf: JsonValue) { - inf.let { - if (it != JsonValue.from("inf")) { - throw OpenAIInvalidDataException( - "'inf' is invalid, received $it" - ) - } - } - } - } - ) - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - accept( - object : Visitor { - override fun visitInteger(integer: Long) = 1 - - override fun visitInf(inf: JsonValue) = - inf.let { if (it == JsonValue.from("inf")) 1 else 0 } - - override fun unknown(json: JsonValue?) = 0 - } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is MaxResponseOutputTokens && - integer == other.integer && - inf == other.inf - } - - override fun hashCode(): Int = Objects.hash(integer, inf) - - override fun toString(): String = - when { - integer != null -> "MaxResponseOutputTokens{integer=$integer}" - inf != null -> "MaxResponseOutputTokens{inf=$inf}" - _json != null -> "MaxResponseOutputTokens{_unknown=$_json}" - else -> throw IllegalStateException("Invalid MaxResponseOutputTokens") - } - - companion object { - - @JvmStatic fun ofInteger(integer: Long) = MaxResponseOutputTokens(integer = integer) - - @JvmStatic fun ofInf() = MaxResponseOutputTokens(inf = JsonValue.from("inf")) - } - - /** - * An interface that defines how to map each variant of [MaxResponseOutputTokens] to a - * value of type [T]. - */ - interface Visitor { - - fun visitInteger(integer: Long): T - - fun visitInf(inf: JsonValue): T - - /** - * Maps an unknown variant of [MaxResponseOutputTokens] to a value of type [T]. - * - * An instance of [MaxResponseOutputTokens] can contain an unknown variant if it was - * deserialized from data that doesn't match any known variant. For example, if the - * SDK is on an older version than the API, then the API may respond with new - * variants that the SDK is unaware of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown MaxResponseOutputTokens: $json") - } - } - - internal class Deserializer : - BaseDeserializer(MaxResponseOutputTokens::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): MaxResponseOutputTokens { - val json = JsonValue.fromJsonNode(node) - - val bestMatches = - sequenceOf( - tryDeserialize(node, jacksonTypeRef()) - ?.let { MaxResponseOutputTokens(inf = it, _json = json) } - ?.takeIf { it.isValid() }, - tryDeserialize(node, jacksonTypeRef())?.let { - MaxResponseOutputTokens(integer = it, _json = json) - }, - ) - .filterNotNull() - .allMaxBy { it.validity() } - .toList() - return when (bestMatches.size) { - // This can happen if what we're deserializing is completely incompatible - // with all the possible variants (e.g. deserializing from object). - 0 -> MaxResponseOutputTokens(_json = json) - 1 -> bestMatches.single() - // If there's more than one match with the highest validity, then use the - // first completely valid match, or simply the first match if none are - // completely valid. - else -> bestMatches.firstOrNull { it.isValid() } ?: bestMatches.first() - } - } - } - - internal class Serializer : - BaseSerializer(MaxResponseOutputTokens::class) { - - override fun serialize( - value: MaxResponseOutputTokens, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.integer != null -> generator.writeObject(value.integer) - value.inf != null -> generator.writeObject(value.inf) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid MaxResponseOutputTokens") - } - } - } - } - - class Modality @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val TEXT = of("text") - - @JvmField val AUDIO = of("audio") - - @JvmStatic fun of(value: String) = Modality(JsonField.of(value)) - } - - /** An enum containing [Modality]'s known values. */ - enum class Known { - TEXT, - AUDIO, - } - - /** - * An enum containing [Modality]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Modality] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - TEXT, - AUDIO, - /** - * An enum member indicating that [Modality] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - TEXT -> Value.TEXT - AUDIO -> Value.AUDIO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - TEXT -> Known.TEXT - AUDIO -> Known.AUDIO - else -> throw OpenAIInvalidDataException("Unknown Modality: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Modality = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Modality && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** The Realtime model used for this session. */ - class Model @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val GPT_4O_REALTIME_PREVIEW = of("gpt-4o-realtime-preview") - - @JvmField - val GPT_4O_REALTIME_PREVIEW_2024_10_01 = of("gpt-4o-realtime-preview-2024-10-01") - - @JvmField - val GPT_4O_REALTIME_PREVIEW_2024_12_17 = of("gpt-4o-realtime-preview-2024-12-17") - - @JvmField - val GPT_4O_REALTIME_PREVIEW_2025_06_03 = of("gpt-4o-realtime-preview-2025-06-03") - - @JvmField val GPT_4O_MINI_REALTIME_PREVIEW = of("gpt-4o-mini-realtime-preview") - - @JvmField - val GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 = - of("gpt-4o-mini-realtime-preview-2024-12-17") - - @JvmStatic fun of(value: String) = Model(JsonField.of(value)) - } - - /** An enum containing [Model]'s known values. */ - enum class Known { - GPT_4O_REALTIME_PREVIEW, - GPT_4O_REALTIME_PREVIEW_2024_10_01, - GPT_4O_REALTIME_PREVIEW_2024_12_17, - GPT_4O_REALTIME_PREVIEW_2025_06_03, - GPT_4O_MINI_REALTIME_PREVIEW, - GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17, - } - - /** - * An enum containing [Model]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Model] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - GPT_4O_REALTIME_PREVIEW, - GPT_4O_REALTIME_PREVIEW_2024_10_01, - GPT_4O_REALTIME_PREVIEW_2024_12_17, - GPT_4O_REALTIME_PREVIEW_2025_06_03, - GPT_4O_MINI_REALTIME_PREVIEW, - GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17, - /** - * An enum member indicating that [Model] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - GPT_4O_REALTIME_PREVIEW -> Value.GPT_4O_REALTIME_PREVIEW - GPT_4O_REALTIME_PREVIEW_2024_10_01 -> Value.GPT_4O_REALTIME_PREVIEW_2024_10_01 - GPT_4O_REALTIME_PREVIEW_2024_12_17 -> Value.GPT_4O_REALTIME_PREVIEW_2024_12_17 - GPT_4O_REALTIME_PREVIEW_2025_06_03 -> Value.GPT_4O_REALTIME_PREVIEW_2025_06_03 - GPT_4O_MINI_REALTIME_PREVIEW -> Value.GPT_4O_MINI_REALTIME_PREVIEW - GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 -> - Value.GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - GPT_4O_REALTIME_PREVIEW -> Known.GPT_4O_REALTIME_PREVIEW - GPT_4O_REALTIME_PREVIEW_2024_10_01 -> Known.GPT_4O_REALTIME_PREVIEW_2024_10_01 - GPT_4O_REALTIME_PREVIEW_2024_12_17 -> Known.GPT_4O_REALTIME_PREVIEW_2024_12_17 - GPT_4O_REALTIME_PREVIEW_2025_06_03 -> Known.GPT_4O_REALTIME_PREVIEW_2025_06_03 - GPT_4O_MINI_REALTIME_PREVIEW -> Known.GPT_4O_MINI_REALTIME_PREVIEW - GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 -> - Known.GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 - else -> throw OpenAIInvalidDataException("Unknown Model: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Model = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Model && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For - * `pcm16`, output audio is sampled at a rate of 24kHz. - */ - class OutputAudioFormat - @JsonCreator - private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val PCM16 = of("pcm16") - - @JvmField val G711_ULAW = of("g711_ulaw") - - @JvmField val G711_ALAW = of("g711_alaw") - - @JvmStatic fun of(value: String) = OutputAudioFormat(JsonField.of(value)) - } - - /** An enum containing [OutputAudioFormat]'s known values. */ - enum class Known { - PCM16, - G711_ULAW, - G711_ALAW, - } - - /** - * An enum containing [OutputAudioFormat]'s known values, as well as an [_UNKNOWN] - * member. - * - * An instance of [OutputAudioFormat] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - PCM16, - G711_ULAW, - G711_ALAW, - /** - * An enum member indicating that [OutputAudioFormat] was instantiated with an - * unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - PCM16 -> Value.PCM16 - G711_ULAW -> Value.G711_ULAW - G711_ALAW -> Value.G711_ALAW - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - PCM16 -> Known.PCM16 - G711_ULAW -> Known.G711_ULAW - G711_ALAW -> Known.G711_ALAW - else -> throw OpenAIInvalidDataException("Unknown OutputAudioFormat: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): OutputAudioFormat = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is OutputAudioFormat && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - class Tool - private constructor( - private val description: JsonField, - private val name: JsonField, - private val parameters: JsonValue, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("description") - @ExcludeMissing - description: JsonField = JsonMissing.of(), - @JsonProperty("name") @ExcludeMissing name: JsonField = JsonMissing.of(), - @JsonProperty("parameters") - @ExcludeMissing - parameters: JsonValue = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(description, name, parameters, type, mutableMapOf()) - - /** - * The description of the function, including guidance on when and how to call it, and - * guidance about what to tell the user when calling (if anything). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun description(): Optional = description.getOptional("description") - - /** - * The name of the function. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun name(): Optional = name.getOptional("name") - - /** Parameters of the function in JSON Schema. */ - @JsonProperty("parameters") @ExcludeMissing fun _parameters(): JsonValue = parameters - - /** - * The type of the tool, i.e. `function`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [description]. - * - * Unlike [description], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("description") - @ExcludeMissing - fun _description(): JsonField = description - - /** - * Returns the raw JSON value of [name]. - * - * Unlike [name], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("name") @ExcludeMissing fun _name(): JsonField = name - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Tool]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Tool]. */ - class Builder internal constructor() { - - private var description: JsonField = JsonMissing.of() - private var name: JsonField = JsonMissing.of() - private var parameters: JsonValue = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(tool: Tool) = apply { - description = tool.description - name = tool.name - parameters = tool.parameters - type = tool.type - additionalProperties = tool.additionalProperties.toMutableMap() - } - - /** - * The description of the function, including guidance on when and how to call it, - * and guidance about what to tell the user when calling (if anything). - */ - fun description(description: String) = description(JsonField.of(description)) - - /** - * Sets [Builder.description] to an arbitrary JSON value. - * - * You should usually call [Builder.description] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun description(description: JsonField) = apply { - this.description = description - } - - /** The name of the function. */ - fun name(name: String) = name(JsonField.of(name)) - - /** - * Sets [Builder.name] to an arbitrary JSON value. - * - * You should usually call [Builder.name] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun name(name: JsonField) = apply { this.name = name } - - /** Parameters of the function in JSON Schema. */ - fun parameters(parameters: JsonValue) = apply { this.parameters = parameters } - - /** The type of the tool, i.e. `function`. */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Tool]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Tool = - Tool(description, name, parameters, type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): Tool = apply { - if (validated) { - return@apply - } - - description() - name() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (description.asKnown().isPresent) 1 else 0) + - (if (name.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** The type of the tool, i.e. `function`. */ - class Type @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that - * doesn't match any known member, and you want to know that value. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val FUNCTION = of("function") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - FUNCTION - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, - * if the SDK is on an older version than the API, then the API may respond with - * new members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - FUNCTION, - /** - * An enum member indicating that [Type] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if - * you want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - FUNCTION -> Value.FUNCTION - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a - * known member. - */ - fun known(): Known = - when (this) { - FUNCTION -> Known.FUNCTION - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have - * the expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Tool && - description == other.description && - name == other.name && - parameters == other.parameters && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(description, name, parameters, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Tool{description=$description, name=$name, parameters=$parameters, type=$type, additionalProperties=$additionalProperties}" - } - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is - * enabled for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, - * group id, and metadata. - */ - @JsonDeserialize(using = Tracing.Deserializer::class) - @JsonSerialize(using = Tracing.Serializer::class) - class Tracing - private constructor( - private val auto: JsonValue? = null, - private val configuration: TracingConfiguration? = null, - private val _json: JsonValue? = null, - ) { - - /** Default tracing mode for the session. */ - fun auto(): Optional = Optional.ofNullable(auto) - - /** Granular configuration for tracing. */ - fun configuration(): Optional = Optional.ofNullable(configuration) - - fun isAuto(): Boolean = auto != null - - fun isConfiguration(): Boolean = configuration != null - - /** Default tracing mode for the session. */ - fun asAuto(): JsonValue = auto.getOrThrow("auto") - - /** Granular configuration for tracing. */ - fun asConfiguration(): TracingConfiguration = configuration.getOrThrow("configuration") - - fun _json(): Optional = Optional.ofNullable(_json) - - fun accept(visitor: Visitor): T = - when { - auto != null -> visitor.visitAuto(auto) - configuration != null -> visitor.visitConfiguration(configuration) - else -> visitor.unknown(_json) - } - - private var validated: Boolean = false - - fun validate(): Tracing = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitAuto(auto: JsonValue) { - auto.let { - if (it != JsonValue.from("auto")) { - throw OpenAIInvalidDataException( - "'auto' is invalid, received $it" - ) - } - } - } - - override fun visitConfiguration(configuration: TracingConfiguration) { - configuration.validate() - } - } - ) - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - accept( - object : Visitor { - override fun visitAuto(auto: JsonValue) = - auto.let { if (it == JsonValue.from("auto")) 1 else 0 } - - override fun visitConfiguration(configuration: TracingConfiguration) = - configuration.validity() - - override fun unknown(json: JsonValue?) = 0 - } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Tracing && - auto == other.auto && - configuration == other.configuration - } - - override fun hashCode(): Int = Objects.hash(auto, configuration) - - override fun toString(): String = - when { - auto != null -> "Tracing{auto=$auto}" - configuration != null -> "Tracing{configuration=$configuration}" - _json != null -> "Tracing{_unknown=$_json}" - else -> throw IllegalStateException("Invalid Tracing") - } - - companion object { - - /** Default tracing mode for the session. */ - @JvmStatic fun ofAuto() = Tracing(auto = JsonValue.from("auto")) - - /** Granular configuration for tracing. */ - @JvmStatic - fun ofConfiguration(configuration: TracingConfiguration) = - Tracing(configuration = configuration) - } - - /** - * An interface that defines how to map each variant of [Tracing] to a value of type - * [T]. - */ - interface Visitor { - - /** Default tracing mode for the session. */ - fun visitAuto(auto: JsonValue): T - - /** Granular configuration for tracing. */ - fun visitConfiguration(configuration: TracingConfiguration): T - - /** - * Maps an unknown variant of [Tracing] to a value of type [T]. - * - * An instance of [Tracing] can contain an unknown variant if it was deserialized - * from data that doesn't match any known variant. For example, if the SDK is on an - * older version than the API, then the API may respond with new variants that the - * SDK is unaware of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown Tracing: $json") - } - } - - internal class Deserializer : BaseDeserializer(Tracing::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): Tracing { - val json = JsonValue.fromJsonNode(node) - - val bestMatches = - sequenceOf( - tryDeserialize(node, jacksonTypeRef()) - ?.let { Tracing(auto = it, _json = json) } - ?.takeIf { it.isValid() }, - tryDeserialize(node, jacksonTypeRef())?.let { - Tracing(configuration = it, _json = json) - }, - ) - .filterNotNull() - .allMaxBy { it.validity() } - .toList() - return when (bestMatches.size) { - // This can happen if what we're deserializing is completely incompatible - // with all the possible variants (e.g. deserializing from array). - 0 -> Tracing(_json = json) - 1 -> bestMatches.single() - // If there's more than one match with the highest validity, then use the - // first completely valid match, or simply the first match if none are - // completely valid. - else -> bestMatches.firstOrNull { it.isValid() } ?: bestMatches.first() - } - } - } - - internal class Serializer : BaseSerializer(Tracing::class) { - - override fun serialize( - value: Tracing, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.auto != null -> generator.writeObject(value.auto) - value.configuration != null -> generator.writeObject(value.configuration) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid Tracing") - } - } - } - - /** Granular configuration for tracing. */ - class TracingConfiguration - private constructor( - private val groupId: JsonField, - private val metadata: JsonValue, - private val workflowName: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("group_id") - @ExcludeMissing - groupId: JsonField = JsonMissing.of(), - @JsonProperty("metadata") - @ExcludeMissing - metadata: JsonValue = JsonMissing.of(), - @JsonProperty("workflow_name") - @ExcludeMissing - workflowName: JsonField = JsonMissing.of(), - ) : this(groupId, metadata, workflowName, mutableMapOf()) - - /** - * The group id to attach to this trace to enable filtering and grouping in the - * traces dashboard. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. - * if the server responded with an unexpected value). - */ - fun groupId(): Optional = groupId.getOptional("group_id") - - /** - * The arbitrary metadata to attach to this trace to enable filtering in the traces - * dashboard. - */ - @JsonProperty("metadata") @ExcludeMissing fun _metadata(): JsonValue = metadata - - /** - * The name of the workflow to attach to this trace. This is used to name the trace - * in the traces dashboard. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. - * if the server responded with an unexpected value). - */ - fun workflowName(): Optional = workflowName.getOptional("workflow_name") - - /** - * Returns the raw JSON value of [groupId]. - * - * Unlike [groupId], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("group_id") - @ExcludeMissing - fun _groupId(): JsonField = groupId - - /** - * Returns the raw JSON value of [workflowName]. - * - * Unlike [workflowName], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("workflow_name") - @ExcludeMissing - fun _workflowName(): JsonField = workflowName - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [TracingConfiguration]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TracingConfiguration]. */ - class Builder internal constructor() { - - private var groupId: JsonField = JsonMissing.of() - private var metadata: JsonValue = JsonMissing.of() - private var workflowName: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(tracingConfiguration: TracingConfiguration) = apply { - groupId = tracingConfiguration.groupId - metadata = tracingConfiguration.metadata - workflowName = tracingConfiguration.workflowName - additionalProperties = - tracingConfiguration.additionalProperties.toMutableMap() - } - - /** - * The group id to attach to this trace to enable filtering and grouping in the - * traces dashboard. - */ - fun groupId(groupId: String) = groupId(JsonField.of(groupId)) - - /** - * Sets [Builder.groupId] to an arbitrary JSON value. - * - * You should usually call [Builder.groupId] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or - * not yet supported value. - */ - fun groupId(groupId: JsonField) = apply { this.groupId = groupId } - - /** - * The arbitrary metadata to attach to this trace to enable filtering in the - * traces dashboard. - */ - fun metadata(metadata: JsonValue) = apply { this.metadata = metadata } - - /** - * The name of the workflow to attach to this trace. This is used to name the - * trace in the traces dashboard. - */ - fun workflowName(workflowName: String) = - workflowName(JsonField.of(workflowName)) - - /** - * Sets [Builder.workflowName] to an arbitrary JSON value. - * - * You should usually call [Builder.workflowName] with a well-typed [String] - * value instead. This method is primarily for setting the field to an - * undocumented or not yet supported value. - */ - fun workflowName(workflowName: JsonField) = apply { - this.workflowName = workflowName - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TracingConfiguration]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): TracingConfiguration = - TracingConfiguration( - groupId, - metadata, - workflowName, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TracingConfiguration = apply { - if (validated) { - return@apply - } - - groupId() - workflowName() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (groupId.asKnown().isPresent) 1 else 0) + - (if (workflowName.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TracingConfiguration && - groupId == other.groupId && - metadata == other.metadata && - workflowName == other.workflowName && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(groupId, metadata, workflowName, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TracingConfiguration{groupId=$groupId, metadata=$metadata, workflowName=$workflowName, additionalProperties=$additionalProperties}" - } - } - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to - * `null` to turn off, in which case the client must manually trigger model response. Server - * VAD means that the model will detect the start and end of speech based on audio volume - * and respond at the end of user speech. Semantic VAD is more advanced and uses a turn - * detection model (in conjunction with VAD) to semantically estimate whether the user has - * finished speaking, then dynamically sets a timeout based on this probability. For - * example, if user audio trails off with "uhhm", the model will score a low probability of - * turn end and wait longer for the user to continue speaking. This can be useful for more - * natural conversations, but may have a higher latency. - */ - class TurnDetection - private constructor( - private val createResponse: JsonField, - private val eagerness: JsonField, - private val interruptResponse: JsonField, - private val prefixPaddingMs: JsonField, - private val silenceDurationMs: JsonField, - private val threshold: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("create_response") - @ExcludeMissing - createResponse: JsonField = JsonMissing.of(), - @JsonProperty("eagerness") - @ExcludeMissing - eagerness: JsonField = JsonMissing.of(), - @JsonProperty("interrupt_response") - @ExcludeMissing - interruptResponse: JsonField = JsonMissing.of(), - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - prefixPaddingMs: JsonField = JsonMissing.of(), - @JsonProperty("silence_duration_ms") - @ExcludeMissing - silenceDurationMs: JsonField = JsonMissing.of(), - @JsonProperty("threshold") - @ExcludeMissing - threshold: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - mutableMapOf(), - ) - - /** - * Whether or not to automatically generate a response when a VAD stop event occurs. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun createResponse(): Optional = createResponse.getOptional("create_response") - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` will - * wait longer for the user to continue speaking, `high` will respond more quickly. - * `auto` is the default and is equivalent to `medium`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun eagerness(): Optional = eagerness.getOptional("eagerness") - - /** - * Whether or not to automatically interrupt any ongoing response with output to the - * default conversation (i.e. `conversation` of `auto`) when a VAD start event occurs. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun interruptResponse(): Optional = - interruptResponse.getOptional("interrupt_response") - - /** - * Used only for `server_vad` mode. Amount of audio to include before the VAD detected - * speech (in milliseconds). Defaults to 300ms. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun prefixPaddingMs(): Optional = prefixPaddingMs.getOptional("prefix_padding_ms") - - /** - * Used only for `server_vad` mode. Duration of silence to detect speech stop (in - * milliseconds). Defaults to 500ms. With shorter values the model will respond more - * quickly, but may jump in on short pauses from the user. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun silenceDurationMs(): Optional = - silenceDurationMs.getOptional("silence_duration_ms") - - /** - * Used only for `server_vad` mode. Activation threshold for VAD (0.0 to 1.0), this - * defaults to 0.5. A higher threshold will require louder audio to activate the model, - * and thus might perform better in noisy environments. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun threshold(): Optional = threshold.getOptional("threshold") - - /** - * Type of turn detection. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [createResponse]. - * - * Unlike [createResponse], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("create_response") - @ExcludeMissing - fun _createResponse(): JsonField = createResponse - - /** - * Returns the raw JSON value of [eagerness]. - * - * Unlike [eagerness], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("eagerness") - @ExcludeMissing - fun _eagerness(): JsonField = eagerness - - /** - * Returns the raw JSON value of [interruptResponse]. - * - * Unlike [interruptResponse], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("interrupt_response") - @ExcludeMissing - fun _interruptResponse(): JsonField = interruptResponse - - /** - * Returns the raw JSON value of [prefixPaddingMs]. - * - * Unlike [prefixPaddingMs], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - fun _prefixPaddingMs(): JsonField = prefixPaddingMs - - /** - * Returns the raw JSON value of [silenceDurationMs]. - * - * Unlike [silenceDurationMs], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("silence_duration_ms") - @ExcludeMissing - fun _silenceDurationMs(): JsonField = silenceDurationMs - - /** - * Returns the raw JSON value of [threshold]. - * - * Unlike [threshold], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("threshold") - @ExcludeMissing - fun _threshold(): JsonField = threshold - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [TurnDetection]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TurnDetection]. */ - class Builder internal constructor() { - - private var createResponse: JsonField = JsonMissing.of() - private var eagerness: JsonField = JsonMissing.of() - private var interruptResponse: JsonField = JsonMissing.of() - private var prefixPaddingMs: JsonField = JsonMissing.of() - private var silenceDurationMs: JsonField = JsonMissing.of() - private var threshold: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(turnDetection: TurnDetection) = apply { - createResponse = turnDetection.createResponse - eagerness = turnDetection.eagerness - interruptResponse = turnDetection.interruptResponse - prefixPaddingMs = turnDetection.prefixPaddingMs - silenceDurationMs = turnDetection.silenceDurationMs - threshold = turnDetection.threshold - type = turnDetection.type - additionalProperties = turnDetection.additionalProperties.toMutableMap() - } - - /** - * Whether or not to automatically generate a response when a VAD stop event occurs. - */ - fun createResponse(createResponse: Boolean) = - createResponse(JsonField.of(createResponse)) - - /** - * Sets [Builder.createResponse] to an arbitrary JSON value. - * - * You should usually call [Builder.createResponse] with a well-typed [Boolean] - * value instead. This method is primarily for setting the field to an undocumented - * or not yet supported value. - */ - fun createResponse(createResponse: JsonField) = apply { - this.createResponse = createResponse - } - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` - * will wait longer for the user to continue speaking, `high` will respond more - * quickly. `auto` is the default and is equivalent to `medium`. - */ - fun eagerness(eagerness: Eagerness) = eagerness(JsonField.of(eagerness)) - - /** - * Sets [Builder.eagerness] to an arbitrary JSON value. - * - * You should usually call [Builder.eagerness] with a well-typed [Eagerness] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun eagerness(eagerness: JsonField) = apply { - this.eagerness = eagerness - } - - /** - * Whether or not to automatically interrupt any ongoing response with output to the - * default conversation (i.e. `conversation` of `auto`) when a VAD start event - * occurs. - */ - fun interruptResponse(interruptResponse: Boolean) = - interruptResponse(JsonField.of(interruptResponse)) - - /** - * Sets [Builder.interruptResponse] to an arbitrary JSON value. - * - * You should usually call [Builder.interruptResponse] with a well-typed [Boolean] - * value instead. This method is primarily for setting the field to an undocumented - * or not yet supported value. - */ - fun interruptResponse(interruptResponse: JsonField) = apply { - this.interruptResponse = interruptResponse - } - - /** - * Used only for `server_vad` mode. Amount of audio to include before the VAD - * detected speech (in milliseconds). Defaults to 300ms. - */ - fun prefixPaddingMs(prefixPaddingMs: Long) = - prefixPaddingMs(JsonField.of(prefixPaddingMs)) - - /** - * Sets [Builder.prefixPaddingMs] to an arbitrary JSON value. - * - * You should usually call [Builder.prefixPaddingMs] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun prefixPaddingMs(prefixPaddingMs: JsonField) = apply { - this.prefixPaddingMs = prefixPaddingMs - } - - /** - * Used only for `server_vad` mode. Duration of silence to detect speech stop (in - * milliseconds). Defaults to 500ms. With shorter values the model will respond more - * quickly, but may jump in on short pauses from the user. - */ - fun silenceDurationMs(silenceDurationMs: Long) = - silenceDurationMs(JsonField.of(silenceDurationMs)) - - /** - * Sets [Builder.silenceDurationMs] to an arbitrary JSON value. - * - * You should usually call [Builder.silenceDurationMs] with a well-typed [Long] - * value instead. This method is primarily for setting the field to an undocumented - * or not yet supported value. - */ - fun silenceDurationMs(silenceDurationMs: JsonField) = apply { - this.silenceDurationMs = silenceDurationMs - } - - /** - * Used only for `server_vad` mode. Activation threshold for VAD (0.0 to 1.0), this - * defaults to 0.5. A higher threshold will require louder audio to activate the - * model, and thus might perform better in noisy environments. - */ - fun threshold(threshold: Double) = threshold(JsonField.of(threshold)) - - /** - * Sets [Builder.threshold] to an arbitrary JSON value. - * - * You should usually call [Builder.threshold] with a well-typed [Double] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun threshold(threshold: JsonField) = apply { this.threshold = threshold } - - /** Type of turn detection. */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TurnDetection]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): TurnDetection = - TurnDetection( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TurnDetection = apply { - if (validated) { - return@apply - } - - createResponse() - eagerness().ifPresent { it.validate() } - interruptResponse() - prefixPaddingMs() - silenceDurationMs() - threshold() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (createResponse.asKnown().isPresent) 1 else 0) + - (eagerness.asKnown().getOrNull()?.validity() ?: 0) + - (if (interruptResponse.asKnown().isPresent) 1 else 0) + - (if (prefixPaddingMs.asKnown().isPresent) 1 else 0) + - (if (silenceDurationMs.asKnown().isPresent) 1 else 0) + - (if (threshold.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` will - * wait longer for the user to continue speaking, `high` will respond more quickly. - * `auto` is the default and is equivalent to `medium`. - */ - class Eagerness @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that - * doesn't match any known member, and you want to know that value. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val LOW = of("low") - - @JvmField val MEDIUM = of("medium") - - @JvmField val HIGH = of("high") - - @JvmField val AUTO = of("auto") - - @JvmStatic fun of(value: String) = Eagerness(JsonField.of(value)) - } - - /** An enum containing [Eagerness]'s known values. */ - enum class Known { - LOW, - MEDIUM, - HIGH, - AUTO, - } - - /** - * An enum containing [Eagerness]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Eagerness] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, - * if the SDK is on an older version than the API, then the API may respond with - * new members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - LOW, - MEDIUM, - HIGH, - AUTO, - /** - * An enum member indicating that [Eagerness] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if - * you want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - LOW -> Value.LOW - MEDIUM -> Value.MEDIUM - HIGH -> Value.HIGH - AUTO -> Value.AUTO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a - * known member. - */ - fun known(): Known = - when (this) { - LOW -> Known.LOW - MEDIUM -> Known.MEDIUM - HIGH -> Known.HIGH - AUTO -> Known.AUTO - else -> throw OpenAIInvalidDataException("Unknown Eagerness: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have - * the expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Eagerness = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Eagerness && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** Type of turn detection. */ - class Type @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that - * doesn't match any known member, and you want to know that value. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val SERVER_VAD = of("server_vad") - - @JvmField val SEMANTIC_VAD = of("semantic_vad") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - SERVER_VAD, - SEMANTIC_VAD, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, - * if the SDK is on an older version than the API, then the API may respond with - * new members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - SERVER_VAD, - SEMANTIC_VAD, - /** - * An enum member indicating that [Type] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if - * you want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - SERVER_VAD -> Value.SERVER_VAD - SEMANTIC_VAD -> Value.SEMANTIC_VAD - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a - * known member. - */ - fun known(): Known = - when (this) { - SERVER_VAD -> Known.SERVER_VAD - SEMANTIC_VAD -> Known.SEMANTIC_VAD - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have - * the expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TurnDetection && - createResponse == other.createResponse && - eagerness == other.eagerness && - interruptResponse == other.interruptResponse && - prefixPaddingMs == other.prefixPaddingMs && - silenceDurationMs == other.silenceDurationMs && - threshold == other.threshold && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TurnDetection{createResponse=$createResponse, eagerness=$eagerness, interruptResponse=$interruptResponse, prefixPaddingMs=$prefixPaddingMs, silenceDurationMs=$silenceDurationMs, threshold=$threshold, type=$type, additionalProperties=$additionalProperties}" - } - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - */ - class Voice @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val ALLOY = of("alloy") - - @JvmField val ASH = of("ash") - - @JvmField val BALLAD = of("ballad") - - @JvmField val CORAL = of("coral") - - @JvmField val ECHO = of("echo") - - @JvmField val SAGE = of("sage") - - @JvmField val SHIMMER = of("shimmer") - - @JvmField val VERSE = of("verse") - - @JvmStatic fun of(value: String) = Voice(JsonField.of(value)) - } - - /** An enum containing [Voice]'s known values. */ - enum class Known { - ALLOY, - ASH, - BALLAD, - CORAL, - ECHO, - SAGE, - SHIMMER, - VERSE, - } - - /** - * An enum containing [Voice]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Voice] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - ALLOY, - ASH, - BALLAD, - CORAL, - ECHO, - SAGE, - SHIMMER, - VERSE, - /** - * An enum member indicating that [Voice] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - ALLOY -> Value.ALLOY - ASH -> Value.ASH - BALLAD -> Value.BALLAD - CORAL -> Value.CORAL - ECHO -> Value.ECHO - SAGE -> Value.SAGE - SHIMMER -> Value.SHIMMER - VERSE -> Value.VERSE - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - ALLOY -> Known.ALLOY - ASH -> Known.ASH - BALLAD -> Known.BALLAD - CORAL -> Known.CORAL - ECHO -> Known.ECHO - SAGE -> Known.SAGE - SHIMMER -> Known.SHIMMER - VERSE -> Known.VERSE - else -> throw OpenAIInvalidDataException("Unknown Voice: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Voice = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Voice && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Session && - clientSecret == other.clientSecret && - inputAudioFormat == other.inputAudioFormat && - inputAudioNoiseReduction == other.inputAudioNoiseReduction && - inputAudioTranscription == other.inputAudioTranscription && - instructions == other.instructions && - maxResponseOutputTokens == other.maxResponseOutputTokens && - modalities == other.modalities && - model == other.model && - outputAudioFormat == other.outputAudioFormat && - speed == other.speed && - temperature == other.temperature && - toolChoice == other.toolChoice && - tools == other.tools && - tracing == other.tracing && - turnDetection == other.turnDetection && - voice == other.voice && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - clientSecret, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - instructions, - maxResponseOutputTokens, - modalities, - model, - outputAudioFormat, - speed, - temperature, - toolChoice, - tools, - tracing, - turnDetection, - voice, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Session{clientSecret=$clientSecret, inputAudioFormat=$inputAudioFormat, inputAudioNoiseReduction=$inputAudioNoiseReduction, inputAudioTranscription=$inputAudioTranscription, instructions=$instructions, maxResponseOutputTokens=$maxResponseOutputTokens, modalities=$modalities, model=$model, outputAudioFormat=$outputAudioFormat, speed=$speed, temperature=$temperature, toolChoice=$toolChoice, tools=$tools, tracing=$tracing, turnDetection=$turnDetection, voice=$voice, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is SessionUpdateEvent && - session == other.session && - type == other.type && - eventId == other.eventId && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(session, type, eventId, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "SessionUpdateEvent{session=$session, type=$type, eventId=$eventId, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/SessionUpdatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/SessionUpdatedEvent.kt deleted file mode 100644 index 74904ef71..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/SessionUpdatedEvent.kt +++ /dev/null @@ -1,252 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import com.openai.models.beta.realtime.sessions.Session -import java.util.Collections -import java.util.Objects -import kotlin.jvm.optionals.getOrNull - -/** Returned when a session is updated with a `session.update` event, unless there is an error. */ -class SessionUpdatedEvent -private constructor( - private val eventId: JsonField, - private val session: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("session") @ExcludeMissing session: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, session, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * Realtime session object configuration. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun session(): Session = session.getRequired("session") - - /** - * The event type, must be `session.updated`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("session.updated") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [session]. - * - * Unlike [session], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("session") @ExcludeMissing fun _session(): JsonField = session - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [SessionUpdatedEvent]. - * - * The following fields are required: - * ```java - * .eventId() - * .session() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [SessionUpdatedEvent]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var session: JsonField? = null - private var type: JsonValue = JsonValue.from("session.updated") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(sessionUpdatedEvent: SessionUpdatedEvent) = apply { - eventId = sessionUpdatedEvent.eventId - session = sessionUpdatedEvent.session - type = sessionUpdatedEvent.type - additionalProperties = sessionUpdatedEvent.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** Realtime session object configuration. */ - fun session(session: Session) = session(JsonField.of(session)) - - /** - * Sets [Builder.session] to an arbitrary JSON value. - * - * You should usually call [Builder.session] with a well-typed [Session] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun session(session: JsonField) = apply { this.session = session } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("session.updated") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [SessionUpdatedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .session() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): SessionUpdatedEvent = - SessionUpdatedEvent( - checkRequired("eventId", eventId), - checkRequired("session", session), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): SessionUpdatedEvent = apply { - if (validated) { - return@apply - } - - eventId() - session().validate() - _type().let { - if (it != JsonValue.from("session.updated")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (session.asKnown().getOrNull()?.validity() ?: 0) + - type.let { if (it == JsonValue.from("session.updated")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is SessionUpdatedEvent && - eventId == other.eventId && - session == other.session && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(eventId, session, type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "SessionUpdatedEvent{eventId=$eventId, session=$session, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdate.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdate.kt deleted file mode 100644 index 4f29554b4..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdate.kt +++ /dev/null @@ -1,2948 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkKnown -import com.openai.core.checkRequired -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** Send this event to update a transcription session. */ -class TranscriptionSessionUpdate -private constructor( - private val session: JsonField, - private val type: JsonValue, - private val eventId: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("session") @ExcludeMissing session: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - ) : this(session, type, eventId, mutableMapOf()) - - /** - * Realtime transcription session object configuration. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun session(): Session = session.getRequired("session") - - /** - * The event type, must be `transcription_session.update`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("transcription_session.update") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Optional client-generated ID used to identify this event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eventId(): Optional = eventId.getOptional("event_id") - - /** - * Returns the raw JSON value of [session]. - * - * Unlike [session], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("session") @ExcludeMissing fun _session(): JsonField = session - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [TranscriptionSessionUpdate]. - * - * The following fields are required: - * ```java - * .session() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TranscriptionSessionUpdate]. */ - class Builder internal constructor() { - - private var session: JsonField? = null - private var type: JsonValue = JsonValue.from("transcription_session.update") - private var eventId: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(transcriptionSessionUpdate: TranscriptionSessionUpdate) = apply { - session = transcriptionSessionUpdate.session - type = transcriptionSessionUpdate.type - eventId = transcriptionSessionUpdate.eventId - additionalProperties = transcriptionSessionUpdate.additionalProperties.toMutableMap() - } - - /** Realtime transcription session object configuration. */ - fun session(session: Session) = session(JsonField.of(session)) - - /** - * Sets [Builder.session] to an arbitrary JSON value. - * - * You should usually call [Builder.session] with a well-typed [Session] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun session(session: JsonField) = apply { this.session = session } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("transcription_session.update") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - /** Optional client-generated ID used to identify this event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TranscriptionSessionUpdate]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .session() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): TranscriptionSessionUpdate = - TranscriptionSessionUpdate( - checkRequired("session", session), - type, - eventId, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TranscriptionSessionUpdate = apply { - if (validated) { - return@apply - } - - session().validate() - _type().let { - if (it != JsonValue.from("transcription_session.update")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - eventId() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (session.asKnown().getOrNull()?.validity() ?: 0) + - type.let { if (it == JsonValue.from("transcription_session.update")) 1 else 0 } + - (if (eventId.asKnown().isPresent) 1 else 0) - - /** Realtime transcription session object configuration. */ - class Session - private constructor( - private val clientSecret: JsonField, - private val include: JsonField>, - private val inputAudioFormat: JsonField, - private val inputAudioNoiseReduction: JsonField, - private val inputAudioTranscription: JsonField, - private val modalities: JsonField>, - private val turnDetection: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("client_secret") - @ExcludeMissing - clientSecret: JsonField = JsonMissing.of(), - @JsonProperty("include") - @ExcludeMissing - include: JsonField> = JsonMissing.of(), - @JsonProperty("input_audio_format") - @ExcludeMissing - inputAudioFormat: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_noise_reduction") - @ExcludeMissing - inputAudioNoiseReduction: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_transcription") - @ExcludeMissing - inputAudioTranscription: JsonField = JsonMissing.of(), - @JsonProperty("modalities") - @ExcludeMissing - modalities: JsonField> = JsonMissing.of(), - @JsonProperty("turn_detection") - @ExcludeMissing - turnDetection: JsonField = JsonMissing.of(), - ) : this( - clientSecret, - include, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - modalities, - turnDetection, - mutableMapOf(), - ) - - /** - * Configuration options for the generated client secret. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun clientSecret(): Optional = clientSecret.getOptional("client_secret") - - /** - * The set of items to include in the transcription. Current available items are: - * - `item.input_audio_transcription.logprobs` - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun include(): Optional> = include.getOptional("include") - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioFormat(): Optional = - inputAudioFormat.getOptional("input_audio_format") - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. - * Noise reduction filters audio added to the input audio buffer before it is sent to VAD - * and the model. Filtering the audio can improve VAD and turn detection accuracy (reducing - * false positives) and model performance by improving perception of the input audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioNoiseReduction(): Optional = - inputAudioNoiseReduction.getOptional("input_audio_noise_reduction") - - /** - * Configuration for input audio transcription. The client can optionally set the language - * and prompt for transcription, these offer additional guidance to the transcription - * service. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioTranscription(): Optional = - inputAudioTranscription.getOptional("input_audio_transcription") - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun modalities(): Optional> = modalities.getOptional("modalities") - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to - * `null` to turn off, in which case the client must manually trigger model response. Server - * VAD means that the model will detect the start and end of speech based on audio volume - * and respond at the end of user speech. Semantic VAD is more advanced and uses a turn - * detection model (in conjunction with VAD) to semantically estimate whether the user has - * finished speaking, then dynamically sets a timeout based on this probability. For - * example, if user audio trails off with "uhhm", the model will score a low probability of - * turn end and wait longer for the user to continue speaking. This can be useful for more - * natural conversations, but may have a higher latency. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun turnDetection(): Optional = turnDetection.getOptional("turn_detection") - - /** - * Returns the raw JSON value of [clientSecret]. - * - * Unlike [clientSecret], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("client_secret") - @ExcludeMissing - fun _clientSecret(): JsonField = clientSecret - - /** - * Returns the raw JSON value of [include]. - * - * Unlike [include], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("include") @ExcludeMissing fun _include(): JsonField> = include - - /** - * Returns the raw JSON value of [inputAudioFormat]. - * - * Unlike [inputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("input_audio_format") - @ExcludeMissing - fun _inputAudioFormat(): JsonField = inputAudioFormat - - /** - * Returns the raw JSON value of [inputAudioNoiseReduction]. - * - * Unlike [inputAudioNoiseReduction], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("input_audio_noise_reduction") - @ExcludeMissing - fun _inputAudioNoiseReduction(): JsonField = - inputAudioNoiseReduction - - /** - * Returns the raw JSON value of [inputAudioTranscription]. - * - * Unlike [inputAudioTranscription], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("input_audio_transcription") - @ExcludeMissing - fun _inputAudioTranscription(): JsonField = inputAudioTranscription - - /** - * Returns the raw JSON value of [modalities]. - * - * Unlike [modalities], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("modalities") - @ExcludeMissing - fun _modalities(): JsonField> = modalities - - /** - * Returns the raw JSON value of [turnDetection]. - * - * Unlike [turnDetection], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("turn_detection") - @ExcludeMissing - fun _turnDetection(): JsonField = turnDetection - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Session]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Session]. */ - class Builder internal constructor() { - - private var clientSecret: JsonField = JsonMissing.of() - private var include: JsonField>? = null - private var inputAudioFormat: JsonField = JsonMissing.of() - private var inputAudioNoiseReduction: JsonField = - JsonMissing.of() - private var inputAudioTranscription: JsonField = - JsonMissing.of() - private var modalities: JsonField>? = null - private var turnDetection: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(session: Session) = apply { - clientSecret = session.clientSecret - include = session.include.map { it.toMutableList() } - inputAudioFormat = session.inputAudioFormat - inputAudioNoiseReduction = session.inputAudioNoiseReduction - inputAudioTranscription = session.inputAudioTranscription - modalities = session.modalities.map { it.toMutableList() } - turnDetection = session.turnDetection - additionalProperties = session.additionalProperties.toMutableMap() - } - - /** Configuration options for the generated client secret. */ - fun clientSecret(clientSecret: ClientSecret) = clientSecret(JsonField.of(clientSecret)) - - /** - * Sets [Builder.clientSecret] to an arbitrary JSON value. - * - * You should usually call [Builder.clientSecret] with a well-typed [ClientSecret] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun clientSecret(clientSecret: JsonField) = apply { - this.clientSecret = clientSecret - } - - /** - * The set of items to include in the transcription. Current available items are: - * - `item.input_audio_transcription.logprobs` - */ - fun include(include: List) = include(JsonField.of(include)) - - /** - * Sets [Builder.include] to an arbitrary JSON value. - * - * You should usually call [Builder.include] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun include(include: JsonField>) = apply { - this.include = include.map { it.toMutableList() } - } - - /** - * Adds a single [String] to [Builder.include]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addInclude(include: String) = apply { - this.include = - (this.include ?: JsonField.of(mutableListOf())).also { - checkKnown("include", it).add(include) - } - } - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For - * `pcm16`, input audio must be 16-bit PCM at a 24kHz sample rate, single channel - * (mono), and little-endian byte order. - */ - fun inputAudioFormat(inputAudioFormat: InputAudioFormat) = - inputAudioFormat(JsonField.of(inputAudioFormat)) - - /** - * Sets [Builder.inputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioFormat] with a well-typed - * [InputAudioFormat] value instead. This method is primarily for setting the field to - * an undocumented or not yet supported value. - */ - fun inputAudioFormat(inputAudioFormat: JsonField) = apply { - this.inputAudioFormat = inputAudioFormat - } - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. - * Noise reduction filters audio added to the input audio buffer before it is sent to - * VAD and the model. Filtering the audio can improve VAD and turn detection accuracy - * (reducing false positives) and model performance by improving perception of the input - * audio. - */ - fun inputAudioNoiseReduction(inputAudioNoiseReduction: InputAudioNoiseReduction) = - inputAudioNoiseReduction(JsonField.of(inputAudioNoiseReduction)) - - /** - * Sets [Builder.inputAudioNoiseReduction] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioNoiseReduction] with a well-typed - * [InputAudioNoiseReduction] value instead. This method is primarily for setting the - * field to an undocumented or not yet supported value. - */ - fun inputAudioNoiseReduction( - inputAudioNoiseReduction: JsonField - ) = apply { this.inputAudioNoiseReduction = inputAudioNoiseReduction } - - /** - * Configuration for input audio transcription. The client can optionally set the - * language and prompt for transcription, these offer additional guidance to the - * transcription service. - */ - fun inputAudioTranscription(inputAudioTranscription: InputAudioTranscription) = - inputAudioTranscription(JsonField.of(inputAudioTranscription)) - - /** - * Sets [Builder.inputAudioTranscription] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioTranscription] with a well-typed - * [InputAudioTranscription] value instead. This method is primarily for setting the - * field to an undocumented or not yet supported value. - */ - fun inputAudioTranscription( - inputAudioTranscription: JsonField - ) = apply { this.inputAudioTranscription = inputAudioTranscription } - - /** - * The set of modalities the model can respond with. To disable audio, set this to - * ["text"]. - */ - fun modalities(modalities: List) = modalities(JsonField.of(modalities)) - - /** - * Sets [Builder.modalities] to an arbitrary JSON value. - * - * You should usually call [Builder.modalities] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun modalities(modalities: JsonField>) = apply { - this.modalities = modalities.map { it.toMutableList() } - } - - /** - * Adds a single [Modality] to [modalities]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addModality(modality: Modality) = apply { - modalities = - (modalities ?: JsonField.of(mutableListOf())).also { - checkKnown("modalities", it).add(modality) - } - } - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set - * to `null` to turn off, in which case the client must manually trigger model response. - * Server VAD means that the model will detect the start and end of speech based on - * audio volume and respond at the end of user speech. Semantic VAD is more advanced and - * uses a turn detection model (in conjunction with VAD) to semantically estimate - * whether the user has finished speaking, then dynamically sets a timeout based on this - * probability. For example, if user audio trails off with "uhhm", the model will score - * a low probability of turn end and wait longer for the user to continue speaking. This - * can be useful for more natural conversations, but may have a higher latency. - */ - fun turnDetection(turnDetection: TurnDetection) = - turnDetection(JsonField.of(turnDetection)) - - /** - * Sets [Builder.turnDetection] to an arbitrary JSON value. - * - * You should usually call [Builder.turnDetection] with a well-typed [TurnDetection] - * value instead. This method is primarily for setting the field to an undocumented or - * not yet supported value. - */ - fun turnDetection(turnDetection: JsonField) = apply { - this.turnDetection = turnDetection - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Session]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Session = - Session( - clientSecret, - (include ?: JsonMissing.of()).map { it.toImmutable() }, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - (modalities ?: JsonMissing.of()).map { it.toImmutable() }, - turnDetection, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): Session = apply { - if (validated) { - return@apply - } - - clientSecret().ifPresent { it.validate() } - include() - inputAudioFormat().ifPresent { it.validate() } - inputAudioNoiseReduction().ifPresent { it.validate() } - inputAudioTranscription().ifPresent { it.validate() } - modalities().ifPresent { it.forEach { it.validate() } } - turnDetection().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (clientSecret.asKnown().getOrNull()?.validity() ?: 0) + - (include.asKnown().getOrNull()?.size ?: 0) + - (inputAudioFormat.asKnown().getOrNull()?.validity() ?: 0) + - (inputAudioNoiseReduction.asKnown().getOrNull()?.validity() ?: 0) + - (inputAudioTranscription.asKnown().getOrNull()?.validity() ?: 0) + - (modalities.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (turnDetection.asKnown().getOrNull()?.validity() ?: 0) - - /** Configuration options for the generated client secret. */ - class ClientSecret - private constructor( - private val expiresAt: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("expires_at") - @ExcludeMissing - expiresAt: JsonField = JsonMissing.of() - ) : this(expiresAt, mutableMapOf()) - - /** - * Configuration for the ephemeral token expiration. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun expiresAt(): Optional = expiresAt.getOptional("expires_at") - - /** - * Returns the raw JSON value of [expiresAt]. - * - * Unlike [expiresAt], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("expires_at") - @ExcludeMissing - fun _expiresAt(): JsonField = expiresAt - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [ClientSecret]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ClientSecret]. */ - class Builder internal constructor() { - - private var expiresAt: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(clientSecret: ClientSecret) = apply { - expiresAt = clientSecret.expiresAt - additionalProperties = clientSecret.additionalProperties.toMutableMap() - } - - /** Configuration for the ephemeral token expiration. */ - fun expiresAt(expiresAt: ExpiresAt) = expiresAt(JsonField.of(expiresAt)) - - /** - * Sets [Builder.expiresAt] to an arbitrary JSON value. - * - * You should usually call [Builder.expiresAt] with a well-typed [ExpiresAt] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun expiresAt(expiresAt: JsonField) = apply { - this.expiresAt = expiresAt - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ClientSecret]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): ClientSecret = - ClientSecret(expiresAt, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): ClientSecret = apply { - if (validated) { - return@apply - } - - expiresAt().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = (expiresAt.asKnown().getOrNull()?.validity() ?: 0) - - /** Configuration for the ephemeral token expiration. */ - class ExpiresAt - private constructor( - private val anchor: JsonField, - private val seconds: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("anchor") - @ExcludeMissing - anchor: JsonField = JsonMissing.of(), - @JsonProperty("seconds") - @ExcludeMissing - seconds: JsonField = JsonMissing.of(), - ) : this(anchor, seconds, mutableMapOf()) - - /** - * The anchor point for the ephemeral token expiration. Only `created_at` is - * currently supported. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. - * if the server responded with an unexpected value). - */ - fun anchor(): Optional = anchor.getOptional("anchor") - - /** - * The number of seconds from the anchor point to the expiration. Select a value - * between `10` and `7200`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. - * if the server responded with an unexpected value). - */ - fun seconds(): Optional = seconds.getOptional("seconds") - - /** - * Returns the raw JSON value of [anchor]. - * - * Unlike [anchor], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("anchor") @ExcludeMissing fun _anchor(): JsonField = anchor - - /** - * Returns the raw JSON value of [seconds]. - * - * Unlike [seconds], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("seconds") @ExcludeMissing fun _seconds(): JsonField = seconds - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [ExpiresAt]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ExpiresAt]. */ - class Builder internal constructor() { - - private var anchor: JsonField = JsonMissing.of() - private var seconds: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(expiresAt: ExpiresAt) = apply { - anchor = expiresAt.anchor - seconds = expiresAt.seconds - additionalProperties = expiresAt.additionalProperties.toMutableMap() - } - - /** - * The anchor point for the ephemeral token expiration. Only `created_at` is - * currently supported. - */ - fun anchor(anchor: Anchor) = anchor(JsonField.of(anchor)) - - /** - * Sets [Builder.anchor] to an arbitrary JSON value. - * - * You should usually call [Builder.anchor] with a well-typed [Anchor] value - * instead. This method is primarily for setting the field to an undocumented or - * not yet supported value. - */ - fun anchor(anchor: JsonField) = apply { this.anchor = anchor } - - /** - * The number of seconds from the anchor point to the expiration. Select a value - * between `10` and `7200`. - */ - fun seconds(seconds: Long) = seconds(JsonField.of(seconds)) - - /** - * Sets [Builder.seconds] to an arbitrary JSON value. - * - * You should usually call [Builder.seconds] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or - * not yet supported value. - */ - fun seconds(seconds: JsonField) = apply { this.seconds = seconds } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ExpiresAt]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): ExpiresAt = - ExpiresAt(anchor, seconds, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): ExpiresAt = apply { - if (validated) { - return@apply - } - - anchor().ifPresent { it.validate() } - seconds() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (anchor.asKnown().getOrNull()?.validity() ?: 0) + - (if (seconds.asKnown().isPresent) 1 else 0) - - /** - * The anchor point for the ephemeral token expiration. Only `created_at` is - * currently supported. - */ - class Anchor - @JsonCreator - private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that - * doesn't match any known member, and you want to know that value. For example, - * if the SDK is on an older version than the API, then the API may respond with - * new members that the SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue - fun _value(): JsonField = value - - companion object { - - @JvmField val CREATED_AT = of("created_at") - - @JvmStatic fun of(value: String) = Anchor(JsonField.of(value)) - } - - /** An enum containing [Anchor]'s known values. */ - enum class Known { - CREATED_AT - } - - /** - * An enum containing [Anchor]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Anchor] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For - * example, if the SDK is on an older version than the API, then the API may - * respond with new members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - CREATED_AT, - /** - * An enum member indicating that [Anchor] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or - * if you want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - CREATED_AT -> Value.CREATED_AT - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known - * and don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a - * known member. - */ - fun known(): Known = - when (this) { - CREATED_AT -> Known.CREATED_AT - else -> throw OpenAIInvalidDataException("Unknown Anchor: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not - * have the expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Anchor = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Anchor && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ExpiresAt && - anchor == other.anchor && - seconds == other.seconds && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(anchor, seconds, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ExpiresAt{anchor=$anchor, seconds=$seconds, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ClientSecret && - expiresAt == other.expiresAt && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(expiresAt, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ClientSecret{expiresAt=$expiresAt, additionalProperties=$additionalProperties}" - } - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - */ - class InputAudioFormat - @JsonCreator - private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val PCM16 = of("pcm16") - - @JvmField val G711_ULAW = of("g711_ulaw") - - @JvmField val G711_ALAW = of("g711_alaw") - - @JvmStatic fun of(value: String) = InputAudioFormat(JsonField.of(value)) - } - - /** An enum containing [InputAudioFormat]'s known values. */ - enum class Known { - PCM16, - G711_ULAW, - G711_ALAW, - } - - /** - * An enum containing [InputAudioFormat]'s known values, as well as an [_UNKNOWN] - * member. - * - * An instance of [InputAudioFormat] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - PCM16, - G711_ULAW, - G711_ALAW, - /** - * An enum member indicating that [InputAudioFormat] was instantiated with an - * unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - PCM16 -> Value.PCM16 - G711_ULAW -> Value.G711_ULAW - G711_ALAW -> Value.G711_ALAW - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - PCM16 -> Known.PCM16 - G711_ULAW -> Known.G711_ULAW - G711_ALAW -> Known.G711_ALAW - else -> throw OpenAIInvalidDataException("Unknown InputAudioFormat: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): InputAudioFormat = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioFormat && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. - * Noise reduction filters audio added to the input audio buffer before it is sent to VAD - * and the model. Filtering the audio can improve VAD and turn detection accuracy (reducing - * false positives) and model performance by improving perception of the input audio. - */ - class InputAudioNoiseReduction - private constructor( - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of() - ) : this(type, mutableMapOf()) - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference - * room microphones. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [InputAudioNoiseReduction]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioNoiseReduction]. */ - class Builder internal constructor() { - - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioNoiseReduction: InputAudioNoiseReduction) = apply { - type = inputAudioNoiseReduction.type - additionalProperties = - inputAudioNoiseReduction.additionalProperties.toMutableMap() - } - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference - * room microphones. - */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioNoiseReduction]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioNoiseReduction = - InputAudioNoiseReduction(type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): InputAudioNoiseReduction = apply { - if (validated) { - return@apply - } - - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = (type.asKnown().getOrNull()?.validity() ?: 0) - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference - * room microphones. - */ - class Type @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that - * doesn't match any known member, and you want to know that value. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val NEAR_FIELD = of("near_field") - - @JvmField val FAR_FIELD = of("far_field") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - NEAR_FIELD, - FAR_FIELD, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, - * if the SDK is on an older version than the API, then the API may respond with - * new members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - NEAR_FIELD, - FAR_FIELD, - /** - * An enum member indicating that [Type] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if - * you want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - NEAR_FIELD -> Value.NEAR_FIELD - FAR_FIELD -> Value.FAR_FIELD - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a - * known member. - */ - fun known(): Known = - when (this) { - NEAR_FIELD -> Known.NEAR_FIELD - FAR_FIELD -> Known.FAR_FIELD - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have - * the expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioNoiseReduction && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioNoiseReduction{type=$type, additionalProperties=$additionalProperties}" - } - - /** - * Configuration for input audio transcription. The client can optionally set the language - * and prompt for transcription, these offer additional guidance to the transcription - * service. - */ - class InputAudioTranscription - private constructor( - private val language: JsonField, - private val model: JsonField, - private val prompt: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("language") - @ExcludeMissing - language: JsonField = JsonMissing.of(), - @JsonProperty("model") @ExcludeMissing model: JsonField = JsonMissing.of(), - @JsonProperty("prompt") @ExcludeMissing prompt: JsonField = JsonMissing.of(), - ) : this(language, model, prompt, mutableMapOf()) - - /** - * The language of the input audio. Supplying the input language in - * [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`) format - * will improve accuracy and latency. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun language(): Optional = language.getOptional("language") - - /** - * The model to use for transcription, current options are `gpt-4o-transcribe`, - * `gpt-4o-mini-transcribe`, and `whisper-1`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun model(): Optional = model.getOptional("model") - - /** - * An optional text to guide the model's style or continue a previous audio segment. For - * `whisper-1`, the - * [prompt is a list of keywords](https://platform.openai.com/docs/guides/speech-to-text#prompting). - * For `gpt-4o-transcribe` models, the prompt is a free text string, for example "expect - * words related to technology". - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun prompt(): Optional = prompt.getOptional("prompt") - - /** - * Returns the raw JSON value of [language]. - * - * Unlike [language], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("language") @ExcludeMissing fun _language(): JsonField = language - - /** - * Returns the raw JSON value of [model]. - * - * Unlike [model], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("model") @ExcludeMissing fun _model(): JsonField = model - - /** - * Returns the raw JSON value of [prompt]. - * - * Unlike [prompt], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("prompt") @ExcludeMissing fun _prompt(): JsonField = prompt - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [InputAudioTranscription]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioTranscription]. */ - class Builder internal constructor() { - - private var language: JsonField = JsonMissing.of() - private var model: JsonField = JsonMissing.of() - private var prompt: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioTranscription: InputAudioTranscription) = apply { - language = inputAudioTranscription.language - model = inputAudioTranscription.model - prompt = inputAudioTranscription.prompt - additionalProperties = - inputAudioTranscription.additionalProperties.toMutableMap() - } - - /** - * The language of the input audio. Supplying the input language in - * [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`) - * format will improve accuracy and latency. - */ - fun language(language: String) = language(JsonField.of(language)) - - /** - * Sets [Builder.language] to an arbitrary JSON value. - * - * You should usually call [Builder.language] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun language(language: JsonField) = apply { this.language = language } - - /** - * The model to use for transcription, current options are `gpt-4o-transcribe`, - * `gpt-4o-mini-transcribe`, and `whisper-1`. - */ - fun model(model: Model) = model(JsonField.of(model)) - - /** - * Sets [Builder.model] to an arbitrary JSON value. - * - * You should usually call [Builder.model] with a well-typed [Model] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun model(model: JsonField) = apply { this.model = model } - - /** - * An optional text to guide the model's style or continue a previous audio segment. - * For `whisper-1`, the - * [prompt is a list of keywords](https://platform.openai.com/docs/guides/speech-to-text#prompting). - * For `gpt-4o-transcribe` models, the prompt is a free text string, for example - * "expect words related to technology". - */ - fun prompt(prompt: String) = prompt(JsonField.of(prompt)) - - /** - * Sets [Builder.prompt] to an arbitrary JSON value. - * - * You should usually call [Builder.prompt] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun prompt(prompt: JsonField) = apply { this.prompt = prompt } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioTranscription]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioTranscription = - InputAudioTranscription( - language, - model, - prompt, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): InputAudioTranscription = apply { - if (validated) { - return@apply - } - - language() - model().ifPresent { it.validate() } - prompt() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (language.asKnown().isPresent) 1 else 0) + - (model.asKnown().getOrNull()?.validity() ?: 0) + - (if (prompt.asKnown().isPresent) 1 else 0) - - /** - * The model to use for transcription, current options are `gpt-4o-transcribe`, - * `gpt-4o-mini-transcribe`, and `whisper-1`. - */ - class Model @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that - * doesn't match any known member, and you want to know that value. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val GPT_4O_TRANSCRIBE = of("gpt-4o-transcribe") - - @JvmField val GPT_4O_MINI_TRANSCRIBE = of("gpt-4o-mini-transcribe") - - @JvmField val WHISPER_1 = of("whisper-1") - - @JvmStatic fun of(value: String) = Model(JsonField.of(value)) - } - - /** An enum containing [Model]'s known values. */ - enum class Known { - GPT_4O_TRANSCRIBE, - GPT_4O_MINI_TRANSCRIBE, - WHISPER_1, - } - - /** - * An enum containing [Model]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Model] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, - * if the SDK is on an older version than the API, then the API may respond with - * new members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - GPT_4O_TRANSCRIBE, - GPT_4O_MINI_TRANSCRIBE, - WHISPER_1, - /** - * An enum member indicating that [Model] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if - * you want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - GPT_4O_TRANSCRIBE -> Value.GPT_4O_TRANSCRIBE - GPT_4O_MINI_TRANSCRIBE -> Value.GPT_4O_MINI_TRANSCRIBE - WHISPER_1 -> Value.WHISPER_1 - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a - * known member. - */ - fun known(): Known = - when (this) { - GPT_4O_TRANSCRIBE -> Known.GPT_4O_TRANSCRIBE - GPT_4O_MINI_TRANSCRIBE -> Known.GPT_4O_MINI_TRANSCRIBE - WHISPER_1 -> Known.WHISPER_1 - else -> throw OpenAIInvalidDataException("Unknown Model: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have - * the expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Model = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Model && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioTranscription && - language == other.language && - model == other.model && - prompt == other.prompt && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(language, model, prompt, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioTranscription{language=$language, model=$model, prompt=$prompt, additionalProperties=$additionalProperties}" - } - - class Modality @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val TEXT = of("text") - - @JvmField val AUDIO = of("audio") - - @JvmStatic fun of(value: String) = Modality(JsonField.of(value)) - } - - /** An enum containing [Modality]'s known values. */ - enum class Known { - TEXT, - AUDIO, - } - - /** - * An enum containing [Modality]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Modality] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - TEXT, - AUDIO, - /** - * An enum member indicating that [Modality] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - TEXT -> Value.TEXT - AUDIO -> Value.AUDIO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - TEXT -> Known.TEXT - AUDIO -> Known.AUDIO - else -> throw OpenAIInvalidDataException("Unknown Modality: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Modality = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Modality && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to - * `null` to turn off, in which case the client must manually trigger model response. Server - * VAD means that the model will detect the start and end of speech based on audio volume - * and respond at the end of user speech. Semantic VAD is more advanced and uses a turn - * detection model (in conjunction with VAD) to semantically estimate whether the user has - * finished speaking, then dynamically sets a timeout based on this probability. For - * example, if user audio trails off with "uhhm", the model will score a low probability of - * turn end and wait longer for the user to continue speaking. This can be useful for more - * natural conversations, but may have a higher latency. - */ - class TurnDetection - private constructor( - private val createResponse: JsonField, - private val eagerness: JsonField, - private val interruptResponse: JsonField, - private val prefixPaddingMs: JsonField, - private val silenceDurationMs: JsonField, - private val threshold: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("create_response") - @ExcludeMissing - createResponse: JsonField = JsonMissing.of(), - @JsonProperty("eagerness") - @ExcludeMissing - eagerness: JsonField = JsonMissing.of(), - @JsonProperty("interrupt_response") - @ExcludeMissing - interruptResponse: JsonField = JsonMissing.of(), - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - prefixPaddingMs: JsonField = JsonMissing.of(), - @JsonProperty("silence_duration_ms") - @ExcludeMissing - silenceDurationMs: JsonField = JsonMissing.of(), - @JsonProperty("threshold") - @ExcludeMissing - threshold: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - mutableMapOf(), - ) - - /** - * Whether or not to automatically generate a response when a VAD stop event occurs. Not - * available for transcription sessions. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun createResponse(): Optional = createResponse.getOptional("create_response") - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` will - * wait longer for the user to continue speaking, `high` will respond more quickly. - * `auto` is the default and is equivalent to `medium`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun eagerness(): Optional = eagerness.getOptional("eagerness") - - /** - * Whether or not to automatically interrupt any ongoing response with output to the - * default conversation (i.e. `conversation` of `auto`) when a VAD start event occurs. - * Not available for transcription sessions. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun interruptResponse(): Optional = - interruptResponse.getOptional("interrupt_response") - - /** - * Used only for `server_vad` mode. Amount of audio to include before the VAD detected - * speech (in milliseconds). Defaults to 300ms. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun prefixPaddingMs(): Optional = prefixPaddingMs.getOptional("prefix_padding_ms") - - /** - * Used only for `server_vad` mode. Duration of silence to detect speech stop (in - * milliseconds). Defaults to 500ms. With shorter values the model will respond more - * quickly, but may jump in on short pauses from the user. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun silenceDurationMs(): Optional = - silenceDurationMs.getOptional("silence_duration_ms") - - /** - * Used only for `server_vad` mode. Activation threshold for VAD (0.0 to 1.0), this - * defaults to 0.5. A higher threshold will require louder audio to activate the model, - * and thus might perform better in noisy environments. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun threshold(): Optional = threshold.getOptional("threshold") - - /** - * Type of turn detection. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [createResponse]. - * - * Unlike [createResponse], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("create_response") - @ExcludeMissing - fun _createResponse(): JsonField = createResponse - - /** - * Returns the raw JSON value of [eagerness]. - * - * Unlike [eagerness], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("eagerness") - @ExcludeMissing - fun _eagerness(): JsonField = eagerness - - /** - * Returns the raw JSON value of [interruptResponse]. - * - * Unlike [interruptResponse], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("interrupt_response") - @ExcludeMissing - fun _interruptResponse(): JsonField = interruptResponse - - /** - * Returns the raw JSON value of [prefixPaddingMs]. - * - * Unlike [prefixPaddingMs], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - fun _prefixPaddingMs(): JsonField = prefixPaddingMs - - /** - * Returns the raw JSON value of [silenceDurationMs]. - * - * Unlike [silenceDurationMs], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("silence_duration_ms") - @ExcludeMissing - fun _silenceDurationMs(): JsonField = silenceDurationMs - - /** - * Returns the raw JSON value of [threshold]. - * - * Unlike [threshold], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("threshold") - @ExcludeMissing - fun _threshold(): JsonField = threshold - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [TurnDetection]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TurnDetection]. */ - class Builder internal constructor() { - - private var createResponse: JsonField = JsonMissing.of() - private var eagerness: JsonField = JsonMissing.of() - private var interruptResponse: JsonField = JsonMissing.of() - private var prefixPaddingMs: JsonField = JsonMissing.of() - private var silenceDurationMs: JsonField = JsonMissing.of() - private var threshold: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(turnDetection: TurnDetection) = apply { - createResponse = turnDetection.createResponse - eagerness = turnDetection.eagerness - interruptResponse = turnDetection.interruptResponse - prefixPaddingMs = turnDetection.prefixPaddingMs - silenceDurationMs = turnDetection.silenceDurationMs - threshold = turnDetection.threshold - type = turnDetection.type - additionalProperties = turnDetection.additionalProperties.toMutableMap() - } - - /** - * Whether or not to automatically generate a response when a VAD stop event occurs. - * Not available for transcription sessions. - */ - fun createResponse(createResponse: Boolean) = - createResponse(JsonField.of(createResponse)) - - /** - * Sets [Builder.createResponse] to an arbitrary JSON value. - * - * You should usually call [Builder.createResponse] with a well-typed [Boolean] - * value instead. This method is primarily for setting the field to an undocumented - * or not yet supported value. - */ - fun createResponse(createResponse: JsonField) = apply { - this.createResponse = createResponse - } - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` - * will wait longer for the user to continue speaking, `high` will respond more - * quickly. `auto` is the default and is equivalent to `medium`. - */ - fun eagerness(eagerness: Eagerness) = eagerness(JsonField.of(eagerness)) - - /** - * Sets [Builder.eagerness] to an arbitrary JSON value. - * - * You should usually call [Builder.eagerness] with a well-typed [Eagerness] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun eagerness(eagerness: JsonField) = apply { - this.eagerness = eagerness - } - - /** - * Whether or not to automatically interrupt any ongoing response with output to the - * default conversation (i.e. `conversation` of `auto`) when a VAD start event - * occurs. Not available for transcription sessions. - */ - fun interruptResponse(interruptResponse: Boolean) = - interruptResponse(JsonField.of(interruptResponse)) - - /** - * Sets [Builder.interruptResponse] to an arbitrary JSON value. - * - * You should usually call [Builder.interruptResponse] with a well-typed [Boolean] - * value instead. This method is primarily for setting the field to an undocumented - * or not yet supported value. - */ - fun interruptResponse(interruptResponse: JsonField) = apply { - this.interruptResponse = interruptResponse - } - - /** - * Used only for `server_vad` mode. Amount of audio to include before the VAD - * detected speech (in milliseconds). Defaults to 300ms. - */ - fun prefixPaddingMs(prefixPaddingMs: Long) = - prefixPaddingMs(JsonField.of(prefixPaddingMs)) - - /** - * Sets [Builder.prefixPaddingMs] to an arbitrary JSON value. - * - * You should usually call [Builder.prefixPaddingMs] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun prefixPaddingMs(prefixPaddingMs: JsonField) = apply { - this.prefixPaddingMs = prefixPaddingMs - } - - /** - * Used only for `server_vad` mode. Duration of silence to detect speech stop (in - * milliseconds). Defaults to 500ms. With shorter values the model will respond more - * quickly, but may jump in on short pauses from the user. - */ - fun silenceDurationMs(silenceDurationMs: Long) = - silenceDurationMs(JsonField.of(silenceDurationMs)) - - /** - * Sets [Builder.silenceDurationMs] to an arbitrary JSON value. - * - * You should usually call [Builder.silenceDurationMs] with a well-typed [Long] - * value instead. This method is primarily for setting the field to an undocumented - * or not yet supported value. - */ - fun silenceDurationMs(silenceDurationMs: JsonField) = apply { - this.silenceDurationMs = silenceDurationMs - } - - /** - * Used only for `server_vad` mode. Activation threshold for VAD (0.0 to 1.0), this - * defaults to 0.5. A higher threshold will require louder audio to activate the - * model, and thus might perform better in noisy environments. - */ - fun threshold(threshold: Double) = threshold(JsonField.of(threshold)) - - /** - * Sets [Builder.threshold] to an arbitrary JSON value. - * - * You should usually call [Builder.threshold] with a well-typed [Double] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun threshold(threshold: JsonField) = apply { this.threshold = threshold } - - /** Type of turn detection. */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TurnDetection]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): TurnDetection = - TurnDetection( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TurnDetection = apply { - if (validated) { - return@apply - } - - createResponse() - eagerness().ifPresent { it.validate() } - interruptResponse() - prefixPaddingMs() - silenceDurationMs() - threshold() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (createResponse.asKnown().isPresent) 1 else 0) + - (eagerness.asKnown().getOrNull()?.validity() ?: 0) + - (if (interruptResponse.asKnown().isPresent) 1 else 0) + - (if (prefixPaddingMs.asKnown().isPresent) 1 else 0) + - (if (silenceDurationMs.asKnown().isPresent) 1 else 0) + - (if (threshold.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` will - * wait longer for the user to continue speaking, `high` will respond more quickly. - * `auto` is the default and is equivalent to `medium`. - */ - class Eagerness @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that - * doesn't match any known member, and you want to know that value. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val LOW = of("low") - - @JvmField val MEDIUM = of("medium") - - @JvmField val HIGH = of("high") - - @JvmField val AUTO = of("auto") - - @JvmStatic fun of(value: String) = Eagerness(JsonField.of(value)) - } - - /** An enum containing [Eagerness]'s known values. */ - enum class Known { - LOW, - MEDIUM, - HIGH, - AUTO, - } - - /** - * An enum containing [Eagerness]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Eagerness] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, - * if the SDK is on an older version than the API, then the API may respond with - * new members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - LOW, - MEDIUM, - HIGH, - AUTO, - /** - * An enum member indicating that [Eagerness] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if - * you want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - LOW -> Value.LOW - MEDIUM -> Value.MEDIUM - HIGH -> Value.HIGH - AUTO -> Value.AUTO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a - * known member. - */ - fun known(): Known = - when (this) { - LOW -> Known.LOW - MEDIUM -> Known.MEDIUM - HIGH -> Known.HIGH - AUTO -> Known.AUTO - else -> throw OpenAIInvalidDataException("Unknown Eagerness: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have - * the expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Eagerness = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Eagerness && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** Type of turn detection. */ - class Type @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that - * doesn't match any known member, and you want to know that value. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val SERVER_VAD = of("server_vad") - - @JvmField val SEMANTIC_VAD = of("semantic_vad") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - SERVER_VAD, - SEMANTIC_VAD, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, - * if the SDK is on an older version than the API, then the API may respond with - * new members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - SERVER_VAD, - SEMANTIC_VAD, - /** - * An enum member indicating that [Type] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if - * you want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - SERVER_VAD -> Value.SERVER_VAD - SEMANTIC_VAD -> Value.SEMANTIC_VAD - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a - * known member. - */ - fun known(): Known = - when (this) { - SERVER_VAD -> Known.SERVER_VAD - SEMANTIC_VAD -> Known.SEMANTIC_VAD - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have - * the expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TurnDetection && - createResponse == other.createResponse && - eagerness == other.eagerness && - interruptResponse == other.interruptResponse && - prefixPaddingMs == other.prefixPaddingMs && - silenceDurationMs == other.silenceDurationMs && - threshold == other.threshold && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TurnDetection{createResponse=$createResponse, eagerness=$eagerness, interruptResponse=$interruptResponse, prefixPaddingMs=$prefixPaddingMs, silenceDurationMs=$silenceDurationMs, threshold=$threshold, type=$type, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Session && - clientSecret == other.clientSecret && - include == other.include && - inputAudioFormat == other.inputAudioFormat && - inputAudioNoiseReduction == other.inputAudioNoiseReduction && - inputAudioTranscription == other.inputAudioTranscription && - modalities == other.modalities && - turnDetection == other.turnDetection && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - clientSecret, - include, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - modalities, - turnDetection, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Session{clientSecret=$clientSecret, include=$include, inputAudioFormat=$inputAudioFormat, inputAudioNoiseReduction=$inputAudioNoiseReduction, inputAudioTranscription=$inputAudioTranscription, modalities=$modalities, turnDetection=$turnDetection, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TranscriptionSessionUpdate && - session == other.session && - type == other.type && - eventId == other.eventId && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(session, type, eventId, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TranscriptionSessionUpdate{session=$session, type=$type, eventId=$eventId, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdatedEvent.kt deleted file mode 100644 index 3cf316f06..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdatedEvent.kt +++ /dev/null @@ -1,273 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.errors.OpenAIInvalidDataException -import com.openai.models.beta.realtime.transcriptionsessions.TranscriptionSession -import java.util.Collections -import java.util.Objects -import kotlin.jvm.optionals.getOrNull - -/** - * Returned when a transcription session is updated with a `transcription_session.update` event, - * unless there is an error. - */ -class TranscriptionSessionUpdatedEvent -private constructor( - private val eventId: JsonField, - private val session: JsonField, - private val type: JsonValue, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("event_id") @ExcludeMissing eventId: JsonField = JsonMissing.of(), - @JsonProperty("session") - @ExcludeMissing - session: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), - ) : this(eventId, session, type, mutableMapOf()) - - /** - * The unique ID of the server event. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun eventId(): String = eventId.getRequired("event_id") - - /** - * A new Realtime transcription session configuration. - * - * When a session is created on the server via REST API, the session object also contains an - * ephemeral key. Default TTL for keys is 10 minutes. This property is not present when a - * session is updated via the WebSocket API. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun session(): TranscriptionSession = session.getRequired("session") - - /** - * The event type, must be `transcription_session.updated`. - * - * Expected to always return the following: - * ```java - * JsonValue.from("transcription_session.updated") - * ``` - * - * However, this method can be useful for debugging and logging (e.g. if the server responded - * with an unexpected value). - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonValue = type - - /** - * Returns the raw JSON value of [eventId]. - * - * Unlike [eventId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("event_id") @ExcludeMissing fun _eventId(): JsonField = eventId - - /** - * Returns the raw JSON value of [session]. - * - * Unlike [session], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("session") - @ExcludeMissing - fun _session(): JsonField = session - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of - * [TranscriptionSessionUpdatedEvent]. - * - * The following fields are required: - * ```java - * .eventId() - * .session() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TranscriptionSessionUpdatedEvent]. */ - class Builder internal constructor() { - - private var eventId: JsonField? = null - private var session: JsonField? = null - private var type: JsonValue = JsonValue.from("transcription_session.updated") - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(transcriptionSessionUpdatedEvent: TranscriptionSessionUpdatedEvent) = - apply { - eventId = transcriptionSessionUpdatedEvent.eventId - session = transcriptionSessionUpdatedEvent.session - type = transcriptionSessionUpdatedEvent.type - additionalProperties = - transcriptionSessionUpdatedEvent.additionalProperties.toMutableMap() - } - - /** The unique ID of the server event. */ - fun eventId(eventId: String) = eventId(JsonField.of(eventId)) - - /** - * Sets [Builder.eventId] to an arbitrary JSON value. - * - * You should usually call [Builder.eventId] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun eventId(eventId: JsonField) = apply { this.eventId = eventId } - - /** - * A new Realtime transcription session configuration. - * - * When a session is created on the server via REST API, the session object also contains an - * ephemeral key. Default TTL for keys is 10 minutes. This property is not present when a - * session is updated via the WebSocket API. - */ - fun session(session: TranscriptionSession) = session(JsonField.of(session)) - - /** - * Sets [Builder.session] to an arbitrary JSON value. - * - * You should usually call [Builder.session] with a well-typed [TranscriptionSession] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun session(session: JsonField) = apply { this.session = session } - - /** - * Sets the field to an arbitrary JSON value. - * - * It is usually unnecessary to call this method because the field defaults to the - * following: - * ```java - * JsonValue.from("transcription_session.updated") - * ``` - * - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonValue) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TranscriptionSessionUpdatedEvent]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .eventId() - * .session() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): TranscriptionSessionUpdatedEvent = - TranscriptionSessionUpdatedEvent( - checkRequired("eventId", eventId), - checkRequired("session", session), - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TranscriptionSessionUpdatedEvent = apply { - if (validated) { - return@apply - } - - eventId() - session().validate() - _type().let { - if (it != JsonValue.from("transcription_session.updated")) { - throw OpenAIInvalidDataException("'type' is invalid, received $it") - } - } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (eventId.asKnown().isPresent) 1 else 0) + - (session.asKnown().getOrNull()?.validity() ?: 0) + - type.let { if (it == JsonValue.from("transcription_session.updated")) 1 else 0 } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TranscriptionSessionUpdatedEvent && - eventId == other.eventId && - session == other.session && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(eventId, session, type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TranscriptionSessionUpdatedEvent{eventId=$eventId, session=$session, type=$type, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/sessions/Session.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/sessions/Session.kt deleted file mode 100644 index c5ce40166..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/sessions/Session.kt +++ /dev/null @@ -1,3913 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime.sessions - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.ObjectCodec -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.BaseDeserializer -import com.openai.core.BaseSerializer -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.allMaxBy -import com.openai.core.checkKnown -import com.openai.core.getOrThrow -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** Realtime session object configuration. */ -class Session -private constructor( - private val id: JsonField, - private val inputAudioFormat: JsonField, - private val inputAudioNoiseReduction: JsonField, - private val inputAudioTranscription: JsonField, - private val instructions: JsonField, - private val maxResponseOutputTokens: JsonField, - private val modalities: JsonField>, - private val model: JsonField, - private val outputAudioFormat: JsonField, - private val speed: JsonField, - private val temperature: JsonField, - private val toolChoice: JsonField, - private val tools: JsonField>, - private val tracing: JsonField, - private val turnDetection: JsonField, - private val voice: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("id") @ExcludeMissing id: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_format") - @ExcludeMissing - inputAudioFormat: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_noise_reduction") - @ExcludeMissing - inputAudioNoiseReduction: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_transcription") - @ExcludeMissing - inputAudioTranscription: JsonField = JsonMissing.of(), - @JsonProperty("instructions") - @ExcludeMissing - instructions: JsonField = JsonMissing.of(), - @JsonProperty("max_response_output_tokens") - @ExcludeMissing - maxResponseOutputTokens: JsonField = JsonMissing.of(), - @JsonProperty("modalities") - @ExcludeMissing - modalities: JsonField> = JsonMissing.of(), - @JsonProperty("model") @ExcludeMissing model: JsonField = JsonMissing.of(), - @JsonProperty("output_audio_format") - @ExcludeMissing - outputAudioFormat: JsonField = JsonMissing.of(), - @JsonProperty("speed") @ExcludeMissing speed: JsonField = JsonMissing.of(), - @JsonProperty("temperature") - @ExcludeMissing - temperature: JsonField = JsonMissing.of(), - @JsonProperty("tool_choice") - @ExcludeMissing - toolChoice: JsonField = JsonMissing.of(), - @JsonProperty("tools") @ExcludeMissing tools: JsonField> = JsonMissing.of(), - @JsonProperty("tracing") @ExcludeMissing tracing: JsonField = JsonMissing.of(), - @JsonProperty("turn_detection") - @ExcludeMissing - turnDetection: JsonField = JsonMissing.of(), - @JsonProperty("voice") @ExcludeMissing voice: JsonField = JsonMissing.of(), - ) : this( - id, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - instructions, - maxResponseOutputTokens, - modalities, - model, - outputAudioFormat, - speed, - temperature, - toolChoice, - tools, - tracing, - turnDetection, - voice, - mutableMapOf(), - ) - - /** - * Unique identifier for the session that looks like `sess_1234567890abcdef`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun id(): Optional = id.getOptional("id") - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioFormat(): Optional = - inputAudioFormat.getOptional("input_audio_format") - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. Noise - * reduction filters audio added to the input audio buffer before it is sent to VAD and the - * model. Filtering the audio can improve VAD and turn detection accuracy (reducing false - * positives) and model performance by improving perception of the input audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioNoiseReduction(): Optional = - inputAudioNoiseReduction.getOptional("input_audio_noise_reduction") - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` to turn - * off once on. Input audio transcription is not native to the model, since the model consumes - * audio directly. Transcription runs asynchronously through - * [the /audio/transcriptions endpoint](https://platform.openai.com/docs/api-reference/audio/createTranscription) - * and should be treated as guidance of input audio content rather than precisely what the model - * heard. The client can optionally set the language and prompt for transcription, these offer - * additional guidance to the transcription service. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioTranscription(): Optional = - inputAudioTranscription.getOptional("input_audio_transcription") - - /** - * The default system instructions (i.e. system message) prepended to model calls. This field - * allows the client to guide the model on desired responses. The model can be instructed on - * response content and format, (e.g. "be extremely succinct", "act friendly", "here are - * examples of good responses") and on audio behavior (e.g. "talk quickly", "inject emotion into - * your voice", "laugh frequently"). The instructions are not guaranteed to be followed by the - * model, but they provide guidance to the model on the desired behavior. - * - * Note that the server sets default instructions which will be used if this field is not set - * and are visible in the `session.created` event at the start of the session. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun instructions(): Optional = instructions.getOptional("instructions") - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun maxResponseOutputTokens(): Optional = - maxResponseOutputTokens.getOptional("max_response_output_tokens") - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun modalities(): Optional> = modalities.getOptional("modalities") - - /** - * The Realtime model used for this session. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun model(): Optional = model.getOptional("model") - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * output audio is sampled at a rate of 24kHz. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun outputAudioFormat(): Optional = - outputAudioFormat.getOptional("output_audio_format") - - /** - * The speed of the model's spoken response. 1.0 is the default speed. 0.25 is the minimum - * speed. 1.5 is the maximum speed. This value can only be changed in between model turns, not - * while a response is in progress. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun speed(): Optional = speed.getOptional("speed") - - /** - * Sampling temperature for the model, limited to [0.6, 1.2]. For audio models a temperature of - * 0.8 is highly recommended for best performance. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun temperature(): Optional = temperature.getOptional("temperature") - - /** - * How the model chooses tools. Options are `auto`, `none`, `required`, or specify a function. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun toolChoice(): Optional = toolChoice.getOptional("tool_choice") - - /** - * Tools (functions) available to the model. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun tools(): Optional> = tools.getOptional("tools") - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is enabled - * for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, group - * id, and metadata. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun tracing(): Optional = tracing.getOptional("tracing") - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to `null` - * to turn off, in which case the client must manually trigger model response. Server VAD means - * that the model will detect the start and end of speech based on audio volume and respond at - * the end of user speech. Semantic VAD is more advanced and uses a turn detection model (in - * conjunction with VAD) to semantically estimate whether the user has finished speaking, then - * dynamically sets a timeout based on this probability. For example, if user audio trails off - * with "uhhm", the model will score a low probability of turn end and wait longer for the user - * to continue speaking. This can be useful for more natural conversations, but may have a - * higher latency. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun turnDetection(): Optional = turnDetection.getOptional("turn_detection") - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun voice(): Optional = voice.getOptional("voice") - - /** - * Returns the raw JSON value of [id]. - * - * Unlike [id], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("id") @ExcludeMissing fun _id(): JsonField = id - - /** - * Returns the raw JSON value of [inputAudioFormat]. - * - * Unlike [inputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("input_audio_format") - @ExcludeMissing - fun _inputAudioFormat(): JsonField = inputAudioFormat - - /** - * Returns the raw JSON value of [inputAudioNoiseReduction]. - * - * Unlike [inputAudioNoiseReduction], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("input_audio_noise_reduction") - @ExcludeMissing - fun _inputAudioNoiseReduction(): JsonField = inputAudioNoiseReduction - - /** - * Returns the raw JSON value of [inputAudioTranscription]. - * - * Unlike [inputAudioTranscription], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("input_audio_transcription") - @ExcludeMissing - fun _inputAudioTranscription(): JsonField = inputAudioTranscription - - /** - * Returns the raw JSON value of [instructions]. - * - * Unlike [instructions], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("instructions") - @ExcludeMissing - fun _instructions(): JsonField = instructions - - /** - * Returns the raw JSON value of [maxResponseOutputTokens]. - * - * Unlike [maxResponseOutputTokens], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("max_response_output_tokens") - @ExcludeMissing - fun _maxResponseOutputTokens(): JsonField = maxResponseOutputTokens - - /** - * Returns the raw JSON value of [modalities]. - * - * Unlike [modalities], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("modalities") - @ExcludeMissing - fun _modalities(): JsonField> = modalities - - /** - * Returns the raw JSON value of [model]. - * - * Unlike [model], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("model") @ExcludeMissing fun _model(): JsonField = model - - /** - * Returns the raw JSON value of [outputAudioFormat]. - * - * Unlike [outputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("output_audio_format") - @ExcludeMissing - fun _outputAudioFormat(): JsonField = outputAudioFormat - - /** - * Returns the raw JSON value of [speed]. - * - * Unlike [speed], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("speed") @ExcludeMissing fun _speed(): JsonField = speed - - /** - * Returns the raw JSON value of [temperature]. - * - * Unlike [temperature], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("temperature") @ExcludeMissing fun _temperature(): JsonField = temperature - - /** - * Returns the raw JSON value of [toolChoice]. - * - * Unlike [toolChoice], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tool_choice") @ExcludeMissing fun _toolChoice(): JsonField = toolChoice - - /** - * Returns the raw JSON value of [tools]. - * - * Unlike [tools], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tools") @ExcludeMissing fun _tools(): JsonField> = tools - - /** - * Returns the raw JSON value of [tracing]. - * - * Unlike [tracing], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tracing") @ExcludeMissing fun _tracing(): JsonField = tracing - - /** - * Returns the raw JSON value of [turnDetection]. - * - * Unlike [turnDetection], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("turn_detection") - @ExcludeMissing - fun _turnDetection(): JsonField = turnDetection - - /** - * Returns the raw JSON value of [voice]. - * - * Unlike [voice], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("voice") @ExcludeMissing fun _voice(): JsonField = voice - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Session]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Session]. */ - class Builder internal constructor() { - - private var id: JsonField = JsonMissing.of() - private var inputAudioFormat: JsonField = JsonMissing.of() - private var inputAudioNoiseReduction: JsonField = JsonMissing.of() - private var inputAudioTranscription: JsonField = JsonMissing.of() - private var instructions: JsonField = JsonMissing.of() - private var maxResponseOutputTokens: JsonField = JsonMissing.of() - private var modalities: JsonField>? = null - private var model: JsonField = JsonMissing.of() - private var outputAudioFormat: JsonField = JsonMissing.of() - private var speed: JsonField = JsonMissing.of() - private var temperature: JsonField = JsonMissing.of() - private var toolChoice: JsonField = JsonMissing.of() - private var tools: JsonField>? = null - private var tracing: JsonField = JsonMissing.of() - private var turnDetection: JsonField = JsonMissing.of() - private var voice: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(session: Session) = apply { - id = session.id - inputAudioFormat = session.inputAudioFormat - inputAudioNoiseReduction = session.inputAudioNoiseReduction - inputAudioTranscription = session.inputAudioTranscription - instructions = session.instructions - maxResponseOutputTokens = session.maxResponseOutputTokens - modalities = session.modalities.map { it.toMutableList() } - model = session.model - outputAudioFormat = session.outputAudioFormat - speed = session.speed - temperature = session.temperature - toolChoice = session.toolChoice - tools = session.tools.map { it.toMutableList() } - tracing = session.tracing - turnDetection = session.turnDetection - voice = session.voice - additionalProperties = session.additionalProperties.toMutableMap() - } - - /** Unique identifier for the session that looks like `sess_1234567890abcdef`. */ - fun id(id: String) = id(JsonField.of(id)) - - /** - * Sets [Builder.id] to an arbitrary JSON value. - * - * You should usually call [Builder.id] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun id(id: JsonField) = apply { this.id = id } - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - */ - fun inputAudioFormat(inputAudioFormat: InputAudioFormat) = - inputAudioFormat(JsonField.of(inputAudioFormat)) - - /** - * Sets [Builder.inputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioFormat] with a well-typed [InputAudioFormat] - * value instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun inputAudioFormat(inputAudioFormat: JsonField) = apply { - this.inputAudioFormat = inputAudioFormat - } - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. - * Noise reduction filters audio added to the input audio buffer before it is sent to VAD - * and the model. Filtering the audio can improve VAD and turn detection accuracy (reducing - * false positives) and model performance by improving perception of the input audio. - */ - fun inputAudioNoiseReduction(inputAudioNoiseReduction: InputAudioNoiseReduction) = - inputAudioNoiseReduction(JsonField.of(inputAudioNoiseReduction)) - - /** - * Sets [Builder.inputAudioNoiseReduction] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioNoiseReduction] with a well-typed - * [InputAudioNoiseReduction] value instead. This method is primarily for setting the field - * to an undocumented or not yet supported value. - */ - fun inputAudioNoiseReduction( - inputAudioNoiseReduction: JsonField - ) = apply { this.inputAudioNoiseReduction = inputAudioNoiseReduction } - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` to - * turn off once on. Input audio transcription is not native to the model, since the model - * consumes audio directly. Transcription runs asynchronously through - * [the /audio/transcriptions endpoint](https://platform.openai.com/docs/api-reference/audio/createTranscription) - * and should be treated as guidance of input audio content rather than precisely what the - * model heard. The client can optionally set the language and prompt for transcription, - * these offer additional guidance to the transcription service. - */ - fun inputAudioTranscription(inputAudioTranscription: InputAudioTranscription) = - inputAudioTranscription(JsonField.of(inputAudioTranscription)) - - /** - * Sets [Builder.inputAudioTranscription] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioTranscription] with a well-typed - * [InputAudioTranscription] value instead. This method is primarily for setting the field - * to an undocumented or not yet supported value. - */ - fun inputAudioTranscription(inputAudioTranscription: JsonField) = - apply { - this.inputAudioTranscription = inputAudioTranscription - } - - /** - * The default system instructions (i.e. system message) prepended to model calls. This - * field allows the client to guide the model on desired responses. The model can be - * instructed on response content and format, (e.g. "be extremely succinct", "act friendly", - * "here are examples of good responses") and on audio behavior (e.g. "talk quickly", - * "inject emotion into your voice", "laugh frequently"). The instructions are not - * guaranteed to be followed by the model, but they provide guidance to the model on the - * desired behavior. - * - * Note that the server sets default instructions which will be used if this field is not - * set and are visible in the `session.created` event at the start of the session. - */ - fun instructions(instructions: String) = instructions(JsonField.of(instructions)) - - /** - * Sets [Builder.instructions] to an arbitrary JSON value. - * - * You should usually call [Builder.instructions] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun instructions(instructions: JsonField) = apply { - this.instructions = instructions - } - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - */ - fun maxResponseOutputTokens(maxResponseOutputTokens: MaxResponseOutputTokens) = - maxResponseOutputTokens(JsonField.of(maxResponseOutputTokens)) - - /** - * Sets [Builder.maxResponseOutputTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.maxResponseOutputTokens] with a well-typed - * [MaxResponseOutputTokens] value instead. This method is primarily for setting the field - * to an undocumented or not yet supported value. - */ - fun maxResponseOutputTokens(maxResponseOutputTokens: JsonField) = - apply { - this.maxResponseOutputTokens = maxResponseOutputTokens - } - - /** - * Alias for calling [maxResponseOutputTokens] with - * `MaxResponseOutputTokens.ofInteger(integer)`. - */ - fun maxResponseOutputTokens(integer: Long) = - maxResponseOutputTokens(MaxResponseOutputTokens.ofInteger(integer)) - - /** Alias for calling [maxResponseOutputTokens] with `MaxResponseOutputTokens.ofInf()`. */ - fun maxResponseOutputTokensInf() = maxResponseOutputTokens(MaxResponseOutputTokens.ofInf()) - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - */ - fun modalities(modalities: List) = modalities(JsonField.of(modalities)) - - /** - * Sets [Builder.modalities] to an arbitrary JSON value. - * - * You should usually call [Builder.modalities] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun modalities(modalities: JsonField>) = apply { - this.modalities = modalities.map { it.toMutableList() } - } - - /** - * Adds a single [Modality] to [modalities]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addModality(modality: Modality) = apply { - modalities = - (modalities ?: JsonField.of(mutableListOf())).also { - checkKnown("modalities", it).add(modality) - } - } - - /** The Realtime model used for this session. */ - fun model(model: Model) = model(JsonField.of(model)) - - /** - * Sets [Builder.model] to an arbitrary JSON value. - * - * You should usually call [Builder.model] with a well-typed [Model] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun model(model: JsonField) = apply { this.model = model } - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For - * `pcm16`, output audio is sampled at a rate of 24kHz. - */ - fun outputAudioFormat(outputAudioFormat: OutputAudioFormat) = - outputAudioFormat(JsonField.of(outputAudioFormat)) - - /** - * Sets [Builder.outputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.outputAudioFormat] with a well-typed [OutputAudioFormat] - * value instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun outputAudioFormat(outputAudioFormat: JsonField) = apply { - this.outputAudioFormat = outputAudioFormat - } - - /** - * The speed of the model's spoken response. 1.0 is the default speed. 0.25 is the minimum - * speed. 1.5 is the maximum speed. This value can only be changed in between model turns, - * not while a response is in progress. - */ - fun speed(speed: Double) = speed(JsonField.of(speed)) - - /** - * Sets [Builder.speed] to an arbitrary JSON value. - * - * You should usually call [Builder.speed] with a well-typed [Double] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun speed(speed: JsonField) = apply { this.speed = speed } - - /** - * Sampling temperature for the model, limited to [0.6, 1.2]. For audio models a temperature - * of 0.8 is highly recommended for best performance. - */ - fun temperature(temperature: Double) = temperature(JsonField.of(temperature)) - - /** - * Sets [Builder.temperature] to an arbitrary JSON value. - * - * You should usually call [Builder.temperature] with a well-typed [Double] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun temperature(temperature: JsonField) = apply { this.temperature = temperature } - - /** - * How the model chooses tools. Options are `auto`, `none`, `required`, or specify a - * function. - */ - fun toolChoice(toolChoice: String) = toolChoice(JsonField.of(toolChoice)) - - /** - * Sets [Builder.toolChoice] to an arbitrary JSON value. - * - * You should usually call [Builder.toolChoice] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun toolChoice(toolChoice: JsonField) = apply { this.toolChoice = toolChoice } - - /** Tools (functions) available to the model. */ - fun tools(tools: List) = tools(JsonField.of(tools)) - - /** - * Sets [Builder.tools] to an arbitrary JSON value. - * - * You should usually call [Builder.tools] with a well-typed `List` value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun tools(tools: JsonField>) = apply { - this.tools = tools.map { it.toMutableList() } - } - - /** - * Adds a single [Tool] to [tools]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addTool(tool: Tool) = apply { - tools = - (tools ?: JsonField.of(mutableListOf())).also { checkKnown("tools", it).add(tool) } - } - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is - * enabled for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, - * group id, and metadata. - */ - fun tracing(tracing: Tracing) = tracing(JsonField.of(tracing)) - - /** - * Sets [Builder.tracing] to an arbitrary JSON value. - * - * You should usually call [Builder.tracing] with a well-typed [Tracing] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun tracing(tracing: JsonField) = apply { this.tracing = tracing } - - /** Alias for calling [tracing] with `Tracing.ofAuto()`. */ - fun tracingAuto() = tracing(Tracing.ofAuto()) - - /** Alias for calling [tracing] with `Tracing.ofConfiguration(configuration)`. */ - fun tracing(configuration: Tracing.TracingConfiguration) = - tracing(Tracing.ofConfiguration(configuration)) - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to - * `null` to turn off, in which case the client must manually trigger model response. Server - * VAD means that the model will detect the start and end of speech based on audio volume - * and respond at the end of user speech. Semantic VAD is more advanced and uses a turn - * detection model (in conjunction with VAD) to semantically estimate whether the user has - * finished speaking, then dynamically sets a timeout based on this probability. For - * example, if user audio trails off with "uhhm", the model will score a low probability of - * turn end and wait longer for the user to continue speaking. This can be useful for more - * natural conversations, but may have a higher latency. - */ - fun turnDetection(turnDetection: TurnDetection) = turnDetection(JsonField.of(turnDetection)) - - /** - * Sets [Builder.turnDetection] to an arbitrary JSON value. - * - * You should usually call [Builder.turnDetection] with a well-typed [TurnDetection] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun turnDetection(turnDetection: JsonField) = apply { - this.turnDetection = turnDetection - } - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - */ - fun voice(voice: Voice) = voice(JsonField.of(voice)) - - /** - * Sets [Builder.voice] to an arbitrary JSON value. - * - * You should usually call [Builder.voice] with a well-typed [Voice] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun voice(voice: JsonField) = apply { this.voice = voice } - - /** - * Sets [voice] to an arbitrary [String]. - * - * You should usually call [voice] with a well-typed [Voice] constant instead. This method - * is primarily for setting the field to an undocumented or not yet supported value. - */ - fun voice(value: String) = voice(Voice.of(value)) - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Session]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Session = - Session( - id, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - instructions, - maxResponseOutputTokens, - (modalities ?: JsonMissing.of()).map { it.toImmutable() }, - model, - outputAudioFormat, - speed, - temperature, - toolChoice, - (tools ?: JsonMissing.of()).map { it.toImmutable() }, - tracing, - turnDetection, - voice, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): Session = apply { - if (validated) { - return@apply - } - - id() - inputAudioFormat().ifPresent { it.validate() } - inputAudioNoiseReduction().ifPresent { it.validate() } - inputAudioTranscription().ifPresent { it.validate() } - instructions() - maxResponseOutputTokens().ifPresent { it.validate() } - modalities().ifPresent { it.forEach { it.validate() } } - model().ifPresent { it.validate() } - outputAudioFormat().ifPresent { it.validate() } - speed() - temperature() - toolChoice() - tools().ifPresent { it.forEach { it.validate() } } - tracing().ifPresent { it.validate() } - turnDetection().ifPresent { it.validate() } - voice() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (id.asKnown().isPresent) 1 else 0) + - (inputAudioFormat.asKnown().getOrNull()?.validity() ?: 0) + - (inputAudioNoiseReduction.asKnown().getOrNull()?.validity() ?: 0) + - (inputAudioTranscription.asKnown().getOrNull()?.validity() ?: 0) + - (if (instructions.asKnown().isPresent) 1 else 0) + - (maxResponseOutputTokens.asKnown().getOrNull()?.validity() ?: 0) + - (modalities.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (model.asKnown().getOrNull()?.validity() ?: 0) + - (outputAudioFormat.asKnown().getOrNull()?.validity() ?: 0) + - (if (speed.asKnown().isPresent) 1 else 0) + - (if (temperature.asKnown().isPresent) 1 else 0) + - (if (toolChoice.asKnown().isPresent) 1 else 0) + - (tools.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (tracing.asKnown().getOrNull()?.validity() ?: 0) + - (turnDetection.asKnown().getOrNull()?.validity() ?: 0) + - (if (voice.asKnown().isPresent) 1 else 0) - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - */ - class InputAudioFormat @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val PCM16 = of("pcm16") - - @JvmField val G711_ULAW = of("g711_ulaw") - - @JvmField val G711_ALAW = of("g711_alaw") - - @JvmStatic fun of(value: String) = InputAudioFormat(JsonField.of(value)) - } - - /** An enum containing [InputAudioFormat]'s known values. */ - enum class Known { - PCM16, - G711_ULAW, - G711_ALAW, - } - - /** - * An enum containing [InputAudioFormat]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [InputAudioFormat] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - PCM16, - G711_ULAW, - G711_ALAW, - /** - * An enum member indicating that [InputAudioFormat] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - PCM16 -> Value.PCM16 - G711_ULAW -> Value.G711_ULAW - G711_ALAW -> Value.G711_ALAW - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - PCM16 -> Known.PCM16 - G711_ULAW -> Known.G711_ULAW - G711_ALAW -> Known.G711_ALAW - else -> throw OpenAIInvalidDataException("Unknown InputAudioFormat: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): InputAudioFormat = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioFormat && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. Noise - * reduction filters audio added to the input audio buffer before it is sent to VAD and the - * model. Filtering the audio can improve VAD and turn detection accuracy (reducing false - * positives) and model performance by improving perception of the input audio. - */ - class InputAudioNoiseReduction - private constructor( - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of() - ) : this(type, mutableMapOf()) - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference room - * microphones. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [InputAudioNoiseReduction]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioNoiseReduction]. */ - class Builder internal constructor() { - - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioNoiseReduction: InputAudioNoiseReduction) = apply { - type = inputAudioNoiseReduction.type - additionalProperties = inputAudioNoiseReduction.additionalProperties.toMutableMap() - } - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference - * room microphones. - */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioNoiseReduction]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioNoiseReduction = - InputAudioNoiseReduction(type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): InputAudioNoiseReduction = apply { - if (validated) { - return@apply - } - - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = (type.asKnown().getOrNull()?.validity() ?: 0) - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference room - * microphones. - */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val NEAR_FIELD = of("near_field") - - @JvmField val FAR_FIELD = of("far_field") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - NEAR_FIELD, - FAR_FIELD, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - NEAR_FIELD, - FAR_FIELD, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - NEAR_FIELD -> Value.NEAR_FIELD - FAR_FIELD -> Value.FAR_FIELD - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - NEAR_FIELD -> Known.NEAR_FIELD - FAR_FIELD -> Known.FAR_FIELD - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioNoiseReduction && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioNoiseReduction{type=$type, additionalProperties=$additionalProperties}" - } - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` to turn - * off once on. Input audio transcription is not native to the model, since the model consumes - * audio directly. Transcription runs asynchronously through - * [the /audio/transcriptions endpoint](https://platform.openai.com/docs/api-reference/audio/createTranscription) - * and should be treated as guidance of input audio content rather than precisely what the model - * heard. The client can optionally set the language and prompt for transcription, these offer - * additional guidance to the transcription service. - */ - class InputAudioTranscription - private constructor( - private val language: JsonField, - private val model: JsonField, - private val prompt: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("language") - @ExcludeMissing - language: JsonField = JsonMissing.of(), - @JsonProperty("model") @ExcludeMissing model: JsonField = JsonMissing.of(), - @JsonProperty("prompt") @ExcludeMissing prompt: JsonField = JsonMissing.of(), - ) : this(language, model, prompt, mutableMapOf()) - - /** - * The language of the input audio. Supplying the input language in - * [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`) format - * will improve accuracy and latency. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun language(): Optional = language.getOptional("language") - - /** - * The model to use for transcription, current options are `gpt-4o-transcribe`, - * `gpt-4o-mini-transcribe`, and `whisper-1`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun model(): Optional = model.getOptional("model") - - /** - * An optional text to guide the model's style or continue a previous audio segment. For - * `whisper-1`, the - * [prompt is a list of keywords](https://platform.openai.com/docs/guides/speech-to-text#prompting). - * For `gpt-4o-transcribe` models, the prompt is a free text string, for example "expect - * words related to technology". - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun prompt(): Optional = prompt.getOptional("prompt") - - /** - * Returns the raw JSON value of [language]. - * - * Unlike [language], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("language") @ExcludeMissing fun _language(): JsonField = language - - /** - * Returns the raw JSON value of [model]. - * - * Unlike [model], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("model") @ExcludeMissing fun _model(): JsonField = model - - /** - * Returns the raw JSON value of [prompt]. - * - * Unlike [prompt], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("prompt") @ExcludeMissing fun _prompt(): JsonField = prompt - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [InputAudioTranscription]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioTranscription]. */ - class Builder internal constructor() { - - private var language: JsonField = JsonMissing.of() - private var model: JsonField = JsonMissing.of() - private var prompt: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioTranscription: InputAudioTranscription) = apply { - language = inputAudioTranscription.language - model = inputAudioTranscription.model - prompt = inputAudioTranscription.prompt - additionalProperties = inputAudioTranscription.additionalProperties.toMutableMap() - } - - /** - * The language of the input audio. Supplying the input language in - * [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`) format - * will improve accuracy and latency. - */ - fun language(language: String) = language(JsonField.of(language)) - - /** - * Sets [Builder.language] to an arbitrary JSON value. - * - * You should usually call [Builder.language] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun language(language: JsonField) = apply { this.language = language } - - /** - * The model to use for transcription, current options are `gpt-4o-transcribe`, - * `gpt-4o-mini-transcribe`, and `whisper-1`. - */ - fun model(model: String) = model(JsonField.of(model)) - - /** - * Sets [Builder.model] to an arbitrary JSON value. - * - * You should usually call [Builder.model] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun model(model: JsonField) = apply { this.model = model } - - /** - * An optional text to guide the model's style or continue a previous audio segment. For - * `whisper-1`, the - * [prompt is a list of keywords](https://platform.openai.com/docs/guides/speech-to-text#prompting). - * For `gpt-4o-transcribe` models, the prompt is a free text string, for example "expect - * words related to technology". - */ - fun prompt(prompt: String) = prompt(JsonField.of(prompt)) - - /** - * Sets [Builder.prompt] to an arbitrary JSON value. - * - * You should usually call [Builder.prompt] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun prompt(prompt: JsonField) = apply { this.prompt = prompt } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioTranscription]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioTranscription = - InputAudioTranscription( - language, - model, - prompt, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): InputAudioTranscription = apply { - if (validated) { - return@apply - } - - language() - model() - prompt() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (language.asKnown().isPresent) 1 else 0) + - (if (model.asKnown().isPresent) 1 else 0) + - (if (prompt.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioTranscription && - language == other.language && - model == other.model && - prompt == other.prompt && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(language, model, prompt, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioTranscription{language=$language, model=$model, prompt=$prompt, additionalProperties=$additionalProperties}" - } - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - */ - @JsonDeserialize(using = MaxResponseOutputTokens.Deserializer::class) - @JsonSerialize(using = MaxResponseOutputTokens.Serializer::class) - class MaxResponseOutputTokens - private constructor( - private val integer: Long? = null, - private val inf: JsonValue? = null, - private val _json: JsonValue? = null, - ) { - - fun integer(): Optional = Optional.ofNullable(integer) - - fun inf(): Optional = Optional.ofNullable(inf) - - fun isInteger(): Boolean = integer != null - - fun isInf(): Boolean = inf != null - - fun asInteger(): Long = integer.getOrThrow("integer") - - fun asInf(): JsonValue = inf.getOrThrow("inf") - - fun _json(): Optional = Optional.ofNullable(_json) - - fun accept(visitor: Visitor): T = - when { - integer != null -> visitor.visitInteger(integer) - inf != null -> visitor.visitInf(inf) - else -> visitor.unknown(_json) - } - - private var validated: Boolean = false - - fun validate(): MaxResponseOutputTokens = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitInteger(integer: Long) {} - - override fun visitInf(inf: JsonValue) { - inf.let { - if (it != JsonValue.from("inf")) { - throw OpenAIInvalidDataException("'inf' is invalid, received $it") - } - } - } - } - ) - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - accept( - object : Visitor { - override fun visitInteger(integer: Long) = 1 - - override fun visitInf(inf: JsonValue) = - inf.let { if (it == JsonValue.from("inf")) 1 else 0 } - - override fun unknown(json: JsonValue?) = 0 - } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is MaxResponseOutputTokens && integer == other.integer && inf == other.inf - } - - override fun hashCode(): Int = Objects.hash(integer, inf) - - override fun toString(): String = - when { - integer != null -> "MaxResponseOutputTokens{integer=$integer}" - inf != null -> "MaxResponseOutputTokens{inf=$inf}" - _json != null -> "MaxResponseOutputTokens{_unknown=$_json}" - else -> throw IllegalStateException("Invalid MaxResponseOutputTokens") - } - - companion object { - - @JvmStatic fun ofInteger(integer: Long) = MaxResponseOutputTokens(integer = integer) - - @JvmStatic fun ofInf() = MaxResponseOutputTokens(inf = JsonValue.from("inf")) - } - - /** - * An interface that defines how to map each variant of [MaxResponseOutputTokens] to a value - * of type [T]. - */ - interface Visitor { - - fun visitInteger(integer: Long): T - - fun visitInf(inf: JsonValue): T - - /** - * Maps an unknown variant of [MaxResponseOutputTokens] to a value of type [T]. - * - * An instance of [MaxResponseOutputTokens] can contain an unknown variant if it was - * deserialized from data that doesn't match any known variant. For example, if the SDK - * is on an older version than the API, then the API may respond with new variants that - * the SDK is unaware of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown MaxResponseOutputTokens: $json") - } - } - - internal class Deserializer : - BaseDeserializer(MaxResponseOutputTokens::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): MaxResponseOutputTokens { - val json = JsonValue.fromJsonNode(node) - - val bestMatches = - sequenceOf( - tryDeserialize(node, jacksonTypeRef()) - ?.let { MaxResponseOutputTokens(inf = it, _json = json) } - ?.takeIf { it.isValid() }, - tryDeserialize(node, jacksonTypeRef())?.let { - MaxResponseOutputTokens(integer = it, _json = json) - }, - ) - .filterNotNull() - .allMaxBy { it.validity() } - .toList() - return when (bestMatches.size) { - // This can happen if what we're deserializing is completely incompatible with - // all the possible variants (e.g. deserializing from object). - 0 -> MaxResponseOutputTokens(_json = json) - 1 -> bestMatches.single() - // If there's more than one match with the highest validity, then use the first - // completely valid match, or simply the first match if none are completely - // valid. - else -> bestMatches.firstOrNull { it.isValid() } ?: bestMatches.first() - } - } - } - - internal class Serializer : - BaseSerializer(MaxResponseOutputTokens::class) { - - override fun serialize( - value: MaxResponseOutputTokens, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.integer != null -> generator.writeObject(value.integer) - value.inf != null -> generator.writeObject(value.inf) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid MaxResponseOutputTokens") - } - } - } - } - - class Modality @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val TEXT = of("text") - - @JvmField val AUDIO = of("audio") - - @JvmStatic fun of(value: String) = Modality(JsonField.of(value)) - } - - /** An enum containing [Modality]'s known values. */ - enum class Known { - TEXT, - AUDIO, - } - - /** - * An enum containing [Modality]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Modality] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - TEXT, - AUDIO, - /** An enum member indicating that [Modality] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - TEXT -> Value.TEXT - AUDIO -> Value.AUDIO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - TEXT -> Known.TEXT - AUDIO -> Known.AUDIO - else -> throw OpenAIInvalidDataException("Unknown Modality: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Modality = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Modality && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** The Realtime model used for this session. */ - class Model @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val GPT_4O_REALTIME_PREVIEW = of("gpt-4o-realtime-preview") - - @JvmField - val GPT_4O_REALTIME_PREVIEW_2024_10_01 = of("gpt-4o-realtime-preview-2024-10-01") - - @JvmField - val GPT_4O_REALTIME_PREVIEW_2024_12_17 = of("gpt-4o-realtime-preview-2024-12-17") - - @JvmField - val GPT_4O_REALTIME_PREVIEW_2025_06_03 = of("gpt-4o-realtime-preview-2025-06-03") - - @JvmField val GPT_4O_MINI_REALTIME_PREVIEW = of("gpt-4o-mini-realtime-preview") - - @JvmField - val GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 = - of("gpt-4o-mini-realtime-preview-2024-12-17") - - @JvmStatic fun of(value: String) = Model(JsonField.of(value)) - } - - /** An enum containing [Model]'s known values. */ - enum class Known { - GPT_4O_REALTIME_PREVIEW, - GPT_4O_REALTIME_PREVIEW_2024_10_01, - GPT_4O_REALTIME_PREVIEW_2024_12_17, - GPT_4O_REALTIME_PREVIEW_2025_06_03, - GPT_4O_MINI_REALTIME_PREVIEW, - GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17, - } - - /** - * An enum containing [Model]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Model] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - GPT_4O_REALTIME_PREVIEW, - GPT_4O_REALTIME_PREVIEW_2024_10_01, - GPT_4O_REALTIME_PREVIEW_2024_12_17, - GPT_4O_REALTIME_PREVIEW_2025_06_03, - GPT_4O_MINI_REALTIME_PREVIEW, - GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17, - /** An enum member indicating that [Model] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - GPT_4O_REALTIME_PREVIEW -> Value.GPT_4O_REALTIME_PREVIEW - GPT_4O_REALTIME_PREVIEW_2024_10_01 -> Value.GPT_4O_REALTIME_PREVIEW_2024_10_01 - GPT_4O_REALTIME_PREVIEW_2024_12_17 -> Value.GPT_4O_REALTIME_PREVIEW_2024_12_17 - GPT_4O_REALTIME_PREVIEW_2025_06_03 -> Value.GPT_4O_REALTIME_PREVIEW_2025_06_03 - GPT_4O_MINI_REALTIME_PREVIEW -> Value.GPT_4O_MINI_REALTIME_PREVIEW - GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 -> - Value.GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - GPT_4O_REALTIME_PREVIEW -> Known.GPT_4O_REALTIME_PREVIEW - GPT_4O_REALTIME_PREVIEW_2024_10_01 -> Known.GPT_4O_REALTIME_PREVIEW_2024_10_01 - GPT_4O_REALTIME_PREVIEW_2024_12_17 -> Known.GPT_4O_REALTIME_PREVIEW_2024_12_17 - GPT_4O_REALTIME_PREVIEW_2025_06_03 -> Known.GPT_4O_REALTIME_PREVIEW_2025_06_03 - GPT_4O_MINI_REALTIME_PREVIEW -> Known.GPT_4O_MINI_REALTIME_PREVIEW - GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 -> - Known.GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 - else -> throw OpenAIInvalidDataException("Unknown Model: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Model = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Model && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * output audio is sampled at a rate of 24kHz. - */ - class OutputAudioFormat @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val PCM16 = of("pcm16") - - @JvmField val G711_ULAW = of("g711_ulaw") - - @JvmField val G711_ALAW = of("g711_alaw") - - @JvmStatic fun of(value: String) = OutputAudioFormat(JsonField.of(value)) - } - - /** An enum containing [OutputAudioFormat]'s known values. */ - enum class Known { - PCM16, - G711_ULAW, - G711_ALAW, - } - - /** - * An enum containing [OutputAudioFormat]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [OutputAudioFormat] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - PCM16, - G711_ULAW, - G711_ALAW, - /** - * An enum member indicating that [OutputAudioFormat] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - PCM16 -> Value.PCM16 - G711_ULAW -> Value.G711_ULAW - G711_ALAW -> Value.G711_ALAW - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - PCM16 -> Known.PCM16 - G711_ULAW -> Known.G711_ULAW - G711_ALAW -> Known.G711_ALAW - else -> throw OpenAIInvalidDataException("Unknown OutputAudioFormat: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): OutputAudioFormat = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is OutputAudioFormat && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - class Tool - private constructor( - private val description: JsonField, - private val name: JsonField, - private val parameters: JsonValue, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("description") - @ExcludeMissing - description: JsonField = JsonMissing.of(), - @JsonProperty("name") @ExcludeMissing name: JsonField = JsonMissing.of(), - @JsonProperty("parameters") @ExcludeMissing parameters: JsonValue = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(description, name, parameters, type, mutableMapOf()) - - /** - * The description of the function, including guidance on when and how to call it, and - * guidance about what to tell the user when calling (if anything). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun description(): Optional = description.getOptional("description") - - /** - * The name of the function. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun name(): Optional = name.getOptional("name") - - /** Parameters of the function in JSON Schema. */ - @JsonProperty("parameters") @ExcludeMissing fun _parameters(): JsonValue = parameters - - /** - * The type of the tool, i.e. `function`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [description]. - * - * Unlike [description], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("description") - @ExcludeMissing - fun _description(): JsonField = description - - /** - * Returns the raw JSON value of [name]. - * - * Unlike [name], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("name") @ExcludeMissing fun _name(): JsonField = name - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Tool]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Tool]. */ - class Builder internal constructor() { - - private var description: JsonField = JsonMissing.of() - private var name: JsonField = JsonMissing.of() - private var parameters: JsonValue = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(tool: Tool) = apply { - description = tool.description - name = tool.name - parameters = tool.parameters - type = tool.type - additionalProperties = tool.additionalProperties.toMutableMap() - } - - /** - * The description of the function, including guidance on when and how to call it, and - * guidance about what to tell the user when calling (if anything). - */ - fun description(description: String) = description(JsonField.of(description)) - - /** - * Sets [Builder.description] to an arbitrary JSON value. - * - * You should usually call [Builder.description] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun description(description: JsonField) = apply { - this.description = description - } - - /** The name of the function. */ - fun name(name: String) = name(JsonField.of(name)) - - /** - * Sets [Builder.name] to an arbitrary JSON value. - * - * You should usually call [Builder.name] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun name(name: JsonField) = apply { this.name = name } - - /** Parameters of the function in JSON Schema. */ - fun parameters(parameters: JsonValue) = apply { this.parameters = parameters } - - /** The type of the tool, i.e. `function`. */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Tool]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Tool = - Tool(description, name, parameters, type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): Tool = apply { - if (validated) { - return@apply - } - - description() - name() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (description.asKnown().isPresent) 1 else 0) + - (if (name.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** The type of the tool, i.e. `function`. */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val FUNCTION = of("function") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - FUNCTION - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - FUNCTION, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - FUNCTION -> Value.FUNCTION - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - FUNCTION -> Known.FUNCTION - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Tool && - description == other.description && - name == other.name && - parameters == other.parameters && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(description, name, parameters, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Tool{description=$description, name=$name, parameters=$parameters, type=$type, additionalProperties=$additionalProperties}" - } - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is enabled - * for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, group - * id, and metadata. - */ - @JsonDeserialize(using = Tracing.Deserializer::class) - @JsonSerialize(using = Tracing.Serializer::class) - class Tracing - private constructor( - private val auto: JsonValue? = null, - private val configuration: TracingConfiguration? = null, - private val _json: JsonValue? = null, - ) { - - /** Default tracing mode for the session. */ - fun auto(): Optional = Optional.ofNullable(auto) - - /** Granular configuration for tracing. */ - fun configuration(): Optional = Optional.ofNullable(configuration) - - fun isAuto(): Boolean = auto != null - - fun isConfiguration(): Boolean = configuration != null - - /** Default tracing mode for the session. */ - fun asAuto(): JsonValue = auto.getOrThrow("auto") - - /** Granular configuration for tracing. */ - fun asConfiguration(): TracingConfiguration = configuration.getOrThrow("configuration") - - fun _json(): Optional = Optional.ofNullable(_json) - - fun accept(visitor: Visitor): T = - when { - auto != null -> visitor.visitAuto(auto) - configuration != null -> visitor.visitConfiguration(configuration) - else -> visitor.unknown(_json) - } - - private var validated: Boolean = false - - fun validate(): Tracing = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitAuto(auto: JsonValue) { - auto.let { - if (it != JsonValue.from("auto")) { - throw OpenAIInvalidDataException("'auto' is invalid, received $it") - } - } - } - - override fun visitConfiguration(configuration: TracingConfiguration) { - configuration.validate() - } - } - ) - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - accept( - object : Visitor { - override fun visitAuto(auto: JsonValue) = - auto.let { if (it == JsonValue.from("auto")) 1 else 0 } - - override fun visitConfiguration(configuration: TracingConfiguration) = - configuration.validity() - - override fun unknown(json: JsonValue?) = 0 - } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Tracing && auto == other.auto && configuration == other.configuration - } - - override fun hashCode(): Int = Objects.hash(auto, configuration) - - override fun toString(): String = - when { - auto != null -> "Tracing{auto=$auto}" - configuration != null -> "Tracing{configuration=$configuration}" - _json != null -> "Tracing{_unknown=$_json}" - else -> throw IllegalStateException("Invalid Tracing") - } - - companion object { - - /** Default tracing mode for the session. */ - @JvmStatic fun ofAuto() = Tracing(auto = JsonValue.from("auto")) - - /** Granular configuration for tracing. */ - @JvmStatic - fun ofConfiguration(configuration: TracingConfiguration) = - Tracing(configuration = configuration) - } - - /** - * An interface that defines how to map each variant of [Tracing] to a value of type [T]. - */ - interface Visitor { - - /** Default tracing mode for the session. */ - fun visitAuto(auto: JsonValue): T - - /** Granular configuration for tracing. */ - fun visitConfiguration(configuration: TracingConfiguration): T - - /** - * Maps an unknown variant of [Tracing] to a value of type [T]. - * - * An instance of [Tracing] can contain an unknown variant if it was deserialized from - * data that doesn't match any known variant. For example, if the SDK is on an older - * version than the API, then the API may respond with new variants that the SDK is - * unaware of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown Tracing: $json") - } - } - - internal class Deserializer : BaseDeserializer(Tracing::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): Tracing { - val json = JsonValue.fromJsonNode(node) - - val bestMatches = - sequenceOf( - tryDeserialize(node, jacksonTypeRef()) - ?.let { Tracing(auto = it, _json = json) } - ?.takeIf { it.isValid() }, - tryDeserialize(node, jacksonTypeRef())?.let { - Tracing(configuration = it, _json = json) - }, - ) - .filterNotNull() - .allMaxBy { it.validity() } - .toList() - return when (bestMatches.size) { - // This can happen if what we're deserializing is completely incompatible with - // all the possible variants (e.g. deserializing from array). - 0 -> Tracing(_json = json) - 1 -> bestMatches.single() - // If there's more than one match with the highest validity, then use the first - // completely valid match, or simply the first match if none are completely - // valid. - else -> bestMatches.firstOrNull { it.isValid() } ?: bestMatches.first() - } - } - } - - internal class Serializer : BaseSerializer(Tracing::class) { - - override fun serialize( - value: Tracing, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.auto != null -> generator.writeObject(value.auto) - value.configuration != null -> generator.writeObject(value.configuration) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid Tracing") - } - } - } - - /** Granular configuration for tracing. */ - class TracingConfiguration - private constructor( - private val groupId: JsonField, - private val metadata: JsonValue, - private val workflowName: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("group_id") - @ExcludeMissing - groupId: JsonField = JsonMissing.of(), - @JsonProperty("metadata") @ExcludeMissing metadata: JsonValue = JsonMissing.of(), - @JsonProperty("workflow_name") - @ExcludeMissing - workflowName: JsonField = JsonMissing.of(), - ) : this(groupId, metadata, workflowName, mutableMapOf()) - - /** - * The group id to attach to this trace to enable filtering and grouping in the traces - * dashboard. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun groupId(): Optional = groupId.getOptional("group_id") - - /** - * The arbitrary metadata to attach to this trace to enable filtering in the traces - * dashboard. - */ - @JsonProperty("metadata") @ExcludeMissing fun _metadata(): JsonValue = metadata - - /** - * The name of the workflow to attach to this trace. This is used to name the trace in - * the traces dashboard. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun workflowName(): Optional = workflowName.getOptional("workflow_name") - - /** - * Returns the raw JSON value of [groupId]. - * - * Unlike [groupId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("group_id") @ExcludeMissing fun _groupId(): JsonField = groupId - - /** - * Returns the raw JSON value of [workflowName]. - * - * Unlike [workflowName], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("workflow_name") - @ExcludeMissing - fun _workflowName(): JsonField = workflowName - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [TracingConfiguration]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TracingConfiguration]. */ - class Builder internal constructor() { - - private var groupId: JsonField = JsonMissing.of() - private var metadata: JsonValue = JsonMissing.of() - private var workflowName: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(tracingConfiguration: TracingConfiguration) = apply { - groupId = tracingConfiguration.groupId - metadata = tracingConfiguration.metadata - workflowName = tracingConfiguration.workflowName - additionalProperties = tracingConfiguration.additionalProperties.toMutableMap() - } - - /** - * The group id to attach to this trace to enable filtering and grouping in the - * traces dashboard. - */ - fun groupId(groupId: String) = groupId(JsonField.of(groupId)) - - /** - * Sets [Builder.groupId] to an arbitrary JSON value. - * - * You should usually call [Builder.groupId] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun groupId(groupId: JsonField) = apply { this.groupId = groupId } - - /** - * The arbitrary metadata to attach to this trace to enable filtering in the traces - * dashboard. - */ - fun metadata(metadata: JsonValue) = apply { this.metadata = metadata } - - /** - * The name of the workflow to attach to this trace. This is used to name the trace - * in the traces dashboard. - */ - fun workflowName(workflowName: String) = workflowName(JsonField.of(workflowName)) - - /** - * Sets [Builder.workflowName] to an arbitrary JSON value. - * - * You should usually call [Builder.workflowName] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun workflowName(workflowName: JsonField) = apply { - this.workflowName = workflowName - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TracingConfiguration]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): TracingConfiguration = - TracingConfiguration( - groupId, - metadata, - workflowName, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TracingConfiguration = apply { - if (validated) { - return@apply - } - - groupId() - workflowName() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (groupId.asKnown().isPresent) 1 else 0) + - (if (workflowName.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TracingConfiguration && - groupId == other.groupId && - metadata == other.metadata && - workflowName == other.workflowName && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(groupId, metadata, workflowName, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TracingConfiguration{groupId=$groupId, metadata=$metadata, workflowName=$workflowName, additionalProperties=$additionalProperties}" - } - } - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to `null` - * to turn off, in which case the client must manually trigger model response. Server VAD means - * that the model will detect the start and end of speech based on audio volume and respond at - * the end of user speech. Semantic VAD is more advanced and uses a turn detection model (in - * conjunction with VAD) to semantically estimate whether the user has finished speaking, then - * dynamically sets a timeout based on this probability. For example, if user audio trails off - * with "uhhm", the model will score a low probability of turn end and wait longer for the user - * to continue speaking. This can be useful for more natural conversations, but may have a - * higher latency. - */ - class TurnDetection - private constructor( - private val createResponse: JsonField, - private val eagerness: JsonField, - private val interruptResponse: JsonField, - private val prefixPaddingMs: JsonField, - private val silenceDurationMs: JsonField, - private val threshold: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("create_response") - @ExcludeMissing - createResponse: JsonField = JsonMissing.of(), - @JsonProperty("eagerness") - @ExcludeMissing - eagerness: JsonField = JsonMissing.of(), - @JsonProperty("interrupt_response") - @ExcludeMissing - interruptResponse: JsonField = JsonMissing.of(), - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - prefixPaddingMs: JsonField = JsonMissing.of(), - @JsonProperty("silence_duration_ms") - @ExcludeMissing - silenceDurationMs: JsonField = JsonMissing.of(), - @JsonProperty("threshold") - @ExcludeMissing - threshold: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - mutableMapOf(), - ) - - /** - * Whether or not to automatically generate a response when a VAD stop event occurs. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun createResponse(): Optional = createResponse.getOptional("create_response") - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` will wait - * longer for the user to continue speaking, `high` will respond more quickly. `auto` is the - * default and is equivalent to `medium`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eagerness(): Optional = eagerness.getOptional("eagerness") - - /** - * Whether or not to automatically interrupt any ongoing response with output to the default - * conversation (i.e. `conversation` of `auto`) when a VAD start event occurs. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun interruptResponse(): Optional = - interruptResponse.getOptional("interrupt_response") - - /** - * Used only for `server_vad` mode. Amount of audio to include before the VAD detected - * speech (in milliseconds). Defaults to 300ms. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun prefixPaddingMs(): Optional = prefixPaddingMs.getOptional("prefix_padding_ms") - - /** - * Used only for `server_vad` mode. Duration of silence to detect speech stop (in - * milliseconds). Defaults to 500ms. With shorter values the model will respond more - * quickly, but may jump in on short pauses from the user. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun silenceDurationMs(): Optional = - silenceDurationMs.getOptional("silence_duration_ms") - - /** - * Used only for `server_vad` mode. Activation threshold for VAD (0.0 to 1.0), this defaults - * to 0.5. A higher threshold will require louder audio to activate the model, and thus - * might perform better in noisy environments. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun threshold(): Optional = threshold.getOptional("threshold") - - /** - * Type of turn detection. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [createResponse]. - * - * Unlike [createResponse], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("create_response") - @ExcludeMissing - fun _createResponse(): JsonField = createResponse - - /** - * Returns the raw JSON value of [eagerness]. - * - * Unlike [eagerness], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("eagerness") - @ExcludeMissing - fun _eagerness(): JsonField = eagerness - - /** - * Returns the raw JSON value of [interruptResponse]. - * - * Unlike [interruptResponse], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("interrupt_response") - @ExcludeMissing - fun _interruptResponse(): JsonField = interruptResponse - - /** - * Returns the raw JSON value of [prefixPaddingMs]. - * - * Unlike [prefixPaddingMs], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - fun _prefixPaddingMs(): JsonField = prefixPaddingMs - - /** - * Returns the raw JSON value of [silenceDurationMs]. - * - * Unlike [silenceDurationMs], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("silence_duration_ms") - @ExcludeMissing - fun _silenceDurationMs(): JsonField = silenceDurationMs - - /** - * Returns the raw JSON value of [threshold]. - * - * Unlike [threshold], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("threshold") @ExcludeMissing fun _threshold(): JsonField = threshold - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [TurnDetection]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TurnDetection]. */ - class Builder internal constructor() { - - private var createResponse: JsonField = JsonMissing.of() - private var eagerness: JsonField = JsonMissing.of() - private var interruptResponse: JsonField = JsonMissing.of() - private var prefixPaddingMs: JsonField = JsonMissing.of() - private var silenceDurationMs: JsonField = JsonMissing.of() - private var threshold: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(turnDetection: TurnDetection) = apply { - createResponse = turnDetection.createResponse - eagerness = turnDetection.eagerness - interruptResponse = turnDetection.interruptResponse - prefixPaddingMs = turnDetection.prefixPaddingMs - silenceDurationMs = turnDetection.silenceDurationMs - threshold = turnDetection.threshold - type = turnDetection.type - additionalProperties = turnDetection.additionalProperties.toMutableMap() - } - - /** Whether or not to automatically generate a response when a VAD stop event occurs. */ - fun createResponse(createResponse: Boolean) = - createResponse(JsonField.of(createResponse)) - - /** - * Sets [Builder.createResponse] to an arbitrary JSON value. - * - * You should usually call [Builder.createResponse] with a well-typed [Boolean] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun createResponse(createResponse: JsonField) = apply { - this.createResponse = createResponse - } - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` will - * wait longer for the user to continue speaking, `high` will respond more quickly. - * `auto` is the default and is equivalent to `medium`. - */ - fun eagerness(eagerness: Eagerness) = eagerness(JsonField.of(eagerness)) - - /** - * Sets [Builder.eagerness] to an arbitrary JSON value. - * - * You should usually call [Builder.eagerness] with a well-typed [Eagerness] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun eagerness(eagerness: JsonField) = apply { this.eagerness = eagerness } - - /** - * Whether or not to automatically interrupt any ongoing response with output to the - * default conversation (i.e. `conversation` of `auto`) when a VAD start event occurs. - */ - fun interruptResponse(interruptResponse: Boolean) = - interruptResponse(JsonField.of(interruptResponse)) - - /** - * Sets [Builder.interruptResponse] to an arbitrary JSON value. - * - * You should usually call [Builder.interruptResponse] with a well-typed [Boolean] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun interruptResponse(interruptResponse: JsonField) = apply { - this.interruptResponse = interruptResponse - } - - /** - * Used only for `server_vad` mode. Amount of audio to include before the VAD detected - * speech (in milliseconds). Defaults to 300ms. - */ - fun prefixPaddingMs(prefixPaddingMs: Long) = - prefixPaddingMs(JsonField.of(prefixPaddingMs)) - - /** - * Sets [Builder.prefixPaddingMs] to an arbitrary JSON value. - * - * You should usually call [Builder.prefixPaddingMs] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun prefixPaddingMs(prefixPaddingMs: JsonField) = apply { - this.prefixPaddingMs = prefixPaddingMs - } - - /** - * Used only for `server_vad` mode. Duration of silence to detect speech stop (in - * milliseconds). Defaults to 500ms. With shorter values the model will respond more - * quickly, but may jump in on short pauses from the user. - */ - fun silenceDurationMs(silenceDurationMs: Long) = - silenceDurationMs(JsonField.of(silenceDurationMs)) - - /** - * Sets [Builder.silenceDurationMs] to an arbitrary JSON value. - * - * You should usually call [Builder.silenceDurationMs] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun silenceDurationMs(silenceDurationMs: JsonField) = apply { - this.silenceDurationMs = silenceDurationMs - } - - /** - * Used only for `server_vad` mode. Activation threshold for VAD (0.0 to 1.0), this - * defaults to 0.5. A higher threshold will require louder audio to activate the model, - * and thus might perform better in noisy environments. - */ - fun threshold(threshold: Double) = threshold(JsonField.of(threshold)) - - /** - * Sets [Builder.threshold] to an arbitrary JSON value. - * - * You should usually call [Builder.threshold] with a well-typed [Double] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun threshold(threshold: JsonField) = apply { this.threshold = threshold } - - /** Type of turn detection. */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TurnDetection]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): TurnDetection = - TurnDetection( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TurnDetection = apply { - if (validated) { - return@apply - } - - createResponse() - eagerness().ifPresent { it.validate() } - interruptResponse() - prefixPaddingMs() - silenceDurationMs() - threshold() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (createResponse.asKnown().isPresent) 1 else 0) + - (eagerness.asKnown().getOrNull()?.validity() ?: 0) + - (if (interruptResponse.asKnown().isPresent) 1 else 0) + - (if (prefixPaddingMs.asKnown().isPresent) 1 else 0) + - (if (silenceDurationMs.asKnown().isPresent) 1 else 0) + - (if (threshold.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` will wait - * longer for the user to continue speaking, `high` will respond more quickly. `auto` is the - * default and is equivalent to `medium`. - */ - class Eagerness @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val LOW = of("low") - - @JvmField val MEDIUM = of("medium") - - @JvmField val HIGH = of("high") - - @JvmField val AUTO = of("auto") - - @JvmStatic fun of(value: String) = Eagerness(JsonField.of(value)) - } - - /** An enum containing [Eagerness]'s known values. */ - enum class Known { - LOW, - MEDIUM, - HIGH, - AUTO, - } - - /** - * An enum containing [Eagerness]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Eagerness] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - LOW, - MEDIUM, - HIGH, - AUTO, - /** - * An enum member indicating that [Eagerness] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - LOW -> Value.LOW - MEDIUM -> Value.MEDIUM - HIGH -> Value.HIGH - AUTO -> Value.AUTO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - LOW -> Known.LOW - MEDIUM -> Known.MEDIUM - HIGH -> Known.HIGH - AUTO -> Known.AUTO - else -> throw OpenAIInvalidDataException("Unknown Eagerness: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Eagerness = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Eagerness && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** Type of turn detection. */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val SERVER_VAD = of("server_vad") - - @JvmField val SEMANTIC_VAD = of("semantic_vad") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - SERVER_VAD, - SEMANTIC_VAD, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - SERVER_VAD, - SEMANTIC_VAD, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - SERVER_VAD -> Value.SERVER_VAD - SEMANTIC_VAD -> Value.SEMANTIC_VAD - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - SERVER_VAD -> Known.SERVER_VAD - SEMANTIC_VAD -> Known.SEMANTIC_VAD - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TurnDetection && - createResponse == other.createResponse && - eagerness == other.eagerness && - interruptResponse == other.interruptResponse && - prefixPaddingMs == other.prefixPaddingMs && - silenceDurationMs == other.silenceDurationMs && - threshold == other.threshold && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TurnDetection{createResponse=$createResponse, eagerness=$eagerness, interruptResponse=$interruptResponse, prefixPaddingMs=$prefixPaddingMs, silenceDurationMs=$silenceDurationMs, threshold=$threshold, type=$type, additionalProperties=$additionalProperties}" - } - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - */ - class Voice @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val ALLOY = of("alloy") - - @JvmField val ASH = of("ash") - - @JvmField val BALLAD = of("ballad") - - @JvmField val CORAL = of("coral") - - @JvmField val ECHO = of("echo") - - @JvmField val SAGE = of("sage") - - @JvmField val SHIMMER = of("shimmer") - - @JvmField val VERSE = of("verse") - - @JvmStatic fun of(value: String) = Voice(JsonField.of(value)) - } - - /** An enum containing [Voice]'s known values. */ - enum class Known { - ALLOY, - ASH, - BALLAD, - CORAL, - ECHO, - SAGE, - SHIMMER, - VERSE, - } - - /** - * An enum containing [Voice]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Voice] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - ALLOY, - ASH, - BALLAD, - CORAL, - ECHO, - SAGE, - SHIMMER, - VERSE, - /** An enum member indicating that [Voice] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - ALLOY -> Value.ALLOY - ASH -> Value.ASH - BALLAD -> Value.BALLAD - CORAL -> Value.CORAL - ECHO -> Value.ECHO - SAGE -> Value.SAGE - SHIMMER -> Value.SHIMMER - VERSE -> Value.VERSE - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - ALLOY -> Known.ALLOY - ASH -> Known.ASH - BALLAD -> Known.BALLAD - CORAL -> Known.CORAL - ECHO -> Known.ECHO - SAGE -> Known.SAGE - SHIMMER -> Known.SHIMMER - VERSE -> Known.VERSE - else -> throw OpenAIInvalidDataException("Unknown Voice: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Voice = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Voice && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Session && - id == other.id && - inputAudioFormat == other.inputAudioFormat && - inputAudioNoiseReduction == other.inputAudioNoiseReduction && - inputAudioTranscription == other.inputAudioTranscription && - instructions == other.instructions && - maxResponseOutputTokens == other.maxResponseOutputTokens && - modalities == other.modalities && - model == other.model && - outputAudioFormat == other.outputAudioFormat && - speed == other.speed && - temperature == other.temperature && - toolChoice == other.toolChoice && - tools == other.tools && - tracing == other.tracing && - turnDetection == other.turnDetection && - voice == other.voice && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - id, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - instructions, - maxResponseOutputTokens, - modalities, - model, - outputAudioFormat, - speed, - temperature, - toolChoice, - tools, - tracing, - turnDetection, - voice, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Session{id=$id, inputAudioFormat=$inputAudioFormat, inputAudioNoiseReduction=$inputAudioNoiseReduction, inputAudioTranscription=$inputAudioTranscription, instructions=$instructions, maxResponseOutputTokens=$maxResponseOutputTokens, modalities=$modalities, model=$model, outputAudioFormat=$outputAudioFormat, speed=$speed, temperature=$temperature, toolChoice=$toolChoice, tools=$tools, tracing=$tracing, turnDetection=$turnDetection, voice=$voice, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateParams.kt deleted file mode 100644 index 4461d3444..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateParams.kt +++ /dev/null @@ -1,5271 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime.sessions - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.ObjectCodec -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.BaseDeserializer -import com.openai.core.BaseSerializer -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.Params -import com.openai.core.allMaxBy -import com.openai.core.checkKnown -import com.openai.core.checkRequired -import com.openai.core.getOrThrow -import com.openai.core.http.Headers -import com.openai.core.http.QueryParams -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * Create an ephemeral API token for use in client-side applications with the Realtime API. Can be - * configured with the same session parameters as the `session.update` client event. - * - * It responds with a session object, plus a `client_secret` key which contains a usable ephemeral - * API token that can be used to authenticate browser clients for the Realtime API. - */ -class SessionCreateParams -private constructor( - private val body: Body, - private val additionalHeaders: Headers, - private val additionalQueryParams: QueryParams, -) : Params { - - /** - * Configuration options for the generated client secret. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun clientSecret(): Optional = body.clientSecret() - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioFormat(): Optional = body.inputAudioFormat() - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. Noise - * reduction filters audio added to the input audio buffer before it is sent to VAD and the - * model. Filtering the audio can improve VAD and turn detection accuracy (reducing false - * positives) and model performance by improving perception of the input audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioNoiseReduction(): Optional = - body.inputAudioNoiseReduction() - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` to turn - * off once on. Input audio transcription is not native to the model, since the model consumes - * audio directly. Transcription runs asynchronously through - * [the /audio/transcriptions endpoint](https://platform.openai.com/docs/api-reference/audio/createTranscription) - * and should be treated as guidance of input audio content rather than precisely what the model - * heard. The client can optionally set the language and prompt for transcription, these offer - * additional guidance to the transcription service. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioTranscription(): Optional = - body.inputAudioTranscription() - - /** - * The default system instructions (i.e. system message) prepended to model calls. This field - * allows the client to guide the model on desired responses. The model can be instructed on - * response content and format, (e.g. "be extremely succinct", "act friendly", "here are - * examples of good responses") and on audio behavior (e.g. "talk quickly", "inject emotion into - * your voice", "laugh frequently"). The instructions are not guaranteed to be followed by the - * model, but they provide guidance to the model on the desired behavior. - * - * Note that the server sets default instructions which will be used if this field is not set - * and are visible in the `session.created` event at the start of the session. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun instructions(): Optional = body.instructions() - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun maxResponseOutputTokens(): Optional = - body.maxResponseOutputTokens() - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun modalities(): Optional> = body.modalities() - - /** - * The Realtime model used for this session. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun model(): Optional = body.model() - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * output audio is sampled at a rate of 24kHz. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun outputAudioFormat(): Optional = body.outputAudioFormat() - - /** - * The speed of the model's spoken response. 1.0 is the default speed. 0.25 is the minimum - * speed. 1.5 is the maximum speed. This value can only be changed in between model turns, not - * while a response is in progress. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun speed(): Optional = body.speed() - - /** - * Sampling temperature for the model, limited to [0.6, 1.2]. For audio models a temperature of - * 0.8 is highly recommended for best performance. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun temperature(): Optional = body.temperature() - - /** - * How the model chooses tools. Options are `auto`, `none`, `required`, or specify a function. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun toolChoice(): Optional = body.toolChoice() - - /** - * Tools (functions) available to the model. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun tools(): Optional> = body.tools() - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is enabled - * for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, group - * id, and metadata. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun tracing(): Optional = body.tracing() - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to `null` - * to turn off, in which case the client must manually trigger model response. Server VAD means - * that the model will detect the start and end of speech based on audio volume and respond at - * the end of user speech. Semantic VAD is more advanced and uses a turn detection model (in - * conjunction with VAD) to semantically estimate whether the user has finished speaking, then - * dynamically sets a timeout based on this probability. For example, if user audio trails off - * with "uhhm", the model will score a low probability of turn end and wait longer for the user - * to continue speaking. This can be useful for more natural conversations, but may have a - * higher latency. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun turnDetection(): Optional = body.turnDetection() - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun voice(): Optional = body.voice() - - /** - * Returns the raw JSON value of [clientSecret]. - * - * Unlike [clientSecret], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _clientSecret(): JsonField = body._clientSecret() - - /** - * Returns the raw JSON value of [inputAudioFormat]. - * - * Unlike [inputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - fun _inputAudioFormat(): JsonField = body._inputAudioFormat() - - /** - * Returns the raw JSON value of [inputAudioNoiseReduction]. - * - * Unlike [inputAudioNoiseReduction], this method doesn't throw if the JSON field has an - * unexpected type. - */ - fun _inputAudioNoiseReduction(): JsonField = - body._inputAudioNoiseReduction() - - /** - * Returns the raw JSON value of [inputAudioTranscription]. - * - * Unlike [inputAudioTranscription], this method doesn't throw if the JSON field has an - * unexpected type. - */ - fun _inputAudioTranscription(): JsonField = - body._inputAudioTranscription() - - /** - * Returns the raw JSON value of [instructions]. - * - * Unlike [instructions], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _instructions(): JsonField = body._instructions() - - /** - * Returns the raw JSON value of [maxResponseOutputTokens]. - * - * Unlike [maxResponseOutputTokens], this method doesn't throw if the JSON field has an - * unexpected type. - */ - fun _maxResponseOutputTokens(): JsonField = - body._maxResponseOutputTokens() - - /** - * Returns the raw JSON value of [modalities]. - * - * Unlike [modalities], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _modalities(): JsonField> = body._modalities() - - /** - * Returns the raw JSON value of [model]. - * - * Unlike [model], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _model(): JsonField = body._model() - - /** - * Returns the raw JSON value of [outputAudioFormat]. - * - * Unlike [outputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - fun _outputAudioFormat(): JsonField = body._outputAudioFormat() - - /** - * Returns the raw JSON value of [speed]. - * - * Unlike [speed], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _speed(): JsonField = body._speed() - - /** - * Returns the raw JSON value of [temperature]. - * - * Unlike [temperature], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _temperature(): JsonField = body._temperature() - - /** - * Returns the raw JSON value of [toolChoice]. - * - * Unlike [toolChoice], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _toolChoice(): JsonField = body._toolChoice() - - /** - * Returns the raw JSON value of [tools]. - * - * Unlike [tools], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _tools(): JsonField> = body._tools() - - /** - * Returns the raw JSON value of [tracing]. - * - * Unlike [tracing], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _tracing(): JsonField = body._tracing() - - /** - * Returns the raw JSON value of [turnDetection]. - * - * Unlike [turnDetection], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _turnDetection(): JsonField = body._turnDetection() - - /** - * Returns the raw JSON value of [voice]. - * - * Unlike [voice], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _voice(): JsonField = body._voice() - - fun _additionalBodyProperties(): Map = body._additionalProperties() - - /** Additional headers to send with the request. */ - fun _additionalHeaders(): Headers = additionalHeaders - - /** Additional query param to send with the request. */ - fun _additionalQueryParams(): QueryParams = additionalQueryParams - - fun toBuilder() = Builder().from(this) - - companion object { - - @JvmStatic fun none(): SessionCreateParams = builder().build() - - /** Returns a mutable builder for constructing an instance of [SessionCreateParams]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [SessionCreateParams]. */ - class Builder internal constructor() { - - private var body: Body.Builder = Body.builder() - private var additionalHeaders: Headers.Builder = Headers.builder() - private var additionalQueryParams: QueryParams.Builder = QueryParams.builder() - - @JvmSynthetic - internal fun from(sessionCreateParams: SessionCreateParams) = apply { - body = sessionCreateParams.body.toBuilder() - additionalHeaders = sessionCreateParams.additionalHeaders.toBuilder() - additionalQueryParams = sessionCreateParams.additionalQueryParams.toBuilder() - } - - /** - * Sets the entire request body. - * - * This is generally only useful if you are already constructing the body separately. - * Otherwise, it's more convenient to use the top-level setters instead: - * - [clientSecret] - * - [inputAudioFormat] - * - [inputAudioNoiseReduction] - * - [inputAudioTranscription] - * - [instructions] - * - etc. - */ - fun body(body: Body) = apply { this.body = body.toBuilder() } - - /** Configuration options for the generated client secret. */ - fun clientSecret(clientSecret: ClientSecret) = apply { body.clientSecret(clientSecret) } - - /** - * Sets [Builder.clientSecret] to an arbitrary JSON value. - * - * You should usually call [Builder.clientSecret] with a well-typed [ClientSecret] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun clientSecret(clientSecret: JsonField) = apply { - body.clientSecret(clientSecret) - } - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - */ - fun inputAudioFormat(inputAudioFormat: InputAudioFormat) = apply { - body.inputAudioFormat(inputAudioFormat) - } - - /** - * Sets [Builder.inputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioFormat] with a well-typed [InputAudioFormat] - * value instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun inputAudioFormat(inputAudioFormat: JsonField) = apply { - body.inputAudioFormat(inputAudioFormat) - } - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. - * Noise reduction filters audio added to the input audio buffer before it is sent to VAD - * and the model. Filtering the audio can improve VAD and turn detection accuracy (reducing - * false positives) and model performance by improving perception of the input audio. - */ - fun inputAudioNoiseReduction(inputAudioNoiseReduction: InputAudioNoiseReduction) = apply { - body.inputAudioNoiseReduction(inputAudioNoiseReduction) - } - - /** - * Sets [Builder.inputAudioNoiseReduction] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioNoiseReduction] with a well-typed - * [InputAudioNoiseReduction] value instead. This method is primarily for setting the field - * to an undocumented or not yet supported value. - */ - fun inputAudioNoiseReduction( - inputAudioNoiseReduction: JsonField - ) = apply { body.inputAudioNoiseReduction(inputAudioNoiseReduction) } - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` to - * turn off once on. Input audio transcription is not native to the model, since the model - * consumes audio directly. Transcription runs asynchronously through - * [the /audio/transcriptions endpoint](https://platform.openai.com/docs/api-reference/audio/createTranscription) - * and should be treated as guidance of input audio content rather than precisely what the - * model heard. The client can optionally set the language and prompt for transcription, - * these offer additional guidance to the transcription service. - */ - fun inputAudioTranscription(inputAudioTranscription: InputAudioTranscription) = apply { - body.inputAudioTranscription(inputAudioTranscription) - } - - /** - * Sets [Builder.inputAudioTranscription] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioTranscription] with a well-typed - * [InputAudioTranscription] value instead. This method is primarily for setting the field - * to an undocumented or not yet supported value. - */ - fun inputAudioTranscription(inputAudioTranscription: JsonField) = - apply { - body.inputAudioTranscription(inputAudioTranscription) - } - - /** - * The default system instructions (i.e. system message) prepended to model calls. This - * field allows the client to guide the model on desired responses. The model can be - * instructed on response content and format, (e.g. "be extremely succinct", "act friendly", - * "here are examples of good responses") and on audio behavior (e.g. "talk quickly", - * "inject emotion into your voice", "laugh frequently"). The instructions are not - * guaranteed to be followed by the model, but they provide guidance to the model on the - * desired behavior. - * - * Note that the server sets default instructions which will be used if this field is not - * set and are visible in the `session.created` event at the start of the session. - */ - fun instructions(instructions: String) = apply { body.instructions(instructions) } - - /** - * Sets [Builder.instructions] to an arbitrary JSON value. - * - * You should usually call [Builder.instructions] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun instructions(instructions: JsonField) = apply { - body.instructions(instructions) - } - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - */ - fun maxResponseOutputTokens(maxResponseOutputTokens: MaxResponseOutputTokens) = apply { - body.maxResponseOutputTokens(maxResponseOutputTokens) - } - - /** - * Sets [Builder.maxResponseOutputTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.maxResponseOutputTokens] with a well-typed - * [MaxResponseOutputTokens] value instead. This method is primarily for setting the field - * to an undocumented or not yet supported value. - */ - fun maxResponseOutputTokens(maxResponseOutputTokens: JsonField) = - apply { - body.maxResponseOutputTokens(maxResponseOutputTokens) - } - - /** - * Alias for calling [maxResponseOutputTokens] with - * `MaxResponseOutputTokens.ofInteger(integer)`. - */ - fun maxResponseOutputTokens(integer: Long) = apply { body.maxResponseOutputTokens(integer) } - - /** Alias for calling [maxResponseOutputTokens] with `MaxResponseOutputTokens.ofInf()`. */ - fun maxResponseOutputTokensInf() = apply { body.maxResponseOutputTokensInf() } - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - */ - fun modalities(modalities: List) = apply { body.modalities(modalities) } - - /** - * Sets [Builder.modalities] to an arbitrary JSON value. - * - * You should usually call [Builder.modalities] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun modalities(modalities: JsonField>) = apply { - body.modalities(modalities) - } - - /** - * Adds a single [Modality] to [modalities]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addModality(modality: Modality) = apply { body.addModality(modality) } - - /** The Realtime model used for this session. */ - fun model(model: Model) = apply { body.model(model) } - - /** - * Sets [Builder.model] to an arbitrary JSON value. - * - * You should usually call [Builder.model] with a well-typed [Model] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun model(model: JsonField) = apply { body.model(model) } - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For - * `pcm16`, output audio is sampled at a rate of 24kHz. - */ - fun outputAudioFormat(outputAudioFormat: OutputAudioFormat) = apply { - body.outputAudioFormat(outputAudioFormat) - } - - /** - * Sets [Builder.outputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.outputAudioFormat] with a well-typed [OutputAudioFormat] - * value instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun outputAudioFormat(outputAudioFormat: JsonField) = apply { - body.outputAudioFormat(outputAudioFormat) - } - - /** - * The speed of the model's spoken response. 1.0 is the default speed. 0.25 is the minimum - * speed. 1.5 is the maximum speed. This value can only be changed in between model turns, - * not while a response is in progress. - */ - fun speed(speed: Double) = apply { body.speed(speed) } - - /** - * Sets [Builder.speed] to an arbitrary JSON value. - * - * You should usually call [Builder.speed] with a well-typed [Double] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun speed(speed: JsonField) = apply { body.speed(speed) } - - /** - * Sampling temperature for the model, limited to [0.6, 1.2]. For audio models a temperature - * of 0.8 is highly recommended for best performance. - */ - fun temperature(temperature: Double) = apply { body.temperature(temperature) } - - /** - * Sets [Builder.temperature] to an arbitrary JSON value. - * - * You should usually call [Builder.temperature] with a well-typed [Double] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun temperature(temperature: JsonField) = apply { body.temperature(temperature) } - - /** - * How the model chooses tools. Options are `auto`, `none`, `required`, or specify a - * function. - */ - fun toolChoice(toolChoice: String) = apply { body.toolChoice(toolChoice) } - - /** - * Sets [Builder.toolChoice] to an arbitrary JSON value. - * - * You should usually call [Builder.toolChoice] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun toolChoice(toolChoice: JsonField) = apply { body.toolChoice(toolChoice) } - - /** Tools (functions) available to the model. */ - fun tools(tools: List) = apply { body.tools(tools) } - - /** - * Sets [Builder.tools] to an arbitrary JSON value. - * - * You should usually call [Builder.tools] with a well-typed `List` value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun tools(tools: JsonField>) = apply { body.tools(tools) } - - /** - * Adds a single [Tool] to [tools]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addTool(tool: Tool) = apply { body.addTool(tool) } - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is - * enabled for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, - * group id, and metadata. - */ - fun tracing(tracing: Tracing) = apply { body.tracing(tracing) } - - /** - * Sets [Builder.tracing] to an arbitrary JSON value. - * - * You should usually call [Builder.tracing] with a well-typed [Tracing] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun tracing(tracing: JsonField) = apply { body.tracing(tracing) } - - /** Alias for calling [tracing] with `Tracing.ofAuto()`. */ - fun tracingAuto() = apply { body.tracingAuto() } - - /** Alias for calling [tracing] with `Tracing.ofConfiguration(configuration)`. */ - fun tracing(configuration: Tracing.TracingConfiguration) = apply { - body.tracing(configuration) - } - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to - * `null` to turn off, in which case the client must manually trigger model response. Server - * VAD means that the model will detect the start and end of speech based on audio volume - * and respond at the end of user speech. Semantic VAD is more advanced and uses a turn - * detection model (in conjunction with VAD) to semantically estimate whether the user has - * finished speaking, then dynamically sets a timeout based on this probability. For - * example, if user audio trails off with "uhhm", the model will score a low probability of - * turn end and wait longer for the user to continue speaking. This can be useful for more - * natural conversations, but may have a higher latency. - */ - fun turnDetection(turnDetection: TurnDetection) = apply { - body.turnDetection(turnDetection) - } - - /** - * Sets [Builder.turnDetection] to an arbitrary JSON value. - * - * You should usually call [Builder.turnDetection] with a well-typed [TurnDetection] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun turnDetection(turnDetection: JsonField) = apply { - body.turnDetection(turnDetection) - } - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - */ - fun voice(voice: Voice) = apply { body.voice(voice) } - - /** - * Sets [Builder.voice] to an arbitrary JSON value. - * - * You should usually call [Builder.voice] with a well-typed [Voice] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun voice(voice: JsonField) = apply { body.voice(voice) } - - /** - * Sets [voice] to an arbitrary [String]. - * - * You should usually call [voice] with a well-typed [Voice] constant instead. This method - * is primarily for setting the field to an undocumented or not yet supported value. - */ - fun voice(value: String) = apply { body.voice(value) } - - fun additionalBodyProperties(additionalBodyProperties: Map) = apply { - body.additionalProperties(additionalBodyProperties) - } - - fun putAdditionalBodyProperty(key: String, value: JsonValue) = apply { - body.putAdditionalProperty(key, value) - } - - fun putAllAdditionalBodyProperties(additionalBodyProperties: Map) = - apply { - body.putAllAdditionalProperties(additionalBodyProperties) - } - - fun removeAdditionalBodyProperty(key: String) = apply { body.removeAdditionalProperty(key) } - - fun removeAllAdditionalBodyProperties(keys: Set) = apply { - body.removeAllAdditionalProperties(keys) - } - - fun additionalHeaders(additionalHeaders: Headers) = apply { - this.additionalHeaders.clear() - putAllAdditionalHeaders(additionalHeaders) - } - - fun additionalHeaders(additionalHeaders: Map>) = apply { - this.additionalHeaders.clear() - putAllAdditionalHeaders(additionalHeaders) - } - - fun putAdditionalHeader(name: String, value: String) = apply { - additionalHeaders.put(name, value) - } - - fun putAdditionalHeaders(name: String, values: Iterable) = apply { - additionalHeaders.put(name, values) - } - - fun putAllAdditionalHeaders(additionalHeaders: Headers) = apply { - this.additionalHeaders.putAll(additionalHeaders) - } - - fun putAllAdditionalHeaders(additionalHeaders: Map>) = apply { - this.additionalHeaders.putAll(additionalHeaders) - } - - fun replaceAdditionalHeaders(name: String, value: String) = apply { - additionalHeaders.replace(name, value) - } - - fun replaceAdditionalHeaders(name: String, values: Iterable) = apply { - additionalHeaders.replace(name, values) - } - - fun replaceAllAdditionalHeaders(additionalHeaders: Headers) = apply { - this.additionalHeaders.replaceAll(additionalHeaders) - } - - fun replaceAllAdditionalHeaders(additionalHeaders: Map>) = apply { - this.additionalHeaders.replaceAll(additionalHeaders) - } - - fun removeAdditionalHeaders(name: String) = apply { additionalHeaders.remove(name) } - - fun removeAllAdditionalHeaders(names: Set) = apply { - additionalHeaders.removeAll(names) - } - - fun additionalQueryParams(additionalQueryParams: QueryParams) = apply { - this.additionalQueryParams.clear() - putAllAdditionalQueryParams(additionalQueryParams) - } - - fun additionalQueryParams(additionalQueryParams: Map>) = apply { - this.additionalQueryParams.clear() - putAllAdditionalQueryParams(additionalQueryParams) - } - - fun putAdditionalQueryParam(key: String, value: String) = apply { - additionalQueryParams.put(key, value) - } - - fun putAdditionalQueryParams(key: String, values: Iterable) = apply { - additionalQueryParams.put(key, values) - } - - fun putAllAdditionalQueryParams(additionalQueryParams: QueryParams) = apply { - this.additionalQueryParams.putAll(additionalQueryParams) - } - - fun putAllAdditionalQueryParams(additionalQueryParams: Map>) = - apply { - this.additionalQueryParams.putAll(additionalQueryParams) - } - - fun replaceAdditionalQueryParams(key: String, value: String) = apply { - additionalQueryParams.replace(key, value) - } - - fun replaceAdditionalQueryParams(key: String, values: Iterable) = apply { - additionalQueryParams.replace(key, values) - } - - fun replaceAllAdditionalQueryParams(additionalQueryParams: QueryParams) = apply { - this.additionalQueryParams.replaceAll(additionalQueryParams) - } - - fun replaceAllAdditionalQueryParams(additionalQueryParams: Map>) = - apply { - this.additionalQueryParams.replaceAll(additionalQueryParams) - } - - fun removeAdditionalQueryParams(key: String) = apply { additionalQueryParams.remove(key) } - - fun removeAllAdditionalQueryParams(keys: Set) = apply { - additionalQueryParams.removeAll(keys) - } - - /** - * Returns an immutable instance of [SessionCreateParams]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): SessionCreateParams = - SessionCreateParams( - body.build(), - additionalHeaders.build(), - additionalQueryParams.build(), - ) - } - - fun _body(): Body = body - - override fun _headers(): Headers = additionalHeaders - - override fun _queryParams(): QueryParams = additionalQueryParams - - /** Realtime session object configuration. */ - class Body - private constructor( - private val clientSecret: JsonField, - private val inputAudioFormat: JsonField, - private val inputAudioNoiseReduction: JsonField, - private val inputAudioTranscription: JsonField, - private val instructions: JsonField, - private val maxResponseOutputTokens: JsonField, - private val modalities: JsonField>, - private val model: JsonField, - private val outputAudioFormat: JsonField, - private val speed: JsonField, - private val temperature: JsonField, - private val toolChoice: JsonField, - private val tools: JsonField>, - private val tracing: JsonField, - private val turnDetection: JsonField, - private val voice: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("client_secret") - @ExcludeMissing - clientSecret: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_format") - @ExcludeMissing - inputAudioFormat: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_noise_reduction") - @ExcludeMissing - inputAudioNoiseReduction: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_transcription") - @ExcludeMissing - inputAudioTranscription: JsonField = JsonMissing.of(), - @JsonProperty("instructions") - @ExcludeMissing - instructions: JsonField = JsonMissing.of(), - @JsonProperty("max_response_output_tokens") - @ExcludeMissing - maxResponseOutputTokens: JsonField = JsonMissing.of(), - @JsonProperty("modalities") - @ExcludeMissing - modalities: JsonField> = JsonMissing.of(), - @JsonProperty("model") @ExcludeMissing model: JsonField = JsonMissing.of(), - @JsonProperty("output_audio_format") - @ExcludeMissing - outputAudioFormat: JsonField = JsonMissing.of(), - @JsonProperty("speed") @ExcludeMissing speed: JsonField = JsonMissing.of(), - @JsonProperty("temperature") - @ExcludeMissing - temperature: JsonField = JsonMissing.of(), - @JsonProperty("tool_choice") - @ExcludeMissing - toolChoice: JsonField = JsonMissing.of(), - @JsonProperty("tools") @ExcludeMissing tools: JsonField> = JsonMissing.of(), - @JsonProperty("tracing") @ExcludeMissing tracing: JsonField = JsonMissing.of(), - @JsonProperty("turn_detection") - @ExcludeMissing - turnDetection: JsonField = JsonMissing.of(), - @JsonProperty("voice") @ExcludeMissing voice: JsonField = JsonMissing.of(), - ) : this( - clientSecret, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - instructions, - maxResponseOutputTokens, - modalities, - model, - outputAudioFormat, - speed, - temperature, - toolChoice, - tools, - tracing, - turnDetection, - voice, - mutableMapOf(), - ) - - /** - * Configuration options for the generated client secret. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun clientSecret(): Optional = clientSecret.getOptional("client_secret") - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioFormat(): Optional = - inputAudioFormat.getOptional("input_audio_format") - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. - * Noise reduction filters audio added to the input audio buffer before it is sent to VAD - * and the model. Filtering the audio can improve VAD and turn detection accuracy (reducing - * false positives) and model performance by improving perception of the input audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioNoiseReduction(): Optional = - inputAudioNoiseReduction.getOptional("input_audio_noise_reduction") - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` to - * turn off once on. Input audio transcription is not native to the model, since the model - * consumes audio directly. Transcription runs asynchronously through - * [the /audio/transcriptions endpoint](https://platform.openai.com/docs/api-reference/audio/createTranscription) - * and should be treated as guidance of input audio content rather than precisely what the - * model heard. The client can optionally set the language and prompt for transcription, - * these offer additional guidance to the transcription service. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioTranscription(): Optional = - inputAudioTranscription.getOptional("input_audio_transcription") - - /** - * The default system instructions (i.e. system message) prepended to model calls. This - * field allows the client to guide the model on desired responses. The model can be - * instructed on response content and format, (e.g. "be extremely succinct", "act friendly", - * "here are examples of good responses") and on audio behavior (e.g. "talk quickly", - * "inject emotion into your voice", "laugh frequently"). The instructions are not - * guaranteed to be followed by the model, but they provide guidance to the model on the - * desired behavior. - * - * Note that the server sets default instructions which will be used if this field is not - * set and are visible in the `session.created` event at the start of the session. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun instructions(): Optional = instructions.getOptional("instructions") - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun maxResponseOutputTokens(): Optional = - maxResponseOutputTokens.getOptional("max_response_output_tokens") - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun modalities(): Optional> = modalities.getOptional("modalities") - - /** - * The Realtime model used for this session. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun model(): Optional = model.getOptional("model") - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For - * `pcm16`, output audio is sampled at a rate of 24kHz. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun outputAudioFormat(): Optional = - outputAudioFormat.getOptional("output_audio_format") - - /** - * The speed of the model's spoken response. 1.0 is the default speed. 0.25 is the minimum - * speed. 1.5 is the maximum speed. This value can only be changed in between model turns, - * not while a response is in progress. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun speed(): Optional = speed.getOptional("speed") - - /** - * Sampling temperature for the model, limited to [0.6, 1.2]. For audio models a temperature - * of 0.8 is highly recommended for best performance. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun temperature(): Optional = temperature.getOptional("temperature") - - /** - * How the model chooses tools. Options are `auto`, `none`, `required`, or specify a - * function. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun toolChoice(): Optional = toolChoice.getOptional("tool_choice") - - /** - * Tools (functions) available to the model. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun tools(): Optional> = tools.getOptional("tools") - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is - * enabled for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, - * group id, and metadata. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun tracing(): Optional = tracing.getOptional("tracing") - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to - * `null` to turn off, in which case the client must manually trigger model response. Server - * VAD means that the model will detect the start and end of speech based on audio volume - * and respond at the end of user speech. Semantic VAD is more advanced and uses a turn - * detection model (in conjunction with VAD) to semantically estimate whether the user has - * finished speaking, then dynamically sets a timeout based on this probability. For - * example, if user audio trails off with "uhhm", the model will score a low probability of - * turn end and wait longer for the user to continue speaking. This can be useful for more - * natural conversations, but may have a higher latency. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun turnDetection(): Optional = turnDetection.getOptional("turn_detection") - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun voice(): Optional = voice.getOptional("voice") - - /** - * Returns the raw JSON value of [clientSecret]. - * - * Unlike [clientSecret], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("client_secret") - @ExcludeMissing - fun _clientSecret(): JsonField = clientSecret - - /** - * Returns the raw JSON value of [inputAudioFormat]. - * - * Unlike [inputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("input_audio_format") - @ExcludeMissing - fun _inputAudioFormat(): JsonField = inputAudioFormat - - /** - * Returns the raw JSON value of [inputAudioNoiseReduction]. - * - * Unlike [inputAudioNoiseReduction], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("input_audio_noise_reduction") - @ExcludeMissing - fun _inputAudioNoiseReduction(): JsonField = - inputAudioNoiseReduction - - /** - * Returns the raw JSON value of [inputAudioTranscription]. - * - * Unlike [inputAudioTranscription], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("input_audio_transcription") - @ExcludeMissing - fun _inputAudioTranscription(): JsonField = inputAudioTranscription - - /** - * Returns the raw JSON value of [instructions]. - * - * Unlike [instructions], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("instructions") - @ExcludeMissing - fun _instructions(): JsonField = instructions - - /** - * Returns the raw JSON value of [maxResponseOutputTokens]. - * - * Unlike [maxResponseOutputTokens], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("max_response_output_tokens") - @ExcludeMissing - fun _maxResponseOutputTokens(): JsonField = maxResponseOutputTokens - - /** - * Returns the raw JSON value of [modalities]. - * - * Unlike [modalities], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("modalities") - @ExcludeMissing - fun _modalities(): JsonField> = modalities - - /** - * Returns the raw JSON value of [model]. - * - * Unlike [model], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("model") @ExcludeMissing fun _model(): JsonField = model - - /** - * Returns the raw JSON value of [outputAudioFormat]. - * - * Unlike [outputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("output_audio_format") - @ExcludeMissing - fun _outputAudioFormat(): JsonField = outputAudioFormat - - /** - * Returns the raw JSON value of [speed]. - * - * Unlike [speed], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("speed") @ExcludeMissing fun _speed(): JsonField = speed - - /** - * Returns the raw JSON value of [temperature]. - * - * Unlike [temperature], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("temperature") - @ExcludeMissing - fun _temperature(): JsonField = temperature - - /** - * Returns the raw JSON value of [toolChoice]. - * - * Unlike [toolChoice], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tool_choice") - @ExcludeMissing - fun _toolChoice(): JsonField = toolChoice - - /** - * Returns the raw JSON value of [tools]. - * - * Unlike [tools], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tools") @ExcludeMissing fun _tools(): JsonField> = tools - - /** - * Returns the raw JSON value of [tracing]. - * - * Unlike [tracing], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tracing") @ExcludeMissing fun _tracing(): JsonField = tracing - - /** - * Returns the raw JSON value of [turnDetection]. - * - * Unlike [turnDetection], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("turn_detection") - @ExcludeMissing - fun _turnDetection(): JsonField = turnDetection - - /** - * Returns the raw JSON value of [voice]. - * - * Unlike [voice], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("voice") @ExcludeMissing fun _voice(): JsonField = voice - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Body]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Body]. */ - class Builder internal constructor() { - - private var clientSecret: JsonField = JsonMissing.of() - private var inputAudioFormat: JsonField = JsonMissing.of() - private var inputAudioNoiseReduction: JsonField = - JsonMissing.of() - private var inputAudioTranscription: JsonField = - JsonMissing.of() - private var instructions: JsonField = JsonMissing.of() - private var maxResponseOutputTokens: JsonField = - JsonMissing.of() - private var modalities: JsonField>? = null - private var model: JsonField = JsonMissing.of() - private var outputAudioFormat: JsonField = JsonMissing.of() - private var speed: JsonField = JsonMissing.of() - private var temperature: JsonField = JsonMissing.of() - private var toolChoice: JsonField = JsonMissing.of() - private var tools: JsonField>? = null - private var tracing: JsonField = JsonMissing.of() - private var turnDetection: JsonField = JsonMissing.of() - private var voice: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(body: Body) = apply { - clientSecret = body.clientSecret - inputAudioFormat = body.inputAudioFormat - inputAudioNoiseReduction = body.inputAudioNoiseReduction - inputAudioTranscription = body.inputAudioTranscription - instructions = body.instructions - maxResponseOutputTokens = body.maxResponseOutputTokens - modalities = body.modalities.map { it.toMutableList() } - model = body.model - outputAudioFormat = body.outputAudioFormat - speed = body.speed - temperature = body.temperature - toolChoice = body.toolChoice - tools = body.tools.map { it.toMutableList() } - tracing = body.tracing - turnDetection = body.turnDetection - voice = body.voice - additionalProperties = body.additionalProperties.toMutableMap() - } - - /** Configuration options for the generated client secret. */ - fun clientSecret(clientSecret: ClientSecret) = clientSecret(JsonField.of(clientSecret)) - - /** - * Sets [Builder.clientSecret] to an arbitrary JSON value. - * - * You should usually call [Builder.clientSecret] with a well-typed [ClientSecret] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun clientSecret(clientSecret: JsonField) = apply { - this.clientSecret = clientSecret - } - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For - * `pcm16`, input audio must be 16-bit PCM at a 24kHz sample rate, single channel - * (mono), and little-endian byte order. - */ - fun inputAudioFormat(inputAudioFormat: InputAudioFormat) = - inputAudioFormat(JsonField.of(inputAudioFormat)) - - /** - * Sets [Builder.inputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioFormat] with a well-typed - * [InputAudioFormat] value instead. This method is primarily for setting the field to - * an undocumented or not yet supported value. - */ - fun inputAudioFormat(inputAudioFormat: JsonField) = apply { - this.inputAudioFormat = inputAudioFormat - } - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. - * Noise reduction filters audio added to the input audio buffer before it is sent to - * VAD and the model. Filtering the audio can improve VAD and turn detection accuracy - * (reducing false positives) and model performance by improving perception of the input - * audio. - */ - fun inputAudioNoiseReduction(inputAudioNoiseReduction: InputAudioNoiseReduction) = - inputAudioNoiseReduction(JsonField.of(inputAudioNoiseReduction)) - - /** - * Sets [Builder.inputAudioNoiseReduction] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioNoiseReduction] with a well-typed - * [InputAudioNoiseReduction] value instead. This method is primarily for setting the - * field to an undocumented or not yet supported value. - */ - fun inputAudioNoiseReduction( - inputAudioNoiseReduction: JsonField - ) = apply { this.inputAudioNoiseReduction = inputAudioNoiseReduction } - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` - * to turn off once on. Input audio transcription is not native to the model, since the - * model consumes audio directly. Transcription runs asynchronously through - * [the /audio/transcriptions endpoint](https://platform.openai.com/docs/api-reference/audio/createTranscription) - * and should be treated as guidance of input audio content rather than precisely what - * the model heard. The client can optionally set the language and prompt for - * transcription, these offer additional guidance to the transcription service. - */ - fun inputAudioTranscription(inputAudioTranscription: InputAudioTranscription) = - inputAudioTranscription(JsonField.of(inputAudioTranscription)) - - /** - * Sets [Builder.inputAudioTranscription] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioTranscription] with a well-typed - * [InputAudioTranscription] value instead. This method is primarily for setting the - * field to an undocumented or not yet supported value. - */ - fun inputAudioTranscription( - inputAudioTranscription: JsonField - ) = apply { this.inputAudioTranscription = inputAudioTranscription } - - /** - * The default system instructions (i.e. system message) prepended to model calls. This - * field allows the client to guide the model on desired responses. The model can be - * instructed on response content and format, (e.g. "be extremely succinct", "act - * friendly", "here are examples of good responses") and on audio behavior (e.g. "talk - * quickly", "inject emotion into your voice", "laugh frequently"). The instructions are - * not guaranteed to be followed by the model, but they provide guidance to the model on - * the desired behavior. - * - * Note that the server sets default instructions which will be used if this field is - * not set and are visible in the `session.created` event at the start of the session. - */ - fun instructions(instructions: String) = instructions(JsonField.of(instructions)) - - /** - * Sets [Builder.instructions] to an arbitrary JSON value. - * - * You should usually call [Builder.instructions] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun instructions(instructions: JsonField) = apply { - this.instructions = instructions - } - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool - * calls. Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the - * maximum available tokens for a given model. Defaults to `inf`. - */ - fun maxResponseOutputTokens(maxResponseOutputTokens: MaxResponseOutputTokens) = - maxResponseOutputTokens(JsonField.of(maxResponseOutputTokens)) - - /** - * Sets [Builder.maxResponseOutputTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.maxResponseOutputTokens] with a well-typed - * [MaxResponseOutputTokens] value instead. This method is primarily for setting the - * field to an undocumented or not yet supported value. - */ - fun maxResponseOutputTokens( - maxResponseOutputTokens: JsonField - ) = apply { this.maxResponseOutputTokens = maxResponseOutputTokens } - - /** - * Alias for calling [maxResponseOutputTokens] with - * `MaxResponseOutputTokens.ofInteger(integer)`. - */ - fun maxResponseOutputTokens(integer: Long) = - maxResponseOutputTokens(MaxResponseOutputTokens.ofInteger(integer)) - - /** - * Alias for calling [maxResponseOutputTokens] with `MaxResponseOutputTokens.ofInf()`. - */ - fun maxResponseOutputTokensInf() = - maxResponseOutputTokens(MaxResponseOutputTokens.ofInf()) - - /** - * The set of modalities the model can respond with. To disable audio, set this to - * ["text"]. - */ - fun modalities(modalities: List) = modalities(JsonField.of(modalities)) - - /** - * Sets [Builder.modalities] to an arbitrary JSON value. - * - * You should usually call [Builder.modalities] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun modalities(modalities: JsonField>) = apply { - this.modalities = modalities.map { it.toMutableList() } - } - - /** - * Adds a single [Modality] to [modalities]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addModality(modality: Modality) = apply { - modalities = - (modalities ?: JsonField.of(mutableListOf())).also { - checkKnown("modalities", it).add(modality) - } - } - - /** The Realtime model used for this session. */ - fun model(model: Model) = model(JsonField.of(model)) - - /** - * Sets [Builder.model] to an arbitrary JSON value. - * - * You should usually call [Builder.model] with a well-typed [Model] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun model(model: JsonField) = apply { this.model = model } - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For - * `pcm16`, output audio is sampled at a rate of 24kHz. - */ - fun outputAudioFormat(outputAudioFormat: OutputAudioFormat) = - outputAudioFormat(JsonField.of(outputAudioFormat)) - - /** - * Sets [Builder.outputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.outputAudioFormat] with a well-typed - * [OutputAudioFormat] value instead. This method is primarily for setting the field to - * an undocumented or not yet supported value. - */ - fun outputAudioFormat(outputAudioFormat: JsonField) = apply { - this.outputAudioFormat = outputAudioFormat - } - - /** - * The speed of the model's spoken response. 1.0 is the default speed. 0.25 is the - * minimum speed. 1.5 is the maximum speed. This value can only be changed in between - * model turns, not while a response is in progress. - */ - fun speed(speed: Double) = speed(JsonField.of(speed)) - - /** - * Sets [Builder.speed] to an arbitrary JSON value. - * - * You should usually call [Builder.speed] with a well-typed [Double] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun speed(speed: JsonField) = apply { this.speed = speed } - - /** - * Sampling temperature for the model, limited to [0.6, 1.2]. For audio models a - * temperature of 0.8 is highly recommended for best performance. - */ - fun temperature(temperature: Double) = temperature(JsonField.of(temperature)) - - /** - * Sets [Builder.temperature] to an arbitrary JSON value. - * - * You should usually call [Builder.temperature] with a well-typed [Double] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun temperature(temperature: JsonField) = apply { - this.temperature = temperature - } - - /** - * How the model chooses tools. Options are `auto`, `none`, `required`, or specify a - * function. - */ - fun toolChoice(toolChoice: String) = toolChoice(JsonField.of(toolChoice)) - - /** - * Sets [Builder.toolChoice] to an arbitrary JSON value. - * - * You should usually call [Builder.toolChoice] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun toolChoice(toolChoice: JsonField) = apply { this.toolChoice = toolChoice } - - /** Tools (functions) available to the model. */ - fun tools(tools: List) = tools(JsonField.of(tools)) - - /** - * Sets [Builder.tools] to an arbitrary JSON value. - * - * You should usually call [Builder.tools] with a well-typed `List` value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun tools(tools: JsonField>) = apply { - this.tools = tools.map { it.toMutableList() } - } - - /** - * Adds a single [Tool] to [tools]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addTool(tool: Tool) = apply { - tools = - (tools ?: JsonField.of(mutableListOf())).also { - checkKnown("tools", it).add(tool) - } - } - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is - * enabled for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, - * group id, and metadata. - */ - fun tracing(tracing: Tracing) = tracing(JsonField.of(tracing)) - - /** - * Sets [Builder.tracing] to an arbitrary JSON value. - * - * You should usually call [Builder.tracing] with a well-typed [Tracing] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun tracing(tracing: JsonField) = apply { this.tracing = tracing } - - /** Alias for calling [tracing] with `Tracing.ofAuto()`. */ - fun tracingAuto() = tracing(Tracing.ofAuto()) - - /** Alias for calling [tracing] with `Tracing.ofConfiguration(configuration)`. */ - fun tracing(configuration: Tracing.TracingConfiguration) = - tracing(Tracing.ofConfiguration(configuration)) - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set - * to `null` to turn off, in which case the client must manually trigger model response. - * Server VAD means that the model will detect the start and end of speech based on - * audio volume and respond at the end of user speech. Semantic VAD is more advanced and - * uses a turn detection model (in conjunction with VAD) to semantically estimate - * whether the user has finished speaking, then dynamically sets a timeout based on this - * probability. For example, if user audio trails off with "uhhm", the model will score - * a low probability of turn end and wait longer for the user to continue speaking. This - * can be useful for more natural conversations, but may have a higher latency. - */ - fun turnDetection(turnDetection: TurnDetection) = - turnDetection(JsonField.of(turnDetection)) - - /** - * Sets [Builder.turnDetection] to an arbitrary JSON value. - * - * You should usually call [Builder.turnDetection] with a well-typed [TurnDetection] - * value instead. This method is primarily for setting the field to an undocumented or - * not yet supported value. - */ - fun turnDetection(turnDetection: JsonField) = apply { - this.turnDetection = turnDetection - } - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once - * the model has responded with audio at least once. Current voice options are `alloy`, - * `ash`, `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - */ - fun voice(voice: Voice) = voice(JsonField.of(voice)) - - /** - * Sets [Builder.voice] to an arbitrary JSON value. - * - * You should usually call [Builder.voice] with a well-typed [Voice] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun voice(voice: JsonField) = apply { this.voice = voice } - - /** - * Sets [voice] to an arbitrary [String]. - * - * You should usually call [voice] with a well-typed [Voice] constant instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun voice(value: String) = voice(Voice.of(value)) - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Body]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Body = - Body( - clientSecret, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - instructions, - maxResponseOutputTokens, - (modalities ?: JsonMissing.of()).map { it.toImmutable() }, - model, - outputAudioFormat, - speed, - temperature, - toolChoice, - (tools ?: JsonMissing.of()).map { it.toImmutable() }, - tracing, - turnDetection, - voice, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): Body = apply { - if (validated) { - return@apply - } - - clientSecret().ifPresent { it.validate() } - inputAudioFormat().ifPresent { it.validate() } - inputAudioNoiseReduction().ifPresent { it.validate() } - inputAudioTranscription().ifPresent { it.validate() } - instructions() - maxResponseOutputTokens().ifPresent { it.validate() } - modalities().ifPresent { it.forEach { it.validate() } } - model().ifPresent { it.validate() } - outputAudioFormat().ifPresent { it.validate() } - speed() - temperature() - toolChoice() - tools().ifPresent { it.forEach { it.validate() } } - tracing().ifPresent { it.validate() } - turnDetection().ifPresent { it.validate() } - voice() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (clientSecret.asKnown().getOrNull()?.validity() ?: 0) + - (inputAudioFormat.asKnown().getOrNull()?.validity() ?: 0) + - (inputAudioNoiseReduction.asKnown().getOrNull()?.validity() ?: 0) + - (inputAudioTranscription.asKnown().getOrNull()?.validity() ?: 0) + - (if (instructions.asKnown().isPresent) 1 else 0) + - (maxResponseOutputTokens.asKnown().getOrNull()?.validity() ?: 0) + - (modalities.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (model.asKnown().getOrNull()?.validity() ?: 0) + - (outputAudioFormat.asKnown().getOrNull()?.validity() ?: 0) + - (if (speed.asKnown().isPresent) 1 else 0) + - (if (temperature.asKnown().isPresent) 1 else 0) + - (if (toolChoice.asKnown().isPresent) 1 else 0) + - (tools.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (tracing.asKnown().getOrNull()?.validity() ?: 0) + - (turnDetection.asKnown().getOrNull()?.validity() ?: 0) + - (if (voice.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Body && - clientSecret == other.clientSecret && - inputAudioFormat == other.inputAudioFormat && - inputAudioNoiseReduction == other.inputAudioNoiseReduction && - inputAudioTranscription == other.inputAudioTranscription && - instructions == other.instructions && - maxResponseOutputTokens == other.maxResponseOutputTokens && - modalities == other.modalities && - model == other.model && - outputAudioFormat == other.outputAudioFormat && - speed == other.speed && - temperature == other.temperature && - toolChoice == other.toolChoice && - tools == other.tools && - tracing == other.tracing && - turnDetection == other.turnDetection && - voice == other.voice && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - clientSecret, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - instructions, - maxResponseOutputTokens, - modalities, - model, - outputAudioFormat, - speed, - temperature, - toolChoice, - tools, - tracing, - turnDetection, - voice, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Body{clientSecret=$clientSecret, inputAudioFormat=$inputAudioFormat, inputAudioNoiseReduction=$inputAudioNoiseReduction, inputAudioTranscription=$inputAudioTranscription, instructions=$instructions, maxResponseOutputTokens=$maxResponseOutputTokens, modalities=$modalities, model=$model, outputAudioFormat=$outputAudioFormat, speed=$speed, temperature=$temperature, toolChoice=$toolChoice, tools=$tools, tracing=$tracing, turnDetection=$turnDetection, voice=$voice, additionalProperties=$additionalProperties}" - } - - /** Configuration options for the generated client secret. */ - class ClientSecret - private constructor( - private val expiresAfter: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("expires_after") - @ExcludeMissing - expiresAfter: JsonField = JsonMissing.of() - ) : this(expiresAfter, mutableMapOf()) - - /** - * Configuration for the ephemeral token expiration. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun expiresAfter(): Optional = expiresAfter.getOptional("expires_after") - - /** - * Returns the raw JSON value of [expiresAfter]. - * - * Unlike [expiresAfter], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("expires_after") - @ExcludeMissing - fun _expiresAfter(): JsonField = expiresAfter - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [ClientSecret]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ClientSecret]. */ - class Builder internal constructor() { - - private var expiresAfter: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(clientSecret: ClientSecret) = apply { - expiresAfter = clientSecret.expiresAfter - additionalProperties = clientSecret.additionalProperties.toMutableMap() - } - - /** Configuration for the ephemeral token expiration. */ - fun expiresAfter(expiresAfter: ExpiresAfter) = expiresAfter(JsonField.of(expiresAfter)) - - /** - * Sets [Builder.expiresAfter] to an arbitrary JSON value. - * - * You should usually call [Builder.expiresAfter] with a well-typed [ExpiresAfter] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun expiresAfter(expiresAfter: JsonField) = apply { - this.expiresAfter = expiresAfter - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ClientSecret]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): ClientSecret = - ClientSecret(expiresAfter, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): ClientSecret = apply { - if (validated) { - return@apply - } - - expiresAfter().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = (expiresAfter.asKnown().getOrNull()?.validity() ?: 0) - - /** Configuration for the ephemeral token expiration. */ - class ExpiresAfter - private constructor( - private val anchor: JsonField, - private val seconds: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("anchor") - @ExcludeMissing - anchor: JsonField = JsonMissing.of(), - @JsonProperty("seconds") @ExcludeMissing seconds: JsonField = JsonMissing.of(), - ) : this(anchor, seconds, mutableMapOf()) - - /** - * The anchor point for the ephemeral token expiration. Only `created_at` is currently - * supported. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected - * value). - */ - fun anchor(): Anchor = anchor.getRequired("anchor") - - /** - * The number of seconds from the anchor point to the expiration. Select a value between - * `10` and `7200`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun seconds(): Optional = seconds.getOptional("seconds") - - /** - * Returns the raw JSON value of [anchor]. - * - * Unlike [anchor], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("anchor") @ExcludeMissing fun _anchor(): JsonField = anchor - - /** - * Returns the raw JSON value of [seconds]. - * - * Unlike [seconds], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("seconds") @ExcludeMissing fun _seconds(): JsonField = seconds - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ExpiresAfter]. - * - * The following fields are required: - * ```java - * .anchor() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ExpiresAfter]. */ - class Builder internal constructor() { - - private var anchor: JsonField? = null - private var seconds: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(expiresAfter: ExpiresAfter) = apply { - anchor = expiresAfter.anchor - seconds = expiresAfter.seconds - additionalProperties = expiresAfter.additionalProperties.toMutableMap() - } - - /** - * The anchor point for the ephemeral token expiration. Only `created_at` is - * currently supported. - */ - fun anchor(anchor: Anchor) = anchor(JsonField.of(anchor)) - - /** - * Sets [Builder.anchor] to an arbitrary JSON value. - * - * You should usually call [Builder.anchor] with a well-typed [Anchor] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun anchor(anchor: JsonField) = apply { this.anchor = anchor } - - /** - * The number of seconds from the anchor point to the expiration. Select a value - * between `10` and `7200`. - */ - fun seconds(seconds: Long) = seconds(JsonField.of(seconds)) - - /** - * Sets [Builder.seconds] to an arbitrary JSON value. - * - * You should usually call [Builder.seconds] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun seconds(seconds: JsonField) = apply { this.seconds = seconds } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ExpiresAfter]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .anchor() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ExpiresAfter = - ExpiresAfter( - checkRequired("anchor", anchor), - seconds, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ExpiresAfter = apply { - if (validated) { - return@apply - } - - anchor().validate() - seconds() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (anchor.asKnown().getOrNull()?.validity() ?: 0) + - (if (seconds.asKnown().isPresent) 1 else 0) - - /** - * The anchor point for the ephemeral token expiration. Only `created_at` is currently - * supported. - */ - class Anchor @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that - * doesn't match any known member, and you want to know that value. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val CREATED_AT = of("created_at") - - @JvmStatic fun of(value: String) = Anchor(JsonField.of(value)) - } - - /** An enum containing [Anchor]'s known values. */ - enum class Known { - CREATED_AT - } - - /** - * An enum containing [Anchor]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Anchor] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, - * if the SDK is on an older version than the API, then the API may respond with - * new members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - CREATED_AT, - /** - * An enum member indicating that [Anchor] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if - * you want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - CREATED_AT -> Value.CREATED_AT - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a - * known member. - */ - fun known(): Known = - when (this) { - CREATED_AT -> Known.CREATED_AT - else -> throw OpenAIInvalidDataException("Unknown Anchor: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have - * the expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Anchor = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Anchor && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ExpiresAfter && - anchor == other.anchor && - seconds == other.seconds && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(anchor, seconds, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ExpiresAfter{anchor=$anchor, seconds=$seconds, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ClientSecret && - expiresAfter == other.expiresAfter && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(expiresAfter, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ClientSecret{expiresAfter=$expiresAfter, additionalProperties=$additionalProperties}" - } - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - */ - class InputAudioFormat @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val PCM16 = of("pcm16") - - @JvmField val G711_ULAW = of("g711_ulaw") - - @JvmField val G711_ALAW = of("g711_alaw") - - @JvmStatic fun of(value: String) = InputAudioFormat(JsonField.of(value)) - } - - /** An enum containing [InputAudioFormat]'s known values. */ - enum class Known { - PCM16, - G711_ULAW, - G711_ALAW, - } - - /** - * An enum containing [InputAudioFormat]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [InputAudioFormat] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - PCM16, - G711_ULAW, - G711_ALAW, - /** - * An enum member indicating that [InputAudioFormat] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - PCM16 -> Value.PCM16 - G711_ULAW -> Value.G711_ULAW - G711_ALAW -> Value.G711_ALAW - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - PCM16 -> Known.PCM16 - G711_ULAW -> Known.G711_ULAW - G711_ALAW -> Known.G711_ALAW - else -> throw OpenAIInvalidDataException("Unknown InputAudioFormat: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): InputAudioFormat = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioFormat && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. Noise - * reduction filters audio added to the input audio buffer before it is sent to VAD and the - * model. Filtering the audio can improve VAD and turn detection accuracy (reducing false - * positives) and model performance by improving perception of the input audio. - */ - class InputAudioNoiseReduction - private constructor( - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of() - ) : this(type, mutableMapOf()) - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference room - * microphones. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [InputAudioNoiseReduction]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioNoiseReduction]. */ - class Builder internal constructor() { - - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioNoiseReduction: InputAudioNoiseReduction) = apply { - type = inputAudioNoiseReduction.type - additionalProperties = inputAudioNoiseReduction.additionalProperties.toMutableMap() - } - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference - * room microphones. - */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioNoiseReduction]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioNoiseReduction = - InputAudioNoiseReduction(type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): InputAudioNoiseReduction = apply { - if (validated) { - return@apply - } - - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = (type.asKnown().getOrNull()?.validity() ?: 0) - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference room - * microphones. - */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val NEAR_FIELD = of("near_field") - - @JvmField val FAR_FIELD = of("far_field") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - NEAR_FIELD, - FAR_FIELD, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - NEAR_FIELD, - FAR_FIELD, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - NEAR_FIELD -> Value.NEAR_FIELD - FAR_FIELD -> Value.FAR_FIELD - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - NEAR_FIELD -> Known.NEAR_FIELD - FAR_FIELD -> Known.FAR_FIELD - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioNoiseReduction && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioNoiseReduction{type=$type, additionalProperties=$additionalProperties}" - } - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` to turn - * off once on. Input audio transcription is not native to the model, since the model consumes - * audio directly. Transcription runs asynchronously through - * [the /audio/transcriptions endpoint](https://platform.openai.com/docs/api-reference/audio/createTranscription) - * and should be treated as guidance of input audio content rather than precisely what the model - * heard. The client can optionally set the language and prompt for transcription, these offer - * additional guidance to the transcription service. - */ - class InputAudioTranscription - private constructor( - private val language: JsonField, - private val model: JsonField, - private val prompt: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("language") - @ExcludeMissing - language: JsonField = JsonMissing.of(), - @JsonProperty("model") @ExcludeMissing model: JsonField = JsonMissing.of(), - @JsonProperty("prompt") @ExcludeMissing prompt: JsonField = JsonMissing.of(), - ) : this(language, model, prompt, mutableMapOf()) - - /** - * The language of the input audio. Supplying the input language in - * [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`) format - * will improve accuracy and latency. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun language(): Optional = language.getOptional("language") - - /** - * The model to use for transcription, current options are `gpt-4o-transcribe`, - * `gpt-4o-mini-transcribe`, and `whisper-1`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun model(): Optional = model.getOptional("model") - - /** - * An optional text to guide the model's style or continue a previous audio segment. For - * `whisper-1`, the - * [prompt is a list of keywords](https://platform.openai.com/docs/guides/speech-to-text#prompting). - * For `gpt-4o-transcribe` models, the prompt is a free text string, for example "expect - * words related to technology". - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun prompt(): Optional = prompt.getOptional("prompt") - - /** - * Returns the raw JSON value of [language]. - * - * Unlike [language], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("language") @ExcludeMissing fun _language(): JsonField = language - - /** - * Returns the raw JSON value of [model]. - * - * Unlike [model], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("model") @ExcludeMissing fun _model(): JsonField = model - - /** - * Returns the raw JSON value of [prompt]. - * - * Unlike [prompt], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("prompt") @ExcludeMissing fun _prompt(): JsonField = prompt - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [InputAudioTranscription]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioTranscription]. */ - class Builder internal constructor() { - - private var language: JsonField = JsonMissing.of() - private var model: JsonField = JsonMissing.of() - private var prompt: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioTranscription: InputAudioTranscription) = apply { - language = inputAudioTranscription.language - model = inputAudioTranscription.model - prompt = inputAudioTranscription.prompt - additionalProperties = inputAudioTranscription.additionalProperties.toMutableMap() - } - - /** - * The language of the input audio. Supplying the input language in - * [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`) format - * will improve accuracy and latency. - */ - fun language(language: String) = language(JsonField.of(language)) - - /** - * Sets [Builder.language] to an arbitrary JSON value. - * - * You should usually call [Builder.language] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun language(language: JsonField) = apply { this.language = language } - - /** - * The model to use for transcription, current options are `gpt-4o-transcribe`, - * `gpt-4o-mini-transcribe`, and `whisper-1`. - */ - fun model(model: String) = model(JsonField.of(model)) - - /** - * Sets [Builder.model] to an arbitrary JSON value. - * - * You should usually call [Builder.model] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun model(model: JsonField) = apply { this.model = model } - - /** - * An optional text to guide the model's style or continue a previous audio segment. For - * `whisper-1`, the - * [prompt is a list of keywords](https://platform.openai.com/docs/guides/speech-to-text#prompting). - * For `gpt-4o-transcribe` models, the prompt is a free text string, for example "expect - * words related to technology". - */ - fun prompt(prompt: String) = prompt(JsonField.of(prompt)) - - /** - * Sets [Builder.prompt] to an arbitrary JSON value. - * - * You should usually call [Builder.prompt] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun prompt(prompt: JsonField) = apply { this.prompt = prompt } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioTranscription]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioTranscription = - InputAudioTranscription( - language, - model, - prompt, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): InputAudioTranscription = apply { - if (validated) { - return@apply - } - - language() - model() - prompt() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (language.asKnown().isPresent) 1 else 0) + - (if (model.asKnown().isPresent) 1 else 0) + - (if (prompt.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioTranscription && - language == other.language && - model == other.model && - prompt == other.prompt && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(language, model, prompt, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioTranscription{language=$language, model=$model, prompt=$prompt, additionalProperties=$additionalProperties}" - } - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - */ - @JsonDeserialize(using = MaxResponseOutputTokens.Deserializer::class) - @JsonSerialize(using = MaxResponseOutputTokens.Serializer::class) - class MaxResponseOutputTokens - private constructor( - private val integer: Long? = null, - private val inf: JsonValue? = null, - private val _json: JsonValue? = null, - ) { - - fun integer(): Optional = Optional.ofNullable(integer) - - fun inf(): Optional = Optional.ofNullable(inf) - - fun isInteger(): Boolean = integer != null - - fun isInf(): Boolean = inf != null - - fun asInteger(): Long = integer.getOrThrow("integer") - - fun asInf(): JsonValue = inf.getOrThrow("inf") - - fun _json(): Optional = Optional.ofNullable(_json) - - fun accept(visitor: Visitor): T = - when { - integer != null -> visitor.visitInteger(integer) - inf != null -> visitor.visitInf(inf) - else -> visitor.unknown(_json) - } - - private var validated: Boolean = false - - fun validate(): MaxResponseOutputTokens = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitInteger(integer: Long) {} - - override fun visitInf(inf: JsonValue) { - inf.let { - if (it != JsonValue.from("inf")) { - throw OpenAIInvalidDataException("'inf' is invalid, received $it") - } - } - } - } - ) - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - accept( - object : Visitor { - override fun visitInteger(integer: Long) = 1 - - override fun visitInf(inf: JsonValue) = - inf.let { if (it == JsonValue.from("inf")) 1 else 0 } - - override fun unknown(json: JsonValue?) = 0 - } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is MaxResponseOutputTokens && integer == other.integer && inf == other.inf - } - - override fun hashCode(): Int = Objects.hash(integer, inf) - - override fun toString(): String = - when { - integer != null -> "MaxResponseOutputTokens{integer=$integer}" - inf != null -> "MaxResponseOutputTokens{inf=$inf}" - _json != null -> "MaxResponseOutputTokens{_unknown=$_json}" - else -> throw IllegalStateException("Invalid MaxResponseOutputTokens") - } - - companion object { - - @JvmStatic fun ofInteger(integer: Long) = MaxResponseOutputTokens(integer = integer) - - @JvmStatic fun ofInf() = MaxResponseOutputTokens(inf = JsonValue.from("inf")) - } - - /** - * An interface that defines how to map each variant of [MaxResponseOutputTokens] to a value - * of type [T]. - */ - interface Visitor { - - fun visitInteger(integer: Long): T - - fun visitInf(inf: JsonValue): T - - /** - * Maps an unknown variant of [MaxResponseOutputTokens] to a value of type [T]. - * - * An instance of [MaxResponseOutputTokens] can contain an unknown variant if it was - * deserialized from data that doesn't match any known variant. For example, if the SDK - * is on an older version than the API, then the API may respond with new variants that - * the SDK is unaware of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown MaxResponseOutputTokens: $json") - } - } - - internal class Deserializer : - BaseDeserializer(MaxResponseOutputTokens::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): MaxResponseOutputTokens { - val json = JsonValue.fromJsonNode(node) - - val bestMatches = - sequenceOf( - tryDeserialize(node, jacksonTypeRef()) - ?.let { MaxResponseOutputTokens(inf = it, _json = json) } - ?.takeIf { it.isValid() }, - tryDeserialize(node, jacksonTypeRef())?.let { - MaxResponseOutputTokens(integer = it, _json = json) - }, - ) - .filterNotNull() - .allMaxBy { it.validity() } - .toList() - return when (bestMatches.size) { - // This can happen if what we're deserializing is completely incompatible with - // all the possible variants (e.g. deserializing from object). - 0 -> MaxResponseOutputTokens(_json = json) - 1 -> bestMatches.single() - // If there's more than one match with the highest validity, then use the first - // completely valid match, or simply the first match if none are completely - // valid. - else -> bestMatches.firstOrNull { it.isValid() } ?: bestMatches.first() - } - } - } - - internal class Serializer : - BaseSerializer(MaxResponseOutputTokens::class) { - - override fun serialize( - value: MaxResponseOutputTokens, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.integer != null -> generator.writeObject(value.integer) - value.inf != null -> generator.writeObject(value.inf) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid MaxResponseOutputTokens") - } - } - } - } - - class Modality @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val TEXT = of("text") - - @JvmField val AUDIO = of("audio") - - @JvmStatic fun of(value: String) = Modality(JsonField.of(value)) - } - - /** An enum containing [Modality]'s known values. */ - enum class Known { - TEXT, - AUDIO, - } - - /** - * An enum containing [Modality]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Modality] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - TEXT, - AUDIO, - /** An enum member indicating that [Modality] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - TEXT -> Value.TEXT - AUDIO -> Value.AUDIO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - TEXT -> Known.TEXT - AUDIO -> Known.AUDIO - else -> throw OpenAIInvalidDataException("Unknown Modality: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Modality = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Modality && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** The Realtime model used for this session. */ - class Model @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val GPT_4O_REALTIME_PREVIEW = of("gpt-4o-realtime-preview") - - @JvmField - val GPT_4O_REALTIME_PREVIEW_2024_10_01 = of("gpt-4o-realtime-preview-2024-10-01") - - @JvmField - val GPT_4O_REALTIME_PREVIEW_2024_12_17 = of("gpt-4o-realtime-preview-2024-12-17") - - @JvmField - val GPT_4O_REALTIME_PREVIEW_2025_06_03 = of("gpt-4o-realtime-preview-2025-06-03") - - @JvmField val GPT_4O_MINI_REALTIME_PREVIEW = of("gpt-4o-mini-realtime-preview") - - @JvmField - val GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 = - of("gpt-4o-mini-realtime-preview-2024-12-17") - - @JvmStatic fun of(value: String) = Model(JsonField.of(value)) - } - - /** An enum containing [Model]'s known values. */ - enum class Known { - GPT_4O_REALTIME_PREVIEW, - GPT_4O_REALTIME_PREVIEW_2024_10_01, - GPT_4O_REALTIME_PREVIEW_2024_12_17, - GPT_4O_REALTIME_PREVIEW_2025_06_03, - GPT_4O_MINI_REALTIME_PREVIEW, - GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17, - } - - /** - * An enum containing [Model]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Model] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - GPT_4O_REALTIME_PREVIEW, - GPT_4O_REALTIME_PREVIEW_2024_10_01, - GPT_4O_REALTIME_PREVIEW_2024_12_17, - GPT_4O_REALTIME_PREVIEW_2025_06_03, - GPT_4O_MINI_REALTIME_PREVIEW, - GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17, - /** An enum member indicating that [Model] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - GPT_4O_REALTIME_PREVIEW -> Value.GPT_4O_REALTIME_PREVIEW - GPT_4O_REALTIME_PREVIEW_2024_10_01 -> Value.GPT_4O_REALTIME_PREVIEW_2024_10_01 - GPT_4O_REALTIME_PREVIEW_2024_12_17 -> Value.GPT_4O_REALTIME_PREVIEW_2024_12_17 - GPT_4O_REALTIME_PREVIEW_2025_06_03 -> Value.GPT_4O_REALTIME_PREVIEW_2025_06_03 - GPT_4O_MINI_REALTIME_PREVIEW -> Value.GPT_4O_MINI_REALTIME_PREVIEW - GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 -> - Value.GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - GPT_4O_REALTIME_PREVIEW -> Known.GPT_4O_REALTIME_PREVIEW - GPT_4O_REALTIME_PREVIEW_2024_10_01 -> Known.GPT_4O_REALTIME_PREVIEW_2024_10_01 - GPT_4O_REALTIME_PREVIEW_2024_12_17 -> Known.GPT_4O_REALTIME_PREVIEW_2024_12_17 - GPT_4O_REALTIME_PREVIEW_2025_06_03 -> Known.GPT_4O_REALTIME_PREVIEW_2025_06_03 - GPT_4O_MINI_REALTIME_PREVIEW -> Known.GPT_4O_MINI_REALTIME_PREVIEW - GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 -> - Known.GPT_4O_MINI_REALTIME_PREVIEW_2024_12_17 - else -> throw OpenAIInvalidDataException("Unknown Model: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Model = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Model && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * output audio is sampled at a rate of 24kHz. - */ - class OutputAudioFormat @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val PCM16 = of("pcm16") - - @JvmField val G711_ULAW = of("g711_ulaw") - - @JvmField val G711_ALAW = of("g711_alaw") - - @JvmStatic fun of(value: String) = OutputAudioFormat(JsonField.of(value)) - } - - /** An enum containing [OutputAudioFormat]'s known values. */ - enum class Known { - PCM16, - G711_ULAW, - G711_ALAW, - } - - /** - * An enum containing [OutputAudioFormat]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [OutputAudioFormat] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - PCM16, - G711_ULAW, - G711_ALAW, - /** - * An enum member indicating that [OutputAudioFormat] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - PCM16 -> Value.PCM16 - G711_ULAW -> Value.G711_ULAW - G711_ALAW -> Value.G711_ALAW - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - PCM16 -> Known.PCM16 - G711_ULAW -> Known.G711_ULAW - G711_ALAW -> Known.G711_ALAW - else -> throw OpenAIInvalidDataException("Unknown OutputAudioFormat: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): OutputAudioFormat = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is OutputAudioFormat && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - class Tool - private constructor( - private val description: JsonField, - private val name: JsonField, - private val parameters: JsonValue, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("description") - @ExcludeMissing - description: JsonField = JsonMissing.of(), - @JsonProperty("name") @ExcludeMissing name: JsonField = JsonMissing.of(), - @JsonProperty("parameters") @ExcludeMissing parameters: JsonValue = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(description, name, parameters, type, mutableMapOf()) - - /** - * The description of the function, including guidance on when and how to call it, and - * guidance about what to tell the user when calling (if anything). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun description(): Optional = description.getOptional("description") - - /** - * The name of the function. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun name(): Optional = name.getOptional("name") - - /** Parameters of the function in JSON Schema. */ - @JsonProperty("parameters") @ExcludeMissing fun _parameters(): JsonValue = parameters - - /** - * The type of the tool, i.e. `function`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [description]. - * - * Unlike [description], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("description") - @ExcludeMissing - fun _description(): JsonField = description - - /** - * Returns the raw JSON value of [name]. - * - * Unlike [name], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("name") @ExcludeMissing fun _name(): JsonField = name - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Tool]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Tool]. */ - class Builder internal constructor() { - - private var description: JsonField = JsonMissing.of() - private var name: JsonField = JsonMissing.of() - private var parameters: JsonValue = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(tool: Tool) = apply { - description = tool.description - name = tool.name - parameters = tool.parameters - type = tool.type - additionalProperties = tool.additionalProperties.toMutableMap() - } - - /** - * The description of the function, including guidance on when and how to call it, and - * guidance about what to tell the user when calling (if anything). - */ - fun description(description: String) = description(JsonField.of(description)) - - /** - * Sets [Builder.description] to an arbitrary JSON value. - * - * You should usually call [Builder.description] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun description(description: JsonField) = apply { - this.description = description - } - - /** The name of the function. */ - fun name(name: String) = name(JsonField.of(name)) - - /** - * Sets [Builder.name] to an arbitrary JSON value. - * - * You should usually call [Builder.name] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun name(name: JsonField) = apply { this.name = name } - - /** Parameters of the function in JSON Schema. */ - fun parameters(parameters: JsonValue) = apply { this.parameters = parameters } - - /** The type of the tool, i.e. `function`. */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Tool]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Tool = - Tool(description, name, parameters, type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): Tool = apply { - if (validated) { - return@apply - } - - description() - name() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (description.asKnown().isPresent) 1 else 0) + - (if (name.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** The type of the tool, i.e. `function`. */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val FUNCTION = of("function") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - FUNCTION - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - FUNCTION, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - FUNCTION -> Value.FUNCTION - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - FUNCTION -> Known.FUNCTION - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Tool && - description == other.description && - name == other.name && - parameters == other.parameters && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(description, name, parameters, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Tool{description=$description, name=$name, parameters=$parameters, type=$type, additionalProperties=$additionalProperties}" - } - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is enabled - * for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, group - * id, and metadata. - */ - @JsonDeserialize(using = Tracing.Deserializer::class) - @JsonSerialize(using = Tracing.Serializer::class) - class Tracing - private constructor( - private val auto: JsonValue? = null, - private val configuration: TracingConfiguration? = null, - private val _json: JsonValue? = null, - ) { - - /** Default tracing mode for the session. */ - fun auto(): Optional = Optional.ofNullable(auto) - - /** Granular configuration for tracing. */ - fun configuration(): Optional = Optional.ofNullable(configuration) - - fun isAuto(): Boolean = auto != null - - fun isConfiguration(): Boolean = configuration != null - - /** Default tracing mode for the session. */ - fun asAuto(): JsonValue = auto.getOrThrow("auto") - - /** Granular configuration for tracing. */ - fun asConfiguration(): TracingConfiguration = configuration.getOrThrow("configuration") - - fun _json(): Optional = Optional.ofNullable(_json) - - fun accept(visitor: Visitor): T = - when { - auto != null -> visitor.visitAuto(auto) - configuration != null -> visitor.visitConfiguration(configuration) - else -> visitor.unknown(_json) - } - - private var validated: Boolean = false - - fun validate(): Tracing = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitAuto(auto: JsonValue) { - auto.let { - if (it != JsonValue.from("auto")) { - throw OpenAIInvalidDataException("'auto' is invalid, received $it") - } - } - } - - override fun visitConfiguration(configuration: TracingConfiguration) { - configuration.validate() - } - } - ) - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - accept( - object : Visitor { - override fun visitAuto(auto: JsonValue) = - auto.let { if (it == JsonValue.from("auto")) 1 else 0 } - - override fun visitConfiguration(configuration: TracingConfiguration) = - configuration.validity() - - override fun unknown(json: JsonValue?) = 0 - } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Tracing && auto == other.auto && configuration == other.configuration - } - - override fun hashCode(): Int = Objects.hash(auto, configuration) - - override fun toString(): String = - when { - auto != null -> "Tracing{auto=$auto}" - configuration != null -> "Tracing{configuration=$configuration}" - _json != null -> "Tracing{_unknown=$_json}" - else -> throw IllegalStateException("Invalid Tracing") - } - - companion object { - - /** Default tracing mode for the session. */ - @JvmStatic fun ofAuto() = Tracing(auto = JsonValue.from("auto")) - - /** Granular configuration for tracing. */ - @JvmStatic - fun ofConfiguration(configuration: TracingConfiguration) = - Tracing(configuration = configuration) - } - - /** - * An interface that defines how to map each variant of [Tracing] to a value of type [T]. - */ - interface Visitor { - - /** Default tracing mode for the session. */ - fun visitAuto(auto: JsonValue): T - - /** Granular configuration for tracing. */ - fun visitConfiguration(configuration: TracingConfiguration): T - - /** - * Maps an unknown variant of [Tracing] to a value of type [T]. - * - * An instance of [Tracing] can contain an unknown variant if it was deserialized from - * data that doesn't match any known variant. For example, if the SDK is on an older - * version than the API, then the API may respond with new variants that the SDK is - * unaware of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown Tracing: $json") - } - } - - internal class Deserializer : BaseDeserializer(Tracing::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): Tracing { - val json = JsonValue.fromJsonNode(node) - - val bestMatches = - sequenceOf( - tryDeserialize(node, jacksonTypeRef()) - ?.let { Tracing(auto = it, _json = json) } - ?.takeIf { it.isValid() }, - tryDeserialize(node, jacksonTypeRef())?.let { - Tracing(configuration = it, _json = json) - }, - ) - .filterNotNull() - .allMaxBy { it.validity() } - .toList() - return when (bestMatches.size) { - // This can happen if what we're deserializing is completely incompatible with - // all the possible variants (e.g. deserializing from array). - 0 -> Tracing(_json = json) - 1 -> bestMatches.single() - // If there's more than one match with the highest validity, then use the first - // completely valid match, or simply the first match if none are completely - // valid. - else -> bestMatches.firstOrNull { it.isValid() } ?: bestMatches.first() - } - } - } - - internal class Serializer : BaseSerializer(Tracing::class) { - - override fun serialize( - value: Tracing, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.auto != null -> generator.writeObject(value.auto) - value.configuration != null -> generator.writeObject(value.configuration) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid Tracing") - } - } - } - - /** Granular configuration for tracing. */ - class TracingConfiguration - private constructor( - private val groupId: JsonField, - private val metadata: JsonValue, - private val workflowName: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("group_id") - @ExcludeMissing - groupId: JsonField = JsonMissing.of(), - @JsonProperty("metadata") @ExcludeMissing metadata: JsonValue = JsonMissing.of(), - @JsonProperty("workflow_name") - @ExcludeMissing - workflowName: JsonField = JsonMissing.of(), - ) : this(groupId, metadata, workflowName, mutableMapOf()) - - /** - * The group id to attach to this trace to enable filtering and grouping in the traces - * dashboard. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun groupId(): Optional = groupId.getOptional("group_id") - - /** - * The arbitrary metadata to attach to this trace to enable filtering in the traces - * dashboard. - */ - @JsonProperty("metadata") @ExcludeMissing fun _metadata(): JsonValue = metadata - - /** - * The name of the workflow to attach to this trace. This is used to name the trace in - * the traces dashboard. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun workflowName(): Optional = workflowName.getOptional("workflow_name") - - /** - * Returns the raw JSON value of [groupId]. - * - * Unlike [groupId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("group_id") @ExcludeMissing fun _groupId(): JsonField = groupId - - /** - * Returns the raw JSON value of [workflowName]. - * - * Unlike [workflowName], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("workflow_name") - @ExcludeMissing - fun _workflowName(): JsonField = workflowName - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [TracingConfiguration]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TracingConfiguration]. */ - class Builder internal constructor() { - - private var groupId: JsonField = JsonMissing.of() - private var metadata: JsonValue = JsonMissing.of() - private var workflowName: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(tracingConfiguration: TracingConfiguration) = apply { - groupId = tracingConfiguration.groupId - metadata = tracingConfiguration.metadata - workflowName = tracingConfiguration.workflowName - additionalProperties = tracingConfiguration.additionalProperties.toMutableMap() - } - - /** - * The group id to attach to this trace to enable filtering and grouping in the - * traces dashboard. - */ - fun groupId(groupId: String) = groupId(JsonField.of(groupId)) - - /** - * Sets [Builder.groupId] to an arbitrary JSON value. - * - * You should usually call [Builder.groupId] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun groupId(groupId: JsonField) = apply { this.groupId = groupId } - - /** - * The arbitrary metadata to attach to this trace to enable filtering in the traces - * dashboard. - */ - fun metadata(metadata: JsonValue) = apply { this.metadata = metadata } - - /** - * The name of the workflow to attach to this trace. This is used to name the trace - * in the traces dashboard. - */ - fun workflowName(workflowName: String) = workflowName(JsonField.of(workflowName)) - - /** - * Sets [Builder.workflowName] to an arbitrary JSON value. - * - * You should usually call [Builder.workflowName] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun workflowName(workflowName: JsonField) = apply { - this.workflowName = workflowName - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TracingConfiguration]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): TracingConfiguration = - TracingConfiguration( - groupId, - metadata, - workflowName, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TracingConfiguration = apply { - if (validated) { - return@apply - } - - groupId() - workflowName() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (groupId.asKnown().isPresent) 1 else 0) + - (if (workflowName.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TracingConfiguration && - groupId == other.groupId && - metadata == other.metadata && - workflowName == other.workflowName && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(groupId, metadata, workflowName, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TracingConfiguration{groupId=$groupId, metadata=$metadata, workflowName=$workflowName, additionalProperties=$additionalProperties}" - } - } - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to `null` - * to turn off, in which case the client must manually trigger model response. Server VAD means - * that the model will detect the start and end of speech based on audio volume and respond at - * the end of user speech. Semantic VAD is more advanced and uses a turn detection model (in - * conjunction with VAD) to semantically estimate whether the user has finished speaking, then - * dynamically sets a timeout based on this probability. For example, if user audio trails off - * with "uhhm", the model will score a low probability of turn end and wait longer for the user - * to continue speaking. This can be useful for more natural conversations, but may have a - * higher latency. - */ - class TurnDetection - private constructor( - private val createResponse: JsonField, - private val eagerness: JsonField, - private val interruptResponse: JsonField, - private val prefixPaddingMs: JsonField, - private val silenceDurationMs: JsonField, - private val threshold: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("create_response") - @ExcludeMissing - createResponse: JsonField = JsonMissing.of(), - @JsonProperty("eagerness") - @ExcludeMissing - eagerness: JsonField = JsonMissing.of(), - @JsonProperty("interrupt_response") - @ExcludeMissing - interruptResponse: JsonField = JsonMissing.of(), - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - prefixPaddingMs: JsonField = JsonMissing.of(), - @JsonProperty("silence_duration_ms") - @ExcludeMissing - silenceDurationMs: JsonField = JsonMissing.of(), - @JsonProperty("threshold") - @ExcludeMissing - threshold: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - mutableMapOf(), - ) - - /** - * Whether or not to automatically generate a response when a VAD stop event occurs. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun createResponse(): Optional = createResponse.getOptional("create_response") - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` will wait - * longer for the user to continue speaking, `high` will respond more quickly. `auto` is the - * default and is equivalent to `medium`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eagerness(): Optional = eagerness.getOptional("eagerness") - - /** - * Whether or not to automatically interrupt any ongoing response with output to the default - * conversation (i.e. `conversation` of `auto`) when a VAD start event occurs. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun interruptResponse(): Optional = - interruptResponse.getOptional("interrupt_response") - - /** - * Used only for `server_vad` mode. Amount of audio to include before the VAD detected - * speech (in milliseconds). Defaults to 300ms. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun prefixPaddingMs(): Optional = prefixPaddingMs.getOptional("prefix_padding_ms") - - /** - * Used only for `server_vad` mode. Duration of silence to detect speech stop (in - * milliseconds). Defaults to 500ms. With shorter values the model will respond more - * quickly, but may jump in on short pauses from the user. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun silenceDurationMs(): Optional = - silenceDurationMs.getOptional("silence_duration_ms") - - /** - * Used only for `server_vad` mode. Activation threshold for VAD (0.0 to 1.0), this defaults - * to 0.5. A higher threshold will require louder audio to activate the model, and thus - * might perform better in noisy environments. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun threshold(): Optional = threshold.getOptional("threshold") - - /** - * Type of turn detection. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [createResponse]. - * - * Unlike [createResponse], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("create_response") - @ExcludeMissing - fun _createResponse(): JsonField = createResponse - - /** - * Returns the raw JSON value of [eagerness]. - * - * Unlike [eagerness], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("eagerness") - @ExcludeMissing - fun _eagerness(): JsonField = eagerness - - /** - * Returns the raw JSON value of [interruptResponse]. - * - * Unlike [interruptResponse], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("interrupt_response") - @ExcludeMissing - fun _interruptResponse(): JsonField = interruptResponse - - /** - * Returns the raw JSON value of [prefixPaddingMs]. - * - * Unlike [prefixPaddingMs], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - fun _prefixPaddingMs(): JsonField = prefixPaddingMs - - /** - * Returns the raw JSON value of [silenceDurationMs]. - * - * Unlike [silenceDurationMs], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("silence_duration_ms") - @ExcludeMissing - fun _silenceDurationMs(): JsonField = silenceDurationMs - - /** - * Returns the raw JSON value of [threshold]. - * - * Unlike [threshold], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("threshold") @ExcludeMissing fun _threshold(): JsonField = threshold - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [TurnDetection]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TurnDetection]. */ - class Builder internal constructor() { - - private var createResponse: JsonField = JsonMissing.of() - private var eagerness: JsonField = JsonMissing.of() - private var interruptResponse: JsonField = JsonMissing.of() - private var prefixPaddingMs: JsonField = JsonMissing.of() - private var silenceDurationMs: JsonField = JsonMissing.of() - private var threshold: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(turnDetection: TurnDetection) = apply { - createResponse = turnDetection.createResponse - eagerness = turnDetection.eagerness - interruptResponse = turnDetection.interruptResponse - prefixPaddingMs = turnDetection.prefixPaddingMs - silenceDurationMs = turnDetection.silenceDurationMs - threshold = turnDetection.threshold - type = turnDetection.type - additionalProperties = turnDetection.additionalProperties.toMutableMap() - } - - /** Whether or not to automatically generate a response when a VAD stop event occurs. */ - fun createResponse(createResponse: Boolean) = - createResponse(JsonField.of(createResponse)) - - /** - * Sets [Builder.createResponse] to an arbitrary JSON value. - * - * You should usually call [Builder.createResponse] with a well-typed [Boolean] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun createResponse(createResponse: JsonField) = apply { - this.createResponse = createResponse - } - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` will - * wait longer for the user to continue speaking, `high` will respond more quickly. - * `auto` is the default and is equivalent to `medium`. - */ - fun eagerness(eagerness: Eagerness) = eagerness(JsonField.of(eagerness)) - - /** - * Sets [Builder.eagerness] to an arbitrary JSON value. - * - * You should usually call [Builder.eagerness] with a well-typed [Eagerness] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun eagerness(eagerness: JsonField) = apply { this.eagerness = eagerness } - - /** - * Whether or not to automatically interrupt any ongoing response with output to the - * default conversation (i.e. `conversation` of `auto`) when a VAD start event occurs. - */ - fun interruptResponse(interruptResponse: Boolean) = - interruptResponse(JsonField.of(interruptResponse)) - - /** - * Sets [Builder.interruptResponse] to an arbitrary JSON value. - * - * You should usually call [Builder.interruptResponse] with a well-typed [Boolean] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun interruptResponse(interruptResponse: JsonField) = apply { - this.interruptResponse = interruptResponse - } - - /** - * Used only for `server_vad` mode. Amount of audio to include before the VAD detected - * speech (in milliseconds). Defaults to 300ms. - */ - fun prefixPaddingMs(prefixPaddingMs: Long) = - prefixPaddingMs(JsonField.of(prefixPaddingMs)) - - /** - * Sets [Builder.prefixPaddingMs] to an arbitrary JSON value. - * - * You should usually call [Builder.prefixPaddingMs] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun prefixPaddingMs(prefixPaddingMs: JsonField) = apply { - this.prefixPaddingMs = prefixPaddingMs - } - - /** - * Used only for `server_vad` mode. Duration of silence to detect speech stop (in - * milliseconds). Defaults to 500ms. With shorter values the model will respond more - * quickly, but may jump in on short pauses from the user. - */ - fun silenceDurationMs(silenceDurationMs: Long) = - silenceDurationMs(JsonField.of(silenceDurationMs)) - - /** - * Sets [Builder.silenceDurationMs] to an arbitrary JSON value. - * - * You should usually call [Builder.silenceDurationMs] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun silenceDurationMs(silenceDurationMs: JsonField) = apply { - this.silenceDurationMs = silenceDurationMs - } - - /** - * Used only for `server_vad` mode. Activation threshold for VAD (0.0 to 1.0), this - * defaults to 0.5. A higher threshold will require louder audio to activate the model, - * and thus might perform better in noisy environments. - */ - fun threshold(threshold: Double) = threshold(JsonField.of(threshold)) - - /** - * Sets [Builder.threshold] to an arbitrary JSON value. - * - * You should usually call [Builder.threshold] with a well-typed [Double] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun threshold(threshold: JsonField) = apply { this.threshold = threshold } - - /** Type of turn detection. */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TurnDetection]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): TurnDetection = - TurnDetection( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TurnDetection = apply { - if (validated) { - return@apply - } - - createResponse() - eagerness().ifPresent { it.validate() } - interruptResponse() - prefixPaddingMs() - silenceDurationMs() - threshold() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (createResponse.asKnown().isPresent) 1 else 0) + - (eagerness.asKnown().getOrNull()?.validity() ?: 0) + - (if (interruptResponse.asKnown().isPresent) 1 else 0) + - (if (prefixPaddingMs.asKnown().isPresent) 1 else 0) + - (if (silenceDurationMs.asKnown().isPresent) 1 else 0) + - (if (threshold.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` will wait - * longer for the user to continue speaking, `high` will respond more quickly. `auto` is the - * default and is equivalent to `medium`. - */ - class Eagerness @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val LOW = of("low") - - @JvmField val MEDIUM = of("medium") - - @JvmField val HIGH = of("high") - - @JvmField val AUTO = of("auto") - - @JvmStatic fun of(value: String) = Eagerness(JsonField.of(value)) - } - - /** An enum containing [Eagerness]'s known values. */ - enum class Known { - LOW, - MEDIUM, - HIGH, - AUTO, - } - - /** - * An enum containing [Eagerness]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Eagerness] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - LOW, - MEDIUM, - HIGH, - AUTO, - /** - * An enum member indicating that [Eagerness] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - LOW -> Value.LOW - MEDIUM -> Value.MEDIUM - HIGH -> Value.HIGH - AUTO -> Value.AUTO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - LOW -> Known.LOW - MEDIUM -> Known.MEDIUM - HIGH -> Known.HIGH - AUTO -> Known.AUTO - else -> throw OpenAIInvalidDataException("Unknown Eagerness: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Eagerness = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Eagerness && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** Type of turn detection. */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val SERVER_VAD = of("server_vad") - - @JvmField val SEMANTIC_VAD = of("semantic_vad") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - SERVER_VAD, - SEMANTIC_VAD, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - SERVER_VAD, - SEMANTIC_VAD, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - SERVER_VAD -> Value.SERVER_VAD - SEMANTIC_VAD -> Value.SEMANTIC_VAD - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - SERVER_VAD -> Known.SERVER_VAD - SEMANTIC_VAD -> Known.SEMANTIC_VAD - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TurnDetection && - createResponse == other.createResponse && - eagerness == other.eagerness && - interruptResponse == other.interruptResponse && - prefixPaddingMs == other.prefixPaddingMs && - silenceDurationMs == other.silenceDurationMs && - threshold == other.threshold && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TurnDetection{createResponse=$createResponse, eagerness=$eagerness, interruptResponse=$interruptResponse, prefixPaddingMs=$prefixPaddingMs, silenceDurationMs=$silenceDurationMs, threshold=$threshold, type=$type, additionalProperties=$additionalProperties}" - } - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - */ - class Voice @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val ALLOY = of("alloy") - - @JvmField val ASH = of("ash") - - @JvmField val BALLAD = of("ballad") - - @JvmField val CORAL = of("coral") - - @JvmField val ECHO = of("echo") - - @JvmField val SAGE = of("sage") - - @JvmField val SHIMMER = of("shimmer") - - @JvmField val VERSE = of("verse") - - @JvmStatic fun of(value: String) = Voice(JsonField.of(value)) - } - - /** An enum containing [Voice]'s known values. */ - enum class Known { - ALLOY, - ASH, - BALLAD, - CORAL, - ECHO, - SAGE, - SHIMMER, - VERSE, - } - - /** - * An enum containing [Voice]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Voice] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - ALLOY, - ASH, - BALLAD, - CORAL, - ECHO, - SAGE, - SHIMMER, - VERSE, - /** An enum member indicating that [Voice] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - ALLOY -> Value.ALLOY - ASH -> Value.ASH - BALLAD -> Value.BALLAD - CORAL -> Value.CORAL - ECHO -> Value.ECHO - SAGE -> Value.SAGE - SHIMMER -> Value.SHIMMER - VERSE -> Value.VERSE - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - ALLOY -> Known.ALLOY - ASH -> Known.ASH - BALLAD -> Known.BALLAD - CORAL -> Known.CORAL - ECHO -> Known.ECHO - SAGE -> Known.SAGE - SHIMMER -> Known.SHIMMER - VERSE -> Known.VERSE - else -> throw OpenAIInvalidDataException("Unknown Voice: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Voice = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Voice && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is SessionCreateParams && - body == other.body && - additionalHeaders == other.additionalHeaders && - additionalQueryParams == other.additionalQueryParams - } - - override fun hashCode(): Int = Objects.hash(body, additionalHeaders, additionalQueryParams) - - override fun toString() = - "SessionCreateParams{body=$body, additionalHeaders=$additionalHeaders, additionalQueryParams=$additionalQueryParams}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateResponse.kt deleted file mode 100644 index d59033233..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateResponse.kt +++ /dev/null @@ -1,2760 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime.sessions - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.ObjectCodec -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.BaseDeserializer -import com.openai.core.BaseSerializer -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.allMaxBy -import com.openai.core.checkKnown -import com.openai.core.checkRequired -import com.openai.core.getOrThrow -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * A new Realtime session configuration, with an ephemeral key. Default TTL for keys is one minute. - */ -class SessionCreateResponse -private constructor( - private val clientSecret: JsonField, - private val inputAudioFormat: JsonField, - private val inputAudioTranscription: JsonField, - private val instructions: JsonField, - private val maxResponseOutputTokens: JsonField, - private val modalities: JsonField>, - private val outputAudioFormat: JsonField, - private val speed: JsonField, - private val temperature: JsonField, - private val toolChoice: JsonField, - private val tools: JsonField>, - private val tracing: JsonField, - private val turnDetection: JsonField, - private val voice: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("client_secret") - @ExcludeMissing - clientSecret: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_format") - @ExcludeMissing - inputAudioFormat: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_transcription") - @ExcludeMissing - inputAudioTranscription: JsonField = JsonMissing.of(), - @JsonProperty("instructions") - @ExcludeMissing - instructions: JsonField = JsonMissing.of(), - @JsonProperty("max_response_output_tokens") - @ExcludeMissing - maxResponseOutputTokens: JsonField = JsonMissing.of(), - @JsonProperty("modalities") - @ExcludeMissing - modalities: JsonField> = JsonMissing.of(), - @JsonProperty("output_audio_format") - @ExcludeMissing - outputAudioFormat: JsonField = JsonMissing.of(), - @JsonProperty("speed") @ExcludeMissing speed: JsonField = JsonMissing.of(), - @JsonProperty("temperature") - @ExcludeMissing - temperature: JsonField = JsonMissing.of(), - @JsonProperty("tool_choice") - @ExcludeMissing - toolChoice: JsonField = JsonMissing.of(), - @JsonProperty("tools") @ExcludeMissing tools: JsonField> = JsonMissing.of(), - @JsonProperty("tracing") @ExcludeMissing tracing: JsonField = JsonMissing.of(), - @JsonProperty("turn_detection") - @ExcludeMissing - turnDetection: JsonField = JsonMissing.of(), - @JsonProperty("voice") @ExcludeMissing voice: JsonField = JsonMissing.of(), - ) : this( - clientSecret, - inputAudioFormat, - inputAudioTranscription, - instructions, - maxResponseOutputTokens, - modalities, - outputAudioFormat, - speed, - temperature, - toolChoice, - tools, - tracing, - turnDetection, - voice, - mutableMapOf(), - ) - - /** - * Ephemeral key returned by the API. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun clientSecret(): ClientSecret = clientSecret.getRequired("client_secret") - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioFormat(): Optional = inputAudioFormat.getOptional("input_audio_format") - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` to turn - * off once on. Input audio transcription is not native to the model, since the model consumes - * audio directly. Transcription runs asynchronously and should be treated as rough guidance - * rather than the representation understood by the model. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioTranscription(): Optional = - inputAudioTranscription.getOptional("input_audio_transcription") - - /** - * The default system instructions (i.e. system message) prepended to model calls. This field - * allows the client to guide the model on desired responses. The model can be instructed on - * response content and format, (e.g. "be extremely succinct", "act friendly", "here are - * examples of good responses") and on audio behavior (e.g. "talk quickly", "inject emotion into - * your voice", "laugh frequently"). The instructions are not guaranteed to be followed by the - * model, but they provide guidance to the model on the desired behavior. - * - * Note that the server sets default instructions which will be used if this field is not set - * and are visible in the `session.created` event at the start of the session. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun instructions(): Optional = instructions.getOptional("instructions") - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun maxResponseOutputTokens(): Optional = - maxResponseOutputTokens.getOptional("max_response_output_tokens") - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun modalities(): Optional> = modalities.getOptional("modalities") - - /** - * The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun outputAudioFormat(): Optional = outputAudioFormat.getOptional("output_audio_format") - - /** - * The speed of the model's spoken response. 1.0 is the default speed. 0.25 is the minimum - * speed. 1.5 is the maximum speed. This value can only be changed in between model turns, not - * while a response is in progress. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun speed(): Optional = speed.getOptional("speed") - - /** - * Sampling temperature for the model, limited to [0.6, 1.2]. Defaults to 0.8. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun temperature(): Optional = temperature.getOptional("temperature") - - /** - * How the model chooses tools. Options are `auto`, `none`, `required`, or specify a function. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun toolChoice(): Optional = toolChoice.getOptional("tool_choice") - - /** - * Tools (functions) available to the model. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun tools(): Optional> = tools.getOptional("tools") - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is enabled - * for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, group - * id, and metadata. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun tracing(): Optional = tracing.getOptional("tracing") - - /** - * Configuration for turn detection. Can be set to `null` to turn off. Server VAD means that the - * model will detect the start and end of speech based on audio volume and respond at the end of - * user speech. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun turnDetection(): Optional = turnDetection.getOptional("turn_detection") - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun voice(): Optional = voice.getOptional("voice") - - /** - * Returns the raw JSON value of [clientSecret]. - * - * Unlike [clientSecret], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("client_secret") - @ExcludeMissing - fun _clientSecret(): JsonField = clientSecret - - /** - * Returns the raw JSON value of [inputAudioFormat]. - * - * Unlike [inputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("input_audio_format") - @ExcludeMissing - fun _inputAudioFormat(): JsonField = inputAudioFormat - - /** - * Returns the raw JSON value of [inputAudioTranscription]. - * - * Unlike [inputAudioTranscription], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("input_audio_transcription") - @ExcludeMissing - fun _inputAudioTranscription(): JsonField = inputAudioTranscription - - /** - * Returns the raw JSON value of [instructions]. - * - * Unlike [instructions], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("instructions") - @ExcludeMissing - fun _instructions(): JsonField = instructions - - /** - * Returns the raw JSON value of [maxResponseOutputTokens]. - * - * Unlike [maxResponseOutputTokens], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("max_response_output_tokens") - @ExcludeMissing - fun _maxResponseOutputTokens(): JsonField = maxResponseOutputTokens - - /** - * Returns the raw JSON value of [modalities]. - * - * Unlike [modalities], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("modalities") - @ExcludeMissing - fun _modalities(): JsonField> = modalities - - /** - * Returns the raw JSON value of [outputAudioFormat]. - * - * Unlike [outputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("output_audio_format") - @ExcludeMissing - fun _outputAudioFormat(): JsonField = outputAudioFormat - - /** - * Returns the raw JSON value of [speed]. - * - * Unlike [speed], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("speed") @ExcludeMissing fun _speed(): JsonField = speed - - /** - * Returns the raw JSON value of [temperature]. - * - * Unlike [temperature], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("temperature") @ExcludeMissing fun _temperature(): JsonField = temperature - - /** - * Returns the raw JSON value of [toolChoice]. - * - * Unlike [toolChoice], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tool_choice") @ExcludeMissing fun _toolChoice(): JsonField = toolChoice - - /** - * Returns the raw JSON value of [tools]. - * - * Unlike [tools], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tools") @ExcludeMissing fun _tools(): JsonField> = tools - - /** - * Returns the raw JSON value of [tracing]. - * - * Unlike [tracing], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("tracing") @ExcludeMissing fun _tracing(): JsonField = tracing - - /** - * Returns the raw JSON value of [turnDetection]. - * - * Unlike [turnDetection], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("turn_detection") - @ExcludeMissing - fun _turnDetection(): JsonField = turnDetection - - /** - * Returns the raw JSON value of [voice]. - * - * Unlike [voice], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("voice") @ExcludeMissing fun _voice(): JsonField = voice - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [SessionCreateResponse]. - * - * The following fields are required: - * ```java - * .clientSecret() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [SessionCreateResponse]. */ - class Builder internal constructor() { - - private var clientSecret: JsonField? = null - private var inputAudioFormat: JsonField = JsonMissing.of() - private var inputAudioTranscription: JsonField = JsonMissing.of() - private var instructions: JsonField = JsonMissing.of() - private var maxResponseOutputTokens: JsonField = JsonMissing.of() - private var modalities: JsonField>? = null - private var outputAudioFormat: JsonField = JsonMissing.of() - private var speed: JsonField = JsonMissing.of() - private var temperature: JsonField = JsonMissing.of() - private var toolChoice: JsonField = JsonMissing.of() - private var tools: JsonField>? = null - private var tracing: JsonField = JsonMissing.of() - private var turnDetection: JsonField = JsonMissing.of() - private var voice: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(sessionCreateResponse: SessionCreateResponse) = apply { - clientSecret = sessionCreateResponse.clientSecret - inputAudioFormat = sessionCreateResponse.inputAudioFormat - inputAudioTranscription = sessionCreateResponse.inputAudioTranscription - instructions = sessionCreateResponse.instructions - maxResponseOutputTokens = sessionCreateResponse.maxResponseOutputTokens - modalities = sessionCreateResponse.modalities.map { it.toMutableList() } - outputAudioFormat = sessionCreateResponse.outputAudioFormat - speed = sessionCreateResponse.speed - temperature = sessionCreateResponse.temperature - toolChoice = sessionCreateResponse.toolChoice - tools = sessionCreateResponse.tools.map { it.toMutableList() } - tracing = sessionCreateResponse.tracing - turnDetection = sessionCreateResponse.turnDetection - voice = sessionCreateResponse.voice - additionalProperties = sessionCreateResponse.additionalProperties.toMutableMap() - } - - /** Ephemeral key returned by the API. */ - fun clientSecret(clientSecret: ClientSecret) = clientSecret(JsonField.of(clientSecret)) - - /** - * Sets [Builder.clientSecret] to an arbitrary JSON value. - * - * You should usually call [Builder.clientSecret] with a well-typed [ClientSecret] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun clientSecret(clientSecret: JsonField) = apply { - this.clientSecret = clientSecret - } - - /** The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. */ - fun inputAudioFormat(inputAudioFormat: String) = - inputAudioFormat(JsonField.of(inputAudioFormat)) - - /** - * Sets [Builder.inputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioFormat] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun inputAudioFormat(inputAudioFormat: JsonField) = apply { - this.inputAudioFormat = inputAudioFormat - } - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` to - * turn off once on. Input audio transcription is not native to the model, since the model - * consumes audio directly. Transcription runs asynchronously and should be treated as rough - * guidance rather than the representation understood by the model. - */ - fun inputAudioTranscription(inputAudioTranscription: InputAudioTranscription) = - inputAudioTranscription(JsonField.of(inputAudioTranscription)) - - /** - * Sets [Builder.inputAudioTranscription] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioTranscription] with a well-typed - * [InputAudioTranscription] value instead. This method is primarily for setting the field - * to an undocumented or not yet supported value. - */ - fun inputAudioTranscription(inputAudioTranscription: JsonField) = - apply { - this.inputAudioTranscription = inputAudioTranscription - } - - /** - * The default system instructions (i.e. system message) prepended to model calls. This - * field allows the client to guide the model on desired responses. The model can be - * instructed on response content and format, (e.g. "be extremely succinct", "act friendly", - * "here are examples of good responses") and on audio behavior (e.g. "talk quickly", - * "inject emotion into your voice", "laugh frequently"). The instructions are not - * guaranteed to be followed by the model, but they provide guidance to the model on the - * desired behavior. - * - * Note that the server sets default instructions which will be used if this field is not - * set and are visible in the `session.created` event at the start of the session. - */ - fun instructions(instructions: String) = instructions(JsonField.of(instructions)) - - /** - * Sets [Builder.instructions] to an arbitrary JSON value. - * - * You should usually call [Builder.instructions] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun instructions(instructions: JsonField) = apply { - this.instructions = instructions - } - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - */ - fun maxResponseOutputTokens(maxResponseOutputTokens: MaxResponseOutputTokens) = - maxResponseOutputTokens(JsonField.of(maxResponseOutputTokens)) - - /** - * Sets [Builder.maxResponseOutputTokens] to an arbitrary JSON value. - * - * You should usually call [Builder.maxResponseOutputTokens] with a well-typed - * [MaxResponseOutputTokens] value instead. This method is primarily for setting the field - * to an undocumented or not yet supported value. - */ - fun maxResponseOutputTokens(maxResponseOutputTokens: JsonField) = - apply { - this.maxResponseOutputTokens = maxResponseOutputTokens - } - - /** - * Alias for calling [maxResponseOutputTokens] with - * `MaxResponseOutputTokens.ofInteger(integer)`. - */ - fun maxResponseOutputTokens(integer: Long) = - maxResponseOutputTokens(MaxResponseOutputTokens.ofInteger(integer)) - - /** Alias for calling [maxResponseOutputTokens] with `MaxResponseOutputTokens.ofInf()`. */ - fun maxResponseOutputTokensInf() = maxResponseOutputTokens(MaxResponseOutputTokens.ofInf()) - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - */ - fun modalities(modalities: List) = modalities(JsonField.of(modalities)) - - /** - * Sets [Builder.modalities] to an arbitrary JSON value. - * - * You should usually call [Builder.modalities] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun modalities(modalities: JsonField>) = apply { - this.modalities = modalities.map { it.toMutableList() } - } - - /** - * Adds a single [Modality] to [modalities]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addModality(modality: Modality) = apply { - modalities = - (modalities ?: JsonField.of(mutableListOf())).also { - checkKnown("modalities", it).add(modality) - } - } - - /** The format of output audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. */ - fun outputAudioFormat(outputAudioFormat: String) = - outputAudioFormat(JsonField.of(outputAudioFormat)) - - /** - * Sets [Builder.outputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.outputAudioFormat] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun outputAudioFormat(outputAudioFormat: JsonField) = apply { - this.outputAudioFormat = outputAudioFormat - } - - /** - * The speed of the model's spoken response. 1.0 is the default speed. 0.25 is the minimum - * speed. 1.5 is the maximum speed. This value can only be changed in between model turns, - * not while a response is in progress. - */ - fun speed(speed: Double) = speed(JsonField.of(speed)) - - /** - * Sets [Builder.speed] to an arbitrary JSON value. - * - * You should usually call [Builder.speed] with a well-typed [Double] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun speed(speed: JsonField) = apply { this.speed = speed } - - /** Sampling temperature for the model, limited to [0.6, 1.2]. Defaults to 0.8. */ - fun temperature(temperature: Double) = temperature(JsonField.of(temperature)) - - /** - * Sets [Builder.temperature] to an arbitrary JSON value. - * - * You should usually call [Builder.temperature] with a well-typed [Double] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun temperature(temperature: JsonField) = apply { this.temperature = temperature } - - /** - * How the model chooses tools. Options are `auto`, `none`, `required`, or specify a - * function. - */ - fun toolChoice(toolChoice: String) = toolChoice(JsonField.of(toolChoice)) - - /** - * Sets [Builder.toolChoice] to an arbitrary JSON value. - * - * You should usually call [Builder.toolChoice] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun toolChoice(toolChoice: JsonField) = apply { this.toolChoice = toolChoice } - - /** Tools (functions) available to the model. */ - fun tools(tools: List) = tools(JsonField.of(tools)) - - /** - * Sets [Builder.tools] to an arbitrary JSON value. - * - * You should usually call [Builder.tools] with a well-typed `List` value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun tools(tools: JsonField>) = apply { - this.tools = tools.map { it.toMutableList() } - } - - /** - * Adds a single [Tool] to [tools]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addTool(tool: Tool) = apply { - tools = - (tools ?: JsonField.of(mutableListOf())).also { checkKnown("tools", it).add(tool) } - } - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is - * enabled for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, - * group id, and metadata. - */ - fun tracing(tracing: Tracing) = tracing(JsonField.of(tracing)) - - /** - * Sets [Builder.tracing] to an arbitrary JSON value. - * - * You should usually call [Builder.tracing] with a well-typed [Tracing] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun tracing(tracing: JsonField) = apply { this.tracing = tracing } - - /** Alias for calling [tracing] with `Tracing.ofAuto()`. */ - fun tracingAuto() = tracing(Tracing.ofAuto()) - - /** Alias for calling [tracing] with `Tracing.ofConfiguration(configuration)`. */ - fun tracing(configuration: Tracing.TracingConfiguration) = - tracing(Tracing.ofConfiguration(configuration)) - - /** - * Configuration for turn detection. Can be set to `null` to turn off. Server VAD means that - * the model will detect the start and end of speech based on audio volume and respond at - * the end of user speech. - */ - fun turnDetection(turnDetection: TurnDetection) = turnDetection(JsonField.of(turnDetection)) - - /** - * Sets [Builder.turnDetection] to an arbitrary JSON value. - * - * You should usually call [Builder.turnDetection] with a well-typed [TurnDetection] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun turnDetection(turnDetection: JsonField) = apply { - this.turnDetection = turnDetection - } - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - */ - fun voice(voice: Voice) = voice(JsonField.of(voice)) - - /** - * Sets [Builder.voice] to an arbitrary JSON value. - * - * You should usually call [Builder.voice] with a well-typed [Voice] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported value. - */ - fun voice(voice: JsonField) = apply { this.voice = voice } - - /** - * Sets [voice] to an arbitrary [String]. - * - * You should usually call [voice] with a well-typed [Voice] constant instead. This method - * is primarily for setting the field to an undocumented or not yet supported value. - */ - fun voice(value: String) = voice(Voice.of(value)) - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [SessionCreateResponse]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .clientSecret() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): SessionCreateResponse = - SessionCreateResponse( - checkRequired("clientSecret", clientSecret), - inputAudioFormat, - inputAudioTranscription, - instructions, - maxResponseOutputTokens, - (modalities ?: JsonMissing.of()).map { it.toImmutable() }, - outputAudioFormat, - speed, - temperature, - toolChoice, - (tools ?: JsonMissing.of()).map { it.toImmutable() }, - tracing, - turnDetection, - voice, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): SessionCreateResponse = apply { - if (validated) { - return@apply - } - - clientSecret().validate() - inputAudioFormat() - inputAudioTranscription().ifPresent { it.validate() } - instructions() - maxResponseOutputTokens().ifPresent { it.validate() } - modalities().ifPresent { it.forEach { it.validate() } } - outputAudioFormat() - speed() - temperature() - toolChoice() - tools().ifPresent { it.forEach { it.validate() } } - tracing().ifPresent { it.validate() } - turnDetection().ifPresent { it.validate() } - voice() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (clientSecret.asKnown().getOrNull()?.validity() ?: 0) + - (if (inputAudioFormat.asKnown().isPresent) 1 else 0) + - (inputAudioTranscription.asKnown().getOrNull()?.validity() ?: 0) + - (if (instructions.asKnown().isPresent) 1 else 0) + - (maxResponseOutputTokens.asKnown().getOrNull()?.validity() ?: 0) + - (modalities.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (if (outputAudioFormat.asKnown().isPresent) 1 else 0) + - (if (speed.asKnown().isPresent) 1 else 0) + - (if (temperature.asKnown().isPresent) 1 else 0) + - (if (toolChoice.asKnown().isPresent) 1 else 0) + - (tools.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (tracing.asKnown().getOrNull()?.validity() ?: 0) + - (turnDetection.asKnown().getOrNull()?.validity() ?: 0) + - (if (voice.asKnown().isPresent) 1 else 0) - - /** Ephemeral key returned by the API. */ - class ClientSecret - private constructor( - private val expiresAt: JsonField, - private val value: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("expires_at") - @ExcludeMissing - expiresAt: JsonField = JsonMissing.of(), - @JsonProperty("value") @ExcludeMissing value: JsonField = JsonMissing.of(), - ) : this(expiresAt, value, mutableMapOf()) - - /** - * Timestamp for when the token expires. Currently, all tokens expire after one minute. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun expiresAt(): Long = expiresAt.getRequired("expires_at") - - /** - * Ephemeral key usable in client environments to authenticate connections to the Realtime - * API. Use this in client-side environments rather than a standard API token, which should - * only be used server-side. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun value(): String = value.getRequired("value") - - /** - * Returns the raw JSON value of [expiresAt]. - * - * Unlike [expiresAt], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("expires_at") @ExcludeMissing fun _expiresAt(): JsonField = expiresAt - - /** - * Returns the raw JSON value of [value]. - * - * Unlike [value], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("value") @ExcludeMissing fun _value(): JsonField = value - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ClientSecret]. - * - * The following fields are required: - * ```java - * .expiresAt() - * .value() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ClientSecret]. */ - class Builder internal constructor() { - - private var expiresAt: JsonField? = null - private var value: JsonField? = null - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(clientSecret: ClientSecret) = apply { - expiresAt = clientSecret.expiresAt - value = clientSecret.value - additionalProperties = clientSecret.additionalProperties.toMutableMap() - } - - /** - * Timestamp for when the token expires. Currently, all tokens expire after one minute. - */ - fun expiresAt(expiresAt: Long) = expiresAt(JsonField.of(expiresAt)) - - /** - * Sets [Builder.expiresAt] to an arbitrary JSON value. - * - * You should usually call [Builder.expiresAt] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun expiresAt(expiresAt: JsonField) = apply { this.expiresAt = expiresAt } - - /** - * Ephemeral key usable in client environments to authenticate connections to the - * Realtime API. Use this in client-side environments rather than a standard API token, - * which should only be used server-side. - */ - fun value(value: String) = value(JsonField.of(value)) - - /** - * Sets [Builder.value] to an arbitrary JSON value. - * - * You should usually call [Builder.value] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun value(value: JsonField) = apply { this.value = value } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ClientSecret]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .expiresAt() - * .value() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ClientSecret = - ClientSecret( - checkRequired("expiresAt", expiresAt), - checkRequired("value", value), - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ClientSecret = apply { - if (validated) { - return@apply - } - - expiresAt() - value() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (expiresAt.asKnown().isPresent) 1 else 0) + - (if (value.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ClientSecret && - expiresAt == other.expiresAt && - value == other.value && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(expiresAt, value, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ClientSecret{expiresAt=$expiresAt, value=$value, additionalProperties=$additionalProperties}" - } - - /** - * Configuration for input audio transcription, defaults to off and can be set to `null` to turn - * off once on. Input audio transcription is not native to the model, since the model consumes - * audio directly. Transcription runs asynchronously and should be treated as rough guidance - * rather than the representation understood by the model. - */ - class InputAudioTranscription - private constructor( - private val model: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("model") @ExcludeMissing model: JsonField = JsonMissing.of() - ) : this(model, mutableMapOf()) - - /** - * The model to use for transcription. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun model(): Optional = model.getOptional("model") - - /** - * Returns the raw JSON value of [model]. - * - * Unlike [model], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("model") @ExcludeMissing fun _model(): JsonField = model - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [InputAudioTranscription]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioTranscription]. */ - class Builder internal constructor() { - - private var model: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioTranscription: InputAudioTranscription) = apply { - model = inputAudioTranscription.model - additionalProperties = inputAudioTranscription.additionalProperties.toMutableMap() - } - - /** The model to use for transcription. */ - fun model(model: String) = model(JsonField.of(model)) - - /** - * Sets [Builder.model] to an arbitrary JSON value. - * - * You should usually call [Builder.model] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun model(model: JsonField) = apply { this.model = model } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioTranscription]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioTranscription = - InputAudioTranscription(model, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): InputAudioTranscription = apply { - if (validated) { - return@apply - } - - model() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = (if (model.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioTranscription && - model == other.model && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(model, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioTranscription{model=$model, additionalProperties=$additionalProperties}" - } - - /** - * Maximum number of output tokens for a single assistant response, inclusive of tool calls. - * Provide an integer between 1 and 4096 to limit output tokens, or `inf` for the maximum - * available tokens for a given model. Defaults to `inf`. - */ - @JsonDeserialize(using = MaxResponseOutputTokens.Deserializer::class) - @JsonSerialize(using = MaxResponseOutputTokens.Serializer::class) - class MaxResponseOutputTokens - private constructor( - private val integer: Long? = null, - private val inf: JsonValue? = null, - private val _json: JsonValue? = null, - ) { - - fun integer(): Optional = Optional.ofNullable(integer) - - fun inf(): Optional = Optional.ofNullable(inf) - - fun isInteger(): Boolean = integer != null - - fun isInf(): Boolean = inf != null - - fun asInteger(): Long = integer.getOrThrow("integer") - - fun asInf(): JsonValue = inf.getOrThrow("inf") - - fun _json(): Optional = Optional.ofNullable(_json) - - fun accept(visitor: Visitor): T = - when { - integer != null -> visitor.visitInteger(integer) - inf != null -> visitor.visitInf(inf) - else -> visitor.unknown(_json) - } - - private var validated: Boolean = false - - fun validate(): MaxResponseOutputTokens = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitInteger(integer: Long) {} - - override fun visitInf(inf: JsonValue) { - inf.let { - if (it != JsonValue.from("inf")) { - throw OpenAIInvalidDataException("'inf' is invalid, received $it") - } - } - } - } - ) - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - accept( - object : Visitor { - override fun visitInteger(integer: Long) = 1 - - override fun visitInf(inf: JsonValue) = - inf.let { if (it == JsonValue.from("inf")) 1 else 0 } - - override fun unknown(json: JsonValue?) = 0 - } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is MaxResponseOutputTokens && integer == other.integer && inf == other.inf - } - - override fun hashCode(): Int = Objects.hash(integer, inf) - - override fun toString(): String = - when { - integer != null -> "MaxResponseOutputTokens{integer=$integer}" - inf != null -> "MaxResponseOutputTokens{inf=$inf}" - _json != null -> "MaxResponseOutputTokens{_unknown=$_json}" - else -> throw IllegalStateException("Invalid MaxResponseOutputTokens") - } - - companion object { - - @JvmStatic fun ofInteger(integer: Long) = MaxResponseOutputTokens(integer = integer) - - @JvmStatic fun ofInf() = MaxResponseOutputTokens(inf = JsonValue.from("inf")) - } - - /** - * An interface that defines how to map each variant of [MaxResponseOutputTokens] to a value - * of type [T]. - */ - interface Visitor { - - fun visitInteger(integer: Long): T - - fun visitInf(inf: JsonValue): T - - /** - * Maps an unknown variant of [MaxResponseOutputTokens] to a value of type [T]. - * - * An instance of [MaxResponseOutputTokens] can contain an unknown variant if it was - * deserialized from data that doesn't match any known variant. For example, if the SDK - * is on an older version than the API, then the API may respond with new variants that - * the SDK is unaware of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown MaxResponseOutputTokens: $json") - } - } - - internal class Deserializer : - BaseDeserializer(MaxResponseOutputTokens::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): MaxResponseOutputTokens { - val json = JsonValue.fromJsonNode(node) - - val bestMatches = - sequenceOf( - tryDeserialize(node, jacksonTypeRef()) - ?.let { MaxResponseOutputTokens(inf = it, _json = json) } - ?.takeIf { it.isValid() }, - tryDeserialize(node, jacksonTypeRef())?.let { - MaxResponseOutputTokens(integer = it, _json = json) - }, - ) - .filterNotNull() - .allMaxBy { it.validity() } - .toList() - return when (bestMatches.size) { - // This can happen if what we're deserializing is completely incompatible with - // all the possible variants (e.g. deserializing from object). - 0 -> MaxResponseOutputTokens(_json = json) - 1 -> bestMatches.single() - // If there's more than one match with the highest validity, then use the first - // completely valid match, or simply the first match if none are completely - // valid. - else -> bestMatches.firstOrNull { it.isValid() } ?: bestMatches.first() - } - } - } - - internal class Serializer : - BaseSerializer(MaxResponseOutputTokens::class) { - - override fun serialize( - value: MaxResponseOutputTokens, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.integer != null -> generator.writeObject(value.integer) - value.inf != null -> generator.writeObject(value.inf) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid MaxResponseOutputTokens") - } - } - } - } - - class Modality @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val TEXT = of("text") - - @JvmField val AUDIO = of("audio") - - @JvmStatic fun of(value: String) = Modality(JsonField.of(value)) - } - - /** An enum containing [Modality]'s known values. */ - enum class Known { - TEXT, - AUDIO, - } - - /** - * An enum containing [Modality]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Modality] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - TEXT, - AUDIO, - /** An enum member indicating that [Modality] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - TEXT -> Value.TEXT - AUDIO -> Value.AUDIO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - TEXT -> Known.TEXT - AUDIO -> Known.AUDIO - else -> throw OpenAIInvalidDataException("Unknown Modality: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Modality = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Modality && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - class Tool - private constructor( - private val description: JsonField, - private val name: JsonField, - private val parameters: JsonValue, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("description") - @ExcludeMissing - description: JsonField = JsonMissing.of(), - @JsonProperty("name") @ExcludeMissing name: JsonField = JsonMissing.of(), - @JsonProperty("parameters") @ExcludeMissing parameters: JsonValue = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(description, name, parameters, type, mutableMapOf()) - - /** - * The description of the function, including guidance on when and how to call it, and - * guidance about what to tell the user when calling (if anything). - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun description(): Optional = description.getOptional("description") - - /** - * The name of the function. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun name(): Optional = name.getOptional("name") - - /** Parameters of the function in JSON Schema. */ - @JsonProperty("parameters") @ExcludeMissing fun _parameters(): JsonValue = parameters - - /** - * The type of the tool, i.e. `function`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [description]. - * - * Unlike [description], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("description") - @ExcludeMissing - fun _description(): JsonField = description - - /** - * Returns the raw JSON value of [name]. - * - * Unlike [name], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("name") @ExcludeMissing fun _name(): JsonField = name - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Tool]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Tool]. */ - class Builder internal constructor() { - - private var description: JsonField = JsonMissing.of() - private var name: JsonField = JsonMissing.of() - private var parameters: JsonValue = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(tool: Tool) = apply { - description = tool.description - name = tool.name - parameters = tool.parameters - type = tool.type - additionalProperties = tool.additionalProperties.toMutableMap() - } - - /** - * The description of the function, including guidance on when and how to call it, and - * guidance about what to tell the user when calling (if anything). - */ - fun description(description: String) = description(JsonField.of(description)) - - /** - * Sets [Builder.description] to an arbitrary JSON value. - * - * You should usually call [Builder.description] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun description(description: JsonField) = apply { - this.description = description - } - - /** The name of the function. */ - fun name(name: String) = name(JsonField.of(name)) - - /** - * Sets [Builder.name] to an arbitrary JSON value. - * - * You should usually call [Builder.name] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun name(name: JsonField) = apply { this.name = name } - - /** Parameters of the function in JSON Schema. */ - fun parameters(parameters: JsonValue) = apply { this.parameters = parameters } - - /** The type of the tool, i.e. `function`. */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Tool]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Tool = - Tool(description, name, parameters, type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): Tool = apply { - if (validated) { - return@apply - } - - description() - name() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (description.asKnown().isPresent) 1 else 0) + - (if (name.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** The type of the tool, i.e. `function`. */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val FUNCTION = of("function") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - FUNCTION - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - FUNCTION, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - FUNCTION -> Value.FUNCTION - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - FUNCTION -> Known.FUNCTION - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Tool && - description == other.description && - name == other.name && - parameters == other.parameters && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(description, name, parameters, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Tool{description=$description, name=$name, parameters=$parameters, type=$type, additionalProperties=$additionalProperties}" - } - - /** - * Configuration options for tracing. Set to null to disable tracing. Once tracing is enabled - * for a session, the configuration cannot be modified. - * - * `auto` will create a trace for the session with default values for the workflow name, group - * id, and metadata. - */ - @JsonDeserialize(using = Tracing.Deserializer::class) - @JsonSerialize(using = Tracing.Serializer::class) - class Tracing - private constructor( - private val auto: JsonValue? = null, - private val configuration: TracingConfiguration? = null, - private val _json: JsonValue? = null, - ) { - - /** Default tracing mode for the session. */ - fun auto(): Optional = Optional.ofNullable(auto) - - /** Granular configuration for tracing. */ - fun configuration(): Optional = Optional.ofNullable(configuration) - - fun isAuto(): Boolean = auto != null - - fun isConfiguration(): Boolean = configuration != null - - /** Default tracing mode for the session. */ - fun asAuto(): JsonValue = auto.getOrThrow("auto") - - /** Granular configuration for tracing. */ - fun asConfiguration(): TracingConfiguration = configuration.getOrThrow("configuration") - - fun _json(): Optional = Optional.ofNullable(_json) - - fun accept(visitor: Visitor): T = - when { - auto != null -> visitor.visitAuto(auto) - configuration != null -> visitor.visitConfiguration(configuration) - else -> visitor.unknown(_json) - } - - private var validated: Boolean = false - - fun validate(): Tracing = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitAuto(auto: JsonValue) { - auto.let { - if (it != JsonValue.from("auto")) { - throw OpenAIInvalidDataException("'auto' is invalid, received $it") - } - } - } - - override fun visitConfiguration(configuration: TracingConfiguration) { - configuration.validate() - } - } - ) - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - accept( - object : Visitor { - override fun visitAuto(auto: JsonValue) = - auto.let { if (it == JsonValue.from("auto")) 1 else 0 } - - override fun visitConfiguration(configuration: TracingConfiguration) = - configuration.validity() - - override fun unknown(json: JsonValue?) = 0 - } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Tracing && auto == other.auto && configuration == other.configuration - } - - override fun hashCode(): Int = Objects.hash(auto, configuration) - - override fun toString(): String = - when { - auto != null -> "Tracing{auto=$auto}" - configuration != null -> "Tracing{configuration=$configuration}" - _json != null -> "Tracing{_unknown=$_json}" - else -> throw IllegalStateException("Invalid Tracing") - } - - companion object { - - /** Default tracing mode for the session. */ - @JvmStatic fun ofAuto() = Tracing(auto = JsonValue.from("auto")) - - /** Granular configuration for tracing. */ - @JvmStatic - fun ofConfiguration(configuration: TracingConfiguration) = - Tracing(configuration = configuration) - } - - /** - * An interface that defines how to map each variant of [Tracing] to a value of type [T]. - */ - interface Visitor { - - /** Default tracing mode for the session. */ - fun visitAuto(auto: JsonValue): T - - /** Granular configuration for tracing. */ - fun visitConfiguration(configuration: TracingConfiguration): T - - /** - * Maps an unknown variant of [Tracing] to a value of type [T]. - * - * An instance of [Tracing] can contain an unknown variant if it was deserialized from - * data that doesn't match any known variant. For example, if the SDK is on an older - * version than the API, then the API may respond with new variants that the SDK is - * unaware of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown Tracing: $json") - } - } - - internal class Deserializer : BaseDeserializer(Tracing::class) { - - override fun ObjectCodec.deserialize(node: JsonNode): Tracing { - val json = JsonValue.fromJsonNode(node) - - val bestMatches = - sequenceOf( - tryDeserialize(node, jacksonTypeRef()) - ?.let { Tracing(auto = it, _json = json) } - ?.takeIf { it.isValid() }, - tryDeserialize(node, jacksonTypeRef())?.let { - Tracing(configuration = it, _json = json) - }, - ) - .filterNotNull() - .allMaxBy { it.validity() } - .toList() - return when (bestMatches.size) { - // This can happen if what we're deserializing is completely incompatible with - // all the possible variants (e.g. deserializing from array). - 0 -> Tracing(_json = json) - 1 -> bestMatches.single() - // If there's more than one match with the highest validity, then use the first - // completely valid match, or simply the first match if none are completely - // valid. - else -> bestMatches.firstOrNull { it.isValid() } ?: bestMatches.first() - } - } - } - - internal class Serializer : BaseSerializer(Tracing::class) { - - override fun serialize( - value: Tracing, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.auto != null -> generator.writeObject(value.auto) - value.configuration != null -> generator.writeObject(value.configuration) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid Tracing") - } - } - } - - /** Granular configuration for tracing. */ - class TracingConfiguration - private constructor( - private val groupId: JsonField, - private val metadata: JsonValue, - private val workflowName: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("group_id") - @ExcludeMissing - groupId: JsonField = JsonMissing.of(), - @JsonProperty("metadata") @ExcludeMissing metadata: JsonValue = JsonMissing.of(), - @JsonProperty("workflow_name") - @ExcludeMissing - workflowName: JsonField = JsonMissing.of(), - ) : this(groupId, metadata, workflowName, mutableMapOf()) - - /** - * The group id to attach to this trace to enable filtering and grouping in the traces - * dashboard. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun groupId(): Optional = groupId.getOptional("group_id") - - /** - * The arbitrary metadata to attach to this trace to enable filtering in the traces - * dashboard. - */ - @JsonProperty("metadata") @ExcludeMissing fun _metadata(): JsonValue = metadata - - /** - * The name of the workflow to attach to this trace. This is used to name the trace in - * the traces dashboard. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun workflowName(): Optional = workflowName.getOptional("workflow_name") - - /** - * Returns the raw JSON value of [groupId]. - * - * Unlike [groupId], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("group_id") @ExcludeMissing fun _groupId(): JsonField = groupId - - /** - * Returns the raw JSON value of [workflowName]. - * - * Unlike [workflowName], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("workflow_name") - @ExcludeMissing - fun _workflowName(): JsonField = workflowName - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [TracingConfiguration]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TracingConfiguration]. */ - class Builder internal constructor() { - - private var groupId: JsonField = JsonMissing.of() - private var metadata: JsonValue = JsonMissing.of() - private var workflowName: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(tracingConfiguration: TracingConfiguration) = apply { - groupId = tracingConfiguration.groupId - metadata = tracingConfiguration.metadata - workflowName = tracingConfiguration.workflowName - additionalProperties = tracingConfiguration.additionalProperties.toMutableMap() - } - - /** - * The group id to attach to this trace to enable filtering and grouping in the - * traces dashboard. - */ - fun groupId(groupId: String) = groupId(JsonField.of(groupId)) - - /** - * Sets [Builder.groupId] to an arbitrary JSON value. - * - * You should usually call [Builder.groupId] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun groupId(groupId: JsonField) = apply { this.groupId = groupId } - - /** - * The arbitrary metadata to attach to this trace to enable filtering in the traces - * dashboard. - */ - fun metadata(metadata: JsonValue) = apply { this.metadata = metadata } - - /** - * The name of the workflow to attach to this trace. This is used to name the trace - * in the traces dashboard. - */ - fun workflowName(workflowName: String) = workflowName(JsonField.of(workflowName)) - - /** - * Sets [Builder.workflowName] to an arbitrary JSON value. - * - * You should usually call [Builder.workflowName] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun workflowName(workflowName: JsonField) = apply { - this.workflowName = workflowName - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TracingConfiguration]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): TracingConfiguration = - TracingConfiguration( - groupId, - metadata, - workflowName, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TracingConfiguration = apply { - if (validated) { - return@apply - } - - groupId() - workflowName() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (groupId.asKnown().isPresent) 1 else 0) + - (if (workflowName.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TracingConfiguration && - groupId == other.groupId && - metadata == other.metadata && - workflowName == other.workflowName && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(groupId, metadata, workflowName, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TracingConfiguration{groupId=$groupId, metadata=$metadata, workflowName=$workflowName, additionalProperties=$additionalProperties}" - } - } - - /** - * Configuration for turn detection. Can be set to `null` to turn off. Server VAD means that the - * model will detect the start and end of speech based on audio volume and respond at the end of - * user speech. - */ - class TurnDetection - private constructor( - private val prefixPaddingMs: JsonField, - private val silenceDurationMs: JsonField, - private val threshold: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - prefixPaddingMs: JsonField = JsonMissing.of(), - @JsonProperty("silence_duration_ms") - @ExcludeMissing - silenceDurationMs: JsonField = JsonMissing.of(), - @JsonProperty("threshold") - @ExcludeMissing - threshold: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(prefixPaddingMs, silenceDurationMs, threshold, type, mutableMapOf()) - - /** - * Amount of audio to include before the VAD detected speech (in milliseconds). Defaults to - * 300ms. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun prefixPaddingMs(): Optional = prefixPaddingMs.getOptional("prefix_padding_ms") - - /** - * Duration of silence to detect speech stop (in milliseconds). Defaults to 500ms. With - * shorter values the model will respond more quickly, but may jump in on short pauses from - * the user. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun silenceDurationMs(): Optional = - silenceDurationMs.getOptional("silence_duration_ms") - - /** - * Activation threshold for VAD (0.0 to 1.0), this defaults to 0.5. A higher threshold will - * require louder audio to activate the model, and thus might perform better in noisy - * environments. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun threshold(): Optional = threshold.getOptional("threshold") - - /** - * Type of turn detection, only `server_vad` is currently supported. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [prefixPaddingMs]. - * - * Unlike [prefixPaddingMs], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - fun _prefixPaddingMs(): JsonField = prefixPaddingMs - - /** - * Returns the raw JSON value of [silenceDurationMs]. - * - * Unlike [silenceDurationMs], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("silence_duration_ms") - @ExcludeMissing - fun _silenceDurationMs(): JsonField = silenceDurationMs - - /** - * Returns the raw JSON value of [threshold]. - * - * Unlike [threshold], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("threshold") @ExcludeMissing fun _threshold(): JsonField = threshold - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [TurnDetection]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TurnDetection]. */ - class Builder internal constructor() { - - private var prefixPaddingMs: JsonField = JsonMissing.of() - private var silenceDurationMs: JsonField = JsonMissing.of() - private var threshold: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(turnDetection: TurnDetection) = apply { - prefixPaddingMs = turnDetection.prefixPaddingMs - silenceDurationMs = turnDetection.silenceDurationMs - threshold = turnDetection.threshold - type = turnDetection.type - additionalProperties = turnDetection.additionalProperties.toMutableMap() - } - - /** - * Amount of audio to include before the VAD detected speech (in milliseconds). Defaults - * to 300ms. - */ - fun prefixPaddingMs(prefixPaddingMs: Long) = - prefixPaddingMs(JsonField.of(prefixPaddingMs)) - - /** - * Sets [Builder.prefixPaddingMs] to an arbitrary JSON value. - * - * You should usually call [Builder.prefixPaddingMs] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun prefixPaddingMs(prefixPaddingMs: JsonField) = apply { - this.prefixPaddingMs = prefixPaddingMs - } - - /** - * Duration of silence to detect speech stop (in milliseconds). Defaults to 500ms. With - * shorter values the model will respond more quickly, but may jump in on short pauses - * from the user. - */ - fun silenceDurationMs(silenceDurationMs: Long) = - silenceDurationMs(JsonField.of(silenceDurationMs)) - - /** - * Sets [Builder.silenceDurationMs] to an arbitrary JSON value. - * - * You should usually call [Builder.silenceDurationMs] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun silenceDurationMs(silenceDurationMs: JsonField) = apply { - this.silenceDurationMs = silenceDurationMs - } - - /** - * Activation threshold for VAD (0.0 to 1.0), this defaults to 0.5. A higher threshold - * will require louder audio to activate the model, and thus might perform better in - * noisy environments. - */ - fun threshold(threshold: Double) = threshold(JsonField.of(threshold)) - - /** - * Sets [Builder.threshold] to an arbitrary JSON value. - * - * You should usually call [Builder.threshold] with a well-typed [Double] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun threshold(threshold: JsonField) = apply { this.threshold = threshold } - - /** Type of turn detection, only `server_vad` is currently supported. */ - fun type(type: String) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TurnDetection]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): TurnDetection = - TurnDetection( - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TurnDetection = apply { - if (validated) { - return@apply - } - - prefixPaddingMs() - silenceDurationMs() - threshold() - type() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (prefixPaddingMs.asKnown().isPresent) 1 else 0) + - (if (silenceDurationMs.asKnown().isPresent) 1 else 0) + - (if (threshold.asKnown().isPresent) 1 else 0) + - (if (type.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TurnDetection && - prefixPaddingMs == other.prefixPaddingMs && - silenceDurationMs == other.silenceDurationMs && - threshold == other.threshold && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(prefixPaddingMs, silenceDurationMs, threshold, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TurnDetection{prefixPaddingMs=$prefixPaddingMs, silenceDurationMs=$silenceDurationMs, threshold=$threshold, type=$type, additionalProperties=$additionalProperties}" - } - - /** - * The voice the model uses to respond. Voice cannot be changed during the session once the - * model has responded with audio at least once. Current voice options are `alloy`, `ash`, - * `ballad`, `coral`, `echo`, `sage`, `shimmer`, and `verse`. - */ - class Voice @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val ALLOY = of("alloy") - - @JvmField val ASH = of("ash") - - @JvmField val BALLAD = of("ballad") - - @JvmField val CORAL = of("coral") - - @JvmField val ECHO = of("echo") - - @JvmField val SAGE = of("sage") - - @JvmField val SHIMMER = of("shimmer") - - @JvmField val VERSE = of("verse") - - @JvmStatic fun of(value: String) = Voice(JsonField.of(value)) - } - - /** An enum containing [Voice]'s known values. */ - enum class Known { - ALLOY, - ASH, - BALLAD, - CORAL, - ECHO, - SAGE, - SHIMMER, - VERSE, - } - - /** - * An enum containing [Voice]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Voice] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - ALLOY, - ASH, - BALLAD, - CORAL, - ECHO, - SAGE, - SHIMMER, - VERSE, - /** An enum member indicating that [Voice] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - ALLOY -> Value.ALLOY - ASH -> Value.ASH - BALLAD -> Value.BALLAD - CORAL -> Value.CORAL - ECHO -> Value.ECHO - SAGE -> Value.SAGE - SHIMMER -> Value.SHIMMER - VERSE -> Value.VERSE - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - ALLOY -> Known.ALLOY - ASH -> Known.ASH - BALLAD -> Known.BALLAD - CORAL -> Known.CORAL - ECHO -> Known.ECHO - SAGE -> Known.SAGE - SHIMMER -> Known.SHIMMER - VERSE -> Known.VERSE - else -> throw OpenAIInvalidDataException("Unknown Voice: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Voice = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Voice && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is SessionCreateResponse && - clientSecret == other.clientSecret && - inputAudioFormat == other.inputAudioFormat && - inputAudioTranscription == other.inputAudioTranscription && - instructions == other.instructions && - maxResponseOutputTokens == other.maxResponseOutputTokens && - modalities == other.modalities && - outputAudioFormat == other.outputAudioFormat && - speed == other.speed && - temperature == other.temperature && - toolChoice == other.toolChoice && - tools == other.tools && - tracing == other.tracing && - turnDetection == other.turnDetection && - voice == other.voice && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - clientSecret, - inputAudioFormat, - inputAudioTranscription, - instructions, - maxResponseOutputTokens, - modalities, - outputAudioFormat, - speed, - temperature, - toolChoice, - tools, - tracing, - turnDetection, - voice, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "SessionCreateResponse{clientSecret=$clientSecret, inputAudioFormat=$inputAudioFormat, inputAudioTranscription=$inputAudioTranscription, instructions=$instructions, maxResponseOutputTokens=$maxResponseOutputTokens, modalities=$modalities, outputAudioFormat=$outputAudioFormat, speed=$speed, temperature=$temperature, toolChoice=$toolChoice, tools=$tools, tracing=$tracing, turnDetection=$turnDetection, voice=$voice, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSession.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSession.kt deleted file mode 100644 index 4c691d9f9..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSession.kt +++ /dev/null @@ -1,1410 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime.transcriptionsessions - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.checkKnown -import com.openai.core.checkRequired -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * A new Realtime transcription session configuration. - * - * When a session is created on the server via REST API, the session object also contains an - * ephemeral key. Default TTL for keys is 10 minutes. This property is not present when a session is - * updated via the WebSocket API. - */ -class TranscriptionSession -private constructor( - private val clientSecret: JsonField, - private val inputAudioFormat: JsonField, - private val inputAudioTranscription: JsonField, - private val modalities: JsonField>, - private val turnDetection: JsonField, - private val additionalProperties: MutableMap, -) { - - @JsonCreator - private constructor( - @JsonProperty("client_secret") - @ExcludeMissing - clientSecret: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_format") - @ExcludeMissing - inputAudioFormat: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_transcription") - @ExcludeMissing - inputAudioTranscription: JsonField = JsonMissing.of(), - @JsonProperty("modalities") - @ExcludeMissing - modalities: JsonField> = JsonMissing.of(), - @JsonProperty("turn_detection") - @ExcludeMissing - turnDetection: JsonField = JsonMissing.of(), - ) : this( - clientSecret, - inputAudioFormat, - inputAudioTranscription, - modalities, - turnDetection, - mutableMapOf(), - ) - - /** - * Ephemeral key returned by the API. Only present when the session is created on the server via - * REST API. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun clientSecret(): ClientSecret = clientSecret.getRequired("client_secret") - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioFormat(): Optional = inputAudioFormat.getOptional("input_audio_format") - - /** - * Configuration of the transcription model. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioTranscription(): Optional = - inputAudioTranscription.getOptional("input_audio_transcription") - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun modalities(): Optional> = modalities.getOptional("modalities") - - /** - * Configuration for turn detection. Can be set to `null` to turn off. Server VAD means that the - * model will detect the start and end of speech based on audio volume and respond at the end of - * user speech. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun turnDetection(): Optional = turnDetection.getOptional("turn_detection") - - /** - * Returns the raw JSON value of [clientSecret]. - * - * Unlike [clientSecret], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("client_secret") - @ExcludeMissing - fun _clientSecret(): JsonField = clientSecret - - /** - * Returns the raw JSON value of [inputAudioFormat]. - * - * Unlike [inputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("input_audio_format") - @ExcludeMissing - fun _inputAudioFormat(): JsonField = inputAudioFormat - - /** - * Returns the raw JSON value of [inputAudioTranscription]. - * - * Unlike [inputAudioTranscription], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("input_audio_transcription") - @ExcludeMissing - fun _inputAudioTranscription(): JsonField = inputAudioTranscription - - /** - * Returns the raw JSON value of [modalities]. - * - * Unlike [modalities], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("modalities") - @ExcludeMissing - fun _modalities(): JsonField> = modalities - - /** - * Returns the raw JSON value of [turnDetection]. - * - * Unlike [turnDetection], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("turn_detection") - @ExcludeMissing - fun _turnDetection(): JsonField = turnDetection - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [TranscriptionSession]. - * - * The following fields are required: - * ```java - * .clientSecret() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TranscriptionSession]. */ - class Builder internal constructor() { - - private var clientSecret: JsonField? = null - private var inputAudioFormat: JsonField = JsonMissing.of() - private var inputAudioTranscription: JsonField = JsonMissing.of() - private var modalities: JsonField>? = null - private var turnDetection: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(transcriptionSession: TranscriptionSession) = apply { - clientSecret = transcriptionSession.clientSecret - inputAudioFormat = transcriptionSession.inputAudioFormat - inputAudioTranscription = transcriptionSession.inputAudioTranscription - modalities = transcriptionSession.modalities.map { it.toMutableList() } - turnDetection = transcriptionSession.turnDetection - additionalProperties = transcriptionSession.additionalProperties.toMutableMap() - } - - /** - * Ephemeral key returned by the API. Only present when the session is created on the server - * via REST API. - */ - fun clientSecret(clientSecret: ClientSecret) = clientSecret(JsonField.of(clientSecret)) - - /** - * Sets [Builder.clientSecret] to an arbitrary JSON value. - * - * You should usually call [Builder.clientSecret] with a well-typed [ClientSecret] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun clientSecret(clientSecret: JsonField) = apply { - this.clientSecret = clientSecret - } - - /** The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. */ - fun inputAudioFormat(inputAudioFormat: String) = - inputAudioFormat(JsonField.of(inputAudioFormat)) - - /** - * Sets [Builder.inputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioFormat] with a well-typed [String] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun inputAudioFormat(inputAudioFormat: JsonField) = apply { - this.inputAudioFormat = inputAudioFormat - } - - /** Configuration of the transcription model. */ - fun inputAudioTranscription(inputAudioTranscription: InputAudioTranscription) = - inputAudioTranscription(JsonField.of(inputAudioTranscription)) - - /** - * Sets [Builder.inputAudioTranscription] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioTranscription] with a well-typed - * [InputAudioTranscription] value instead. This method is primarily for setting the field - * to an undocumented or not yet supported value. - */ - fun inputAudioTranscription(inputAudioTranscription: JsonField) = - apply { - this.inputAudioTranscription = inputAudioTranscription - } - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - */ - fun modalities(modalities: List) = modalities(JsonField.of(modalities)) - - /** - * Sets [Builder.modalities] to an arbitrary JSON value. - * - * You should usually call [Builder.modalities] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun modalities(modalities: JsonField>) = apply { - this.modalities = modalities.map { it.toMutableList() } - } - - /** - * Adds a single [Modality] to [modalities]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addModality(modality: Modality) = apply { - modalities = - (modalities ?: JsonField.of(mutableListOf())).also { - checkKnown("modalities", it).add(modality) - } - } - - /** - * Configuration for turn detection. Can be set to `null` to turn off. Server VAD means that - * the model will detect the start and end of speech based on audio volume and respond at - * the end of user speech. - */ - fun turnDetection(turnDetection: TurnDetection) = turnDetection(JsonField.of(turnDetection)) - - /** - * Sets [Builder.turnDetection] to an arbitrary JSON value. - * - * You should usually call [Builder.turnDetection] with a well-typed [TurnDetection] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun turnDetection(turnDetection: JsonField) = apply { - this.turnDetection = turnDetection - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TranscriptionSession]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .clientSecret() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): TranscriptionSession = - TranscriptionSession( - checkRequired("clientSecret", clientSecret), - inputAudioFormat, - inputAudioTranscription, - (modalities ?: JsonMissing.of()).map { it.toImmutable() }, - turnDetection, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TranscriptionSession = apply { - if (validated) { - return@apply - } - - clientSecret().validate() - inputAudioFormat() - inputAudioTranscription().ifPresent { it.validate() } - modalities().ifPresent { it.forEach { it.validate() } } - turnDetection().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (clientSecret.asKnown().getOrNull()?.validity() ?: 0) + - (if (inputAudioFormat.asKnown().isPresent) 1 else 0) + - (inputAudioTranscription.asKnown().getOrNull()?.validity() ?: 0) + - (modalities.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (turnDetection.asKnown().getOrNull()?.validity() ?: 0) - - /** - * Ephemeral key returned by the API. Only present when the session is created on the server via - * REST API. - */ - class ClientSecret - private constructor( - private val expiresAt: JsonField, - private val value: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("expires_at") - @ExcludeMissing - expiresAt: JsonField = JsonMissing.of(), - @JsonProperty("value") @ExcludeMissing value: JsonField = JsonMissing.of(), - ) : this(expiresAt, value, mutableMapOf()) - - /** - * Timestamp for when the token expires. Currently, all tokens expire after one minute. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun expiresAt(): Long = expiresAt.getRequired("expires_at") - - /** - * Ephemeral key usable in client environments to authenticate connections to the Realtime - * API. Use this in client-side environments rather than a standard API token, which should - * only be used server-side. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun value(): String = value.getRequired("value") - - /** - * Returns the raw JSON value of [expiresAt]. - * - * Unlike [expiresAt], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("expires_at") @ExcludeMissing fun _expiresAt(): JsonField = expiresAt - - /** - * Returns the raw JSON value of [value]. - * - * Unlike [value], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("value") @ExcludeMissing fun _value(): JsonField = value - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [ClientSecret]. - * - * The following fields are required: - * ```java - * .expiresAt() - * .value() - * ``` - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ClientSecret]. */ - class Builder internal constructor() { - - private var expiresAt: JsonField? = null - private var value: JsonField? = null - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(clientSecret: ClientSecret) = apply { - expiresAt = clientSecret.expiresAt - value = clientSecret.value - additionalProperties = clientSecret.additionalProperties.toMutableMap() - } - - /** - * Timestamp for when the token expires. Currently, all tokens expire after one minute. - */ - fun expiresAt(expiresAt: Long) = expiresAt(JsonField.of(expiresAt)) - - /** - * Sets [Builder.expiresAt] to an arbitrary JSON value. - * - * You should usually call [Builder.expiresAt] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun expiresAt(expiresAt: JsonField) = apply { this.expiresAt = expiresAt } - - /** - * Ephemeral key usable in client environments to authenticate connections to the - * Realtime API. Use this in client-side environments rather than a standard API token, - * which should only be used server-side. - */ - fun value(value: String) = value(JsonField.of(value)) - - /** - * Sets [Builder.value] to an arbitrary JSON value. - * - * You should usually call [Builder.value] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun value(value: JsonField) = apply { this.value = value } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ClientSecret]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .expiresAt() - * .value() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build(): ClientSecret = - ClientSecret( - checkRequired("expiresAt", expiresAt), - checkRequired("value", value), - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): ClientSecret = apply { - if (validated) { - return@apply - } - - expiresAt() - value() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (expiresAt.asKnown().isPresent) 1 else 0) + - (if (value.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ClientSecret && - expiresAt == other.expiresAt && - value == other.value && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(expiresAt, value, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ClientSecret{expiresAt=$expiresAt, value=$value, additionalProperties=$additionalProperties}" - } - - /** Configuration of the transcription model. */ - class InputAudioTranscription - private constructor( - private val language: JsonField, - private val model: JsonField, - private val prompt: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("language") - @ExcludeMissing - language: JsonField = JsonMissing.of(), - @JsonProperty("model") @ExcludeMissing model: JsonField = JsonMissing.of(), - @JsonProperty("prompt") @ExcludeMissing prompt: JsonField = JsonMissing.of(), - ) : this(language, model, prompt, mutableMapOf()) - - /** - * The language of the input audio. Supplying the input language in - * [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`) format - * will improve accuracy and latency. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun language(): Optional = language.getOptional("language") - - /** - * The model to use for transcription. Can be `gpt-4o-transcribe`, `gpt-4o-mini-transcribe`, - * or `whisper-1`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun model(): Optional = model.getOptional("model") - - /** - * An optional text to guide the model's style or continue a previous audio segment. The - * [prompt](https://platform.openai.com/docs/guides/speech-to-text#prompting) should match - * the audio language. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun prompt(): Optional = prompt.getOptional("prompt") - - /** - * Returns the raw JSON value of [language]. - * - * Unlike [language], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("language") @ExcludeMissing fun _language(): JsonField = language - - /** - * Returns the raw JSON value of [model]. - * - * Unlike [model], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("model") @ExcludeMissing fun _model(): JsonField = model - - /** - * Returns the raw JSON value of [prompt]. - * - * Unlike [prompt], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("prompt") @ExcludeMissing fun _prompt(): JsonField = prompt - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [InputAudioTranscription]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioTranscription]. */ - class Builder internal constructor() { - - private var language: JsonField = JsonMissing.of() - private var model: JsonField = JsonMissing.of() - private var prompt: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioTranscription: InputAudioTranscription) = apply { - language = inputAudioTranscription.language - model = inputAudioTranscription.model - prompt = inputAudioTranscription.prompt - additionalProperties = inputAudioTranscription.additionalProperties.toMutableMap() - } - - /** - * The language of the input audio. Supplying the input language in - * [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`) format - * will improve accuracy and latency. - */ - fun language(language: String) = language(JsonField.of(language)) - - /** - * Sets [Builder.language] to an arbitrary JSON value. - * - * You should usually call [Builder.language] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun language(language: JsonField) = apply { this.language = language } - - /** - * The model to use for transcription. Can be `gpt-4o-transcribe`, - * `gpt-4o-mini-transcribe`, or `whisper-1`. - */ - fun model(model: Model) = model(JsonField.of(model)) - - /** - * Sets [Builder.model] to an arbitrary JSON value. - * - * You should usually call [Builder.model] with a well-typed [Model] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun model(model: JsonField) = apply { this.model = model } - - /** - * An optional text to guide the model's style or continue a previous audio segment. The - * [prompt](https://platform.openai.com/docs/guides/speech-to-text#prompting) should - * match the audio language. - */ - fun prompt(prompt: String) = prompt(JsonField.of(prompt)) - - /** - * Sets [Builder.prompt] to an arbitrary JSON value. - * - * You should usually call [Builder.prompt] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun prompt(prompt: JsonField) = apply { this.prompt = prompt } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioTranscription]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioTranscription = - InputAudioTranscription( - language, - model, - prompt, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): InputAudioTranscription = apply { - if (validated) { - return@apply - } - - language() - model().ifPresent { it.validate() } - prompt() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (language.asKnown().isPresent) 1 else 0) + - (model.asKnown().getOrNull()?.validity() ?: 0) + - (if (prompt.asKnown().isPresent) 1 else 0) - - /** - * The model to use for transcription. Can be `gpt-4o-transcribe`, `gpt-4o-mini-transcribe`, - * or `whisper-1`. - */ - class Model @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val GPT_4O_TRANSCRIBE = of("gpt-4o-transcribe") - - @JvmField val GPT_4O_MINI_TRANSCRIBE = of("gpt-4o-mini-transcribe") - - @JvmField val WHISPER_1 = of("whisper-1") - - @JvmStatic fun of(value: String) = Model(JsonField.of(value)) - } - - /** An enum containing [Model]'s known values. */ - enum class Known { - GPT_4O_TRANSCRIBE, - GPT_4O_MINI_TRANSCRIBE, - WHISPER_1, - } - - /** - * An enum containing [Model]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Model] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - GPT_4O_TRANSCRIBE, - GPT_4O_MINI_TRANSCRIBE, - WHISPER_1, - /** - * An enum member indicating that [Model] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - GPT_4O_TRANSCRIBE -> Value.GPT_4O_TRANSCRIBE - GPT_4O_MINI_TRANSCRIBE -> Value.GPT_4O_MINI_TRANSCRIBE - WHISPER_1 -> Value.WHISPER_1 - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - GPT_4O_TRANSCRIBE -> Known.GPT_4O_TRANSCRIBE - GPT_4O_MINI_TRANSCRIBE -> Known.GPT_4O_MINI_TRANSCRIBE - WHISPER_1 -> Known.WHISPER_1 - else -> throw OpenAIInvalidDataException("Unknown Model: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Model = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Model && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioTranscription && - language == other.language && - model == other.model && - prompt == other.prompt && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(language, model, prompt, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioTranscription{language=$language, model=$model, prompt=$prompt, additionalProperties=$additionalProperties}" - } - - class Modality @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val TEXT = of("text") - - @JvmField val AUDIO = of("audio") - - @JvmStatic fun of(value: String) = Modality(JsonField.of(value)) - } - - /** An enum containing [Modality]'s known values. */ - enum class Known { - TEXT, - AUDIO, - } - - /** - * An enum containing [Modality]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Modality] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - TEXT, - AUDIO, - /** An enum member indicating that [Modality] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - TEXT -> Value.TEXT - AUDIO -> Value.AUDIO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - TEXT -> Known.TEXT - AUDIO -> Known.AUDIO - else -> throw OpenAIInvalidDataException("Unknown Modality: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Modality = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Modality && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * Configuration for turn detection. Can be set to `null` to turn off. Server VAD means that the - * model will detect the start and end of speech based on audio volume and respond at the end of - * user speech. - */ - class TurnDetection - private constructor( - private val prefixPaddingMs: JsonField, - private val silenceDurationMs: JsonField, - private val threshold: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - prefixPaddingMs: JsonField = JsonMissing.of(), - @JsonProperty("silence_duration_ms") - @ExcludeMissing - silenceDurationMs: JsonField = JsonMissing.of(), - @JsonProperty("threshold") - @ExcludeMissing - threshold: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this(prefixPaddingMs, silenceDurationMs, threshold, type, mutableMapOf()) - - /** - * Amount of audio to include before the VAD detected speech (in milliseconds). Defaults to - * 300ms. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun prefixPaddingMs(): Optional = prefixPaddingMs.getOptional("prefix_padding_ms") - - /** - * Duration of silence to detect speech stop (in milliseconds). Defaults to 500ms. With - * shorter values the model will respond more quickly, but may jump in on short pauses from - * the user. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun silenceDurationMs(): Optional = - silenceDurationMs.getOptional("silence_duration_ms") - - /** - * Activation threshold for VAD (0.0 to 1.0), this defaults to 0.5. A higher threshold will - * require louder audio to activate the model, and thus might perform better in noisy - * environments. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun threshold(): Optional = threshold.getOptional("threshold") - - /** - * Type of turn detection, only `server_vad` is currently supported. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [prefixPaddingMs]. - * - * Unlike [prefixPaddingMs], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - fun _prefixPaddingMs(): JsonField = prefixPaddingMs - - /** - * Returns the raw JSON value of [silenceDurationMs]. - * - * Unlike [silenceDurationMs], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("silence_duration_ms") - @ExcludeMissing - fun _silenceDurationMs(): JsonField = silenceDurationMs - - /** - * Returns the raw JSON value of [threshold]. - * - * Unlike [threshold], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("threshold") @ExcludeMissing fun _threshold(): JsonField = threshold - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [TurnDetection]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TurnDetection]. */ - class Builder internal constructor() { - - private var prefixPaddingMs: JsonField = JsonMissing.of() - private var silenceDurationMs: JsonField = JsonMissing.of() - private var threshold: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(turnDetection: TurnDetection) = apply { - prefixPaddingMs = turnDetection.prefixPaddingMs - silenceDurationMs = turnDetection.silenceDurationMs - threshold = turnDetection.threshold - type = turnDetection.type - additionalProperties = turnDetection.additionalProperties.toMutableMap() - } - - /** - * Amount of audio to include before the VAD detected speech (in milliseconds). Defaults - * to 300ms. - */ - fun prefixPaddingMs(prefixPaddingMs: Long) = - prefixPaddingMs(JsonField.of(prefixPaddingMs)) - - /** - * Sets [Builder.prefixPaddingMs] to an arbitrary JSON value. - * - * You should usually call [Builder.prefixPaddingMs] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun prefixPaddingMs(prefixPaddingMs: JsonField) = apply { - this.prefixPaddingMs = prefixPaddingMs - } - - /** - * Duration of silence to detect speech stop (in milliseconds). Defaults to 500ms. With - * shorter values the model will respond more quickly, but may jump in on short pauses - * from the user. - */ - fun silenceDurationMs(silenceDurationMs: Long) = - silenceDurationMs(JsonField.of(silenceDurationMs)) - - /** - * Sets [Builder.silenceDurationMs] to an arbitrary JSON value. - * - * You should usually call [Builder.silenceDurationMs] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun silenceDurationMs(silenceDurationMs: JsonField) = apply { - this.silenceDurationMs = silenceDurationMs - } - - /** - * Activation threshold for VAD (0.0 to 1.0), this defaults to 0.5. A higher threshold - * will require louder audio to activate the model, and thus might perform better in - * noisy environments. - */ - fun threshold(threshold: Double) = threshold(JsonField.of(threshold)) - - /** - * Sets [Builder.threshold] to an arbitrary JSON value. - * - * You should usually call [Builder.threshold] with a well-typed [Double] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun threshold(threshold: JsonField) = apply { this.threshold = threshold } - - /** Type of turn detection, only `server_vad` is currently supported. */ - fun type(type: String) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [String] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TurnDetection]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): TurnDetection = - TurnDetection( - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TurnDetection = apply { - if (validated) { - return@apply - } - - prefixPaddingMs() - silenceDurationMs() - threshold() - type() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (prefixPaddingMs.asKnown().isPresent) 1 else 0) + - (if (silenceDurationMs.asKnown().isPresent) 1 else 0) + - (if (threshold.asKnown().isPresent) 1 else 0) + - (if (type.asKnown().isPresent) 1 else 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TurnDetection && - prefixPaddingMs == other.prefixPaddingMs && - silenceDurationMs == other.silenceDurationMs && - threshold == other.threshold && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(prefixPaddingMs, silenceDurationMs, threshold, type, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TurnDetection{prefixPaddingMs=$prefixPaddingMs, silenceDurationMs=$silenceDurationMs, threshold=$threshold, type=$type, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TranscriptionSession && - clientSecret == other.clientSecret && - inputAudioFormat == other.inputAudioFormat && - inputAudioTranscription == other.inputAudioTranscription && - modalities == other.modalities && - turnDetection == other.turnDetection && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - clientSecret, - inputAudioFormat, - inputAudioTranscription, - modalities, - turnDetection, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TranscriptionSession{clientSecret=$clientSecret, inputAudioFormat=$inputAudioFormat, inputAudioTranscription=$inputAudioTranscription, modalities=$modalities, turnDetection=$turnDetection, additionalProperties=$additionalProperties}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSessionCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSessionCreateParams.kt deleted file mode 100644 index 7df836dcc..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSessionCreateParams.kt +++ /dev/null @@ -1,3158 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime.transcriptionsessions - -import com.fasterxml.jackson.annotation.JsonAnyGetter -import com.fasterxml.jackson.annotation.JsonAnySetter -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.openai.core.Enum -import com.openai.core.ExcludeMissing -import com.openai.core.JsonField -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.core.Params -import com.openai.core.checkKnown -import com.openai.core.http.Headers -import com.openai.core.http.QueryParams -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.util.Collections -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrNull - -/** - * Create an ephemeral API token for use in client-side applications with the Realtime API - * specifically for realtime transcriptions. Can be configured with the same session parameters as - * the `transcription_session.update` client event. - * - * It responds with a session object, plus a `client_secret` key which contains a usable ephemeral - * API token that can be used to authenticate browser clients for the Realtime API. - */ -class TranscriptionSessionCreateParams -private constructor( - private val body: Body, - private val additionalHeaders: Headers, - private val additionalQueryParams: QueryParams, -) : Params { - - /** - * Configuration options for the generated client secret. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun clientSecret(): Optional = body.clientSecret() - - /** - * The set of items to include in the transcription. Current available items are: - * - `item.input_audio_transcription.logprobs` - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun include(): Optional> = body.include() - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioFormat(): Optional = body.inputAudioFormat() - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. Noise - * reduction filters audio added to the input audio buffer before it is sent to VAD and the - * model. Filtering the audio can improve VAD and turn detection accuracy (reducing false - * positives) and model performance by improving perception of the input audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioNoiseReduction(): Optional = - body.inputAudioNoiseReduction() - - /** - * Configuration for input audio transcription. The client can optionally set the language and - * prompt for transcription, these offer additional guidance to the transcription service. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioTranscription(): Optional = - body.inputAudioTranscription() - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun modalities(): Optional> = body.modalities() - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to `null` - * to turn off, in which case the client must manually trigger model response. Server VAD means - * that the model will detect the start and end of speech based on audio volume and respond at - * the end of user speech. Semantic VAD is more advanced and uses a turn detection model (in - * conjunction with VAD) to semantically estimate whether the user has finished speaking, then - * dynamically sets a timeout based on this probability. For example, if user audio trails off - * with "uhhm", the model will score a low probability of turn end and wait longer for the user - * to continue speaking. This can be useful for more natural conversations, but may have a - * higher latency. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun turnDetection(): Optional = body.turnDetection() - - /** - * Returns the raw JSON value of [clientSecret]. - * - * Unlike [clientSecret], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _clientSecret(): JsonField = body._clientSecret() - - /** - * Returns the raw JSON value of [include]. - * - * Unlike [include], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _include(): JsonField> = body._include() - - /** - * Returns the raw JSON value of [inputAudioFormat]. - * - * Unlike [inputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - fun _inputAudioFormat(): JsonField = body._inputAudioFormat() - - /** - * Returns the raw JSON value of [inputAudioNoiseReduction]. - * - * Unlike [inputAudioNoiseReduction], this method doesn't throw if the JSON field has an - * unexpected type. - */ - fun _inputAudioNoiseReduction(): JsonField = - body._inputAudioNoiseReduction() - - /** - * Returns the raw JSON value of [inputAudioTranscription]. - * - * Unlike [inputAudioTranscription], this method doesn't throw if the JSON field has an - * unexpected type. - */ - fun _inputAudioTranscription(): JsonField = - body._inputAudioTranscription() - - /** - * Returns the raw JSON value of [modalities]. - * - * Unlike [modalities], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _modalities(): JsonField> = body._modalities() - - /** - * Returns the raw JSON value of [turnDetection]. - * - * Unlike [turnDetection], this method doesn't throw if the JSON field has an unexpected type. - */ - fun _turnDetection(): JsonField = body._turnDetection() - - fun _additionalBodyProperties(): Map = body._additionalProperties() - - /** Additional headers to send with the request. */ - fun _additionalHeaders(): Headers = additionalHeaders - - /** Additional query param to send with the request. */ - fun _additionalQueryParams(): QueryParams = additionalQueryParams - - fun toBuilder() = Builder().from(this) - - companion object { - - @JvmStatic fun none(): TranscriptionSessionCreateParams = builder().build() - - /** - * Returns a mutable builder for constructing an instance of - * [TranscriptionSessionCreateParams]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TranscriptionSessionCreateParams]. */ - class Builder internal constructor() { - - private var body: Body.Builder = Body.builder() - private var additionalHeaders: Headers.Builder = Headers.builder() - private var additionalQueryParams: QueryParams.Builder = QueryParams.builder() - - @JvmSynthetic - internal fun from(transcriptionSessionCreateParams: TranscriptionSessionCreateParams) = - apply { - body = transcriptionSessionCreateParams.body.toBuilder() - additionalHeaders = transcriptionSessionCreateParams.additionalHeaders.toBuilder() - additionalQueryParams = - transcriptionSessionCreateParams.additionalQueryParams.toBuilder() - } - - /** - * Sets the entire request body. - * - * This is generally only useful if you are already constructing the body separately. - * Otherwise, it's more convenient to use the top-level setters instead: - * - [clientSecret] - * - [include] - * - [inputAudioFormat] - * - [inputAudioNoiseReduction] - * - [inputAudioTranscription] - * - etc. - */ - fun body(body: Body) = apply { this.body = body.toBuilder() } - - /** Configuration options for the generated client secret. */ - fun clientSecret(clientSecret: ClientSecret) = apply { body.clientSecret(clientSecret) } - - /** - * Sets [Builder.clientSecret] to an arbitrary JSON value. - * - * You should usually call [Builder.clientSecret] with a well-typed [ClientSecret] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun clientSecret(clientSecret: JsonField) = apply { - body.clientSecret(clientSecret) - } - - /** - * The set of items to include in the transcription. Current available items are: - * - `item.input_audio_transcription.logprobs` - */ - fun include(include: List) = apply { body.include(include) } - - /** - * Sets [Builder.include] to an arbitrary JSON value. - * - * You should usually call [Builder.include] with a well-typed `List` value instead. - * This method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun include(include: JsonField>) = apply { body.include(include) } - - /** - * Adds a single [String] to [Builder.include]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addInclude(include: String) = apply { body.addInclude(include) } - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - */ - fun inputAudioFormat(inputAudioFormat: InputAudioFormat) = apply { - body.inputAudioFormat(inputAudioFormat) - } - - /** - * Sets [Builder.inputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioFormat] with a well-typed [InputAudioFormat] - * value instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun inputAudioFormat(inputAudioFormat: JsonField) = apply { - body.inputAudioFormat(inputAudioFormat) - } - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. - * Noise reduction filters audio added to the input audio buffer before it is sent to VAD - * and the model. Filtering the audio can improve VAD and turn detection accuracy (reducing - * false positives) and model performance by improving perception of the input audio. - */ - fun inputAudioNoiseReduction(inputAudioNoiseReduction: InputAudioNoiseReduction) = apply { - body.inputAudioNoiseReduction(inputAudioNoiseReduction) - } - - /** - * Sets [Builder.inputAudioNoiseReduction] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioNoiseReduction] with a well-typed - * [InputAudioNoiseReduction] value instead. This method is primarily for setting the field - * to an undocumented or not yet supported value. - */ - fun inputAudioNoiseReduction( - inputAudioNoiseReduction: JsonField - ) = apply { body.inputAudioNoiseReduction(inputAudioNoiseReduction) } - - /** - * Configuration for input audio transcription. The client can optionally set the language - * and prompt for transcription, these offer additional guidance to the transcription - * service. - */ - fun inputAudioTranscription(inputAudioTranscription: InputAudioTranscription) = apply { - body.inputAudioTranscription(inputAudioTranscription) - } - - /** - * Sets [Builder.inputAudioTranscription] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioTranscription] with a well-typed - * [InputAudioTranscription] value instead. This method is primarily for setting the field - * to an undocumented or not yet supported value. - */ - fun inputAudioTranscription(inputAudioTranscription: JsonField) = - apply { - body.inputAudioTranscription(inputAudioTranscription) - } - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - */ - fun modalities(modalities: List) = apply { body.modalities(modalities) } - - /** - * Sets [Builder.modalities] to an arbitrary JSON value. - * - * You should usually call [Builder.modalities] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun modalities(modalities: JsonField>) = apply { - body.modalities(modalities) - } - - /** - * Adds a single [Modality] to [modalities]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addModality(modality: Modality) = apply { body.addModality(modality) } - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to - * `null` to turn off, in which case the client must manually trigger model response. Server - * VAD means that the model will detect the start and end of speech based on audio volume - * and respond at the end of user speech. Semantic VAD is more advanced and uses a turn - * detection model (in conjunction with VAD) to semantically estimate whether the user has - * finished speaking, then dynamically sets a timeout based on this probability. For - * example, if user audio trails off with "uhhm", the model will score a low probability of - * turn end and wait longer for the user to continue speaking. This can be useful for more - * natural conversations, but may have a higher latency. - */ - fun turnDetection(turnDetection: TurnDetection) = apply { - body.turnDetection(turnDetection) - } - - /** - * Sets [Builder.turnDetection] to an arbitrary JSON value. - * - * You should usually call [Builder.turnDetection] with a well-typed [TurnDetection] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun turnDetection(turnDetection: JsonField) = apply { - body.turnDetection(turnDetection) - } - - fun additionalBodyProperties(additionalBodyProperties: Map) = apply { - body.additionalProperties(additionalBodyProperties) - } - - fun putAdditionalBodyProperty(key: String, value: JsonValue) = apply { - body.putAdditionalProperty(key, value) - } - - fun putAllAdditionalBodyProperties(additionalBodyProperties: Map) = - apply { - body.putAllAdditionalProperties(additionalBodyProperties) - } - - fun removeAdditionalBodyProperty(key: String) = apply { body.removeAdditionalProperty(key) } - - fun removeAllAdditionalBodyProperties(keys: Set) = apply { - body.removeAllAdditionalProperties(keys) - } - - fun additionalHeaders(additionalHeaders: Headers) = apply { - this.additionalHeaders.clear() - putAllAdditionalHeaders(additionalHeaders) - } - - fun additionalHeaders(additionalHeaders: Map>) = apply { - this.additionalHeaders.clear() - putAllAdditionalHeaders(additionalHeaders) - } - - fun putAdditionalHeader(name: String, value: String) = apply { - additionalHeaders.put(name, value) - } - - fun putAdditionalHeaders(name: String, values: Iterable) = apply { - additionalHeaders.put(name, values) - } - - fun putAllAdditionalHeaders(additionalHeaders: Headers) = apply { - this.additionalHeaders.putAll(additionalHeaders) - } - - fun putAllAdditionalHeaders(additionalHeaders: Map>) = apply { - this.additionalHeaders.putAll(additionalHeaders) - } - - fun replaceAdditionalHeaders(name: String, value: String) = apply { - additionalHeaders.replace(name, value) - } - - fun replaceAdditionalHeaders(name: String, values: Iterable) = apply { - additionalHeaders.replace(name, values) - } - - fun replaceAllAdditionalHeaders(additionalHeaders: Headers) = apply { - this.additionalHeaders.replaceAll(additionalHeaders) - } - - fun replaceAllAdditionalHeaders(additionalHeaders: Map>) = apply { - this.additionalHeaders.replaceAll(additionalHeaders) - } - - fun removeAdditionalHeaders(name: String) = apply { additionalHeaders.remove(name) } - - fun removeAllAdditionalHeaders(names: Set) = apply { - additionalHeaders.removeAll(names) - } - - fun additionalQueryParams(additionalQueryParams: QueryParams) = apply { - this.additionalQueryParams.clear() - putAllAdditionalQueryParams(additionalQueryParams) - } - - fun additionalQueryParams(additionalQueryParams: Map>) = apply { - this.additionalQueryParams.clear() - putAllAdditionalQueryParams(additionalQueryParams) - } - - fun putAdditionalQueryParam(key: String, value: String) = apply { - additionalQueryParams.put(key, value) - } - - fun putAdditionalQueryParams(key: String, values: Iterable) = apply { - additionalQueryParams.put(key, values) - } - - fun putAllAdditionalQueryParams(additionalQueryParams: QueryParams) = apply { - this.additionalQueryParams.putAll(additionalQueryParams) - } - - fun putAllAdditionalQueryParams(additionalQueryParams: Map>) = - apply { - this.additionalQueryParams.putAll(additionalQueryParams) - } - - fun replaceAdditionalQueryParams(key: String, value: String) = apply { - additionalQueryParams.replace(key, value) - } - - fun replaceAdditionalQueryParams(key: String, values: Iterable) = apply { - additionalQueryParams.replace(key, values) - } - - fun replaceAllAdditionalQueryParams(additionalQueryParams: QueryParams) = apply { - this.additionalQueryParams.replaceAll(additionalQueryParams) - } - - fun replaceAllAdditionalQueryParams(additionalQueryParams: Map>) = - apply { - this.additionalQueryParams.replaceAll(additionalQueryParams) - } - - fun removeAdditionalQueryParams(key: String) = apply { additionalQueryParams.remove(key) } - - fun removeAllAdditionalQueryParams(keys: Set) = apply { - additionalQueryParams.removeAll(keys) - } - - /** - * Returns an immutable instance of [TranscriptionSessionCreateParams]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): TranscriptionSessionCreateParams = - TranscriptionSessionCreateParams( - body.build(), - additionalHeaders.build(), - additionalQueryParams.build(), - ) - } - - fun _body(): Body = body - - override fun _headers(): Headers = additionalHeaders - - override fun _queryParams(): QueryParams = additionalQueryParams - - /** Realtime transcription session object configuration. */ - class Body - private constructor( - private val clientSecret: JsonField, - private val include: JsonField>, - private val inputAudioFormat: JsonField, - private val inputAudioNoiseReduction: JsonField, - private val inputAudioTranscription: JsonField, - private val modalities: JsonField>, - private val turnDetection: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("client_secret") - @ExcludeMissing - clientSecret: JsonField = JsonMissing.of(), - @JsonProperty("include") - @ExcludeMissing - include: JsonField> = JsonMissing.of(), - @JsonProperty("input_audio_format") - @ExcludeMissing - inputAudioFormat: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_noise_reduction") - @ExcludeMissing - inputAudioNoiseReduction: JsonField = JsonMissing.of(), - @JsonProperty("input_audio_transcription") - @ExcludeMissing - inputAudioTranscription: JsonField = JsonMissing.of(), - @JsonProperty("modalities") - @ExcludeMissing - modalities: JsonField> = JsonMissing.of(), - @JsonProperty("turn_detection") - @ExcludeMissing - turnDetection: JsonField = JsonMissing.of(), - ) : this( - clientSecret, - include, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - modalities, - turnDetection, - mutableMapOf(), - ) - - /** - * Configuration options for the generated client secret. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun clientSecret(): Optional = clientSecret.getOptional("client_secret") - - /** - * The set of items to include in the transcription. Current available items are: - * - `item.input_audio_transcription.logprobs` - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun include(): Optional> = include.getOptional("include") - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioFormat(): Optional = - inputAudioFormat.getOptional("input_audio_format") - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. - * Noise reduction filters audio added to the input audio buffer before it is sent to VAD - * and the model. Filtering the audio can improve VAD and turn detection accuracy (reducing - * false positives) and model performance by improving perception of the input audio. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioNoiseReduction(): Optional = - inputAudioNoiseReduction.getOptional("input_audio_noise_reduction") - - /** - * Configuration for input audio transcription. The client can optionally set the language - * and prompt for transcription, these offer additional guidance to the transcription - * service. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun inputAudioTranscription(): Optional = - inputAudioTranscription.getOptional("input_audio_transcription") - - /** - * The set of modalities the model can respond with. To disable audio, set this to ["text"]. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun modalities(): Optional> = modalities.getOptional("modalities") - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to - * `null` to turn off, in which case the client must manually trigger model response. Server - * VAD means that the model will detect the start and end of speech based on audio volume - * and respond at the end of user speech. Semantic VAD is more advanced and uses a turn - * detection model (in conjunction with VAD) to semantically estimate whether the user has - * finished speaking, then dynamically sets a timeout based on this probability. For - * example, if user audio trails off with "uhhm", the model will score a low probability of - * turn end and wait longer for the user to continue speaking. This can be useful for more - * natural conversations, but may have a higher latency. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun turnDetection(): Optional = turnDetection.getOptional("turn_detection") - - /** - * Returns the raw JSON value of [clientSecret]. - * - * Unlike [clientSecret], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("client_secret") - @ExcludeMissing - fun _clientSecret(): JsonField = clientSecret - - /** - * Returns the raw JSON value of [include]. - * - * Unlike [include], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("include") @ExcludeMissing fun _include(): JsonField> = include - - /** - * Returns the raw JSON value of [inputAudioFormat]. - * - * Unlike [inputAudioFormat], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("input_audio_format") - @ExcludeMissing - fun _inputAudioFormat(): JsonField = inputAudioFormat - - /** - * Returns the raw JSON value of [inputAudioNoiseReduction]. - * - * Unlike [inputAudioNoiseReduction], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("input_audio_noise_reduction") - @ExcludeMissing - fun _inputAudioNoiseReduction(): JsonField = - inputAudioNoiseReduction - - /** - * Returns the raw JSON value of [inputAudioTranscription]. - * - * Unlike [inputAudioTranscription], this method doesn't throw if the JSON field has an - * unexpected type. - */ - @JsonProperty("input_audio_transcription") - @ExcludeMissing - fun _inputAudioTranscription(): JsonField = inputAudioTranscription - - /** - * Returns the raw JSON value of [modalities]. - * - * Unlike [modalities], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("modalities") - @ExcludeMissing - fun _modalities(): JsonField> = modalities - - /** - * Returns the raw JSON value of [turnDetection]. - * - * Unlike [turnDetection], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("turn_detection") - @ExcludeMissing - fun _turnDetection(): JsonField = turnDetection - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [Body]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [Body]. */ - class Builder internal constructor() { - - private var clientSecret: JsonField = JsonMissing.of() - private var include: JsonField>? = null - private var inputAudioFormat: JsonField = JsonMissing.of() - private var inputAudioNoiseReduction: JsonField = - JsonMissing.of() - private var inputAudioTranscription: JsonField = - JsonMissing.of() - private var modalities: JsonField>? = null - private var turnDetection: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(body: Body) = apply { - clientSecret = body.clientSecret - include = body.include.map { it.toMutableList() } - inputAudioFormat = body.inputAudioFormat - inputAudioNoiseReduction = body.inputAudioNoiseReduction - inputAudioTranscription = body.inputAudioTranscription - modalities = body.modalities.map { it.toMutableList() } - turnDetection = body.turnDetection - additionalProperties = body.additionalProperties.toMutableMap() - } - - /** Configuration options for the generated client secret. */ - fun clientSecret(clientSecret: ClientSecret) = clientSecret(JsonField.of(clientSecret)) - - /** - * Sets [Builder.clientSecret] to an arbitrary JSON value. - * - * You should usually call [Builder.clientSecret] with a well-typed [ClientSecret] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun clientSecret(clientSecret: JsonField) = apply { - this.clientSecret = clientSecret - } - - /** - * The set of items to include in the transcription. Current available items are: - * - `item.input_audio_transcription.logprobs` - */ - fun include(include: List) = include(JsonField.of(include)) - - /** - * Sets [Builder.include] to an arbitrary JSON value. - * - * You should usually call [Builder.include] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun include(include: JsonField>) = apply { - this.include = include.map { it.toMutableList() } - } - - /** - * Adds a single [String] to [Builder.include]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addInclude(include: String) = apply { - this.include = - (this.include ?: JsonField.of(mutableListOf())).also { - checkKnown("include", it).add(include) - } - } - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For - * `pcm16`, input audio must be 16-bit PCM at a 24kHz sample rate, single channel - * (mono), and little-endian byte order. - */ - fun inputAudioFormat(inputAudioFormat: InputAudioFormat) = - inputAudioFormat(JsonField.of(inputAudioFormat)) - - /** - * Sets [Builder.inputAudioFormat] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioFormat] with a well-typed - * [InputAudioFormat] value instead. This method is primarily for setting the field to - * an undocumented or not yet supported value. - */ - fun inputAudioFormat(inputAudioFormat: JsonField) = apply { - this.inputAudioFormat = inputAudioFormat - } - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. - * Noise reduction filters audio added to the input audio buffer before it is sent to - * VAD and the model. Filtering the audio can improve VAD and turn detection accuracy - * (reducing false positives) and model performance by improving perception of the input - * audio. - */ - fun inputAudioNoiseReduction(inputAudioNoiseReduction: InputAudioNoiseReduction) = - inputAudioNoiseReduction(JsonField.of(inputAudioNoiseReduction)) - - /** - * Sets [Builder.inputAudioNoiseReduction] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioNoiseReduction] with a well-typed - * [InputAudioNoiseReduction] value instead. This method is primarily for setting the - * field to an undocumented or not yet supported value. - */ - fun inputAudioNoiseReduction( - inputAudioNoiseReduction: JsonField - ) = apply { this.inputAudioNoiseReduction = inputAudioNoiseReduction } - - /** - * Configuration for input audio transcription. The client can optionally set the - * language and prompt for transcription, these offer additional guidance to the - * transcription service. - */ - fun inputAudioTranscription(inputAudioTranscription: InputAudioTranscription) = - inputAudioTranscription(JsonField.of(inputAudioTranscription)) - - /** - * Sets [Builder.inputAudioTranscription] to an arbitrary JSON value. - * - * You should usually call [Builder.inputAudioTranscription] with a well-typed - * [InputAudioTranscription] value instead. This method is primarily for setting the - * field to an undocumented or not yet supported value. - */ - fun inputAudioTranscription( - inputAudioTranscription: JsonField - ) = apply { this.inputAudioTranscription = inputAudioTranscription } - - /** - * The set of modalities the model can respond with. To disable audio, set this to - * ["text"]. - */ - fun modalities(modalities: List) = modalities(JsonField.of(modalities)) - - /** - * Sets [Builder.modalities] to an arbitrary JSON value. - * - * You should usually call [Builder.modalities] with a well-typed `List` value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun modalities(modalities: JsonField>) = apply { - this.modalities = modalities.map { it.toMutableList() } - } - - /** - * Adds a single [Modality] to [modalities]. - * - * @throws IllegalStateException if the field was previously set to a non-list. - */ - fun addModality(modality: Modality) = apply { - modalities = - (modalities ?: JsonField.of(mutableListOf())).also { - checkKnown("modalities", it).add(modality) - } - } - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set - * to `null` to turn off, in which case the client must manually trigger model response. - * Server VAD means that the model will detect the start and end of speech based on - * audio volume and respond at the end of user speech. Semantic VAD is more advanced and - * uses a turn detection model (in conjunction with VAD) to semantically estimate - * whether the user has finished speaking, then dynamically sets a timeout based on this - * probability. For example, if user audio trails off with "uhhm", the model will score - * a low probability of turn end and wait longer for the user to continue speaking. This - * can be useful for more natural conversations, but may have a higher latency. - */ - fun turnDetection(turnDetection: TurnDetection) = - turnDetection(JsonField.of(turnDetection)) - - /** - * Sets [Builder.turnDetection] to an arbitrary JSON value. - * - * You should usually call [Builder.turnDetection] with a well-typed [TurnDetection] - * value instead. This method is primarily for setting the field to an undocumented or - * not yet supported value. - */ - fun turnDetection(turnDetection: JsonField) = apply { - this.turnDetection = turnDetection - } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [Body]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): Body = - Body( - clientSecret, - (include ?: JsonMissing.of()).map { it.toImmutable() }, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - (modalities ?: JsonMissing.of()).map { it.toImmutable() }, - turnDetection, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): Body = apply { - if (validated) { - return@apply - } - - clientSecret().ifPresent { it.validate() } - include() - inputAudioFormat().ifPresent { it.validate() } - inputAudioNoiseReduction().ifPresent { it.validate() } - inputAudioTranscription().ifPresent { it.validate() } - modalities().ifPresent { it.forEach { it.validate() } } - turnDetection().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (clientSecret.asKnown().getOrNull()?.validity() ?: 0) + - (include.asKnown().getOrNull()?.size ?: 0) + - (inputAudioFormat.asKnown().getOrNull()?.validity() ?: 0) + - (inputAudioNoiseReduction.asKnown().getOrNull()?.validity() ?: 0) + - (inputAudioTranscription.asKnown().getOrNull()?.validity() ?: 0) + - (modalities.asKnown().getOrNull()?.sumOf { it.validity().toInt() } ?: 0) + - (turnDetection.asKnown().getOrNull()?.validity() ?: 0) - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Body && - clientSecret == other.clientSecret && - include == other.include && - inputAudioFormat == other.inputAudioFormat && - inputAudioNoiseReduction == other.inputAudioNoiseReduction && - inputAudioTranscription == other.inputAudioTranscription && - modalities == other.modalities && - turnDetection == other.turnDetection && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - clientSecret, - include, - inputAudioFormat, - inputAudioNoiseReduction, - inputAudioTranscription, - modalities, - turnDetection, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "Body{clientSecret=$clientSecret, include=$include, inputAudioFormat=$inputAudioFormat, inputAudioNoiseReduction=$inputAudioNoiseReduction, inputAudioTranscription=$inputAudioTranscription, modalities=$modalities, turnDetection=$turnDetection, additionalProperties=$additionalProperties}" - } - - /** Configuration options for the generated client secret. */ - class ClientSecret - private constructor( - private val expiresAt: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("expires_at") - @ExcludeMissing - expiresAt: JsonField = JsonMissing.of() - ) : this(expiresAt, mutableMapOf()) - - /** - * Configuration for the ephemeral token expiration. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun expiresAt(): Optional = expiresAt.getOptional("expires_at") - - /** - * Returns the raw JSON value of [expiresAt]. - * - * Unlike [expiresAt], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("expires_at") - @ExcludeMissing - fun _expiresAt(): JsonField = expiresAt - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [ClientSecret]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ClientSecret]. */ - class Builder internal constructor() { - - private var expiresAt: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(clientSecret: ClientSecret) = apply { - expiresAt = clientSecret.expiresAt - additionalProperties = clientSecret.additionalProperties.toMutableMap() - } - - /** Configuration for the ephemeral token expiration. */ - fun expiresAt(expiresAt: ExpiresAt) = expiresAt(JsonField.of(expiresAt)) - - /** - * Sets [Builder.expiresAt] to an arbitrary JSON value. - * - * You should usually call [Builder.expiresAt] with a well-typed [ExpiresAt] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun expiresAt(expiresAt: JsonField) = apply { this.expiresAt = expiresAt } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ClientSecret]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): ClientSecret = ClientSecret(expiresAt, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): ClientSecret = apply { - if (validated) { - return@apply - } - - expiresAt().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = (expiresAt.asKnown().getOrNull()?.validity() ?: 0) - - /** Configuration for the ephemeral token expiration. */ - class ExpiresAt - private constructor( - private val anchor: JsonField, - private val seconds: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("anchor") - @ExcludeMissing - anchor: JsonField = JsonMissing.of(), - @JsonProperty("seconds") @ExcludeMissing seconds: JsonField = JsonMissing.of(), - ) : this(anchor, seconds, mutableMapOf()) - - /** - * The anchor point for the ephemeral token expiration. Only `created_at` is currently - * supported. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun anchor(): Optional = anchor.getOptional("anchor") - - /** - * The number of seconds from the anchor point to the expiration. Select a value between - * `10` and `7200`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if - * the server responded with an unexpected value). - */ - fun seconds(): Optional = seconds.getOptional("seconds") - - /** - * Returns the raw JSON value of [anchor]. - * - * Unlike [anchor], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("anchor") @ExcludeMissing fun _anchor(): JsonField = anchor - - /** - * Returns the raw JSON value of [seconds]. - * - * Unlike [seconds], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("seconds") @ExcludeMissing fun _seconds(): JsonField = seconds - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [ExpiresAt]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [ExpiresAt]. */ - class Builder internal constructor() { - - private var anchor: JsonField = JsonMissing.of() - private var seconds: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(expiresAt: ExpiresAt) = apply { - anchor = expiresAt.anchor - seconds = expiresAt.seconds - additionalProperties = expiresAt.additionalProperties.toMutableMap() - } - - /** - * The anchor point for the ephemeral token expiration. Only `created_at` is - * currently supported. - */ - fun anchor(anchor: Anchor) = anchor(JsonField.of(anchor)) - - /** - * Sets [Builder.anchor] to an arbitrary JSON value. - * - * You should usually call [Builder.anchor] with a well-typed [Anchor] value - * instead. This method is primarily for setting the field to an undocumented or not - * yet supported value. - */ - fun anchor(anchor: JsonField) = apply { this.anchor = anchor } - - /** - * The number of seconds from the anchor point to the expiration. Select a value - * between `10` and `7200`. - */ - fun seconds(seconds: Long) = seconds(JsonField.of(seconds)) - - /** - * Sets [Builder.seconds] to an arbitrary JSON value. - * - * You should usually call [Builder.seconds] with a well-typed [Long] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun seconds(seconds: JsonField) = apply { this.seconds = seconds } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = - apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { - additionalProperties.remove(key) - } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [ExpiresAt]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): ExpiresAt = - ExpiresAt(anchor, seconds, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): ExpiresAt = apply { - if (validated) { - return@apply - } - - anchor().ifPresent { it.validate() } - seconds() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (anchor.asKnown().getOrNull()?.validity() ?: 0) + - (if (seconds.asKnown().isPresent) 1 else 0) - - /** - * The anchor point for the ephemeral token expiration. Only `created_at` is currently - * supported. - */ - class Anchor @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that - * doesn't match any known member, and you want to know that value. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val CREATED_AT = of("created_at") - - @JvmStatic fun of(value: String) = Anchor(JsonField.of(value)) - } - - /** An enum containing [Anchor]'s known values. */ - enum class Known { - CREATED_AT - } - - /** - * An enum containing [Anchor]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Anchor] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, - * if the SDK is on an older version than the API, then the API may respond with - * new members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - CREATED_AT, - /** - * An enum member indicating that [Anchor] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if - * you want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - CREATED_AT -> Value.CREATED_AT - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a - * known member. - */ - fun known(): Known = - when (this) { - CREATED_AT -> Known.CREATED_AT - else -> throw OpenAIInvalidDataException("Unknown Anchor: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have - * the expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Anchor = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Anchor && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ExpiresAt && - anchor == other.anchor && - seconds == other.seconds && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(anchor, seconds, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ExpiresAt{anchor=$anchor, seconds=$seconds, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is ClientSecret && - expiresAt == other.expiresAt && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(expiresAt, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "ClientSecret{expiresAt=$expiresAt, additionalProperties=$additionalProperties}" - } - - /** - * The format of input audio. Options are `pcm16`, `g711_ulaw`, or `g711_alaw`. For `pcm16`, - * input audio must be 16-bit PCM at a 24kHz sample rate, single channel (mono), and - * little-endian byte order. - */ - class InputAudioFormat @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val PCM16 = of("pcm16") - - @JvmField val G711_ULAW = of("g711_ulaw") - - @JvmField val G711_ALAW = of("g711_alaw") - - @JvmStatic fun of(value: String) = InputAudioFormat(JsonField.of(value)) - } - - /** An enum containing [InputAudioFormat]'s known values. */ - enum class Known { - PCM16, - G711_ULAW, - G711_ALAW, - } - - /** - * An enum containing [InputAudioFormat]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [InputAudioFormat] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - PCM16, - G711_ULAW, - G711_ALAW, - /** - * An enum member indicating that [InputAudioFormat] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - PCM16 -> Value.PCM16 - G711_ULAW -> Value.G711_ULAW - G711_ALAW -> Value.G711_ALAW - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - PCM16 -> Known.PCM16 - G711_ULAW -> Known.G711_ULAW - G711_ALAW -> Known.G711_ALAW - else -> throw OpenAIInvalidDataException("Unknown InputAudioFormat: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): InputAudioFormat = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioFormat && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * Configuration for input audio noise reduction. This can be set to `null` to turn off. Noise - * reduction filters audio added to the input audio buffer before it is sent to VAD and the - * model. Filtering the audio can improve VAD and turn detection accuracy (reducing false - * positives) and model performance by improving perception of the input audio. - */ - class InputAudioNoiseReduction - private constructor( - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of() - ) : this(type, mutableMapOf()) - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference room - * microphones. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [InputAudioNoiseReduction]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioNoiseReduction]. */ - class Builder internal constructor() { - - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioNoiseReduction: InputAudioNoiseReduction) = apply { - type = inputAudioNoiseReduction.type - additionalProperties = inputAudioNoiseReduction.additionalProperties.toMutableMap() - } - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference - * room microphones. - */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioNoiseReduction]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioNoiseReduction = - InputAudioNoiseReduction(type, additionalProperties.toMutableMap()) - } - - private var validated: Boolean = false - - fun validate(): InputAudioNoiseReduction = apply { - if (validated) { - return@apply - } - - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = (type.asKnown().getOrNull()?.validity() ?: 0) - - /** - * Type of noise reduction. `near_field` is for close-talking microphones such as - * headphones, `far_field` is for far-field microphones such as laptop or conference room - * microphones. - */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val NEAR_FIELD = of("near_field") - - @JvmField val FAR_FIELD = of("far_field") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - NEAR_FIELD, - FAR_FIELD, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - NEAR_FIELD, - FAR_FIELD, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - NEAR_FIELD -> Value.NEAR_FIELD - FAR_FIELD -> Value.FAR_FIELD - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - NEAR_FIELD -> Known.NEAR_FIELD - FAR_FIELD -> Known.FAR_FIELD - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioNoiseReduction && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { Objects.hash(type, additionalProperties) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioNoiseReduction{type=$type, additionalProperties=$additionalProperties}" - } - - /** - * Configuration for input audio transcription. The client can optionally set the language and - * prompt for transcription, these offer additional guidance to the transcription service. - */ - class InputAudioTranscription - private constructor( - private val language: JsonField, - private val model: JsonField, - private val prompt: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("language") - @ExcludeMissing - language: JsonField = JsonMissing.of(), - @JsonProperty("model") @ExcludeMissing model: JsonField = JsonMissing.of(), - @JsonProperty("prompt") @ExcludeMissing prompt: JsonField = JsonMissing.of(), - ) : this(language, model, prompt, mutableMapOf()) - - /** - * The language of the input audio. Supplying the input language in - * [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`) format - * will improve accuracy and latency. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun language(): Optional = language.getOptional("language") - - /** - * The model to use for transcription, current options are `gpt-4o-transcribe`, - * `gpt-4o-mini-transcribe`, and `whisper-1`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun model(): Optional = model.getOptional("model") - - /** - * An optional text to guide the model's style or continue a previous audio segment. For - * `whisper-1`, the - * [prompt is a list of keywords](https://platform.openai.com/docs/guides/speech-to-text#prompting). - * For `gpt-4o-transcribe` models, the prompt is a free text string, for example "expect - * words related to technology". - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun prompt(): Optional = prompt.getOptional("prompt") - - /** - * Returns the raw JSON value of [language]. - * - * Unlike [language], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("language") @ExcludeMissing fun _language(): JsonField = language - - /** - * Returns the raw JSON value of [model]. - * - * Unlike [model], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("model") @ExcludeMissing fun _model(): JsonField = model - - /** - * Returns the raw JSON value of [prompt]. - * - * Unlike [prompt], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("prompt") @ExcludeMissing fun _prompt(): JsonField = prompt - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** - * Returns a mutable builder for constructing an instance of [InputAudioTranscription]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [InputAudioTranscription]. */ - class Builder internal constructor() { - - private var language: JsonField = JsonMissing.of() - private var model: JsonField = JsonMissing.of() - private var prompt: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(inputAudioTranscription: InputAudioTranscription) = apply { - language = inputAudioTranscription.language - model = inputAudioTranscription.model - prompt = inputAudioTranscription.prompt - additionalProperties = inputAudioTranscription.additionalProperties.toMutableMap() - } - - /** - * The language of the input audio. Supplying the input language in - * [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`) format - * will improve accuracy and latency. - */ - fun language(language: String) = language(JsonField.of(language)) - - /** - * Sets [Builder.language] to an arbitrary JSON value. - * - * You should usually call [Builder.language] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun language(language: JsonField) = apply { this.language = language } - - /** - * The model to use for transcription, current options are `gpt-4o-transcribe`, - * `gpt-4o-mini-transcribe`, and `whisper-1`. - */ - fun model(model: Model) = model(JsonField.of(model)) - - /** - * Sets [Builder.model] to an arbitrary JSON value. - * - * You should usually call [Builder.model] with a well-typed [Model] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun model(model: JsonField) = apply { this.model = model } - - /** - * An optional text to guide the model's style or continue a previous audio segment. For - * `whisper-1`, the - * [prompt is a list of keywords](https://platform.openai.com/docs/guides/speech-to-text#prompting). - * For `gpt-4o-transcribe` models, the prompt is a free text string, for example "expect - * words related to technology". - */ - fun prompt(prompt: String) = prompt(JsonField.of(prompt)) - - /** - * Sets [Builder.prompt] to an arbitrary JSON value. - * - * You should usually call [Builder.prompt] with a well-typed [String] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun prompt(prompt: JsonField) = apply { this.prompt = prompt } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [InputAudioTranscription]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): InputAudioTranscription = - InputAudioTranscription( - language, - model, - prompt, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): InputAudioTranscription = apply { - if (validated) { - return@apply - } - - language() - model().ifPresent { it.validate() } - prompt() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (language.asKnown().isPresent) 1 else 0) + - (model.asKnown().getOrNull()?.validity() ?: 0) + - (if (prompt.asKnown().isPresent) 1 else 0) - - /** - * The model to use for transcription, current options are `gpt-4o-transcribe`, - * `gpt-4o-mini-transcribe`, and `whisper-1`. - */ - class Model @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val GPT_4O_TRANSCRIBE = of("gpt-4o-transcribe") - - @JvmField val GPT_4O_MINI_TRANSCRIBE = of("gpt-4o-mini-transcribe") - - @JvmField val WHISPER_1 = of("whisper-1") - - @JvmStatic fun of(value: String) = Model(JsonField.of(value)) - } - - /** An enum containing [Model]'s known values. */ - enum class Known { - GPT_4O_TRANSCRIBE, - GPT_4O_MINI_TRANSCRIBE, - WHISPER_1, - } - - /** - * An enum containing [Model]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Model] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - GPT_4O_TRANSCRIBE, - GPT_4O_MINI_TRANSCRIBE, - WHISPER_1, - /** - * An enum member indicating that [Model] was instantiated with an unknown value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - GPT_4O_TRANSCRIBE -> Value.GPT_4O_TRANSCRIBE - GPT_4O_MINI_TRANSCRIBE -> Value.GPT_4O_MINI_TRANSCRIBE - WHISPER_1 -> Value.WHISPER_1 - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - GPT_4O_TRANSCRIBE -> Known.GPT_4O_TRANSCRIBE - GPT_4O_MINI_TRANSCRIBE -> Known.GPT_4O_MINI_TRANSCRIBE - WHISPER_1 -> Known.WHISPER_1 - else -> throw OpenAIInvalidDataException("Unknown Model: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Model = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Model && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is InputAudioTranscription && - language == other.language && - model == other.model && - prompt == other.prompt && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash(language, model, prompt, additionalProperties) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "InputAudioTranscription{language=$language, model=$model, prompt=$prompt, additionalProperties=$additionalProperties}" - } - - class Modality @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is on an - * older version than the API, then the API may respond with new members that the SDK is - * unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val TEXT = of("text") - - @JvmField val AUDIO = of("audio") - - @JvmStatic fun of(value: String) = Modality(JsonField.of(value)) - } - - /** An enum containing [Modality]'s known values. */ - enum class Known { - TEXT, - AUDIO, - } - - /** - * An enum containing [Modality]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Modality] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if the - * SDK is on an older version than the API, then the API may respond with new members that - * the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - TEXT, - AUDIO, - /** An enum member indicating that [Modality] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN] - * if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you want - * to throw for the unknown case. - */ - fun value(): Value = - when (this) { - TEXT -> Value.TEXT - AUDIO -> Value.AUDIO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and don't - * want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - TEXT -> Known.TEXT - AUDIO -> Known.AUDIO - else -> throw OpenAIInvalidDataException("Unknown Modality: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for debugging - * and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { OpenAIInvalidDataException("Value is not a String") } - - private var validated: Boolean = false - - fun validate(): Modality = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Modality && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** - * Configuration for turn detection, ether Server VAD or Semantic VAD. This can be set to `null` - * to turn off, in which case the client must manually trigger model response. Server VAD means - * that the model will detect the start and end of speech based on audio volume and respond at - * the end of user speech. Semantic VAD is more advanced and uses a turn detection model (in - * conjunction with VAD) to semantically estimate whether the user has finished speaking, then - * dynamically sets a timeout based on this probability. For example, if user audio trails off - * with "uhhm", the model will score a low probability of turn end and wait longer for the user - * to continue speaking. This can be useful for more natural conversations, but may have a - * higher latency. - */ - class TurnDetection - private constructor( - private val createResponse: JsonField, - private val eagerness: JsonField, - private val interruptResponse: JsonField, - private val prefixPaddingMs: JsonField, - private val silenceDurationMs: JsonField, - private val threshold: JsonField, - private val type: JsonField, - private val additionalProperties: MutableMap, - ) { - - @JsonCreator - private constructor( - @JsonProperty("create_response") - @ExcludeMissing - createResponse: JsonField = JsonMissing.of(), - @JsonProperty("eagerness") - @ExcludeMissing - eagerness: JsonField = JsonMissing.of(), - @JsonProperty("interrupt_response") - @ExcludeMissing - interruptResponse: JsonField = JsonMissing.of(), - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - prefixPaddingMs: JsonField = JsonMissing.of(), - @JsonProperty("silence_duration_ms") - @ExcludeMissing - silenceDurationMs: JsonField = JsonMissing.of(), - @JsonProperty("threshold") - @ExcludeMissing - threshold: JsonField = JsonMissing.of(), - @JsonProperty("type") @ExcludeMissing type: JsonField = JsonMissing.of(), - ) : this( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - mutableMapOf(), - ) - - /** - * Whether or not to automatically generate a response when a VAD stop event occurs. Not - * available for transcription sessions. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun createResponse(): Optional = createResponse.getOptional("create_response") - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` will wait - * longer for the user to continue speaking, `high` will respond more quickly. `auto` is the - * default and is equivalent to `medium`. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun eagerness(): Optional = eagerness.getOptional("eagerness") - - /** - * Whether or not to automatically interrupt any ongoing response with output to the default - * conversation (i.e. `conversation` of `auto`) when a VAD start event occurs. Not available - * for transcription sessions. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun interruptResponse(): Optional = - interruptResponse.getOptional("interrupt_response") - - /** - * Used only for `server_vad` mode. Amount of audio to include before the VAD detected - * speech (in milliseconds). Defaults to 300ms. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun prefixPaddingMs(): Optional = prefixPaddingMs.getOptional("prefix_padding_ms") - - /** - * Used only for `server_vad` mode. Duration of silence to detect speech stop (in - * milliseconds). Defaults to 500ms. With shorter values the model will respond more - * quickly, but may jump in on short pauses from the user. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun silenceDurationMs(): Optional = - silenceDurationMs.getOptional("silence_duration_ms") - - /** - * Used only for `server_vad` mode. Activation threshold for VAD (0.0 to 1.0), this defaults - * to 0.5. A higher threshold will require louder audio to activate the model, and thus - * might perform better in noisy environments. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun threshold(): Optional = threshold.getOptional("threshold") - - /** - * Type of turn detection. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the - * server responded with an unexpected value). - */ - fun type(): Optional = type.getOptional("type") - - /** - * Returns the raw JSON value of [createResponse]. - * - * Unlike [createResponse], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("create_response") - @ExcludeMissing - fun _createResponse(): JsonField = createResponse - - /** - * Returns the raw JSON value of [eagerness]. - * - * Unlike [eagerness], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("eagerness") - @ExcludeMissing - fun _eagerness(): JsonField = eagerness - - /** - * Returns the raw JSON value of [interruptResponse]. - * - * Unlike [interruptResponse], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("interrupt_response") - @ExcludeMissing - fun _interruptResponse(): JsonField = interruptResponse - - /** - * Returns the raw JSON value of [prefixPaddingMs]. - * - * Unlike [prefixPaddingMs], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("prefix_padding_ms") - @ExcludeMissing - fun _prefixPaddingMs(): JsonField = prefixPaddingMs - - /** - * Returns the raw JSON value of [silenceDurationMs]. - * - * Unlike [silenceDurationMs], this method doesn't throw if the JSON field has an unexpected - * type. - */ - @JsonProperty("silence_duration_ms") - @ExcludeMissing - fun _silenceDurationMs(): JsonField = silenceDurationMs - - /** - * Returns the raw JSON value of [threshold]. - * - * Unlike [threshold], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("threshold") @ExcludeMissing fun _threshold(): JsonField = threshold - - /** - * Returns the raw JSON value of [type]. - * - * Unlike [type], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("type") @ExcludeMissing fun _type(): JsonField = type - - @JsonAnySetter - private fun putAdditionalProperty(key: String, value: JsonValue) { - additionalProperties.put(key, value) - } - - @JsonAnyGetter - @ExcludeMissing - fun _additionalProperties(): Map = - Collections.unmodifiableMap(additionalProperties) - - fun toBuilder() = Builder().from(this) - - companion object { - - /** Returns a mutable builder for constructing an instance of [TurnDetection]. */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [TurnDetection]. */ - class Builder internal constructor() { - - private var createResponse: JsonField = JsonMissing.of() - private var eagerness: JsonField = JsonMissing.of() - private var interruptResponse: JsonField = JsonMissing.of() - private var prefixPaddingMs: JsonField = JsonMissing.of() - private var silenceDurationMs: JsonField = JsonMissing.of() - private var threshold: JsonField = JsonMissing.of() - private var type: JsonField = JsonMissing.of() - private var additionalProperties: MutableMap = mutableMapOf() - - @JvmSynthetic - internal fun from(turnDetection: TurnDetection) = apply { - createResponse = turnDetection.createResponse - eagerness = turnDetection.eagerness - interruptResponse = turnDetection.interruptResponse - prefixPaddingMs = turnDetection.prefixPaddingMs - silenceDurationMs = turnDetection.silenceDurationMs - threshold = turnDetection.threshold - type = turnDetection.type - additionalProperties = turnDetection.additionalProperties.toMutableMap() - } - - /** - * Whether or not to automatically generate a response when a VAD stop event occurs. Not - * available for transcription sessions. - */ - fun createResponse(createResponse: Boolean) = - createResponse(JsonField.of(createResponse)) - - /** - * Sets [Builder.createResponse] to an arbitrary JSON value. - * - * You should usually call [Builder.createResponse] with a well-typed [Boolean] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun createResponse(createResponse: JsonField) = apply { - this.createResponse = createResponse - } - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` will - * wait longer for the user to continue speaking, `high` will respond more quickly. - * `auto` is the default and is equivalent to `medium`. - */ - fun eagerness(eagerness: Eagerness) = eagerness(JsonField.of(eagerness)) - - /** - * Sets [Builder.eagerness] to an arbitrary JSON value. - * - * You should usually call [Builder.eagerness] with a well-typed [Eagerness] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun eagerness(eagerness: JsonField) = apply { this.eagerness = eagerness } - - /** - * Whether or not to automatically interrupt any ongoing response with output to the - * default conversation (i.e. `conversation` of `auto`) when a VAD start event occurs. - * Not available for transcription sessions. - */ - fun interruptResponse(interruptResponse: Boolean) = - interruptResponse(JsonField.of(interruptResponse)) - - /** - * Sets [Builder.interruptResponse] to an arbitrary JSON value. - * - * You should usually call [Builder.interruptResponse] with a well-typed [Boolean] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun interruptResponse(interruptResponse: JsonField) = apply { - this.interruptResponse = interruptResponse - } - - /** - * Used only for `server_vad` mode. Amount of audio to include before the VAD detected - * speech (in milliseconds). Defaults to 300ms. - */ - fun prefixPaddingMs(prefixPaddingMs: Long) = - prefixPaddingMs(JsonField.of(prefixPaddingMs)) - - /** - * Sets [Builder.prefixPaddingMs] to an arbitrary JSON value. - * - * You should usually call [Builder.prefixPaddingMs] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun prefixPaddingMs(prefixPaddingMs: JsonField) = apply { - this.prefixPaddingMs = prefixPaddingMs - } - - /** - * Used only for `server_vad` mode. Duration of silence to detect speech stop (in - * milliseconds). Defaults to 500ms. With shorter values the model will respond more - * quickly, but may jump in on short pauses from the user. - */ - fun silenceDurationMs(silenceDurationMs: Long) = - silenceDurationMs(JsonField.of(silenceDurationMs)) - - /** - * Sets [Builder.silenceDurationMs] to an arbitrary JSON value. - * - * You should usually call [Builder.silenceDurationMs] with a well-typed [Long] value - * instead. This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun silenceDurationMs(silenceDurationMs: JsonField) = apply { - this.silenceDurationMs = silenceDurationMs - } - - /** - * Used only for `server_vad` mode. Activation threshold for VAD (0.0 to 1.0), this - * defaults to 0.5. A higher threshold will require louder audio to activate the model, - * and thus might perform better in noisy environments. - */ - fun threshold(threshold: Double) = threshold(JsonField.of(threshold)) - - /** - * Sets [Builder.threshold] to an arbitrary JSON value. - * - * You should usually call [Builder.threshold] with a well-typed [Double] value instead. - * This method is primarily for setting the field to an undocumented or not yet - * supported value. - */ - fun threshold(threshold: JsonField) = apply { this.threshold = threshold } - - /** Type of turn detection. */ - fun type(type: Type) = type(JsonField.of(type)) - - /** - * Sets [Builder.type] to an arbitrary JSON value. - * - * You should usually call [Builder.type] with a well-typed [Type] value instead. This - * method is primarily for setting the field to an undocumented or not yet supported - * value. - */ - fun type(type: JsonField) = apply { this.type = type } - - fun additionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.clear() - putAllAdditionalProperties(additionalProperties) - } - - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - additionalProperties.put(key, value) - } - - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - this.additionalProperties.putAll(additionalProperties) - } - - fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) } - - fun removeAllAdditionalProperties(keys: Set) = apply { - keys.forEach(::removeAdditionalProperty) - } - - /** - * Returns an immutable instance of [TurnDetection]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): TurnDetection = - TurnDetection( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - additionalProperties.toMutableMap(), - ) - } - - private var validated: Boolean = false - - fun validate(): TurnDetection = apply { - if (validated) { - return@apply - } - - createResponse() - eagerness().ifPresent { it.validate() } - interruptResponse() - prefixPaddingMs() - silenceDurationMs() - threshold() - type().ifPresent { it.validate() } - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - (if (createResponse.asKnown().isPresent) 1 else 0) + - (eagerness.asKnown().getOrNull()?.validity() ?: 0) + - (if (interruptResponse.asKnown().isPresent) 1 else 0) + - (if (prefixPaddingMs.asKnown().isPresent) 1 else 0) + - (if (silenceDurationMs.asKnown().isPresent) 1 else 0) + - (if (threshold.asKnown().isPresent) 1 else 0) + - (type.asKnown().getOrNull()?.validity() ?: 0) - - /** - * Used only for `semantic_vad` mode. The eagerness of the model to respond. `low` will wait - * longer for the user to continue speaking, `high` will respond more quickly. `auto` is the - * default and is equivalent to `medium`. - */ - class Eagerness @JsonCreator private constructor(private val value: JsonField) : - Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val LOW = of("low") - - @JvmField val MEDIUM = of("medium") - - @JvmField val HIGH = of("high") - - @JvmField val AUTO = of("auto") - - @JvmStatic fun of(value: String) = Eagerness(JsonField.of(value)) - } - - /** An enum containing [Eagerness]'s known values. */ - enum class Known { - LOW, - MEDIUM, - HIGH, - AUTO, - } - - /** - * An enum containing [Eagerness]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Eagerness] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - LOW, - MEDIUM, - HIGH, - AUTO, - /** - * An enum member indicating that [Eagerness] was instantiated with an unknown - * value. - */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - LOW -> Value.LOW - MEDIUM -> Value.MEDIUM - HIGH -> Value.HIGH - AUTO -> Value.AUTO - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - LOW -> Known.LOW - MEDIUM -> Known.MEDIUM - HIGH -> Known.HIGH - AUTO -> Known.AUTO - else -> throw OpenAIInvalidDataException("Unknown Eagerness: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Eagerness = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Eagerness && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - /** Type of turn detection. */ - class Type @JsonCreator private constructor(private val value: JsonField) : Enum { - - /** - * Returns this class instance's raw value. - * - * This is usually only useful if this instance was deserialized from data that doesn't - * match any known member, and you want to know that value. For example, if the SDK is - * on an older version than the API, then the API may respond with new members that the - * SDK is unaware of. - */ - @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value - - companion object { - - @JvmField val SERVER_VAD = of("server_vad") - - @JvmField val SEMANTIC_VAD = of("semantic_vad") - - @JvmStatic fun of(value: String) = Type(JsonField.of(value)) - } - - /** An enum containing [Type]'s known values. */ - enum class Known { - SERVER_VAD, - SEMANTIC_VAD, - } - - /** - * An enum containing [Type]'s known values, as well as an [_UNKNOWN] member. - * - * An instance of [Type] can contain an unknown value in a couple of cases: - * - It was deserialized from data that doesn't match any known member. For example, if - * the SDK is on an older version than the API, then the API may respond with new - * members that the SDK is unaware of. - * - It was constructed with an arbitrary value using the [of] method. - */ - enum class Value { - SERVER_VAD, - SEMANTIC_VAD, - /** An enum member indicating that [Type] was instantiated with an unknown value. */ - _UNKNOWN, - } - - /** - * Returns an enum member corresponding to this class instance's value, or - * [Value._UNKNOWN] if the class was instantiated with an unknown value. - * - * Use the [known] method instead if you're certain the value is always known or if you - * want to throw for the unknown case. - */ - fun value(): Value = - when (this) { - SERVER_VAD -> Value.SERVER_VAD - SEMANTIC_VAD -> Value.SEMANTIC_VAD - else -> Value._UNKNOWN - } - - /** - * Returns an enum member corresponding to this class instance's value. - * - * Use the [value] method instead if you're uncertain the value is always known and - * don't want to throw for the unknown case. - * - * @throws OpenAIInvalidDataException if this class instance's value is a not a known - * member. - */ - fun known(): Known = - when (this) { - SERVER_VAD -> Known.SERVER_VAD - SEMANTIC_VAD -> Known.SEMANTIC_VAD - else -> throw OpenAIInvalidDataException("Unknown Type: $value") - } - - /** - * Returns this class instance's primitive wire representation. - * - * This differs from the [toString] method because that method is primarily for - * debugging and generally doesn't throw. - * - * @throws OpenAIInvalidDataException if this class instance's value does not have the - * expected primitive type. - */ - fun asString(): String = - _value().asString().orElseThrow { - OpenAIInvalidDataException("Value is not a String") - } - - private var validated: Boolean = false - - fun validate(): Type = apply { - if (validated) { - return@apply - } - - known() - validated = true - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object - * recursively. - * - * Used for best match union deserialization. - */ - @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1 - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Type && value == other.value - } - - override fun hashCode() = value.hashCode() - - override fun toString() = value.toString() - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TurnDetection && - createResponse == other.createResponse && - eagerness == other.eagerness && - interruptResponse == other.interruptResponse && - prefixPaddingMs == other.prefixPaddingMs && - silenceDurationMs == other.silenceDurationMs && - threshold == other.threshold && - type == other.type && - additionalProperties == other.additionalProperties - } - - private val hashCode: Int by lazy { - Objects.hash( - createResponse, - eagerness, - interruptResponse, - prefixPaddingMs, - silenceDurationMs, - threshold, - type, - additionalProperties, - ) - } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "TurnDetection{createResponse=$createResponse, eagerness=$eagerness, interruptResponse=$interruptResponse, prefixPaddingMs=$prefixPaddingMs, silenceDurationMs=$silenceDurationMs, threshold=$threshold, type=$type, additionalProperties=$additionalProperties}" - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is TranscriptionSessionCreateParams && - body == other.body && - additionalHeaders == other.additionalHeaders && - additionalQueryParams == other.additionalQueryParams - } - - override fun hashCode(): Int = Objects.hash(body, additionalHeaders, additionalQueryParams) - - override fun toString() = - "TranscriptionSessionCreateParams{body=$body, additionalHeaders=$additionalHeaders, additionalQueryParams=$additionalQueryParams}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParams.kt index 85e0f72c1..600a1400f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParams.kt @@ -19,13 +19,11 @@ import com.openai.core.Enum import com.openai.core.ExcludeMissing import com.openai.core.JsonField import com.openai.core.JsonMissing -import com.openai.core.JsonSchemaLocalValidation import com.openai.core.JsonValue import com.openai.core.Params import com.openai.core.allMaxBy import com.openai.core.checkKnown import com.openai.core.checkRequired -import com.openai.core.functionToolFromClass import com.openai.core.getOrThrow import com.openai.core.http.Headers import com.openai.core.http.QueryParams @@ -1388,6 +1386,32 @@ private constructor( body.prediction(prediction) } + /** + * Alias for calling [prediction] with the following: + * ```java + * ChatCompletionPredictionContent.builder() + * .content(content) + * .build() + * ``` + */ + fun contentPrediction(content: ChatCompletionPredictionContent.Content) = apply { + body.contentPrediction(content) + } + + /** + * Alias for calling [contentPrediction] with + * `ChatCompletionPredictionContent.Content.ofText(text)`. + */ + fun contentPrediction(text: String) = apply { body.contentPrediction(text) } + + /** + * Alias for calling [contentPrediction] with + * `ChatCompletionPredictionContent.Content.ofArrayOfContentParts(arrayOfContentParts)`. + */ + fun contentPredictionOfArrayOfContentParts( + arrayOfContentParts: List + ) = apply { body.contentPredictionOfArrayOfContentParts(arrayOfContentParts) } + /** * Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they * appear in the text so far, increasing the model's likelihood to talk about new topics. @@ -1611,31 +1635,6 @@ private constructor( body.safetyIdentifier(safetyIdentifier) } - /** - * Sets the response format to a JSON schema derived from the structure of the given class. - * This changes the builder to a type-safe [StructuredChatCompletionCreateParams.Builder] - * that will build a [StructuredChatCompletionCreateParams] instance when `build()` is - * called. - * - * @param responseType A class from which a JSON schema will be derived to define the - * response format. - * @param localValidation [com.openai.core.JsonSchemaLocalValidation.YES] (the default) to - * validate the JSON schema locally when it is generated by this method to confirm that it - * adheres to the requirements and restrictions on JSON schemas imposed by the OpenAI - * specification; or [com.openai.core.JsonSchemaLocalValidation.NO] to skip local - * validation and rely only on remote validation. See the SDK documentation for more - * details. - * @throws IllegalArgumentException If local validation is enabled, but it fails because a - * valid JSON schema cannot be derived from the given class. - */ - @JvmOverloads - fun responseFormat( - responseType: Class, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, - ) = - StructuredChatCompletionCreateParams.builder() - .wrap(responseType, this, localValidation) - /** * This feature is in Beta. If specified, our system will make a best effort to sample * deterministically, such that repeated requests with the same `seed` and parameters should @@ -1897,21 +1896,6 @@ private constructor( body.addCustomTool(custom) } - /** - * Adds a single [ChatCompletionTool] to [tools] where the JSON schema describing the - * function parameters is derived from the fields of a given class. Local validation of that - * JSON schema can be performed to check if the schema is likely to pass remote validation - * by the AI model. By default, local validation is enabled; disable it by setting - * [localValidation] to [JsonSchemaLocalValidation.NO]. - * - * @see addTool - */ - @JvmOverloads - fun addTool( - functionParametersType: Class<*>, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, - ) = apply { addTool(functionToolFromClass(functionParametersType, localValidation)) } - /** * An integer between 0 and 20 specifying the maximum number of most likely tokens to return * at each token position, each with an associated log probability. In some cases, the @@ -3854,6 +3838,37 @@ private constructor( this.prediction = prediction } + /** + * Alias for calling [prediction] with the following: + * ```java + * ChatCompletionPredictionContent.builder() + * .content(content) + * .build() + * ``` + */ + fun contentPrediction(content: ChatCompletionPredictionContent.Content) = + prediction(ChatCompletionPredictionContent.builder().content(content).build()) + + /** + * Alias for calling [contentPrediction] with + * `ChatCompletionPredictionContent.Content.ofText(text)`. + */ + fun contentPrediction(text: String) = + contentPrediction(ChatCompletionPredictionContent.Content.ofText(text)) + + /** + * Alias for calling [contentPrediction] with + * `ChatCompletionPredictionContent.Content.ofArrayOfContentParts(arrayOfContentParts)`. + */ + fun contentPredictionOfArrayOfContentParts( + arrayOfContentParts: List + ) = + contentPrediction( + ChatCompletionPredictionContent.Content.ofArrayOfContentParts( + arrayOfContentParts + ) + ) + /** * Number between -2.0 and 2.0. Positive values penalize new tokens based on whether * they appear in the text so far, increasing the model's likelihood to talk about new diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageFunctionToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageFunctionToolCall.kt index 3ebf99940..7dd878b13 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageFunctionToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageFunctionToolCall.kt @@ -11,7 +11,6 @@ import com.openai.core.JsonField import com.openai.core.JsonMissing import com.openai.core.JsonValue import com.openai.core.checkRequired -import com.openai.core.responseTypeFromJson import com.openai.errors.OpenAIInvalidDataException import java.util.Collections import java.util.Objects @@ -273,22 +272,6 @@ private constructor( */ fun arguments(): String = arguments.getRequired("arguments") - /** - * Gets the arguments to the function call, converting the values from the model in JSON - * format to an instance of a class that holds those values. The class must previously have - * been used to define the JSON schema for the function definition's parameters, so that the - * JSON corresponds to the structure of the given class. - * - * @throws OpenAIInvalidDataException If the JSON data is missing, `null`, or cannot be - * parsed to an instance of the [functionParametersType] class. This might occur if the - * class is not the same as the class that was originally used to define the arguments, or - * if the data from the AI model is invalid or incomplete (e.g., truncated). - * @see ChatCompletionCreateParams.Builder.addTool - * @see arguments - */ - fun arguments(functionParametersType: Class): T = - responseTypeFromJson(arguments(), functionParametersType) - /** * The name of the function to call. * diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionToolMessageParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionToolMessageParam.kt index 7964135c4..d00de5c34 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionToolMessageParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionToolMessageParam.kt @@ -23,7 +23,6 @@ import com.openai.core.allMaxBy import com.openai.core.checkRequired import com.openai.core.getOrThrow import com.openai.core.toImmutable -import com.openai.core.toJsonString import com.openai.errors.OpenAIInvalidDataException import java.util.Collections import java.util.Objects @@ -149,14 +148,6 @@ private constructor( /** Alias for calling [content] with `Content.ofText(text)`. */ fun content(text: String) = content(Content.ofText(text)) - /** - * Sets the content to text representing the JSON serialized form of a given object. This is - * useful when passing data that is the result of a function call. - * - * @see content - */ - fun contentAsJson(functionResult: Any) = content(toJsonString(functionResult)) - /** * Alias for calling [content] with `Content.ofArrayOfContentParts(arrayOfContentParts)`. */ diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletion.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletion.kt deleted file mode 100644 index 244089384..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletion.kt +++ /dev/null @@ -1,182 +0,0 @@ -package com.openai.models.chat.completions - -import com.openai.core.JsonField -import com.openai.core.JsonValue -import com.openai.errors.OpenAIInvalidDataException -import com.openai.models.chat.completions.ChatCompletion.Choice.FinishReason -import com.openai.models.chat.completions.ChatCompletion.Choice.Logprobs -import com.openai.models.chat.completions.ChatCompletion.ServiceTier -import com.openai.models.completions.CompletionUsage -import java.util.Objects -import java.util.Optional - -/** - * A wrapper for [ChatCompletion] that provides type-safe access to the [choices] when using the - * _Structured Outputs_ feature to deserialize a JSON response to an instance of an arbitrary class. - * See the SDK documentation for more details on _Structured Outputs_. - * - * @param T The type of the class to which the JSON data in the response will be deserialized. - */ -class StructuredChatCompletion( - @get:JvmName("responseType") val responseType: Class, - @get:JvmName("rawChatCompletion") val rawChatCompletion: ChatCompletion, -) { - /** @see ChatCompletion.id */ - fun id(): String = rawChatCompletion.id() - - private val choices by lazy { - rawChatCompletion._choices().map { choices -> choices.map { Choice(responseType, it) } } - } - - /** @see ChatCompletion.choices */ - fun choices(): List> = choices.getRequired("choices") - - /** @see ChatCompletion.created */ - fun created(): Long = rawChatCompletion.created() - - /** @see ChatCompletion.model */ - fun model(): String = rawChatCompletion.model() - - /** @see ChatCompletion.moderation */ - fun moderation(): Optional = rawChatCompletion.moderation() - - /** @see ChatCompletion._object_ */ - fun _object_(): JsonValue = rawChatCompletion._object_() - - /** @see ChatCompletion.serviceTier */ - fun serviceTier(): Optional = rawChatCompletion.serviceTier() - - /** @see ChatCompletion.systemFingerprint */ - fun systemFingerprint(): Optional = rawChatCompletion.systemFingerprint() - - /** @see ChatCompletion.usage */ - fun usage(): Optional = rawChatCompletion.usage() - - /** @see ChatCompletion._id */ - fun _id(): JsonField = rawChatCompletion._id() - - /** @see ChatCompletion._choices */ - fun _choices(): JsonField>> = choices - - /** @see ChatCompletion._created */ - fun _created(): JsonField = rawChatCompletion._created() - - /** @see ChatCompletion._model */ - fun _model(): JsonField = rawChatCompletion._model() - - /** @see ChatCompletion._moderation */ - fun _moderation(): JsonField = rawChatCompletion._moderation() - - /** @see ChatCompletion._serviceTier */ - fun _serviceTier(): JsonField = rawChatCompletion._serviceTier() - - /** @see ChatCompletion._systemFingerprint */ - fun _systemFingerprint(): JsonField = rawChatCompletion._systemFingerprint() - - /** @see ChatCompletion._usage */ - fun _usage(): JsonField = rawChatCompletion._usage() - - /** @see ChatCompletion._additionalProperties */ - fun _additionalProperties(): Map = rawChatCompletion._additionalProperties() - - class Choice - internal constructor( - @get:JvmName("responseType") val responseType: Class, - @get:JvmName("rawChoice") val rawChoice: ChatCompletion.Choice, - ) { - /** @see ChatCompletion.Choice.finishReason */ - fun finishReason(): FinishReason = rawChoice.finishReason() - - /** @see ChatCompletion.Choice.index */ - fun index(): Long = rawChoice.index() - - /** @see ChatCompletion.Choice.logprobs */ - fun logprobs(): Optional = rawChoice.logprobs() - - /** @see ChatCompletion.Choice._finishReason */ - fun _finishReason(): JsonField = rawChoice._finishReason() - - private val message by lazy { - rawChoice._message().map { StructuredChatCompletionMessage(responseType, it) } - } - - /** @see ChatCompletion.Choice.message */ - fun message(): StructuredChatCompletionMessage = message.getRequired("message") - - /** @see ChatCompletion.Choice._index */ - fun _index(): JsonField = rawChoice._index() - - /** @see ChatCompletion.Choice._logprobs */ - fun _logprobs(): JsonField = rawChoice._logprobs() - - /** @see ChatCompletion.Choice._message */ - fun _message(): JsonField> = message - - /** @see ChatCompletion.Choice._additionalProperties */ - fun _additionalProperties(): Map = rawChoice._additionalProperties() - - /** @see ChatCompletion.Choice.validate */ - fun validate(): Choice = apply { - message().validate() - rawChoice.validate() - } - - /** @see ChatCompletion.Choice.isValid */ - fun isValid(): Boolean = - try { - validate() - true - } catch (_: OpenAIInvalidDataException) { - false - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Choice<*> && - responseType == other.responseType && - rawChoice == other.rawChoice - } - - private val hashCode: Int by lazy { Objects.hash(responseType, rawChoice) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "${javaClass.simpleName}{responseType=$responseType, rawChoice=$rawChoice}" - } - - /** @see ChatCompletion.validate */ - fun validate() = apply { - choices().forEach { it.validate() } - rawChatCompletion.validate() - } - - /** @see ChatCompletion.isValid */ - fun isValid(): Boolean = - try { - validate() - true - } catch (_: OpenAIInvalidDataException) { - false - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is StructuredChatCompletion<*> && - responseType == other.responseType && - rawChatCompletion == other.rawChatCompletion - } - - private val hashCode: Int by lazy { Objects.hash(responseType, rawChatCompletion) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "${javaClass.simpleName}{responseType=$responseType, rawChatCompletion=$rawChatCompletion}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletionCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletionCreateParams.kt deleted file mode 100644 index cbc9e136c..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletionCreateParams.kt +++ /dev/null @@ -1,914 +0,0 @@ -package com.openai.models.chat.completions - -import com.openai.core.JsonField -import com.openai.core.JsonSchemaLocalValidation -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.core.http.Headers -import com.openai.core.http.QueryParams -import com.openai.core.responseFormatFromClass -import com.openai.models.ChatModel -import com.openai.models.ReasoningEffort -import com.openai.models.ResponseFormatJsonSchema -import java.util.Objects -import java.util.Optional - -/** - * A wrapper for [ChatCompletionCreateParams] that provides a type-safe [Builder] that can record - * the [responseType] used to derive a JSON schema from an arbitrary class when using the - * _Structured Outputs_ feature. When a JSON response is received, it is deserialized to an instance - * of that type. See the SDK documentation for more details on _Structured Outputs_. - * - * @param T The type of the class that will be used to derive the JSON schema in the request and to - * which the JSON response will be deserialized. - */ -class StructuredChatCompletionCreateParams -internal constructor( - @get:JvmName("responseType") val responseType: Class, - /** - * The raw, underlying chat completion create parameters wrapped by this structured instance of - * the parameters. - */ - @get:JvmName("rawParams") val rawParams: ChatCompletionCreateParams, -) { - - companion object { - @JvmStatic fun builder() = Builder() - } - - class Builder internal constructor() { - private var responseType: Class? = null - private var paramsBuilder = ChatCompletionCreateParams.builder() - - @JvmSynthetic - internal fun wrap( - responseType: Class, - paramsBuilder: ChatCompletionCreateParams.Builder, - localValidation: JsonSchemaLocalValidation, - ) = apply { - this.responseType = responseType - this.paramsBuilder = paramsBuilder - // Convert the class to a JSON schema and apply it to the delegate `Builder`. - responseFormat(responseType, localValidation) - } - - /** Injects a given `ChatCompletionCreateParams.Builder`. For use only when testing. */ - @JvmSynthetic - internal fun inject(paramsBuilder: ChatCompletionCreateParams.Builder) = apply { - this.paramsBuilder = paramsBuilder - } - - /** @see ChatCompletionCreateParams.Builder.body */ - fun body(body: ChatCompletionCreateParams.Body) = apply { paramsBuilder.body(body) } - - /** @see ChatCompletionCreateParams.Builder.messages */ - fun messages(messages: List) = apply { - paramsBuilder.messages(messages) - } - - /** @see ChatCompletionCreateParams.Builder.messages */ - fun messages(messages: JsonField>) = apply { - paramsBuilder.messages(messages) - } - - /** @see ChatCompletionCreateParams.Builder.addMessage */ - fun addMessage(message: ChatCompletionMessageParam) = apply { - paramsBuilder.addMessage(message) - } - - /** @see ChatCompletionCreateParams.Builder.addMessage */ - fun addMessage(developer: ChatCompletionDeveloperMessageParam) = apply { - paramsBuilder.addMessage(developer) - } - - /** @see ChatCompletionCreateParams.Builder.addDeveloperMessage */ - fun addDeveloperMessage(content: ChatCompletionDeveloperMessageParam.Content) = apply { - paramsBuilder.addDeveloperMessage(content) - } - - /** @see ChatCompletionCreateParams.Builder.addDeveloperMessage */ - fun addDeveloperMessage(text: String) = apply { paramsBuilder.addDeveloperMessage(text) } - - /** @see ChatCompletionCreateParams.Builder.addDeveloperMessageOfArrayOfContentParts */ - fun addDeveloperMessageOfArrayOfContentParts( - arrayOfContentParts: List - ) = apply { paramsBuilder.addDeveloperMessageOfArrayOfContentParts(arrayOfContentParts) } - - /** @see ChatCompletionCreateParams.Builder.addMessage */ - fun addMessage(system: ChatCompletionSystemMessageParam) = apply { - paramsBuilder.addMessage(system) - } - - /** @see ChatCompletionCreateParams.Builder.addSystemMessage */ - fun addSystemMessage(content: ChatCompletionSystemMessageParam.Content) = apply { - paramsBuilder.addSystemMessage(content) - } - - /** @see ChatCompletionCreateParams.Builder.addSystemMessage */ - fun addSystemMessage(text: String) = apply { paramsBuilder.addSystemMessage(text) } - - /** @see ChatCompletionCreateParams.Builder.addSystemMessageOfArrayOfContentParts */ - fun addSystemMessageOfArrayOfContentParts( - arrayOfContentParts: List - ) = apply { paramsBuilder.addSystemMessageOfArrayOfContentParts(arrayOfContentParts) } - - /** @see ChatCompletionCreateParams.Builder.addMessage */ - fun addMessage(user: ChatCompletionUserMessageParam) = apply { - paramsBuilder.addMessage(user) - } - - /** @see ChatCompletionCreateParams.Builder.addUserMessage */ - fun addUserMessage(content: ChatCompletionUserMessageParam.Content) = apply { - paramsBuilder.addUserMessage(content) - } - - /** @see ChatCompletionCreateParams.Builder.addUserMessage */ - fun addUserMessage(text: String) = apply { paramsBuilder.addUserMessage(text) } - - /** @see ChatCompletionCreateParams.Builder.addUserMessageOfArrayOfContentParts */ - fun addUserMessageOfArrayOfContentParts( - arrayOfContentParts: List - ) = apply { paramsBuilder.addUserMessageOfArrayOfContentParts(arrayOfContentParts) } - - /** @see ChatCompletionCreateParams.Builder.addMessage */ - fun addMessage(assistant: ChatCompletionAssistantMessageParam) = apply { - paramsBuilder.addMessage(assistant) - } - - /** @see ChatCompletionCreateParams.Builder.addMessage */ - fun addMessage(assistant: ChatCompletionMessage) = apply { - paramsBuilder.addMessage(assistant) - } - - /** @see ChatCompletionCreateParams.Builder.addAssistantMessage */ - fun addAssistantMessage(content: ChatCompletionAssistantMessageParam.Content?) = apply { - paramsBuilder.addAssistantMessage(content) - } - - /** @see ChatCompletionCreateParams.Builder.addAssistantMessage */ - fun addAssistantMessage(content: Optional) = - apply { - paramsBuilder.addAssistantMessage(content) - } - - /** @see ChatCompletionCreateParams.Builder.addAssistantMessage */ - fun addAssistantMessage(text: String) = apply { paramsBuilder.addAssistantMessage(text) } - - /** @see ChatCompletionCreateParams.Builder.addAssistantMessageOfArrayOfContentParts */ - fun addAssistantMessageOfArrayOfContentParts( - arrayOfContentParts: - List< - ChatCompletionAssistantMessageParam.Content.ChatCompletionRequestAssistantMessageContentPart - > - ) = apply { paramsBuilder.addAssistantMessageOfArrayOfContentParts(arrayOfContentParts) } - - /** @see ChatCompletionCreateParams.Builder.addMessage */ - fun addMessage(tool: ChatCompletionToolMessageParam) = apply { - paramsBuilder.addMessage(tool) - } - - /** @see ChatCompletionCreateParams.Builder.addMessage */ - @Deprecated("deprecated") - fun addMessage(function: ChatCompletionFunctionMessageParam) = apply { - paramsBuilder.addMessage(function) - } - - /** @see ChatCompletionCreateParams.Builder.model */ - fun model(model: ChatModel) = apply { paramsBuilder.model(model) } - - /** @see ChatCompletionCreateParams.Builder.model */ - fun model(model: JsonField) = apply { paramsBuilder.model(model) } - - /** @see ChatCompletionCreateParams.Builder.model */ - fun model(value: String) = apply { paramsBuilder.model(value) } - - /** @see ChatCompletionCreateParams.Builder.audio */ - fun audio(audio: ChatCompletionAudioParam?) = apply { paramsBuilder.audio(audio) } - - /** @see ChatCompletionCreateParams.Builder.audio */ - fun audio(audio: Optional) = apply { paramsBuilder.audio(audio) } - - /** @see ChatCompletionCreateParams.Builder.audio */ - fun audio(audio: JsonField) = apply { paramsBuilder.audio(audio) } - - /** @see ChatCompletionCreateParams.Builder.frequencyPenalty */ - fun frequencyPenalty(frequencyPenalty: Double?) = apply { - paramsBuilder.frequencyPenalty(frequencyPenalty) - } - - /** @see ChatCompletionCreateParams.Builder.frequencyPenalty */ - fun frequencyPenalty(frequencyPenalty: Double) = apply { - paramsBuilder.frequencyPenalty(frequencyPenalty) - } - - /** @see ChatCompletionCreateParams.Builder.frequencyPenalty */ - fun frequencyPenalty(frequencyPenalty: Optional) = apply { - paramsBuilder.frequencyPenalty(frequencyPenalty) - } - - /** @see ChatCompletionCreateParams.Builder.frequencyPenalty */ - fun frequencyPenalty(frequencyPenalty: JsonField) = apply { - paramsBuilder.frequencyPenalty(frequencyPenalty) - } - - /** @see ChatCompletionCreateParams.Builder.functionCall */ - @Deprecated("deprecated") - fun functionCall(functionCall: ChatCompletionCreateParams.FunctionCall) = apply { - paramsBuilder.functionCall(functionCall) - } - - /** @see ChatCompletionCreateParams.Builder.functionCall */ - @Deprecated("deprecated") - fun functionCall(functionCall: JsonField) = apply { - paramsBuilder.functionCall(functionCall) - } - - /** @see ChatCompletionCreateParams.Builder.functionCall */ - @Deprecated("deprecated") - fun functionCall(mode: ChatCompletionCreateParams.FunctionCall.FunctionCallMode) = apply { - paramsBuilder.functionCall(mode) - } - - /** @see ChatCompletionCreateParams.Builder.functionCall */ - @Deprecated("deprecated") - fun functionCall(functionCallOption: ChatCompletionFunctionCallOption) = apply { - paramsBuilder.functionCall(functionCallOption) - } - - /** @see ChatCompletionCreateParams.Builder.functions */ - @Deprecated("deprecated") - fun functions(functions: List) = apply { - paramsBuilder.functions(functions) - } - - /** @see ChatCompletionCreateParams.Builder.functions */ - @Deprecated("deprecated") - fun functions(functions: JsonField>) = apply { - paramsBuilder.functions(functions) - } - - /** @see ChatCompletionCreateParams.Builder.addFunction */ - @Deprecated("deprecated") - fun addFunction(function: ChatCompletionCreateParams.Function) = apply { - paramsBuilder.addFunction(function) - } - - /** @see ChatCompletionCreateParams.Builder.logitBias */ - fun logitBias(logitBias: ChatCompletionCreateParams.LogitBias?) = apply { - paramsBuilder.logitBias(logitBias) - } - - /** @see ChatCompletionCreateParams.Builder.logitBias */ - fun logitBias(logitBias: Optional) = apply { - paramsBuilder.logitBias(logitBias) - } - - /** @see ChatCompletionCreateParams.Builder.logitBias */ - fun logitBias(logitBias: JsonField) = apply { - paramsBuilder.logitBias(logitBias) - } - - /** @see ChatCompletionCreateParams.Builder.logprobs */ - fun logprobs(logprobs: Boolean?) = apply { paramsBuilder.logprobs(logprobs) } - - /** @see ChatCompletionCreateParams.Builder.logprobs */ - fun logprobs(logprobs: Boolean) = apply { paramsBuilder.logprobs(logprobs) } - - /** @see ChatCompletionCreateParams.Builder.logprobs */ - fun logprobs(logprobs: Optional) = apply { paramsBuilder.logprobs(logprobs) } - - /** @see ChatCompletionCreateParams.Builder.logprobs */ - fun logprobs(logprobs: JsonField) = apply { paramsBuilder.logprobs(logprobs) } - - /** @see ChatCompletionCreateParams.Builder.maxCompletionTokens */ - fun maxCompletionTokens(maxCompletionTokens: Long?) = apply { - paramsBuilder.maxCompletionTokens(maxCompletionTokens) - } - - /** @see ChatCompletionCreateParams.Builder.maxCompletionTokens */ - fun maxCompletionTokens(maxCompletionTokens: Long) = apply { - paramsBuilder.maxCompletionTokens(maxCompletionTokens) - } - - /** @see ChatCompletionCreateParams.Builder.maxCompletionTokens */ - fun maxCompletionTokens(maxCompletionTokens: Optional) = apply { - paramsBuilder.maxCompletionTokens(maxCompletionTokens) - } - - /** @see ChatCompletionCreateParams.Builder.maxCompletionTokens */ - fun maxCompletionTokens(maxCompletionTokens: JsonField) = apply { - paramsBuilder.maxCompletionTokens(maxCompletionTokens) - } - - /** @see ChatCompletionCreateParams.Builder.maxTokens */ - @Deprecated("deprecated") - fun maxTokens(maxTokens: Long?) = apply { paramsBuilder.maxTokens(maxTokens) } - - /** @see ChatCompletionCreateParams.Builder.maxTokens */ - @Deprecated("deprecated") - fun maxTokens(maxTokens: Long) = apply { paramsBuilder.maxTokens(maxTokens) } - - /** @see ChatCompletionCreateParams.Builder.maxTokens */ - @Deprecated("deprecated") - fun maxTokens(maxTokens: Optional) = apply { paramsBuilder.maxTokens(maxTokens) } - - /** @see ChatCompletionCreateParams.Builder.maxTokens */ - @Deprecated("deprecated") - fun maxTokens(maxTokens: JsonField) = apply { paramsBuilder.maxTokens(maxTokens) } - - /** @see ChatCompletionCreateParams.Builder.metadata */ - fun metadata(metadata: ChatCompletionCreateParams.Metadata?) = apply { - paramsBuilder.metadata(metadata) - } - - /** @see ChatCompletionCreateParams.Builder.metadata */ - fun metadata(metadata: Optional) = apply { - paramsBuilder.metadata(metadata) - } - - /** @see ChatCompletionCreateParams.Builder.metadata */ - fun metadata(metadata: JsonField) = apply { - paramsBuilder.metadata(metadata) - } - - /** @see ChatCompletionCreateParams.Builder.moderation */ - fun moderation(moderation: ChatCompletionCreateParams.Moderation?) = apply { - paramsBuilder.moderation(moderation) - } - - /** @see ChatCompletionCreateParams.Builder.moderation */ - fun moderation(moderation: Optional) = apply { - paramsBuilder.moderation(moderation) - } - - /** @see ChatCompletionCreateParams.Builder.moderation */ - fun moderation(moderation: JsonField) = apply { - paramsBuilder.moderation(moderation) - } - - /** @see ChatCompletionCreateParams.Builder.modalities */ - fun modalities(modalities: List?) = apply { - paramsBuilder.modalities(modalities) - } - - /** @see ChatCompletionCreateParams.Builder.modalities */ - fun modalities(modalities: Optional>) = apply { - paramsBuilder.modalities(modalities) - } - - /** @see ChatCompletionCreateParams.Builder.modalities */ - fun modalities(modalities: JsonField>) = apply { - paramsBuilder.modalities(modalities) - } - - /** @see ChatCompletionCreateParams.Builder.addModality */ - fun addModality(modality: ChatCompletionCreateParams.Modality) = apply { - paramsBuilder.addModality(modality) - } - - /** @see ChatCompletionCreateParams.Builder.n */ - fun n(n: Long?) = apply { paramsBuilder.n(n) } - - /** @see ChatCompletionCreateParams.Builder.n */ - fun n(n: Long) = apply { paramsBuilder.n(n) } - - /** @see ChatCompletionCreateParams.Builder.n */ - fun n(n: Optional) = apply { paramsBuilder.n(n) } - - /** @see ChatCompletionCreateParams.Builder.n */ - fun n(n: JsonField) = apply { paramsBuilder.n(n) } - - /** @see ChatCompletionCreateParams.Builder.parallelToolCalls */ - fun parallelToolCalls(parallelToolCalls: Boolean) = apply { - paramsBuilder.parallelToolCalls(parallelToolCalls) - } - - /** @see ChatCompletionCreateParams.Builder.parallelToolCalls */ - fun parallelToolCalls(parallelToolCalls: JsonField) = apply { - paramsBuilder.parallelToolCalls(parallelToolCalls) - } - - /** @see ChatCompletionCreateParams.Builder.prediction */ - fun prediction(prediction: ChatCompletionPredictionContent?) = apply { - paramsBuilder.prediction(prediction) - } - - /** @see ChatCompletionCreateParams.Builder.prediction */ - fun prediction(prediction: Optional) = apply { - paramsBuilder.prediction(prediction) - } - - /** @see ChatCompletionCreateParams.Builder.prediction */ - fun prediction(prediction: JsonField) = apply { - paramsBuilder.prediction(prediction) - } - - /** @see ChatCompletionCreateParams.Builder.promptCacheKey */ - fun promptCacheKey(promptCacheKey: String) = apply { - paramsBuilder.promptCacheKey(promptCacheKey) - } - - /** @see ChatCompletionCreateParams.Builder.promptCacheKey */ - fun promptCacheKey(promptCacheKey: Optional) = apply { - paramsBuilder.promptCacheKey(promptCacheKey) - } - - /** @see ChatCompletionCreateParams.Builder.promptCacheKey */ - fun promptCacheKey(promptCacheKey: JsonField) = apply { - paramsBuilder.promptCacheKey(promptCacheKey) - } - - /** @see ChatCompletionCreateParams.Builder.promptCacheOptions */ - fun promptCacheOptions(promptCacheOptions: ChatCompletionCreateParams.PromptCacheOptions) = - apply { - paramsBuilder.promptCacheOptions(promptCacheOptions) - } - - /** @see ChatCompletionCreateParams.Builder.promptCacheOptions */ - fun promptCacheOptions( - promptCacheOptions: JsonField - ) = apply { paramsBuilder.promptCacheOptions(promptCacheOptions) } - - /** @see ChatCompletionCreateParams.Builder.promptCacheRetention */ - fun promptCacheRetention( - promptCacheRetention: ChatCompletionCreateParams.PromptCacheRetention? - ) = apply { paramsBuilder.promptCacheRetention(promptCacheRetention) } - - /** @see ChatCompletionCreateParams.Builder.promptCacheRetention */ - fun promptCacheRetention( - promptCacheRetention: Optional - ) = apply { paramsBuilder.promptCacheRetention(promptCacheRetention) } - - /** @see ChatCompletionCreateParams.Builder.promptCacheRetention */ - fun promptCacheRetention( - promptCacheRetention: JsonField - ) = apply { paramsBuilder.promptCacheRetention(promptCacheRetention) } - - /** @see ChatCompletionCreateParams.Builder.presencePenalty */ - fun presencePenalty(presencePenalty: Double?) = apply { - paramsBuilder.presencePenalty(presencePenalty) - } - - /** @see ChatCompletionCreateParams.Builder.presencePenalty */ - fun presencePenalty(presencePenalty: Double) = apply { - paramsBuilder.presencePenalty(presencePenalty) - } - - /** @see ChatCompletionCreateParams.Builder.presencePenalty */ - fun presencePenalty(presencePenalty: Optional) = apply { - paramsBuilder.presencePenalty(presencePenalty) - } - - /** @see ChatCompletionCreateParams.Builder.presencePenalty */ - fun presencePenalty(presencePenalty: JsonField) = apply { - paramsBuilder.presencePenalty(presencePenalty) - } - - /** @see ChatCompletionCreateParams.Builder.reasoningEffort */ - fun reasoningEffort(reasoningEffort: ReasoningEffort?) = apply { - paramsBuilder.reasoningEffort(reasoningEffort) - } - - /** @see ChatCompletionCreateParams.Builder.reasoningEffort */ - fun reasoningEffort(reasoningEffort: Optional) = apply { - paramsBuilder.reasoningEffort(reasoningEffort) - } - - /** @see ChatCompletionCreateParams.Builder.reasoningEffort */ - fun reasoningEffort(reasoningEffort: JsonField) = apply { - paramsBuilder.reasoningEffort(reasoningEffort) - } - - /** @see ChatCompletionCreateParams.Builder.safetyIdentifier */ - fun safetyIdentifier(safetyIdentifier: String) = apply { - paramsBuilder.safetyIdentifier(safetyIdentifier) - } - - /** @see ChatCompletionCreateParams.Builder.safetyIdentifier */ - fun safetyIdentifier(safetyIdentifier: Optional) = apply { - paramsBuilder.safetyIdentifier(safetyIdentifier) - } - - /** @see ChatCompletionCreateParams.Builder.safetyIdentifier */ - fun safetyIdentifier(safetyIdentifier: JsonField) = apply { - paramsBuilder.safetyIdentifier(safetyIdentifier) - } - - /** @see ChatCompletionCreateParams.Builder.jsonSchemaResponseFormat */ - fun jsonSchemaResponseFormat(jsonSchema: ResponseFormatJsonSchema.JsonSchema) = apply { - paramsBuilder.jsonSchemaResponseFormat(jsonSchema) - } - - /** - * Sets the response format to a JSON schema derived from the structure of the given class. - * - * @see ChatCompletionCreateParams.Builder.responseFormat - */ - @JvmOverloads - fun responseFormat( - responseType: Class, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, - ) = apply { - this.responseType = responseType - paramsBuilder.responseFormat(responseFormatFromClass(responseType, localValidation)) - } - - /** @see ChatCompletionCreateParams.Builder.seed */ - fun seed(seed: Long?) = apply { paramsBuilder.seed(seed) } - - /** @see ChatCompletionCreateParams.Builder.seed */ - fun seed(seed: Long) = apply { paramsBuilder.seed(seed) } - - /** @see ChatCompletionCreateParams.Builder.seed */ - fun seed(seed: Optional) = apply { paramsBuilder.seed(seed) } - - /** @see ChatCompletionCreateParams.Builder.seed */ - fun seed(seed: JsonField) = apply { paramsBuilder.seed(seed) } - - /** @see ChatCompletionCreateParams.Builder.serviceTier */ - fun serviceTier(serviceTier: ChatCompletionCreateParams.ServiceTier?) = apply { - paramsBuilder.serviceTier(serviceTier) - } - - /** @see ChatCompletionCreateParams.Builder.serviceTier */ - fun serviceTier(serviceTier: Optional) = apply { - paramsBuilder.serviceTier(serviceTier) - } - - /** @see ChatCompletionCreateParams.Builder.serviceTier */ - fun serviceTier(serviceTier: JsonField) = apply { - paramsBuilder.serviceTier(serviceTier) - } - - /** @see ChatCompletionCreateParams.Builder.stop */ - fun stop(stop: ChatCompletionCreateParams.Stop?) = apply { paramsBuilder.stop(stop) } - - /** @see ChatCompletionCreateParams.Builder.stop */ - fun stop(stop: Optional) = apply { - paramsBuilder.stop(stop) - } - - /** @see ChatCompletionCreateParams.Builder.stop */ - fun stop(stop: JsonField) = apply { - paramsBuilder.stop(stop) - } - - /** @see ChatCompletionCreateParams.Builder.stop */ - fun stop(string: String) = apply { paramsBuilder.stop(string) } - - /** @see ChatCompletionCreateParams.Builder.stopOfStrings */ - fun stopOfStrings(strings: List) = apply { paramsBuilder.stopOfStrings(strings) } - - /** @see ChatCompletionCreateParams.Builder.store */ - fun store(store: Boolean?) = apply { paramsBuilder.store(store) } - - /** @see ChatCompletionCreateParams.Builder.store */ - fun store(store: Boolean) = apply { paramsBuilder.store(store) } - - /** @see ChatCompletionCreateParams.Builder.store */ - fun store(store: Optional) = apply { paramsBuilder.store(store) } - - /** @see ChatCompletionCreateParams.Builder.store */ - fun store(store: JsonField) = apply { paramsBuilder.store(store) } - - /** @see ChatCompletionCreateParams.Builder.streamOptions */ - fun streamOptions(streamOptions: ChatCompletionStreamOptions?) = apply { - paramsBuilder.streamOptions(streamOptions) - } - - /** @see ChatCompletionCreateParams.Builder.streamOptions */ - fun streamOptions(streamOptions: Optional) = apply { - paramsBuilder.streamOptions(streamOptions) - } - - /** @see ChatCompletionCreateParams.Builder.streamOptions */ - fun streamOptions(streamOptions: JsonField) = apply { - paramsBuilder.streamOptions(streamOptions) - } - - /** @see ChatCompletionCreateParams.Builder.temperature */ - fun temperature(temperature: Double?) = apply { paramsBuilder.temperature(temperature) } - - /** @see ChatCompletionCreateParams.Builder.temperature */ - fun temperature(temperature: Double) = apply { paramsBuilder.temperature(temperature) } - - /** @see ChatCompletionCreateParams.Builder.temperature */ - fun temperature(temperature: Optional) = apply { - paramsBuilder.temperature(temperature) - } - - /** @see ChatCompletionCreateParams.Builder.temperature */ - fun temperature(temperature: JsonField) = apply { - paramsBuilder.temperature(temperature) - } - - /** @see ChatCompletionCreateParams.Builder.toolChoice */ - fun toolChoice(toolChoice: ChatCompletionToolChoiceOption) = apply { - paramsBuilder.toolChoice(toolChoice) - } - - /** @see ChatCompletionCreateParams.Builder.toolChoice */ - fun toolChoice(toolChoice: JsonField) = apply { - paramsBuilder.toolChoice(toolChoice) - } - - /** @see ChatCompletionCreateParams.Builder.toolChoice */ - fun toolChoice(auto: ChatCompletionToolChoiceOption.Auto) = apply { - paramsBuilder.toolChoice(auto) - } - - /** @see ChatCompletionCreateParams.Builder.toolChoice */ - fun toolChoice(namedToolChoice: ChatCompletionNamedToolChoice) = apply { - paramsBuilder.toolChoice(namedToolChoice) - } - - /** @see ChatCompletionCreateParams.Builder.toolChoice */ - fun toolChoice(allowedToolChoice: ChatCompletionAllowedToolChoice) = apply { - paramsBuilder.toolChoice(allowedToolChoice) - } - - /** @see ChatCompletionCreateParams.Builder.toolChoice */ - fun toolChoice(namedToolChoiceCustom: ChatCompletionNamedToolChoiceCustom) = apply { - paramsBuilder.toolChoice(namedToolChoiceCustom) - } - - /** @see ChatCompletionCreateParams.Builder.tools */ - fun tools(tools: List) = apply { paramsBuilder.tools(tools) } - - /** @see ChatCompletionCreateParams.Builder.tools */ - fun tools(tools: JsonField>) = apply { paramsBuilder.tools(tools) } - - /** @see ChatCompletionCreateParams.Builder.addTool */ - fun addTool(tool: ChatCompletionTool) = apply { paramsBuilder.addTool(tool) } - - /** @see ChatCompletionCreateParams.Builder.addTool */ - fun addTool(function: ChatCompletionFunctionTool) = apply { - paramsBuilder.addTool(function) - } - - /** @see ChatCompletionCreateParams.Builder.addTool */ - fun addTool(custom: ChatCompletionCustomTool) = apply { paramsBuilder.addTool(custom) } - - /** @see ChatCompletionCreateParams.Builder.addFunctionTool */ - fun addFunctionTool(function: com.openai.models.FunctionDefinition) = apply { - paramsBuilder.addFunctionTool(function) - } - - /** @see ChatCompletionCreateParams.Builder.addCustomTool */ - fun addCustomTool(custom: ChatCompletionCustomTool.Custom) = apply { - paramsBuilder.addCustomTool(custom) - } - - /** @see ChatCompletionCreateParams.Builder.addTool */ - @JvmOverloads - fun addTool( - functionParametersType: Class<*>, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, - ) = apply { paramsBuilder.addTool(functionParametersType, localValidation) } - - /** @see ChatCompletionCreateParams.Builder.topLogprobs */ - fun topLogprobs(topLogprobs: Long?) = apply { paramsBuilder.topLogprobs(topLogprobs) } - - /** @see ChatCompletionCreateParams.Builder.topLogprobs */ - fun topLogprobs(topLogprobs: Long) = apply { paramsBuilder.topLogprobs(topLogprobs) } - - /** @see ChatCompletionCreateParams.Builder.topLogprobs */ - fun topLogprobs(topLogprobs: Optional) = apply { - paramsBuilder.topLogprobs(topLogprobs) - } - - /** @see ChatCompletionCreateParams.Builder.topLogprobs */ - fun topLogprobs(topLogprobs: JsonField) = apply { - paramsBuilder.topLogprobs(topLogprobs) - } - - /** @see ChatCompletionCreateParams.Builder.topP */ - fun topP(topP: Double?) = apply { paramsBuilder.topP(topP) } - - /** @see ChatCompletionCreateParams.Builder.topP */ - fun topP(topP: Double) = apply { paramsBuilder.topP(topP) } - - /** @see ChatCompletionCreateParams.Builder.topP */ - fun topP(topP: Optional) = apply { paramsBuilder.topP(topP) } - - /** @see ChatCompletionCreateParams.Builder.topP */ - fun topP(topP: JsonField) = apply { paramsBuilder.topP(topP) } - - /** @see ChatCompletionCreateParams.Builder.user */ - fun user(user: String) = apply { paramsBuilder.user(user) } - - /** @see ChatCompletionCreateParams.Builder.user */ - fun user(user: JsonField) = apply { paramsBuilder.user(user) } - - /** @see ChatCompletionCreateParams.Builder.webSearchOptions */ - fun webSearchOptions(webSearchOptions: ChatCompletionCreateParams.WebSearchOptions) = - apply { - paramsBuilder.webSearchOptions(webSearchOptions) - } - - /** @see ChatCompletionCreateParams.Builder.webSearchOptions */ - fun webSearchOptions( - webSearchOptions: JsonField - ) = apply { paramsBuilder.webSearchOptions(webSearchOptions) } - - /** @see ChatCompletionCreateParams.Builder.verbosity */ - fun verbosity(verbosity: ChatCompletionCreateParams.Verbosity?) = apply { - paramsBuilder.verbosity(verbosity) - } - - /** @see ChatCompletionCreateParams.Builder.verbosity */ - fun verbosity(verbosity: Optional) = apply { - paramsBuilder.verbosity(verbosity) - } - - /** @see ChatCompletionCreateParams.Builder.verbosity */ - fun verbosity(verbosity: JsonField) = apply { - paramsBuilder.verbosity(verbosity) - } - - /** @see ChatCompletionCreateParams.Builder.additionalBodyProperties */ - fun additionalBodyProperties(additionalBodyProperties: Map) = apply { - paramsBuilder.additionalBodyProperties(additionalBodyProperties) - } - - /** @see ChatCompletionCreateParams.Builder.putAdditionalBodyProperty */ - fun putAdditionalBodyProperty(key: String, value: JsonValue) = apply { - paramsBuilder.putAdditionalBodyProperty(key, value) - } - - /** @see ChatCompletionCreateParams.Builder.putAllAdditionalBodyProperties */ - fun putAllAdditionalBodyProperties(additionalBodyProperties: Map) = - apply { - paramsBuilder.putAllAdditionalBodyProperties(additionalBodyProperties) - } - - /** @see ChatCompletionCreateParams.Builder.removeAdditionalBodyProperty */ - fun removeAdditionalBodyProperty(key: String) = apply { - paramsBuilder.removeAdditionalBodyProperty(key) - } - - /** @see ChatCompletionCreateParams.Builder.removeAllAdditionalBodyProperties */ - fun removeAllAdditionalBodyProperties(keys: Set) = apply { - paramsBuilder.removeAllAdditionalBodyProperties(keys) - } - - /** @see ChatCompletionCreateParams.Builder.additionalHeaders */ - fun additionalHeaders(additionalHeaders: Headers) = apply { - paramsBuilder.additionalHeaders(additionalHeaders) - } - - /** @see ChatCompletionCreateParams.Builder.additionalHeaders */ - fun additionalHeaders(additionalHeaders: Map>) = apply { - paramsBuilder.additionalHeaders(additionalHeaders) - } - - /** @see ChatCompletionCreateParams.Builder.putAdditionalHeader */ - fun putAdditionalHeader(name: String, value: String) = apply { - paramsBuilder.putAdditionalHeader(name, value) - } - - /** @see ChatCompletionCreateParams.Builder.putAdditionalHeaders */ - fun putAdditionalHeaders(name: String, values: Iterable) = apply { - paramsBuilder.putAdditionalHeaders(name, values) - } - - /** @see ChatCompletionCreateParams.Builder.putAllAdditionalHeaders */ - fun putAllAdditionalHeaders(additionalHeaders: Headers) = apply { - paramsBuilder.putAllAdditionalHeaders(additionalHeaders) - } - - /** @see ChatCompletionCreateParams.Builder.putAllAdditionalHeaders */ - fun putAllAdditionalHeaders(additionalHeaders: Map>) = apply { - paramsBuilder.putAllAdditionalHeaders(additionalHeaders) - } - - /** @see ChatCompletionCreateParams.Builder.replaceAdditionalHeaders */ - fun replaceAdditionalHeaders(name: String, value: String) = apply { - paramsBuilder.replaceAdditionalHeaders(name, value) - } - - /** @see ChatCompletionCreateParams.Builder.replaceAdditionalHeaders */ - fun replaceAdditionalHeaders(name: String, values: Iterable) = apply { - paramsBuilder.replaceAdditionalHeaders(name, values) - } - - /** @see ChatCompletionCreateParams.Builder.replaceAllAdditionalHeaders */ - fun replaceAllAdditionalHeaders(additionalHeaders: Headers) = apply { - paramsBuilder.replaceAllAdditionalHeaders(additionalHeaders) - } - - /** @see ChatCompletionCreateParams.Builder.replaceAllAdditionalHeaders */ - fun replaceAllAdditionalHeaders(additionalHeaders: Map>) = apply { - paramsBuilder.replaceAllAdditionalHeaders(additionalHeaders) - } - - /** @see ChatCompletionCreateParams.Builder.removeAdditionalHeaders */ - fun removeAdditionalHeaders(name: String) = apply { - paramsBuilder.removeAdditionalHeaders(name) - } - - /** @see ChatCompletionCreateParams.Builder.removeAllAdditionalHeaders */ - fun removeAllAdditionalHeaders(names: Set) = apply { - paramsBuilder.removeAllAdditionalHeaders(names) - } - - /** @see ChatCompletionCreateParams.Builder.additionalQueryParams */ - fun additionalQueryParams(additionalQueryParams: QueryParams) = apply { - paramsBuilder.additionalQueryParams(additionalQueryParams) - } - - /** @see ChatCompletionCreateParams.Builder.additionalQueryParams */ - fun additionalQueryParams(additionalQueryParams: Map>) = apply { - paramsBuilder.additionalQueryParams(additionalQueryParams) - } - - /** @see ChatCompletionCreateParams.Builder.putAdditionalQueryParam */ - fun putAdditionalQueryParam(key: String, value: String) = apply { - paramsBuilder.putAdditionalQueryParam(key, value) - } - - /** @see ChatCompletionCreateParams.Builder.putAdditionalQueryParams */ - fun putAdditionalQueryParams(key: String, values: Iterable) = apply { - paramsBuilder.putAdditionalQueryParams(key, values) - } - - /** @see ChatCompletionCreateParams.Builder.putAllAdditionalQueryParams */ - fun putAllAdditionalQueryParams(additionalQueryParams: QueryParams) = apply { - paramsBuilder.putAllAdditionalQueryParams(additionalQueryParams) - } - - /** @see ChatCompletionCreateParams.Builder.putAllAdditionalQueryParams */ - fun putAllAdditionalQueryParams(additionalQueryParams: Map>) = - apply { - paramsBuilder.putAllAdditionalQueryParams(additionalQueryParams) - } - - /** @see ChatCompletionCreateParams.Builder.replaceAdditionalQueryParams */ - fun replaceAdditionalQueryParams(key: String, value: String) = apply { - paramsBuilder.replaceAdditionalQueryParams(key, value) - } - - /** @see ChatCompletionCreateParams.Builder.replaceAdditionalQueryParams */ - fun replaceAdditionalQueryParams(key: String, values: Iterable) = apply { - paramsBuilder.replaceAdditionalQueryParams(key, values) - } - - /** @see ChatCompletionCreateParams.Builder.replaceAllAdditionalQueryParams */ - fun replaceAllAdditionalQueryParams(additionalQueryParams: QueryParams) = apply { - paramsBuilder.replaceAllAdditionalQueryParams(additionalQueryParams) - } - - /** @see ChatCompletionCreateParams.Builder.replaceAllAdditionalQueryParams */ - fun replaceAllAdditionalQueryParams(additionalQueryParams: Map>) = - apply { - paramsBuilder.replaceAllAdditionalQueryParams(additionalQueryParams) - } - - /** @see ChatCompletionCreateParams.Builder.removeAdditionalQueryParams */ - fun removeAdditionalQueryParams(key: String) = apply { - paramsBuilder.removeAdditionalQueryParams(key) - } - - /** @see ChatCompletionCreateParams.Builder.removeAllAdditionalQueryParams */ - fun removeAllAdditionalQueryParams(keys: Set) = apply { - paramsBuilder.removeAllAdditionalQueryParams(keys) - } - - /** - * Returns an immutable instance of [StructuredChatCompletionCreateParams]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .messages() - * .model() - * .responseFormat() - * ``` - * - * @throws IllegalStateException If any required field is unset. - */ - fun build() = - StructuredChatCompletionCreateParams( - checkRequired("responseType", responseType), - paramsBuilder.build(), - ) - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is StructuredChatCompletionCreateParams<*> && - responseType == other.responseType && - rawParams == other.rawParams - } - - private val hashCode: Int by lazy { Objects.hash(responseType, rawParams) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "${javaClass.simpleName}{responseType=$responseType, rawParams=$rawParams}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletionMessage.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletionMessage.kt deleted file mode 100644 index 27e8a3c74..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/StructuredChatCompletionMessage.kt +++ /dev/null @@ -1,95 +0,0 @@ -package com.openai.models.chat.completions - -import com.openai.core.JsonField -import com.openai.core.JsonValue -import com.openai.core.responseTypeFromJson -import com.openai.models.chat.completions.ChatCompletionMessage.FunctionCall -import java.util.Objects -import java.util.Optional - -/** - * A wrapper for [ChatCompletionMessage] that provides type-safe access to the [content] when using - * the _Structured Outputs_ feature to deserialize a JSON response to an instance of an arbitrary - * class. See the SDK documentation for more details on _Structured Outputs_. - * - * @param T The type of the class to which the JSON data in the content will be deserialized when - * [content] is called. - */ -class StructuredChatCompletionMessage -internal constructor( - @get:JvmName("responseType") val responseType: Class, - @get:JvmName("rawMessage") val rawMessage: ChatCompletionMessage, -) { - - private val content: JsonField by lazy { - rawMessage._content().map { responseTypeFromJson(it, responseType) } - } - - /** @see ChatCompletionMessage.content */ - fun content(): Optional = content.getOptional("content") - - /** @see ChatCompletionMessage.refusal */ - fun refusal(): Optional = rawMessage.refusal() - - /** @see ChatCompletionMessage._role */ - fun _role(): JsonValue = rawMessage._role() - - /** @see ChatCompletionMessage.annotations */ - fun annotations(): Optional> = rawMessage.annotations() - - /** @see ChatCompletionMessage.audio */ - fun audio(): Optional = rawMessage.audio() - - /** @see ChatCompletionMessage.functionCall */ - @Deprecated("deprecated") fun functionCall(): Optional = rawMessage.functionCall() - - /** @see ChatCompletionMessage.toolCalls */ - fun toolCalls(): Optional> = rawMessage.toolCalls() - - /** @see ChatCompletionMessage._content */ - fun _content(): JsonField = content - - /** @see ChatCompletionMessage._refusal */ - fun _refusal(): JsonField = rawMessage._refusal() - - /** @see ChatCompletionMessage._annotations */ - fun _annotations(): JsonField> = - rawMessage._annotations() - - /** @see ChatCompletionMessage._audio */ - fun _audio(): JsonField = rawMessage._audio() - - /** @see ChatCompletionMessage._functionCall */ - @Deprecated("deprecated") - fun _functionCall(): JsonField = rawMessage._functionCall() - - /** @see ChatCompletionMessage._toolCalls */ - fun _toolCalls(): JsonField> = rawMessage._toolCalls() - - /** @see ChatCompletionMessage._additionalProperties */ - fun _additionalProperties(): Map = rawMessage._additionalProperties() - - /** @see ChatCompletionMessage.validate */ - // `content()` is not included in the validation by the delegate method, so just call it. - fun validate(): ChatCompletionMessage = rawMessage.validate() - - /** @see ChatCompletionMessage.isValid */ - fun isValid(): Boolean = rawMessage.isValid() - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is StructuredChatCompletionMessage<*> && - responseType == other.responseType && - rawMessage == other.rawMessage - } - - private val hashCode: Int by lazy { Objects.hash(responseType, rawMessage) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "${javaClass.simpleName}{responseType=$responseType, rawMessage=$rawMessage}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/Embedding.kt b/openai-java-core/src/main/kotlin/com/openai/models/embeddings/Embedding.kt index ff616ce31..84ed39ad8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/Embedding.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/embeddings/Embedding.kt @@ -12,6 +12,7 @@ import com.openai.core.JsonMissing import com.openai.core.JsonValue import com.openai.core.checkKnown import com.openai.core.checkRequired +import com.openai.core.toImmutable import com.openai.errors.OpenAIInvalidDataException import java.util.Collections import java.util.Objects @@ -21,7 +22,7 @@ import kotlin.jvm.optionals.getOrNull class Embedding @JsonCreator(mode = JsonCreator.Mode.DISABLED) private constructor( - private val embedding: JsonField, + private val embedding: JsonField>, private val index: JsonField, private val object_: JsonValue, private val additionalProperties: MutableMap, @@ -31,7 +32,7 @@ private constructor( private constructor( @JsonProperty("embedding") @ExcludeMissing - embedding: JsonField = JsonMissing.of(), + embedding: JsonField> = JsonMissing.of(), @JsonProperty("index") @ExcludeMissing index: JsonField = JsonMissing.of(), @JsonProperty("object") @ExcludeMissing object_: JsonValue = JsonMissing.of(), ) : this(embedding, index, object_, mutableMapOf()) @@ -43,16 +44,7 @@ private constructor( * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is * unexpectedly missing or null (e.g. if the server responded with an unexpected value). */ - fun embedding(): List = embeddingValue().asFloats() - - /** - * The embedding data in its original format (either float list or base64 string). This method - * provides efficient access to the embedding data without unnecessary conversions. - * - * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is - * unexpectedly missing or null (e.g. if the server responded with an unexpected value). - */ - fun embeddingValue(): EmbeddingValue = embedding.getRequired("embedding") + fun embedding(): List = embedding.getRequired("embedding") /** * The index of the embedding in the list of embeddings. @@ -80,16 +72,7 @@ private constructor( * * Unlike [embedding], this method doesn't throw if the JSON field has an unexpected type. */ - fun _embedding(): JsonField> = embedding.map { it.asFloats() } - - /** - * Returns the raw JSON value of [embedding]. - * - * Unlike [embeddingValue], this method doesn't throw if the JSON field has an unexpected type. - */ - @JsonProperty("embedding") - @ExcludeMissing - fun _embeddingValue(): JsonField = embedding + @JsonProperty("embedding") @ExcludeMissing fun _embedding(): JsonField> = embedding /** * Returns the raw JSON value of [index]. @@ -127,38 +110,25 @@ private constructor( /** A builder for [Embedding]. */ class Builder internal constructor() { - private var embeddingFloats: MutableList? = null - private var embedding: JsonField? = null + private var embedding: JsonField>? = null private var index: JsonField? = null private var object_: JsonValue = JsonValue.from("embedding") private var additionalProperties: MutableMap = mutableMapOf() @JvmSynthetic internal fun from(embedding: Embedding) = apply { - this.embedding = embedding.embedding + this.embedding = embedding.embedding.map { it.toMutableList() } index = embedding.index object_ = embedding.object_ additionalProperties = embedding.additionalProperties.toMutableMap() } - /** - * The embedding vector. The length of vector depends on the model as listed in the - * [embedding guide](https://platform.openai.com/docs/guides/embeddings). - */ - fun embedding(embedding: EmbeddingValue) = embedding(JsonField.of(embedding)) - /** * The embedding vector, which is a list of floats. The length of vector depends on the * model as listed in the * [embedding guide](https://platform.openai.com/docs/guides/embeddings). */ - fun embedding(floats: List) = embedding(EmbeddingValue.ofFloats(floats)) - - /** - * The embedding vector, which is a base64 string. The length of vector depends on the model - * as listed in the [embedding guide](https://platform.openai.com/docs/guides/embeddings). - */ - fun embedding(base64: String) = embedding(EmbeddingValue.ofBase64(base64)) + fun embedding(embedding: List) = embedding(JsonField.of(embedding)) /** * Sets [Builder.embedding] to an arbitrary JSON value. @@ -167,9 +137,8 @@ private constructor( * instead. This method is primarily for setting the field to an undocumented or not yet * supported value. */ - fun embedding(embedding: JsonField) = apply { - embeddingFloats = null - this.embedding = embedding + fun embedding(embedding: JsonField>) = apply { + this.embedding = embedding.map { it.toMutableList() } } /** @@ -178,12 +147,10 @@ private constructor( * @throws IllegalStateException if the field was previously set to a non-list. */ fun addEmbedding(embedding: Float) = apply { - embeddingFloats = - (this.embedding?.let { checkKnown("embedding", it) }?.asFloats()?.toMutableList() - ?: embeddingFloats - ?: mutableListOf()) - .apply { add(embedding) } - this.embedding = null + this.embedding = + (this.embedding ?: JsonField.of(mutableListOf())).also { + checkKnown("embedding", it).add(embedding) + } } /** The index of the embedding in the list of embeddings. */ @@ -245,10 +212,7 @@ private constructor( */ fun build(): Embedding = Embedding( - checkRequired( - "embedding", - embedding ?: embeddingFloats?.let { JsonField.of(EmbeddingValue.ofFloats(it)) }, - ), + checkRequired("embedding", embedding).map { it.toImmutable() }, checkRequired("index", index), object_, additionalProperties.toMutableMap(), @@ -270,7 +234,7 @@ private constructor( return@apply } - embeddingValue().validate() + embedding() index() _object_().let { if (it != JsonValue.from("embedding")) { @@ -295,7 +259,7 @@ private constructor( */ @JvmSynthetic internal fun validity(): Int = - (embedding.asKnown().getOrNull()?.validity() ?: 0) + + (embedding.asKnown().getOrNull()?.size ?: 0) + (if (index.asKnown().isPresent) 1 else 0) + object_.let { if (it == JsonValue.from("embedding")) 1 else 0 } diff --git a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingCreateParams.kt index d60d83d59..5c861f9a4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingCreateParams.kt @@ -585,8 +585,7 @@ private constructor( private var input: JsonField? = null private var model: JsonField? = null private var dimensions: JsonField = JsonMissing.of() - private var encodingFormat: JsonField = - JsonField.of(EncodingFormat.BASE64) + private var encodingFormat: JsonField = JsonMissing.of() private var user: JsonField = JsonMissing.of() private var additionalProperties: MutableMap = mutableMapOf() diff --git a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingValue.kt b/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingValue.kt deleted file mode 100644 index 4bf046d1e..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingValue.kt +++ /dev/null @@ -1,225 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.embeddings - -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.ObjectCodec -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.BaseDeserializer -import com.openai.core.BaseSerializer -import com.openai.core.JsonValue -import com.openai.core.allMaxBy -import com.openai.core.toImmutable -import com.openai.errors.OpenAIInvalidDataException -import java.nio.ByteBuffer -import java.nio.ByteOrder -import java.util.Base64 -import java.util.Objects -import java.util.Optional - -/** - * Represents embedding data that can be either a list of floats or base64-encoded string. This - * union type allows for efficient handling of both formats. - * - * This class is immutable - all instances are thread-safe and cannot be modified after creation. - */ -@JsonDeserialize(using = EmbeddingValue.Deserializer::class) -@JsonSerialize(using = EmbeddingValue.Serializer::class) -class EmbeddingValue -private constructor( - private val floats: List? = null, - private val base64: String? = null, - private val _json: JsonValue? = null, -) { - - fun floats(): Optional> = Optional.ofNullable(floats) - - fun base64(): Optional = Optional.ofNullable(base64) - - /** Returns true if this value contains a list of floats. */ - fun isFloats(): Boolean = floats != null - - /** Returns true if this value contains base64 string data. */ - fun isBase64(): Boolean = base64 != null - - /** - * Returns the embedding data as a list of floats. - * - * If this value represents base64 string data, then it's decoded into floats. - */ - fun asFloats(): List = - when { - floats != null -> floats - base64 != null -> decodeBase64ToFloats(base64) - else -> throw IllegalStateException("Invalid EmbeddingValue") - } - - /** - * Returns the embedding data as a base64 string. - * - * If this value represents a list of floats, then it's decoded into floats. - */ - fun asBase64(): String = - when { - base64 != null -> base64 - floats != null -> encodeFloatsAsBase64(floats) - else -> throw IllegalStateException("Invalid EmbeddingValue") - } - - fun _json(): JsonValue? = _json - - fun accept(visitor: Visitor): T = - when { - floats != null -> visitor.visitFloats(floats) - base64 != null -> visitor.visitBase64(base64) - else -> visitor.unknown(_json) - } - - fun validate() = apply { - accept( - object : Visitor { - override fun visitFloats(floats: List) {} - - override fun visitBase64(base64: String) {} - } - ) - } - - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - /** - * Returns a score indicating how many valid values are contained in this object. - * - * Used for best match union deserialization. - */ - @JvmSynthetic - internal fun validity(): Int = - when { - floats != null -> floats.size - base64 != null -> 1 - else -> 0 - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is EmbeddingValue && floats == other.floats && base64 == other.base64 - } - - override fun hashCode(): Int = Objects.hash(floats, base64) - - override fun toString(): String = - when { - floats != null -> "EmbeddingValue{floats=$floats}" - base64 != null -> "EmbeddingValue{base64=$base64}" - _json != null -> "EmbeddingValue{_unknown=$_json}" - else -> throw IllegalStateException("Invalid EmbeddingValue") - } - - companion object { - - @JvmStatic fun ofFloats(floats: List) = EmbeddingValue(floats = floats.toImmutable()) - - @JvmStatic fun ofBase64(base64: String) = EmbeddingValue(base64 = base64) - - /** - * Decodes a base64 string to a list of floats. Assumes the base64 string represents an - * array of 32-bit IEEE 754 floats in little-endian format. - */ - private fun decodeBase64ToFloats(base64: String): List { - val bytes = Base64.getDecoder().decode(base64) - val floats = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asFloatBuffer() - return buildList(floats.remaining()) { - while (floats.hasRemaining()) { - add(floats.get()) - } - } - } - - /** - * Encodes a list of floats to a base64 string. Encodes the floats as an array of 32-bit - * IEEE 754 floats in little-endian format. - */ - private fun encodeFloatsAsBase64(floats: List): String { - val buffer = ByteBuffer.allocate(floats.size * 4).order(ByteOrder.LITTLE_ENDIAN) - floats.forEach { buffer.putFloat(it) } - return Base64.getEncoder().encodeToString(buffer.array()) - } - } - - /** - * An interface that defines how to map each variant of [EmbeddingValue] to a value of type [T]. - */ - interface Visitor { - - fun visitFloats(floats: List): T - - fun visitBase64(base64: String): T - - /** - * Maps an unknown variant of [EmbeddingValue] to a value of type [T]. - * - * An instance of [EmbeddingValue] can contain an unknown variant if it was deserialized - * from data that doesn't match any known variant. For example, if the SDK is on an older - * version than the API, then the API may respond with new variants that the SDK is unaware - * of. - * - * @throws OpenAIInvalidDataException in the default implementation. - */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown EmbeddingValue: $json") - } - } - - internal class Deserializer : BaseDeserializer(EmbeddingValue::class) { - override fun ObjectCodec.deserialize(node: JsonNode): EmbeddingValue { - val json = JsonValue.fromJsonNode(node) - - val bestMatches = - sequenceOf( - tryDeserialize(node, jacksonTypeRef>())?.let { - EmbeddingValue(floats = it, _json = json) - }, - tryDeserialize(node, jacksonTypeRef())?.let { - EmbeddingValue(base64 = it, _json = json) - }, - ) - .filterNotNull() - .allMaxBy { it.validity() } - .toList() - - return when (bestMatches.size) { - 0 -> EmbeddingValue(_json = json) - 1 -> bestMatches.single() - else -> bestMatches.firstOrNull { it.isValid() } ?: bestMatches.first() - } - } - } - - internal class Serializer : BaseSerializer(EmbeddingValue::class) { - override fun serialize( - value: EmbeddingValue, - generator: JsonGenerator, - provider: SerializerProvider, - ) { - when { - value.floats != null -> generator.writeObject(value.floats) - value.base64 != null -> generator.writeObject(value.base64) - value._json != null -> generator.writeObject(value._json) - else -> throw IllegalStateException("Invalid EmbeddingValue") - } - } - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreateParams.kt index c9766d548..bbc333d41 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreateParams.kt @@ -19,7 +19,6 @@ import com.openai.core.Enum import com.openai.core.ExcludeMissing import com.openai.core.JsonField import com.openai.core.JsonMissing -import com.openai.core.JsonSchemaLocalValidation import com.openai.core.JsonValue import com.openai.core.Params import com.openai.core.allMaxBy @@ -28,7 +27,6 @@ import com.openai.core.checkRequired import com.openai.core.getOrThrow import com.openai.core.http.Headers import com.openai.core.http.QueryParams -import com.openai.core.responseFunctionToolFromClass import com.openai.core.toImmutable import com.openai.errors.OpenAIInvalidDataException import com.openai.models.ChatModel @@ -1304,45 +1302,6 @@ private constructor( */ fun text(text: JsonField) = apply { body.text(text) } - /** - * Sets the text configuration's format to a JSON schema derived from the structure of the - * given class. This changes the builder to a type-safe - * [StructuredResponseCreateParams.Builder] that will build a - * [StructuredResponseCreateParams] instance when `build()` is called. - * - * Use this method or the `text(StructuredResponseTextConfig)` method, but not both. - * - * @param responseType A class from which a JSON schema will be derived to define the text - * configuration's format. - * @param localValidation [JsonSchemaLocalValidation.YES] (the default) to validate the JSON - * schema locally when it is generated by this method to confirm that it adheres to the - * requirements and restrictions on JSON schemas imposed by the OpenAI specification; or - * [JsonSchemaLocalValidation.NO] to skip local validation and rely only on remote - * validation. See the SDK documentation for more details. - * @throws IllegalArgumentException If local validation is enabled, but it fails because a - * valid JSON schema cannot be derived from the given class. - */ - @JvmOverloads - fun text( - responseType: Class, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, - ) = StructuredResponseCreateParams.builder().wrap(responseType, this, localValidation) - - /** - * Sets the text configuration to a [StructuredResponseTextConfig] where the format was set - * to a JSON schema derived from the structure of a class. This changes the builder to a - * type-safe [StructuredResponseCreateParams.Builder] that will build a - * [StructuredResponseCreateParams] instance when `build()` is called. - * - * Use this method or the `text(Class)` method, but not both. - * - * @param text A text configuration in which the JSON schema defining the format was derived - * from the structure of a class. The `verbosity` parameter can also be set on the text - * configuration, if required. - */ - fun text(text: StructuredResponseTextConfig) = - StructuredResponseCreateParams.builder().wrap(text, this) - /** * How the model should select which tool (or tools) to use when generating a response. See * the `tools` parameter to see how to specify which tools the model can call. @@ -1429,23 +1388,6 @@ private constructor( /** Alias for calling [addTool] with `Tool.ofFunction(function)`. */ fun addTool(function: FunctionTool) = apply { body.addTool(function) } - /** - * Adds a single [FunctionTool] where the JSON schema describing the function parameters is - * derived from the fields of a given class. Local validation of that JSON schema can be - * performed to check if the schema is likely to pass remote validation by the AI model. By - * default, local validation is enabled; disable it by setting [localValidation] to - * [JsonSchemaLocalValidation.NO]. - * - * @see addTool - */ - @JvmOverloads - fun addTool( - functionParametersType: Class<*>, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, - ) = apply { - body.addTool(responseFunctionToolFromClass(functionParametersType, localValidation)) - } - /** Alias for calling [addTool] with `Tool.ofFileSearch(fileSearch)`. */ fun addTool(fileSearch: FileSearchTool) = apply { body.addTool(fileSearch) } diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCall.kt index a7d5b3f20..c2cf3d11f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCall.kt @@ -22,7 +22,6 @@ import com.openai.core.JsonMissing import com.openai.core.JsonValue import com.openai.core.checkRequired import com.openai.core.getOrThrow -import com.openai.core.responseTypeFromJson import com.openai.errors.OpenAIInvalidDataException import java.util.Collections import java.util.Objects @@ -68,21 +67,6 @@ private constructor( */ fun arguments(): String = arguments.getRequired("arguments") - /** - * Parses the JSON string defining the arguments to pass to the function to an instance of a - * class. The class must be the same as the class that was used to define the function's - * parameters when the function was defined. - * - * @throws OpenAIInvalidDataException If the JSON data is missing, `null`, or cannot be parsed - * to an instance of the [functionParametersType] class. This might occur if the class is not - * the same as the class that was originally used to define the arguments, or if the data from - * the AI model is invalid or incomplete (e.g., truncated). - * @see ResponseCreateParams.Builder.addTool - * @see arguments - */ - fun arguments(functionParametersType: Class): T = - responseTypeFromJson(arguments(), functionParametersType) - /** * The unique ID of the function tool call generated by the model. * diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionWebSearch.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionWebSearch.kt index 3ae62ed7a..791112923 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionWebSearch.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionWebSearch.kt @@ -188,8 +188,8 @@ private constructor( /** Alias for calling [action] with `Action.ofOpenPage(openPage)`. */ fun action(openPage: Action.OpenPage) = action(Action.ofOpenPage(openPage)) - /** Alias for calling [action] with `Action.ofFind(findInPage)`. */ - fun action(findInPage: Action.Find) = action(Action.ofFind(findInPage)) + /** Alias for calling [action] with `Action.ofFindInPage(findInPage)`. */ + fun action(findInPage: Action.FindInPage) = action(Action.ofFindInPage(findInPage)) /** The status of the web search tool call. */ fun status(status: Status) = status(JsonField.of(status)) @@ -315,7 +315,7 @@ private constructor( private constructor( private val search: Search? = null, private val openPage: OpenPage? = null, - private val findInPage: Find? = null, + private val findInPage: FindInPage? = null, private val _json: JsonValue? = null, ) { @@ -326,13 +326,13 @@ private constructor( fun openPage(): Optional = Optional.ofNullable(openPage) /** Action type "find_in_page": Searches for a pattern within a loaded page. */ - fun findInPage(): Optional = Optional.ofNullable(findInPage) + fun findInPage(): Optional = Optional.ofNullable(findInPage) fun isSearch(): Boolean = search != null fun isOpenPage(): Boolean = openPage != null - fun isFind(): Boolean = findInPage != null + fun isFindInPage(): Boolean = findInPage != null /** Action type "search" - Performs a web search query. */ fun asSearch(): Search = search.getOrThrow("search") @@ -341,7 +341,7 @@ private constructor( fun asOpenPage(): OpenPage = openPage.getOrThrow("openPage") /** Action type "find_in_page": Searches for a pattern within a loaded page. */ - fun asFind(): Find = findInPage.getOrThrow("findInPage") + fun asFindInPage(): FindInPage = findInPage.getOrThrow("findInPage") fun _json(): Optional = Optional.ofNullable(_json) @@ -378,7 +378,7 @@ private constructor( when { search != null -> visitor.visitSearch(search) openPage != null -> visitor.visitOpenPage(openPage) - findInPage != null -> visitor.visitFind(findInPage) + findInPage != null -> visitor.visitFindInPage(findInPage) else -> visitor.unknown(_json) } @@ -408,7 +408,7 @@ private constructor( openPage.validate() } - override fun visitFind(findInPage: Find) { + override fun visitFindInPage(findInPage: FindInPage) { findInPage.validate() } } @@ -438,7 +438,7 @@ private constructor( override fun visitOpenPage(openPage: OpenPage) = openPage.validity() - override fun visitFind(findInPage: Find) = findInPage.validity() + override fun visitFindInPage(findInPage: FindInPage) = findInPage.validity() override fun unknown(json: JsonValue?) = 0 } @@ -475,7 +475,7 @@ private constructor( @JvmStatic fun ofOpenPage(openPage: OpenPage) = Action(openPage = openPage) /** Action type "find_in_page": Searches for a pattern within a loaded page. */ - @JvmStatic fun ofFind(findInPage: Find) = Action(findInPage = findInPage) + @JvmStatic fun ofFindInPage(findInPage: FindInPage) = Action(findInPage = findInPage) } /** An interface that defines how to map each variant of [Action] to a value of type [T]. */ @@ -488,7 +488,7 @@ private constructor( fun visitOpenPage(openPage: OpenPage): T /** Action type "find_in_page": Searches for a pattern within a loaded page. */ - fun visitFind(findInPage: Find): T + fun visitFindInPage(findInPage: FindInPage): T /** * Maps an unknown variant of [Action] to a value of type [T]. @@ -523,7 +523,7 @@ private constructor( } ?: Action(_json = json) } "find_in_page" -> { - return tryDeserialize(node, jacksonTypeRef())?.let { + return tryDeserialize(node, jacksonTypeRef())?.let { Action(findInPage = it, _json = json) } ?: Action(_json = json) } @@ -1272,7 +1272,7 @@ private constructor( } /** Action type "find_in_page": Searches for a pattern within a loaded page. */ - class Find + class FindInPage @JsonCreator(mode = JsonCreator.Mode.DISABLED) private constructor( private val pattern: JsonField, @@ -1350,7 +1350,7 @@ private constructor( companion object { /** - * Returns a mutable builder for constructing an instance of [Find]. + * Returns a mutable builder for constructing an instance of [FindInPage]. * * The following fields are required: * ```java @@ -1361,7 +1361,7 @@ private constructor( @JvmStatic fun builder() = Builder() } - /** A builder for [Find]. */ + /** A builder for [FindInPage]. */ class Builder internal constructor() { private var pattern: JsonField? = null @@ -1370,7 +1370,7 @@ private constructor( private var additionalProperties: MutableMap = mutableMapOf() @JvmSynthetic - internal fun from(findInPage: Find) = apply { + internal fun from(findInPage: FindInPage) = apply { pattern = findInPage.pattern type = findInPage.type url = findInPage.url @@ -1438,7 +1438,7 @@ private constructor( } /** - * Returns an immutable instance of [Find]. + * Returns an immutable instance of [FindInPage]. * * Further updates to this [Builder] will not mutate the returned instance. * @@ -1450,8 +1450,8 @@ private constructor( * * @throws IllegalStateException if any required field is unset. */ - fun build(): Find = - Find( + fun build(): FindInPage = + FindInPage( checkRequired("pattern", pattern), type, checkRequired("url", url), @@ -1471,7 +1471,7 @@ private constructor( * @throws OpenAIInvalidDataException if any value type in this object doesn't match its * expected type. */ - fun validate(): Find = apply { + fun validate(): FindInPage = apply { if (validated) { return@apply } @@ -1511,7 +1511,7 @@ private constructor( return true } - return other is Find && + return other is FindInPage && pattern == other.pattern && type == other.type && url == other.url && @@ -1525,7 +1525,7 @@ private constructor( override fun hashCode(): Int = hashCode override fun toString() = - "Find{pattern=$pattern, type=$type, url=$url, additionalProperties=$additionalProperties}" + "FindInPage{pattern=$pattern, type=$type, url=$url, additionalProperties=$additionalProperties}" } } diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputItem.kt index b2b64717f..8767da982 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputItem.kt @@ -25,7 +25,6 @@ import com.openai.core.checkKnown import com.openai.core.checkRequired import com.openai.core.getOrThrow import com.openai.core.toImmutable -import com.openai.core.toJsonString import com.openai.errors.OpenAIInvalidDataException import java.util.Collections import java.util.Objects @@ -3237,14 +3236,6 @@ private constructor( /** Alias for calling [output] with `Output.ofString(string)`. */ fun output(string: String) = output(Output.ofString(string)) - /** - * Sets the output to text representing the JSON serialized form of a given object. This - * is useful when passing data that is the result of a function call. - * - * @see output - */ - fun outputAsJson(functionResult: Any) = apply { output(toJsonString(functionResult)) } - /** * Alias for calling [output] with * `Output.ofResponseFunctionCallOutputItemList(responseFunctionCallOutputItemList)`. diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseStreamEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseStreamEvent.kt index 5ee77f593..2b1477f89 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseStreamEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseStreamEvent.kt @@ -2423,7 +2423,6 @@ private constructor( generator.writeObject(value.customToolCallInputDelta) value.customToolCallInputDone != null -> generator.writeObject(value.customToolCallInputDone) - value._json != null -> generator.writeObject(value._json) else -> throw IllegalStateException("Invalid ResponseStreamEvent") } diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextConfig.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextConfig.kt index e9f5bdefc..d15a1a1dc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextConfig.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextConfig.kt @@ -10,7 +10,6 @@ import com.openai.core.Enum import com.openai.core.ExcludeMissing import com.openai.core.JsonField import com.openai.core.JsonMissing -import com.openai.core.JsonSchemaLocalValidation import com.openai.core.JsonValue import com.openai.errors.OpenAIInvalidDataException import com.openai.models.ResponseFormatJsonObject @@ -159,28 +158,6 @@ private constructor( fun format(jsonObject: ResponseFormatJsonObject) = format(ResponseFormatTextConfig.ofJsonObject(jsonObject)) - /** - * Sets the text configuration's format to a JSON schema derived from the structure of the - * given class. This changes the builder to a type-safe - * [StructuredResponseTextConfig.Builder] that will build a [StructuredResponseTextConfig] - * instance when `build()` is called. - * - * @param responseType A class from which a JSON schema will be derived to define the text - * configuration's format. - * @param localValidation [JsonSchemaLocalValidation.YES] (the default) to validate the JSON - * schema locally when it is generated by this method to confirm that it adheres to the - * requirements and restrictions on JSON schemas imposed by the OpenAI specification; or - * [JsonSchemaLocalValidation.NO] to skip local validation and rely only on remote - * validation. See the SDK documentation for more details. - * @throws IllegalArgumentException If local validation is enabled, but it fails because a - * valid JSON schema cannot be derived from the given class. - */ - @JvmOverloads - fun format( - responseType: Class, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, - ) = StructuredResponseTextConfig.builder().wrap(responseType, this, localValidation) - /** * Constrains the verbosity of the model's response. Lower values will result in more * concise responses, while higher values will result in more verbose responses. Currently diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponse.kt deleted file mode 100644 index 548284aa5..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponse.kt +++ /dev/null @@ -1,267 +0,0 @@ -package com.openai.models.responses - -import com.openai.core.JsonField -import com.openai.core.JsonValue -import com.openai.errors.OpenAIInvalidDataException -import com.openai.models.Reasoning -import com.openai.models.ResponsesModel -import java.util.Objects -import java.util.Optional - -/** - * A wrapper for [Response] that provides type-safe access to the [output] when using the - * _Structured Outputs_ feature to deserialize a JSON response to an instance of an arbitrary class. - * See the SDK documentation for more details on _Structured Outputs_. - * - * @param T The type of the class to which the JSON data in the response will be deserialized. - */ -class StructuredResponse( - @get:JvmName("responseType") val responseType: Class, - @get:JvmName("rawResponse") val rawResponse: Response, -) { - /** @see Response.id */ - fun id(): String = rawResponse.id() - - /** @see Response.createdAt */ - fun createdAt(): Double = rawResponse.createdAt() - - /** @see Response.error */ - fun error(): Optional = rawResponse.error() - - /** @see Response.incompleteDetails */ - fun incompleteDetails(): Optional = rawResponse.incompleteDetails() - - /** @see Response.instructions */ - fun instructions(): Optional = rawResponse.instructions() - - /** @see Response.metadata */ - fun metadata(): Optional = rawResponse.metadata() - - /** @see Response.model */ - fun model(): ResponsesModel = rawResponse.model() - - /** @see Response.moderation */ - fun moderation(): Optional = rawResponse.moderation() - - /** @see Response._object_ */ - fun _object_(): JsonValue = rawResponse._object_() - - private val output by lazy { - rawResponse._output().map { outputs -> - outputs.map { StructuredResponseOutputItem(responseType, it) } - } - } - - /** @see Response.output */ - fun output(): List> = output.getRequired("output") - - /** @see Response.parallelToolCalls */ - fun parallelToolCalls(): Boolean = rawResponse.parallelToolCalls() - - /** @see Response.temperature */ - fun temperature(): Optional = rawResponse.temperature() - - /** @see Response.toolChoice */ - fun toolChoice(): Response.ToolChoice = rawResponse.toolChoice() - - /** @see Response.tools */ - fun tools(): List = rawResponse.tools() - - /** @see Response.topP */ - fun topP(): Optional = rawResponse.topP() - - /** @see Response.maxToolCalls */ - fun maxToolCalls(): Optional = rawResponse.maxToolCalls() - - /** @see Response.topLogprobs */ - fun topLogprobs(): Optional = rawResponse.topLogprobs() - - /** @see Response.maxOutputTokens */ - fun maxOutputTokens(): Optional = rawResponse.maxOutputTokens() - - /** @see Response.previousResponseId */ - fun previousResponseId(): Optional = rawResponse.previousResponseId() - - /** @see Response.prompt */ - fun prompt(): Optional = rawResponse.prompt() - - /** @see Response.promptCacheKey */ - fun promptCacheKey(): Optional = rawResponse.promptCacheKey() - - /** @see Response.promptCacheOptions */ - fun promptCacheOptions(): Optional = - rawResponse.promptCacheOptions() - - /** @see Response.promptCacheRetention */ - fun promptCacheRetention(): Optional = - rawResponse.promptCacheRetention() - - /** @see Response.reasoning */ - fun reasoning(): Optional = rawResponse.reasoning() - - /** @see Response.safetyIdentifier */ - fun safetyIdentifier(): Optional = rawResponse.safetyIdentifier() - - /** @see Response.serviceTier */ - fun serviceTier(): Optional = rawResponse.serviceTier() - - /** @see Response.status */ - fun status(): Optional = rawResponse.status() - - /** @see Response.text */ - fun text(): Optional = rawResponse.text() - - /** @see Response.truncation */ - fun truncation(): Optional = rawResponse.truncation() - - /** @see Response.usage */ - fun usage(): Optional = rawResponse.usage() - - /** @see Response.user */ - fun user(): Optional = rawResponse.user() - - /** @see Response.background */ - fun background(): Optional = rawResponse.background() - - /** @see Response.completedAt */ - fun completedAt(): Optional = rawResponse.completedAt() - - /** @see Response.conversation */ - fun conversation(): Optional = rawResponse.conversation() - - /** @see Response._id */ - fun _id(): JsonField = rawResponse._id() - - /** @see Response._createdAt */ - fun _createdAt(): JsonField = rawResponse._createdAt() - - /** @see Response._error */ - fun _error(): JsonField = rawResponse._error() - - /** @see Response._incompleteDetails */ - fun _incompleteDetails(): JsonField = - rawResponse._incompleteDetails() - - /** @see Response._instructions */ - fun _instructions(): JsonField = rawResponse._instructions() - - /** @see Response._metadata */ - fun _metadata(): JsonField = rawResponse._metadata() - - /** @see Response._model */ - fun _model(): JsonField = rawResponse._model() - - /** @see Response._moderation */ - fun _moderation(): JsonField = rawResponse._moderation() - - /** @see Response._output */ - fun _output(): JsonField>> = output - - /** @see Response._parallelToolCalls */ - fun _parallelToolCalls(): JsonField = rawResponse._parallelToolCalls() - - /** @see Response._temperature */ - fun _temperature(): JsonField = rawResponse._temperature() - - /** @see Response._toolChoice */ - fun _toolChoice(): JsonField = rawResponse._toolChoice() - - /** @see Response._tools */ - fun _tools(): JsonField> = rawResponse._tools() - - /** @see Response._topP */ - fun _topP(): JsonField = rawResponse._topP() - - /** @see Response._maxToolCalls */ - fun _maxToolCalls(): JsonField = rawResponse._maxToolCalls() - - /** @see Response._topLogprobs */ - fun _topLogprobs(): JsonField = rawResponse._topLogprobs() - - /** @see Response._maxOutputTokens */ - fun _maxOutputTokens(): JsonField = rawResponse._maxOutputTokens() - - /** @see Response._previousResponseId */ - fun _previousResponseId(): JsonField = rawResponse._previousResponseId() - - /** @see Response._prompt */ - fun _prompt(): JsonField = rawResponse._prompt() - - /** @see Response._promptCacheKey */ - fun _promptCacheKey(): JsonField = rawResponse._promptCacheKey() - - /** @see Response._promptCacheOptions */ - fun _promptCacheOptions(): JsonField = - rawResponse._promptCacheOptions() - - /** @see Response._promptCacheRetention */ - fun _promptCacheRetention(): JsonField = - rawResponse._promptCacheRetention() - - /** @see Response._reasoning */ - fun _reasoning(): JsonField = rawResponse._reasoning() - - /** @see Response._safetyIdentifier */ - fun _safetyIdentifier(): JsonField = rawResponse._safetyIdentifier() - - /** @see Response._serviceTier */ - fun _serviceTier(): JsonField = rawResponse._serviceTier() - - /** @see Response._status */ - fun _status(): JsonField = rawResponse._status() - - /** @see Response._text */ - fun _text(): JsonField = rawResponse._text() - - /** @see Response._truncation */ - fun _truncation(): JsonField = rawResponse._truncation() - - /** @see Response._usage */ - fun _usage(): JsonField = rawResponse._usage() - - /** @see Response._user */ - fun _user(): JsonField = rawResponse._user() - - /** @see Response._background */ - fun _background(): JsonField = rawResponse._background() - - /** @see Response._completedAt */ - fun _completedAt(): JsonField = rawResponse._completedAt() - - /** @see Response._conversation() */ - fun _conversation(): JsonField = rawResponse._conversation() - - /** @see Response._additionalProperties */ - fun _additionalProperties(): Map = rawResponse._additionalProperties() - - /** @see Response.validate */ - fun validate(): StructuredResponse = apply { - output().forEach { it.validate() } - rawResponse.validate() - } - - /** @see Response.isValid */ - fun isValid(): Boolean = - try { - validate() - true - } catch (e: OpenAIInvalidDataException) { - false - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - return other is StructuredResponse<*> && - responseType == other.responseType && - rawResponse == other.rawResponse - } - - private val hashCode: Int by lazy { Objects.hash(responseType, rawResponse) } - - override fun hashCode(): Int = hashCode - - override fun toString(): String = - "${javaClass.simpleName}{responseType=$responseType, rawResponse=$rawResponse}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseCreateParams.kt deleted file mode 100644 index 8ee91eecd..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseCreateParams.kt +++ /dev/null @@ -1,832 +0,0 @@ -package com.openai.models.responses - -import com.openai.core.JsonField -import com.openai.core.JsonSchemaLocalValidation -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.core.http.Headers -import com.openai.core.http.QueryParams -import com.openai.core.textConfigFromClass -import com.openai.models.ChatModel -import com.openai.models.Reasoning -import com.openai.models.ResponsesModel -import java.util.Objects -import java.util.Optional - -/** - * A wrapper for [ResponseCreateParams] that provides a type-safe [Builder] that can record the - * [responseType] used to derive a JSON schema from an arbitrary class when using the _Structured - * Outputs_ feature. When a JSON response is received, it is deserialized to an instance of that - * type. See the SDK documentation for more details on _Structured Outputs_. - * - * @param T The type of the class that will be used to derive the JSON schema in the request and to - * which the JSON response will be deserialized. - */ -class StructuredResponseCreateParams( - @get:JvmName("responseType") val responseType: Class, - /** - * The raw, underlying response create parameters wrapped by this structured instance of the - * parameters. - */ - @get:JvmName("rawParams") val rawParams: ResponseCreateParams, -) { - - companion object { - /** @see ResponseCreateParams.builder */ - @JvmStatic fun builder() = Builder() - } - - class Builder internal constructor() { - private var responseType: Class? = null - private var paramsBuilder = ResponseCreateParams.builder() - - @JvmSynthetic - internal fun wrap( - responseType: Class, - paramsBuilder: ResponseCreateParams.Builder, - localValidation: JsonSchemaLocalValidation, - ) = apply { - this.responseType = responseType - this.paramsBuilder = paramsBuilder - text(responseType, localValidation) - } - - @JvmSynthetic - internal fun wrap( - textConfig: StructuredResponseTextConfig, - paramsBuilder: ResponseCreateParams.Builder, - ) = apply { - this.responseType = textConfig.responseType - this.paramsBuilder = paramsBuilder - text(textConfig) - } - - /** Injects a given `ResponseCreateParams.Builder`. For use only when testing. */ - @JvmSynthetic - internal fun inject(paramsBuilder: ResponseCreateParams.Builder) = apply { - this.paramsBuilder = paramsBuilder - } - - // The `body(...)` function is deliberately not supported. - - /** @see ResponseCreateParams.Builder.input */ - fun input(input: ResponseCreateParams.Input) = apply { paramsBuilder.input(input) } - - /** @see ResponseCreateParams.Builder.input */ - fun input(input: JsonField) = apply { - paramsBuilder.input(input) - } - - /** @see ResponseCreateParams.Builder.input */ - fun input(text: String) = apply { paramsBuilder.input(text) } - - /** @see ResponseCreateParams.Builder.inputOfResponse */ - fun inputOfResponse(response: List) = apply { - paramsBuilder.inputOfResponse(response) - } - - /** @see ResponseCreateParams.Builder.model */ - fun model(model: ResponsesModel) = apply { paramsBuilder.model(model) } - - /** @see ResponseCreateParams.Builder.model */ - fun model(model: JsonField) = apply { paramsBuilder.model(model) } - - /** @see ResponseCreateParams.Builder.model */ - fun model(string: String) = apply { paramsBuilder.model(string) } - - /** @see ResponseCreateParams.Builder.model */ - fun model(chat: ChatModel) = apply { paramsBuilder.model(chat) } - - /** @see ResponseCreateParams.Builder.model */ - fun model(only: ResponsesModel.ResponsesOnlyModel) = apply { paramsBuilder.model(only) } - - /** @see ResponseCreateParams.Builder.background */ - fun background(background: Boolean?) = apply { paramsBuilder.background(background) } - - /** @see ResponseCreateParams.Builder.background */ - fun background(background: Boolean) = apply { paramsBuilder.background(background) } - - /** @see ResponseCreateParams.Builder.background */ - fun background(background: Optional) = apply { - paramsBuilder.background(background) - } - - /** @see ResponseCreateParams.Builder.background */ - fun background(background: JsonField) = apply { - paramsBuilder.background(background) - } - - /** @see ResponseCreateParams.Builder.contextManagement */ - fun contextManagement(contextManagement: List?) = - apply { - paramsBuilder.contextManagement(contextManagement) - } - - /** @see ResponseCreateParams.Builder.contextManagement */ - fun contextManagement( - contextManagement: Optional> - ) = apply { paramsBuilder.contextManagement(contextManagement) } - - /** @see ResponseCreateParams.Builder.contextManagement */ - fun contextManagement( - contextManagement: JsonField> - ) = apply { paramsBuilder.contextManagement(contextManagement) } - - /** @see ResponseCreateParams.Builder.addContextManagement */ - fun addContextManagement(contextManagement: ResponseCreateParams.ContextManagement) = - apply { - paramsBuilder.addContextManagement(contextManagement) - } - - /** @see ResponseCreateParams.Builder.conversation */ - fun conversation(conversation: ResponseCreateParams.Conversation?) = apply { - paramsBuilder.conversation(conversation) - } - - /** @see ResponseCreateParams.Builder.conversation */ - fun conversation(conversation: Optional) = apply { - paramsBuilder.conversation(conversation) - } - - /** @see ResponseCreateParams.Builder.conversation */ - fun conversation(conversation: JsonField) = apply { - paramsBuilder.conversation(conversation) - } - - /** @see ResponseCreateParams.Builder.conversation */ - fun conversation(id: String) = apply { paramsBuilder.conversation(id) } - - /** @see ResponseCreateParams.Builder.conversation */ - fun conversation(responseConversationParam: ResponseConversationParam) = apply { - paramsBuilder.conversation(responseConversationParam) - } - - /** @see ResponseCreateParams.Builder.include */ - fun include(include: List?) = apply { paramsBuilder.include(include) } - - /** @see ResponseCreateParams.Builder.include */ - fun include(include: Optional>) = apply { - paramsBuilder.include(include) - } - - /** @see ResponseCreateParams.Builder.include */ - fun include(include: JsonField>) = apply { - paramsBuilder.include(include) - } - - /** @see ResponseCreateParams.Builder.addInclude */ - fun addInclude(include: ResponseIncludable) = apply { paramsBuilder.addInclude(include) } - - /** @see ResponseCreateParams.Builder.instructions */ - fun instructions(instructions: String?) = apply { paramsBuilder.instructions(instructions) } - - /** @see ResponseCreateParams.Builder.instructions */ - fun instructions(instructions: Optional) = apply { - paramsBuilder.instructions(instructions) - } - - /** @see ResponseCreateParams.Builder.instructions */ - fun instructions(instructions: JsonField) = apply { - paramsBuilder.instructions(instructions) - } - - /** @see ResponseCreateParams.Builder.maxOutputTokens */ - fun maxOutputTokens(maxOutputTokens: Long?) = apply { - paramsBuilder.maxOutputTokens(maxOutputTokens) - } - - /** @see ResponseCreateParams.Builder.maxOutputTokens */ - fun maxOutputTokens(maxOutputTokens: Long) = apply { - paramsBuilder.maxOutputTokens(maxOutputTokens) - } - - /** @see ResponseCreateParams.Builder.maxOutputTokens */ - fun maxOutputTokens(maxOutputTokens: Optional) = apply { - paramsBuilder.maxOutputTokens(maxOutputTokens) - } - - /** @see ResponseCreateParams.Builder.maxOutputTokens */ - fun maxOutputTokens(maxOutputTokens: JsonField) = apply { - paramsBuilder.maxOutputTokens(maxOutputTokens) - } - - /** @see ResponseCreateParams.Builder.maxToolCalls */ - fun maxToolCalls(maxToolCalls: Long?) = apply { paramsBuilder.maxToolCalls(maxToolCalls) } - - /** @see ResponseCreateParams.Builder.maxToolCalls */ - fun maxToolCalls(maxToolCalls: Long) = apply { paramsBuilder.maxToolCalls(maxToolCalls) } - - /** @see ResponseCreateParams.Builder.maxToolCalls */ - fun maxToolCalls(maxToolCalls: Optional) = apply { - paramsBuilder.maxToolCalls(maxToolCalls) - } - - /** @see ResponseCreateParams.Builder.maxToolCalls */ - fun maxToolCalls(maxToolCalls: JsonField) = apply { - paramsBuilder.maxToolCalls(maxToolCalls) - } - - /** @see ResponseCreateParams.Builder.metadata */ - fun metadata(metadata: ResponseCreateParams.Metadata?) = apply { - paramsBuilder.metadata(metadata) - } - - /** @see ResponseCreateParams.Builder.metadata */ - fun metadata(metadata: Optional) = apply { - paramsBuilder.metadata(metadata) - } - - /** @see ResponseCreateParams.Builder.metadata */ - fun metadata(metadata: JsonField) = apply { - paramsBuilder.metadata(metadata) - } - - /** @see ResponseCreateParams.Builder.moderation */ - fun moderation(moderation: ResponseCreateParams.Moderation?) = apply { - paramsBuilder.moderation(moderation) - } - - /** @see ResponseCreateParams.Builder.moderation */ - fun moderation(moderation: Optional) = apply { - paramsBuilder.moderation(moderation) - } - - /** @see ResponseCreateParams.Builder.moderation */ - fun moderation(moderation: JsonField) = apply { - paramsBuilder.moderation(moderation) - } - - /** @see ResponseCreateParams.Builder.parallelToolCalls */ - fun parallelToolCalls(parallelToolCalls: Boolean?) = apply { - paramsBuilder.parallelToolCalls(parallelToolCalls) - } - - /** @see ResponseCreateParams.Builder.parallelToolCalls */ - fun parallelToolCalls(parallelToolCalls: Boolean) = apply { - paramsBuilder.parallelToolCalls(parallelToolCalls) - } - - /** @see ResponseCreateParams.Builder.parallelToolCalls */ - fun parallelToolCalls(parallelToolCalls: Optional) = apply { - paramsBuilder.parallelToolCalls(parallelToolCalls) - } - - /** @see ResponseCreateParams.Builder.parallelToolCalls */ - fun parallelToolCalls(parallelToolCalls: JsonField) = apply { - paramsBuilder.parallelToolCalls(parallelToolCalls) - } - - /** @see ResponseCreateParams.Builder.previousResponseId */ - fun previousResponseId(previousResponseId: String?) = apply { - paramsBuilder.previousResponseId(previousResponseId) - } - - /** @see ResponseCreateParams.Builder.previousResponseId */ - fun previousResponseId(previousResponseId: Optional) = apply { - paramsBuilder.previousResponseId(previousResponseId) - } - - /** @see ResponseCreateParams.Builder.previousResponseId */ - fun previousResponseId(previousResponseId: JsonField) = apply { - paramsBuilder.previousResponseId(previousResponseId) - } - - /** @see ResponseCreateParams.Builder.prompt */ - fun prompt(prompt: ResponsePrompt?) = apply { paramsBuilder.prompt(prompt) } - - /** @see ResponseCreateParams.Builder.prompt */ - fun prompt(prompt: Optional) = apply { paramsBuilder.prompt(prompt) } - - /** @see ResponseCreateParams.Builder.prompt */ - fun prompt(prompt: JsonField) = apply { paramsBuilder.prompt(prompt) } - - /** @see ResponseCreateParams.Builder.promptCacheKey */ - fun promptCacheKey(promptCacheKey: String) = apply { - paramsBuilder.promptCacheKey(promptCacheKey) - } - - /** @see ResponseCreateParams.Builder.promptCacheKey */ - fun promptCacheKey(promptCacheKey: Optional) = apply { - paramsBuilder.promptCacheKey(promptCacheKey) - } - - /** @see ResponseCreateParams.Builder.promptCacheKey */ - fun promptCacheKey(promptCacheKey: JsonField) = apply { - paramsBuilder.promptCacheKey(promptCacheKey) - } - - /** @see ResponseCreateParams.Builder.promptCacheOptions */ - fun promptCacheOptions(promptCacheOptions: ResponseCreateParams.PromptCacheOptions) = - apply { - paramsBuilder.promptCacheOptions(promptCacheOptions) - } - - /** @see ResponseCreateParams.Builder.promptCacheOptions */ - fun promptCacheOptions( - promptCacheOptions: JsonField - ) = apply { paramsBuilder.promptCacheOptions(promptCacheOptions) } - - /** @see ResponseCreateParams.Builder.promptCacheRetention */ - fun promptCacheRetention(promptCacheRetention: ResponseCreateParams.PromptCacheRetention?) = - apply { - paramsBuilder.promptCacheRetention(promptCacheRetention) - } - - /** @see ResponseCreateParams.Builder.promptCacheRetention */ - fun promptCacheRetention( - promptCacheRetention: Optional - ) = apply { paramsBuilder.promptCacheRetention(promptCacheRetention) } - - /** @see ResponseCreateParams.Builder.promptCacheRetention */ - fun promptCacheRetention( - promptCacheRetention: JsonField - ) = apply { paramsBuilder.promptCacheRetention(promptCacheRetention) } - - /** @see ResponseCreateParams.Builder.reasoning */ - fun reasoning(reasoning: Reasoning?) = apply { paramsBuilder.reasoning(reasoning) } - - /** @see ResponseCreateParams.Builder.reasoning */ - fun reasoning(reasoning: Optional) = apply { paramsBuilder.reasoning(reasoning) } - - /** @see ResponseCreateParams.Builder.reasoning */ - fun reasoning(reasoning: JsonField) = apply { - paramsBuilder.reasoning(reasoning) - } - - /** @see ResponseCreateParams.Builder.safetyIdentifier */ - fun safetyIdentifier(safetyIdentifier: String) = apply { - paramsBuilder.safetyIdentifier(safetyIdentifier) - } - - /** @see ResponseCreateParams.Builder.safetyIdentifier */ - fun safetyIdentifier(safetyIdentifier: Optional) = apply { - paramsBuilder.safetyIdentifier(safetyIdentifier) - } - - /** @see ResponseCreateParams.Builder.safetyIdentifier */ - fun safetyIdentifier(safetyIdentifier: JsonField) = apply { - paramsBuilder.safetyIdentifier(safetyIdentifier) - } - - /** @see ResponseCreateParams.Builder.serviceTier */ - fun serviceTier(serviceTier: ResponseCreateParams.ServiceTier?) = apply { - paramsBuilder.serviceTier(serviceTier) - } - - /** @see ResponseCreateParams.Builder.serviceTier */ - fun serviceTier(serviceTier: Optional) = apply { - paramsBuilder.serviceTier(serviceTier) - } - - /** @see ResponseCreateParams.Builder.serviceTier */ - fun serviceTier(serviceTier: JsonField) = apply { - paramsBuilder.serviceTier(serviceTier) - } - - /** @see ResponseCreateParams.Builder.store */ - fun store(store: Boolean?) = apply { paramsBuilder.store(store) } - - /** @see ResponseCreateParams.Builder.store */ - fun store(store: Boolean) = apply { paramsBuilder.store(store) } - - /** @see ResponseCreateParams.Builder.store */ - fun store(store: Optional) = apply { paramsBuilder.store(store) } - - /** @see ResponseCreateParams.Builder.store */ - fun store(store: JsonField) = apply { paramsBuilder.store(store) } - - /** @see ResponseCreateParams.Builder.temperature */ - fun temperature(temperature: Double?) = apply { paramsBuilder.temperature(temperature) } - - /** @see ResponseCreateParams.Builder.temperature */ - fun temperature(temperature: Double) = apply { paramsBuilder.temperature(temperature) } - - /** @see ResponseCreateParams.Builder.temperature */ - fun temperature(temperature: Optional) = apply { - paramsBuilder.temperature(temperature) - } - - /** @see ResponseCreateParams.Builder.temperature */ - fun temperature(temperature: JsonField) = apply { - paramsBuilder.temperature(temperature) - } - - /** - * Sets the text configuration's format to a JSON schema derived from the structure of the - * given class. - * - * @see ResponseCreateParams.Builder.text - */ - @JvmOverloads - fun text( - responseType: Class, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, - ) = apply { - this.responseType = responseType - paramsBuilder.text(textConfigFromClass(responseType, localValidation)) - } - - /** - * Sets the text configuration to a [StructuredResponseTextConfig] where the format was set - * to a JSON schema derived from the structure of a class. - * - * @see ResponseCreateParams.Builder.text - */ - fun text(text: StructuredResponseTextConfig) = apply { - this.responseType = text.responseType - paramsBuilder.text(text.rawConfig) - } - - /** @see ResponseCreateParams.Builder.toolChoice */ - fun toolChoice(toolChoice: ResponseCreateParams.ToolChoice) = apply { - paramsBuilder.toolChoice(toolChoice) - } - - /** @see ResponseCreateParams.Builder.toolChoice */ - fun toolChoice(toolChoice: JsonField) = apply { - paramsBuilder.toolChoice(toolChoice) - } - - /** @see ResponseCreateParams.Builder.toolChoice */ - fun toolChoice(options: ToolChoiceOptions) = apply { paramsBuilder.toolChoice(options) } - - /** @see ResponseCreateParams.Builder.toolChoice */ - fun toolChoice(types: ToolChoiceTypes) = apply { paramsBuilder.toolChoice(types) } - - /** @see ResponseCreateParams.Builder.toolChoice */ - fun toolChoice(function: ToolChoiceFunction) = apply { paramsBuilder.toolChoice(function) } - - /** @see ResponseCreateParams.Builder.toolChoice */ - fun toolChoice(mcp: ToolChoiceMcp) = apply { paramsBuilder.toolChoice(mcp) } - - /** @see ResponseCreateParams.Builder.toolChoice */ - fun toolChoice(allowed: com.openai.models.responses.ToolChoiceAllowed) = apply { - paramsBuilder.toolChoice(allowed) - } - - /** @see ResponseCreateParams.Builder.toolChoice */ - fun toolChoice(custom: ToolChoiceCustom) = apply { paramsBuilder.toolChoice(custom) } - - /** @see ResponseCreateParams.Builder.toolChoice */ - fun toolChoice(applyPatch: ToolChoiceApplyPatch) = apply { - paramsBuilder.toolChoice(applyPatch) - } - - /** @see ResponseCreateParams.Builder.toolChoice */ - fun toolChoice(shell: ToolChoiceShell) = apply { paramsBuilder.toolChoice(shell) } - - /** @see ResponseCreateParams.Builder.toolChoiceSpecificProgrammaticToolCallingParam */ - fun toolChoiceSpecificProgrammaticToolCallingParam() = apply { - paramsBuilder.toolChoiceSpecificProgrammaticToolCallingParam() - } - - /** @see ResponseCreateParams.Builder.tools */ - fun tools(tools: List) = apply { paramsBuilder.tools(tools) } - - /** @see ResponseCreateParams.Builder.tools */ - fun tools(tools: JsonField>) = apply { paramsBuilder.tools(tools) } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(tool: Tool) = apply { paramsBuilder.addTool(tool) } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(function: FunctionTool) = apply { paramsBuilder.addTool(function) } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(namespace: NamespaceTool) = apply { paramsBuilder.addTool(namespace) } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(search: ToolSearchTool) = apply { paramsBuilder.addTool(search) } - - /** @see ResponseCreateParams.Builder.addTool */ - @JvmOverloads - fun addTool( - functionParametersType: Class<*>, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, - ) = apply { paramsBuilder.addTool(functionParametersType, localValidation) } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(fileSearch: FileSearchTool) = apply { paramsBuilder.addTool(fileSearch) } - - /** @see ResponseCreateParams.Builder.addFileSearchTool */ - fun addFileSearchTool(vectorStoreIds: List) = apply { - paramsBuilder.addFileSearchTool(vectorStoreIds) - } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(computer: ComputerTool) = apply { paramsBuilder.addTool(computer) } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(webSearch: WebSearchTool) = apply { paramsBuilder.addTool(webSearch) } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(webSearchPreview: WebSearchPreviewTool) = apply { - paramsBuilder.addTool(webSearchPreview) - } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(applyPatch: ApplyPatchTool) = apply { paramsBuilder.addTool(applyPatch) } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(computerUsePreview: ComputerUsePreviewTool) = apply { - paramsBuilder.addTool(computerUsePreview) - } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(mcp: Tool.Mcp) = apply { paramsBuilder.addTool(mcp) } - - /** @see ResponseCreateParams.Builder.addMcpTool */ - fun addMcpTool(serverLabel: String) = apply { paramsBuilder.addMcpTool(serverLabel) } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(codeInterpreter: Tool.CodeInterpreter) = apply { - paramsBuilder.addTool(codeInterpreter) - } - - /** @see ResponseCreateParams.Builder.addCodeInterpreterTool */ - fun addCodeInterpreterTool(container: Tool.CodeInterpreter.Container) = apply { - paramsBuilder.addCodeInterpreterTool(container) - } - - /** @see ResponseCreateParams.Builder.addCodeInterpreterTool */ - fun addCodeInterpreterTool(string: String) = apply { - paramsBuilder.addCodeInterpreterTool(string) - } - - /** @see ResponseCreateParams.Builder.addCodeInterpreterTool */ - fun addCodeInterpreterTool( - codeInterpreterToolAuto: Tool.CodeInterpreter.Container.CodeInterpreterToolAuto - ) = apply { paramsBuilder.addCodeInterpreterTool(codeInterpreterToolAuto) } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(imageGeneration: Tool.ImageGeneration) = apply { - paramsBuilder.addTool(imageGeneration) - } - - /** @see ResponseCreateParams.Builder.addToolLocalShell */ - fun addToolLocalShell() = apply { paramsBuilder.addToolLocalShell() } - - /** @see ResponseCreateParams.Builder.addToolProgrammaticToolCalling */ - fun addToolProgrammaticToolCalling() = apply { - paramsBuilder.addToolProgrammaticToolCalling() - } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(shell: FunctionShellTool) = apply { paramsBuilder.addTool(shell) } - - /** @see ResponseCreateParams.Builder.addTool */ - fun addTool(custom: CustomTool) = apply { paramsBuilder.addTool(custom) } - - /** @see ResponseCreateParams.Builder.addCustomTool */ - fun addCustomTool(name: String) = apply { paramsBuilder.addCustomTool(name) } - - /** @see ResponseCreateParams.Builder.topP */ - fun topP(topP: Double?) = apply { paramsBuilder.topP(topP) } - - /** @see ResponseCreateParams.Builder.topP */ - fun topP(topP: Double) = apply { paramsBuilder.topP(topP) } - - /** @see ResponseCreateParams.Builder.topP */ - fun topP(topP: Optional) = apply { paramsBuilder.topP(topP) } - - /** @see ResponseCreateParams.Builder.topP */ - fun topP(topP: JsonField) = apply { paramsBuilder.topP(topP) } - - /** @see ResponseCreateParams.Builder.topLogprobs */ - fun topLogprobs(topLogprobs: Long?) = apply { paramsBuilder.topLogprobs(topLogprobs) } - - /** @see ResponseCreateParams.Builder.topLogprobs */ - fun topLogprobs(topLogprobs: Long) = apply { paramsBuilder.topLogprobs(topLogprobs) } - - /** @see ResponseCreateParams.Builder.topLogprobs */ - fun topLogprobs(topLogprobs: Optional) = apply { - paramsBuilder.topLogprobs(topLogprobs) - } - - /** @see ResponseCreateParams.Builder.topLogprobs */ - fun topLogprobs(topLogprobs: JsonField) = apply { - paramsBuilder.topLogprobs(topLogprobs) - } - - /** @see ResponseCreateParams.Builder.truncation */ - fun truncation(truncation: ResponseCreateParams.Truncation?) = apply { - paramsBuilder.truncation(truncation) - } - - /** @see ResponseCreateParams.Builder.truncation */ - fun truncation(truncation: Optional) = apply { - paramsBuilder.truncation(truncation) - } - - /** @see ResponseCreateParams.Builder.truncation */ - fun truncation(truncation: JsonField) = apply { - paramsBuilder.truncation(truncation) - } - - /** @see ResponseCreateParams.Builder.streamOptions */ - fun streamOptions(streamOptions: ResponseCreateParams.StreamOptions?) = apply { - paramsBuilder.streamOptions(streamOptions) - } - - /** @see ResponseCreateParams.Builder.streamOptions */ - fun streamOptions(streamOptions: Optional) = apply { - paramsBuilder.streamOptions(streamOptions) - } - - /** @see ResponseCreateParams.Builder.streamOptions */ - fun streamOptions(streamOptions: JsonField) = apply { - paramsBuilder.streamOptions(streamOptions) - } - - /** @see ResponseCreateParams.Builder.user */ - fun user(user: String) = apply { paramsBuilder.user(user) } - - /** @see ResponseCreateParams.Builder.user */ - fun user(user: JsonField) = apply { paramsBuilder.user(user) } - - /** @see ResponseCreateParams.Builder.additionalBodyProperties */ - fun additionalBodyProperties(additionalBodyProperties: Map) = apply { - paramsBuilder.additionalBodyProperties(additionalBodyProperties) - } - - /** @see ResponseCreateParams.Builder.putAdditionalBodyProperty */ - fun putAdditionalBodyProperty(key: String, value: JsonValue) = apply { - paramsBuilder.putAdditionalBodyProperty(key, value) - } - - /** @see ResponseCreateParams.Builder.putAllAdditionalBodyProperties */ - fun putAllAdditionalBodyProperties(additionalBodyProperties: Map) = - apply { - paramsBuilder.putAllAdditionalBodyProperties(additionalBodyProperties) - } - - /** @see ResponseCreateParams.Builder.removeAdditionalBodyProperty */ - fun removeAdditionalBodyProperty(key: String) = apply { - paramsBuilder.removeAdditionalBodyProperty(key) - } - - /** @see ResponseCreateParams.Builder.removeAllAdditionalBodyProperties */ - fun removeAllAdditionalBodyProperties(keys: Set) = apply { - paramsBuilder.removeAllAdditionalBodyProperties(keys) - } - - /** @see ResponseCreateParams.Builder.additionalHeaders */ - fun additionalHeaders(additionalHeaders: Headers) = apply { - paramsBuilder.additionalHeaders(additionalHeaders) - } - - /** @see ResponseCreateParams.Builder.additionalHeaders */ - fun additionalHeaders(additionalHeaders: Map>) = apply { - paramsBuilder.additionalHeaders(additionalHeaders) - } - - /** @see ResponseCreateParams.Builder.putAdditionalHeader */ - fun putAdditionalHeader(name: String, value: String) = apply { - paramsBuilder.putAdditionalHeader(name, value) - } - - /** @see ResponseCreateParams.Builder.putAdditionalHeaders */ - fun putAdditionalHeaders(name: String, values: Iterable) = apply { - paramsBuilder.putAdditionalHeaders(name, values) - } - - /** @see ResponseCreateParams.Builder.putAllAdditionalHeaders */ - fun putAllAdditionalHeaders(additionalHeaders: Headers) = apply { - paramsBuilder.putAllAdditionalHeaders(additionalHeaders) - } - - /** @see ResponseCreateParams.Builder.putAllAdditionalHeaders */ - fun putAllAdditionalHeaders(additionalHeaders: Map>) = apply { - paramsBuilder.putAllAdditionalHeaders(additionalHeaders) - } - - /** @see ResponseCreateParams.Builder.replaceAdditionalHeaders */ - fun replaceAdditionalHeaders(name: String, value: String) = apply { - paramsBuilder.replaceAdditionalHeaders(name, value) - } - - /** @see ResponseCreateParams.Builder.replaceAdditionalHeaders */ - fun replaceAdditionalHeaders(name: String, values: Iterable) = apply { - paramsBuilder.replaceAdditionalHeaders(name, values) - } - - /** @see ResponseCreateParams.Builder.replaceAllAdditionalHeaders */ - fun replaceAllAdditionalHeaders(additionalHeaders: Headers) = apply { - paramsBuilder.replaceAllAdditionalHeaders(additionalHeaders) - } - - /** @see ResponseCreateParams.Builder.replaceAllAdditionalHeaders */ - fun replaceAllAdditionalHeaders(additionalHeaders: Map>) = apply { - paramsBuilder.replaceAllAdditionalHeaders(additionalHeaders) - } - - /** @see ResponseCreateParams.Builder.removeAdditionalHeaders */ - fun removeAdditionalHeaders(name: String) = apply { - paramsBuilder.removeAdditionalHeaders(name) - } - - /** @see ResponseCreateParams.Builder.removeAllAdditionalHeaders */ - fun removeAllAdditionalHeaders(names: Set) = apply { - paramsBuilder.removeAllAdditionalHeaders(names) - } - - /** @see ResponseCreateParams.Builder.additionalQueryParams */ - fun additionalQueryParams(additionalQueryParams: QueryParams) = apply { - paramsBuilder.additionalQueryParams(additionalQueryParams) - } - - /** @see ResponseCreateParams.Builder.additionalQueryParams */ - fun additionalQueryParams(additionalQueryParams: Map>) = apply { - paramsBuilder.additionalQueryParams(additionalQueryParams) - } - - /** @see ResponseCreateParams.Builder.putAdditionalQueryParam */ - fun putAdditionalQueryParam(key: String, value: String) = apply { - paramsBuilder.putAdditionalQueryParam(key, value) - } - - /** @see ResponseCreateParams.Builder.putAdditionalQueryParams */ - fun putAdditionalQueryParams(key: String, values: Iterable) = apply { - paramsBuilder.putAdditionalQueryParams(key, values) - } - - /** @see ResponseCreateParams.Builder.putAllAdditionalQueryParams */ - fun putAllAdditionalQueryParams(additionalQueryParams: QueryParams) = apply { - paramsBuilder.putAllAdditionalQueryParams(additionalQueryParams) - } - - /** @see ResponseCreateParams.Builder.putAllAdditionalQueryParams */ - fun putAllAdditionalQueryParams(additionalQueryParams: Map>) = - apply { - paramsBuilder.putAllAdditionalQueryParams(additionalQueryParams) - } - - /** @see ResponseCreateParams.Builder.replaceAdditionalQueryParams */ - fun replaceAdditionalQueryParams(key: String, value: String) = apply { - paramsBuilder.replaceAdditionalQueryParams(key, value) - } - - /** @see ResponseCreateParams.Builder.replaceAdditionalQueryParams */ - fun replaceAdditionalQueryParams(key: String, values: Iterable) = apply { - paramsBuilder.replaceAdditionalQueryParams(key, values) - } - - /** @see ResponseCreateParams.Builder.replaceAllAdditionalQueryParams */ - fun replaceAllAdditionalQueryParams(additionalQueryParams: QueryParams) = apply { - paramsBuilder.replaceAllAdditionalQueryParams(additionalQueryParams) - } - - /** @see ResponseCreateParams.Builder.replaceAllAdditionalQueryParams */ - fun replaceAllAdditionalQueryParams(additionalQueryParams: Map>) = - apply { - paramsBuilder.replaceAllAdditionalQueryParams(additionalQueryParams) - } - - /** @see ResponseCreateParams.Builder.removeAdditionalQueryParams */ - fun removeAdditionalQueryParams(key: String) = apply { - paramsBuilder.removeAdditionalQueryParams(key) - } - - /** @see ResponseCreateParams.Builder.removeAllAdditionalQueryParams */ - fun removeAllAdditionalQueryParams(keys: Set) = apply { - paramsBuilder.removeAllAdditionalQueryParams(keys) - } - - /** - * Returns an immutable instance of [StructuredResponseCreateParams]. - * - * Further updates to this [Builder] will not mutate the returned instance. - * - * The following fields are required: - * ```java - * .input() - * .model() - * .text() - * ``` - * - * @throws IllegalStateException if any required field is unset. - */ - fun build() = - StructuredResponseCreateParams( - checkRequired("responseType", responseType), - paramsBuilder.build(), - ) - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is StructuredResponseCreateParams<*> && - responseType == other.responseType && - rawParams == other.rawParams - } - - private val hashCode: Int by lazy { Objects.hash(responseType, rawParams) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "${javaClass.simpleName}{responseType=$responseType, rawParams=$rawParams}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseOutputItem.kt deleted file mode 100644 index 9bc9b2966..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseOutputItem.kt +++ /dev/null @@ -1,611 +0,0 @@ -package com.openai.models.responses - -import com.openai.core.JsonValue -import com.openai.errors.OpenAIInvalidDataException -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrElse -import kotlin.jvm.optionals.getOrNull - -/** - * A wrapper for [ResponseOutputItem] that provides type-safe access to the [message] when using the - * _Structured Outputs_ feature to deserialize a JSON response to an instance of an arbitrary class. - * See the SDK documentation for more details on _Structured Outputs_. - * - * @param T The type of the class to which the JSON data in the content will be deserialized when - * [message] is called. - */ -class StructuredResponseOutputItem( - @get:JvmName("responseType") val responseType: Class, - @get:JvmName("rawOutputItem") val rawOutputItem: ResponseOutputItem, -) { - private val message by lazy { - rawOutputItem.message().map { StructuredResponseOutputMessage(responseType, it) } - } - - /** @see ResponseOutputItem.message */ - fun message(): Optional> = message - - /** @see ResponseOutputItem.fileSearchCall */ - fun fileSearchCall(): Optional = rawOutputItem.fileSearchCall() - - /** @see ResponseOutputItem.functionCall */ - fun functionCall(): Optional = rawOutputItem.functionCall() - - /** @see ResponseOutputItem.functionCallOutput */ - fun functionCallOutput(): Optional = - rawOutputItem.functionCallOutput() - - /** @see ResponseOutputItem.toolSearchCall */ - fun toolSearchCall(): Optional = rawOutputItem.toolSearchCall() - - /** @see ResponseOutputItem.toolSearchOutput */ - fun toolSearchOutput(): Optional = - rawOutputItem.toolSearchOutput() - - /** @see ResponseOutputItem.additionalTools */ - fun additionalTools(): Optional = - rawOutputItem.additionalTools() - - /** @see ResponseOutputItem.webSearchCall */ - fun webSearchCall(): Optional = rawOutputItem.webSearchCall() - - /** @see ResponseOutputItem.computerCall */ - fun computerCall(): Optional = rawOutputItem.computerCall() - - /** @see ResponseOutputItem.computerCallOutput */ - fun computerCallOutput(): Optional = - rawOutputItem.computerCallOutput() - - /** @see ResponseOutputItem.reasoning */ - fun reasoning(): Optional = rawOutputItem.reasoning() - - /** @see ResponseOutputItem.program */ - fun program(): Optional = rawOutputItem.program() - - /** @see ResponseOutputItem.programOutput */ - fun programOutput(): Optional = rawOutputItem.programOutput() - - /** @see ResponseOutputItem.compaction */ - fun compaction(): Optional = rawOutputItem.compaction() - - /** @see ResponseOutputItem.codeInterpreterCall */ - fun codeInterpreterCall(): Optional = - rawOutputItem.codeInterpreterCall() - - /** @see ResponseOutputItem.imageGenerationCall */ - fun imageGenerationCall(): Optional = - rawOutputItem.imageGenerationCall() - - /** @see ResponseOutputItem.localShellCall */ - fun localShellCall(): Optional = - rawOutputItem.localShellCall() - - /** @see ResponseOutputItem.localShellCallOutput */ - fun localShellCallOutput(): Optional = - rawOutputItem.localShellCallOutput() - - /** @see ResponseOutputItem.shellCall */ - fun shellCall(): Optional = rawOutputItem.shellCall() - - /** @see ResponseOutputItem.shellCallOutput */ - fun shellCallOutput(): Optional = - rawOutputItem.shellCallOutput() - - /** @see ResponseOutputItem.applyPatchCall */ - fun applyPatchCall(): Optional = rawOutputItem.applyPatchCall() - - /** @see ResponseOutputItem.applyPatchCallOutput */ - fun applyPatchCallOutput(): Optional = - rawOutputItem.applyPatchCallOutput() - - /** @see ResponseOutputItem.mcpApprovalRequest */ - fun mcpApprovalRequest(): Optional = - rawOutputItem.mcpApprovalRequest() - - /** @see ResponseOutputItem.mcpApprovalResponse */ - fun mcpApprovalResponse(): Optional = - rawOutputItem.mcpApprovalResponse() - - /** @see ResponseOutputItem.mcpCall */ - fun mcpCall(): Optional = rawOutputItem.mcpCall() - - /** @see ResponseOutputItem.mcpListTools */ - fun mcpListTools(): Optional = rawOutputItem.mcpListTools() - - /** @see ResponseOutputItem.customToolCall */ - fun customToolCall(): Optional = rawOutputItem.customToolCall() - - /** @see ResponseOutputItem.customToolCallOutput */ - fun customToolCallOutput(): Optional = - rawOutputItem.customToolCallOutput() - - /** @see ResponseOutputItem.isMessage */ - fun isMessage(): Boolean = message().isPresent - - /** @see ResponseOutputItem.isFileSearchCall */ - fun isFileSearchCall(): Boolean = rawOutputItem.isFileSearchCall() - - /** @see ResponseOutputItem.isFunctionCall */ - fun isFunctionCall(): Boolean = rawOutputItem.isFunctionCall() - - /** @see ResponseOutputItem.isFunctionCallOutput */ - fun isFunctionCallOutput(): Boolean = rawOutputItem.isFunctionCallOutput() - - /** @see ResponseOutputItem.isToolSearchCall */ - fun isToolSearchCall(): Boolean = rawOutputItem.isToolSearchCall() - - /** @see ResponseOutputItem.isToolSearchOutput */ - fun isToolSearchOutput(): Boolean = rawOutputItem.isToolSearchOutput() - - /** @see ResponseOutputItem.isAdditionalTools */ - fun isAdditionalTools(): Boolean = rawOutputItem.isAdditionalTools() - - /** @see ResponseOutputItem.isWebSearchCall */ - fun isWebSearchCall(): Boolean = rawOutputItem.isWebSearchCall() - - /** @see ResponseOutputItem.isComputerCall */ - fun isComputerCall(): Boolean = rawOutputItem.isComputerCall() - - /** @see ResponseOutputItem.isComputerCallOutput */ - fun isComputerCallOutput(): Boolean = rawOutputItem.isComputerCallOutput() - - /** @see ResponseOutputItem.isReasoning */ - fun isReasoning(): Boolean = rawOutputItem.isReasoning() - - /** @see ResponseOutputItem.isProgram */ - fun isProgram(): Boolean = rawOutputItem.isProgram() - - /** @see ResponseOutputItem.isProgramOutput */ - fun isProgramOutput(): Boolean = rawOutputItem.isProgramOutput() - - /** @see ResponseOutputItem.isCompaction */ - fun isCompaction(): Boolean = rawOutputItem.isCompaction() - - /** @see ResponseOutputItem.isCodeInterpreterCall */ - fun isCodeInterpreterCall(): Boolean = rawOutputItem.isCodeInterpreterCall() - - /** @see ResponseOutputItem.isImageGenerationCall */ - fun isImageGenerationCall(): Boolean = rawOutputItem.isImageGenerationCall() - - /** @see ResponseOutputItem.isLocalShellCall */ - fun isLocalShellCall(): Boolean = rawOutputItem.isLocalShellCall() - - /** @see ResponseOutputItem.isLocalShellCallOutput */ - fun isLocalShellCallOutput(): Boolean = rawOutputItem.isLocalShellCallOutput() - - /** @see ResponseOutputItem.isShellCall */ - fun isShellCall(): Boolean = rawOutputItem.isShellCall() - - /** @see ResponseOutputItem.isShellCallOutput */ - fun isShellCallOutput(): Boolean = rawOutputItem.isShellCallOutput() - - /** @see ResponseOutputItem.isApplyPatchCall */ - fun isApplyPatchCall(): Boolean = rawOutputItem.isApplyPatchCall() - - /** @see ResponseOutputItem.isApplyPatchCallOutput */ - fun isApplyPatchCallOutput(): Boolean = rawOutputItem.isApplyPatchCallOutput() - - /** @see ResponseOutputItem.isMcpApprovalRequest */ - fun isMcpApprovalRequest(): Boolean = rawOutputItem.isMcpApprovalRequest() - - /** @see ResponseOutputItem.isMcpApprovalResponse */ - fun isMcpApprovalResponse(): Boolean = rawOutputItem.isMcpApprovalResponse() - - /** @see ResponseOutputItem.isMcpCall */ - fun isMcpCall(): Boolean = rawOutputItem.isMcpCall() - - /** @see ResponseOutputItem.isMcpListTools */ - fun isMcpListTools(): Boolean = rawOutputItem.isMcpListTools() - - /** @see ResponseOutputItem.isCustomToolCall */ - fun isCustomToolCall(): Boolean = rawOutputItem.isCustomToolCall() - - /** @see ResponseOutputItem.isCustomToolCallOutput */ - fun isCustomToolCallOutput(): Boolean = rawOutputItem.isCustomToolCallOutput() - - /** @see ResponseOutputItem.asMessage */ - fun asMessage(): StructuredResponseOutputMessage = - message.getOrElse { - // Same behavior as `com.openai.core.getOrThrow` used by the delegate class. - throw OpenAIInvalidDataException("`message` is not present") - } - - /** @see ResponseOutputItem.asFileSearchCall */ - fun asFileSearchCall(): ResponseFileSearchToolCall = rawOutputItem.asFileSearchCall() - - /** @see ResponseOutputItem.asFunctionCall */ - fun asFunctionCall(): ResponseFunctionToolCall = rawOutputItem.asFunctionCall() - - /** @see ResponseOutputItem.asFunctionCallOutput */ - fun asFunctionCallOutput(): ResponseFunctionToolCallOutputItem = - rawOutputItem.asFunctionCallOutput() - - /** @see ResponseOutputItem.asToolSearchCall */ - fun asToolSearchCall(): ResponseToolSearchCall = rawOutputItem.asToolSearchCall() - - /** @see ResponseOutputItem.asToolSearchOutput */ - fun asToolSearchOutput(): ResponseToolSearchOutputItem = rawOutputItem.asToolSearchOutput() - - /** @see ResponseOutputItem.asAdditionalTools */ - fun asAdditionalTools(): ResponseOutputItem.AdditionalTools = rawOutputItem.asAdditionalTools() - - /** @see ResponseOutputItem.asWebSearchCall */ - fun asWebSearchCall(): ResponseFunctionWebSearch = rawOutputItem.asWebSearchCall() - - /** @see ResponseOutputItem.asComputerCall */ - fun asComputerCall(): ResponseComputerToolCall = rawOutputItem.asComputerCall() - - /** @see ResponseOutputItem.asComputerCallOutput */ - fun asComputerCallOutput(): ResponseComputerToolCallOutputItem = - rawOutputItem.asComputerCallOutput() - - /** @see ResponseOutputItem.asReasoning */ - fun asReasoning(): ResponseReasoningItem = rawOutputItem.asReasoning() - - /** @see ResponseOutputItem.asProgram */ - fun asProgram(): ResponseOutputItem.Program = rawOutputItem.asProgram() - - /** @see ResponseOutputItem.asProgramOutput */ - fun asProgramOutput(): ResponseOutputItem.ProgramOutput = rawOutputItem.asProgramOutput() - - /** @see ResponseOutputItem.asCompaction */ - fun asCompaction(): ResponseCompactionItem = rawOutputItem.asCompaction() - - /** @see ResponseOutputItem.asCodeInterpreterCall */ - fun asCodeInterpreterCall(): ResponseCodeInterpreterToolCall = - rawOutputItem.asCodeInterpreterCall() - - /** @see ResponseOutputItem.asImageGenerationCall */ - fun asImageGenerationCall(): ResponseOutputItem.ImageGenerationCall = - rawOutputItem.asImageGenerationCall() - - /** @see ResponseOutputItem.asLocalShellCall */ - fun asLocalShellCall(): ResponseOutputItem.LocalShellCall = rawOutputItem.asLocalShellCall() - - /** @see ResponseOutputItem.asLocalShellCallOutput */ - fun asLocalShellCallOutput(): ResponseOutputItem.LocalShellCallOutput = - rawOutputItem.asLocalShellCallOutput() - - /** @see ResponseOutputItem.asShellCall */ - fun asShellCall(): ResponseFunctionShellToolCall = rawOutputItem.asShellCall() - - /** @see ResponseOutputItem.asShellCallOutput */ - fun asShellCallOutput(): ResponseFunctionShellToolCallOutput = rawOutputItem.asShellCallOutput() - - /** @see ResponseOutputItem.asApplyPatchCall */ - fun asApplyPatchCall(): ResponseApplyPatchToolCall = rawOutputItem.asApplyPatchCall() - - /** @see ResponseOutputItem.asApplyPatchCallOutput */ - fun asApplyPatchCallOutput(): ResponseApplyPatchToolCallOutput = - rawOutputItem.asApplyPatchCallOutput() - - /** @see ResponseOutputItem.asMcpApprovalRequest */ - fun asMcpApprovalRequest(): ResponseOutputItem.McpApprovalRequest = - rawOutputItem.asMcpApprovalRequest() - - /** @see ResponseOutputItem.asMcpApprovalResponse */ - fun asMcpApprovalResponse(): ResponseOutputItem.McpApprovalResponse = - rawOutputItem.asMcpApprovalResponse() - - /** @see ResponseOutputItem.asMcpCall */ - fun asMcpCall(): ResponseOutputItem.McpCall = rawOutputItem.asMcpCall() - - /** @see ResponseOutputItem.asMcpListTools */ - fun asMcpListTools(): ResponseOutputItem.McpListTools = rawOutputItem.asMcpListTools() - - /** @see ResponseOutputItem.asCustomToolCall */ - fun asCustomToolCall(): ResponseCustomToolCall = rawOutputItem.asCustomToolCall() - - /** @see ResponseOutputItem.asCustomToolCallOutput */ - fun asCustomToolCallOutput(): ResponseCustomToolCallOutputItem = - rawOutputItem.asCustomToolCallOutput() - - /** @see ResponseOutputItem._json */ - fun _json(): Optional = rawOutputItem._json() - - /** @see ResponseOutputItem.accept */ - fun accept(visitor: Visitor): R = - when { - isMessage() -> visitor.visitMessage(asMessage()) - isFileSearchCall() -> visitor.visitFileSearchCall(asFileSearchCall()) - isFunctionCall() -> visitor.visitFunctionCall(asFunctionCall()) - isFunctionCallOutput() -> visitor.visitFunctionCallOutput(asFunctionCallOutput()) - isToolSearchCall() -> visitor.visitToolSearchCall(asToolSearchCall()) - isToolSearchOutput() -> visitor.visitToolSearchOutput(asToolSearchOutput()) - isAdditionalTools() -> visitor.visitAdditionalTools(asAdditionalTools()) - isWebSearchCall() -> visitor.visitWebSearchCall(asWebSearchCall()) - isComputerCall() -> visitor.visitComputerCall(asComputerCall()) - isComputerCallOutput() -> visitor.visitComputerCallOutput(asComputerCallOutput()) - isReasoning() -> visitor.visitReasoning(asReasoning()) - isProgram() -> visitor.visitProgram(asProgram()) - isProgramOutput() -> visitor.visitProgramOutput(asProgramOutput()) - isCompaction() -> visitor.visitCompaction(asCompaction()) - isCodeInterpreterCall() -> visitor.visitCodeInterpreterCall(asCodeInterpreterCall()) - isImageGenerationCall() -> visitor.visitImageGenerationCall(asImageGenerationCall()) - isLocalShellCall() -> visitor.visitLocalShellCall(asLocalShellCall()) - isLocalShellCallOutput() -> visitor.visitLocalShellCallOutput(asLocalShellCallOutput()) - isShellCall() -> visitor.visitShellCall(asShellCall()) - isShellCallOutput() -> visitor.visitShellCallOutput(asShellCallOutput()) - isApplyPatchCall() -> visitor.visitApplyPatchCall(asApplyPatchCall()) - isApplyPatchCallOutput() -> visitor.visitApplyPatchCallOutput(asApplyPatchCallOutput()) - isMcpApprovalRequest() -> visitor.visitMcpApprovalRequest(asMcpApprovalRequest()) - isMcpApprovalResponse() -> visitor.visitMcpApprovalResponse(asMcpApprovalResponse()) - isMcpCall() -> visitor.visitMcpCall(asMcpCall()) - isMcpListTools() -> visitor.visitMcpListTools(asMcpListTools()) - isCustomToolCall() -> visitor.visitCustomToolCall(asCustomToolCall()) - isCustomToolCallOutput() -> visitor.visitCustomToolCallOutput(asCustomToolCallOutput()) - else -> visitor.unknown(_json().getOrNull()) - } - - private var validated: Boolean = false - - /** @see ResponseOutputItem.validate */ - fun validate(): StructuredResponseOutputItem = apply { - if (validated) { - return@apply - } - - accept( - object : Visitor { - override fun visitMessage(message: StructuredResponseOutputMessage) { - message.validate() - } - - override fun visitFileSearchCall(fileSearchCall: ResponseFileSearchToolCall) { - fileSearchCall.validate() - } - - override fun visitFunctionCall(functionCall: ResponseFunctionToolCall) { - functionCall.validate() - } - - override fun visitFunctionCallOutput( - functionCallOutput: ResponseFunctionToolCallOutputItem - ) { - functionCallOutput.validate() - } - - override fun visitToolSearchCall(toolSearchCall: ResponseToolSearchCall) { - toolSearchCall.validate() - } - - override fun visitToolSearchOutput(toolSearchOutput: ResponseToolSearchOutputItem) { - toolSearchOutput.validate() - } - - override fun visitAdditionalTools( - additionalTools: ResponseOutputItem.AdditionalTools - ) { - additionalTools.validate() - } - - override fun visitWebSearchCall(webSearchCall: ResponseFunctionWebSearch) { - webSearchCall.validate() - } - - override fun visitComputerCall(computerCall: ResponseComputerToolCall) { - computerCall.validate() - } - - override fun visitComputerCallOutput( - computerCallOutput: ResponseComputerToolCallOutputItem - ) { - computerCallOutput.validate() - } - - override fun visitReasoning(reasoning: ResponseReasoningItem) { - reasoning.validate() - } - - override fun visitProgram(program: ResponseOutputItem.Program) { - program.validate() - } - - override fun visitProgramOutput(programOutput: ResponseOutputItem.ProgramOutput) { - programOutput.validate() - } - - override fun visitCompaction(compaction: ResponseCompactionItem) { - compaction.validate() - } - - override fun visitCodeInterpreterCall( - codeInterpreterCall: ResponseCodeInterpreterToolCall - ) { - codeInterpreterCall.validate() - } - - override fun visitImageGenerationCall( - imageGenerationCall: ResponseOutputItem.ImageGenerationCall - ) { - imageGenerationCall.validate() - } - - override fun visitLocalShellCall( - localShellCall: ResponseOutputItem.LocalShellCall - ) { - localShellCall.validate() - } - - override fun visitLocalShellCallOutput( - localShellCallOutput: ResponseOutputItem.LocalShellCallOutput - ) { - localShellCallOutput.validate() - } - - override fun visitShellCall(shellCall: ResponseFunctionShellToolCall) { - shellCall.validate() - } - - override fun visitShellCallOutput( - shellCallOutput: ResponseFunctionShellToolCallOutput - ) { - shellCallOutput.validate() - } - - override fun visitApplyPatchCall(applyPatchCall: ResponseApplyPatchToolCall) { - applyPatchCall.validate() - } - - override fun visitApplyPatchCallOutput( - applyPatchCallOutput: ResponseApplyPatchToolCallOutput - ) { - applyPatchCallOutput.validate() - } - - override fun visitMcpApprovalRequest( - mcpApprovalRequest: ResponseOutputItem.McpApprovalRequest - ) { - mcpApprovalRequest.validate() - } - - override fun visitMcpApprovalResponse( - mcpApprovalResponse: ResponseOutputItem.McpApprovalResponse - ) { - mcpApprovalResponse.validate() - } - - override fun visitMcpCall(mcpCall: ResponseOutputItem.McpCall) { - mcpCall.validate() - } - - override fun visitMcpListTools(mcpListTools: ResponseOutputItem.McpListTools) { - mcpListTools.validate() - } - - override fun visitCustomToolCall(customToolCall: ResponseCustomToolCall) { - customToolCall.validate() - } - - override fun visitCustomToolCallOutput( - customToolCallOutput: ResponseCustomToolCallOutputItem - ) { - customToolCallOutput.validate() - } - } - ) - validated = true - } - - /** @see ResponseOutputItem.isValid */ - fun isValid(): Boolean = - try { - validate() - true - } catch (_: OpenAIInvalidDataException) { - false - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is StructuredResponseOutputItem<*> && - responseType == other.responseType && - rawOutputItem == other.rawOutputItem - } - - override fun hashCode(): Int = Objects.hash(responseType, rawOutputItem) - - override fun toString(): String = - "${javaClass.simpleName}{responseType=$responseType, rawOutputItem=$rawOutputItem}" - - /** @see ResponseOutputItem.Visitor */ - // In keeping with the delegate's `Visitor`, `T` is used to refer to the return type of each - // function. `R` (for "Response") is used to refer to the response type, which is otherwise - // named `T` in the outer class, but confusion here is probably preferable to confusion there. - interface Visitor { - /** @see ResponseOutputItem.Visitor.visitMessage */ - fun visitMessage(message: StructuredResponseOutputMessage): T - - /** @see ResponseOutputItem.Visitor.visitFileSearchCall */ - fun visitFileSearchCall(fileSearchCall: ResponseFileSearchToolCall): T - - /** @see ResponseOutputItem.Visitor.visitFunctionCall */ - fun visitFunctionCall(functionCall: ResponseFunctionToolCall): T - - /** @see ResponseOutputItem.Visitor.visitFunctionCallOutput */ - fun visitFunctionCallOutput(functionCallOutput: ResponseFunctionToolCallOutputItem): T - - /** @see ResponseOutputItem.Visitor.visitToolSearchCall */ - fun visitToolSearchCall(toolSearchCall: ResponseToolSearchCall): T - - /** @see ResponseOutputItem.Visitor.visitToolSearchOutput */ - fun visitToolSearchOutput(toolSearchOutput: ResponseToolSearchOutputItem): T - - /** @see ResponseOutputItem.Visitor.visitAdditionalTools */ - fun visitAdditionalTools(additionalTools: ResponseOutputItem.AdditionalTools): T - - /** @see ResponseOutputItem.Visitor.visitWebSearchCall */ - fun visitWebSearchCall(webSearchCall: ResponseFunctionWebSearch): T - - /** @see ResponseOutputItem.Visitor.visitComputerCall */ - fun visitComputerCall(computerCall: ResponseComputerToolCall): T - - /** @see ResponseOutputItem.Visitor.visitComputerCallOutput */ - fun visitComputerCallOutput(computerCallOutput: ResponseComputerToolCallOutputItem): T - - /** @see ResponseOutputItem.Visitor.visitReasoning */ - fun visitReasoning(reasoning: ResponseReasoningItem): T - - /** @see ResponseOutputItem.Visitor.visitProgram */ - fun visitProgram(program: ResponseOutputItem.Program): T - - /** @see ResponseOutputItem.Visitor.visitProgramOutput */ - fun visitProgramOutput(programOutput: ResponseOutputItem.ProgramOutput): T - - /** @see ResponseOutputItem.Visitor.visitCompaction */ - fun visitCompaction(compaction: ResponseCompactionItem): T - - /** @see ResponseOutputItem.Visitor.visitCodeInterpreterCall */ - fun visitCodeInterpreterCall(codeInterpreterCall: ResponseCodeInterpreterToolCall): T - - /** @see ResponseOutputItem.Visitor.visitImageGenerationCall */ - fun visitImageGenerationCall(imageGenerationCall: ResponseOutputItem.ImageGenerationCall): T - - /** @see ResponseOutputItem.Visitor.visitLocalShellCall */ - fun visitLocalShellCall(localShellCall: ResponseOutputItem.LocalShellCall): T - - /** @see ResponseOutputItem.Visitor.visitLocalShellCallOutput */ - fun visitLocalShellCallOutput( - localShellCallOutput: ResponseOutputItem.LocalShellCallOutput - ): T - - /** @see ResponseOutputItem.Visitor.visitShellCall */ - fun visitShellCall(shellCall: ResponseFunctionShellToolCall): T - - /** @see ResponseOutputItem.Visitor.visitShellCallOutput */ - fun visitShellCallOutput(shellCallOutput: ResponseFunctionShellToolCallOutput): T - - /** @see ResponseOutputItem.Visitor.visitApplyPatchCall */ - fun visitApplyPatchCall(applyPatchCall: ResponseApplyPatchToolCall): T - - /** @see ResponseOutputItem.Visitor.visitApplyPatchCallOutput */ - fun visitApplyPatchCallOutput(applyPatchCallOutput: ResponseApplyPatchToolCallOutput): T - - /** @see ResponseOutputItem.Visitor.visitMcpApprovalRequest */ - fun visitMcpApprovalRequest(mcpApprovalRequest: ResponseOutputItem.McpApprovalRequest): T - - /** @see ResponseOutputItem.Visitor.visitMcpApprovalResponse */ - fun visitMcpApprovalResponse(mcpApprovalResponse: ResponseOutputItem.McpApprovalResponse): T - - /** @see ResponseOutputItem.Visitor.visitMcpCall */ - fun visitMcpCall(mcpCall: ResponseOutputItem.McpCall): T - - /** @see ResponseOutputItem.Visitor.visitMcpListTools */ - fun visitMcpListTools(mcpListTools: ResponseOutputItem.McpListTools): T - - /** @see ResponseOutputItem.Visitor.visitCustomToolCall */ - fun visitCustomToolCall(customToolCall: ResponseCustomToolCall): T - - /** @see ResponseOutputItem.Visitor.visitCustomToolCallOutput */ - fun visitCustomToolCallOutput(customToolCallOutput: ResponseCustomToolCallOutputItem): T - - /** @see ResponseOutputItem.Visitor.unknown */ - fun unknown(json: JsonValue?): T { - throw OpenAIInvalidDataException("Unknown ResponseOutputItem: $json") - } - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseOutputMessage.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseOutputMessage.kt deleted file mode 100644 index 5e8ed4ef1..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseOutputMessage.kt +++ /dev/null @@ -1,187 +0,0 @@ -package com.openai.models.responses - -import com.openai.core.JsonField -import com.openai.core.JsonValue -import com.openai.core.responseTypeFromJson -import com.openai.errors.OpenAIInvalidDataException -import java.util.Objects -import java.util.Optional -import kotlin.jvm.optionals.getOrElse -import kotlin.jvm.optionals.getOrNull - -/** - * A wrapper for [ResponseOutputMessage] that provides type-safe access to the [content] when using - * the _Structured Outputs_ feature to deserialize a JSON response to an instance of an arbitrary - * class. See the SDK documentation for more details on _Structured Outputs_. - * - * @param T The type of the class to which the JSON data in the content will be deserialized when - * the output text of the [content] is retrieved. - */ -class StructuredResponseOutputMessage( - @get:JvmName("responseType") val responseType: Class, - @get:JvmName("rawMessage") val rawMessage: ResponseOutputMessage, -) { - /** @see ResponseOutputMessage.id */ - fun id(): String = rawMessage.id() - - private val content by lazy { - rawMessage._content().map { contents -> contents.map { Content(responseType, it) } } - } - - /** @see ResponseOutputMessage.content */ - fun content(): List> = content.getRequired("content") - - /** @see ResponseOutputMessage._role */ - fun _role(): JsonValue = rawMessage._role() - - /** @see ResponseOutputMessage.phase */ - fun phase(): Optional = rawMessage.phase() - - /** @see ResponseOutputMessage.status */ - fun status(): ResponseOutputMessage.Status = rawMessage.status() - - /** @see ResponseOutputMessage._type */ - fun _type(): JsonValue = rawMessage._type() - - /** @see ResponseOutputMessage._id */ - fun _id(): JsonField = rawMessage._id() - - /** @see ResponseOutputMessage._content */ - fun _content(): JsonField>> = content - - /** @see ResponseOutputMessage._phase */ - fun _phase(): JsonField = rawMessage._phase() - - /** @see ResponseOutputMessage._status */ - fun _status(): JsonField = rawMessage._status() - - /** @see ResponseOutputMessage._additionalProperties */ - fun _additionalProperties(): Map = rawMessage._additionalProperties() - - /** @see ResponseOutputMessage.validate */ - fun validate(): StructuredResponseOutputMessage = apply { - // `content()` is a different type to that in the delegate class. - content().forEach { it.validate() } - rawMessage.validate() - } - - /** @see ResponseOutputMessage.isValid */ - fun isValid(): Boolean = - try { - validate() - true - } catch (_: OpenAIInvalidDataException) { - false - } - - /** @see ResponseOutputMessage.Content */ - class Content( - @get:JvmName("responseType") val responseType: Class, - @get:JvmName("rawContent") val rawContent: ResponseOutputMessage.Content, - ) { - private val outputText by lazy { - rawContent.outputText().map { responseTypeFromJson(it.text(), responseType) } - } - - /** - * Gets the output text, but deserialized to an instance of the response type class. - * - * @see ResponseOutputMessage.Content.outputText - */ - fun outputText(): Optional = outputText - - /** @see ResponseOutputMessage.Content.refusal */ - fun refusal(): Optional = rawContent.refusal() - - /** @see ResponseOutputMessage.Content.isOutputText */ - // No need to check `outputText`; the delegate can just check the source value is present. - fun isOutputText(): Boolean = rawContent.isOutputText() - - /** @see ResponseOutputMessage.Content.isRefusal */ - fun isRefusal(): Boolean = rawContent.isRefusal() - - /** @see ResponseOutputMessage.Content.asOutputText */ - fun asOutputText(): T = - outputText.getOrElse { - // Same behavior as `com.openai.core.getOrThrow` used by the delegate class. - throw OpenAIInvalidDataException("`outputText` is not present") - } - - /** @see ResponseOutputMessage.Content.asRefusal */ - fun asRefusal(): ResponseOutputRefusal = rawContent.asRefusal() - - /** @see ResponseOutputMessage.Content._json */ - fun _json(): Optional = rawContent._json() - - /** @see ResponseOutputMessage.Content.accept */ - fun accept(visitor: Visitor): R = - when { - outputText.isPresent -> visitor.visitOutputText(outputText.get()) - refusal().isPresent -> visitor.visitRefusal(refusal().get()) - else -> visitor.unknown(_json().getOrNull()) - } - - /** @see ResponseOutputMessage.Content.validate */ - fun validate(): Content = apply { - // The `outputText` object, as it is a user-defined type that is unlikely to have a - // `validate()` function/method, so validate the underlying `ResponseOutputText` from - // which it is derived. That can be done by the delegate class. - rawContent.validate() - } - - /** @see ResponseOutputMessage.Content.isValid */ - fun isValid(): Boolean = - try { - validate() - true - } catch (_: OpenAIInvalidDataException) { - false - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is Content<*> && - rawContent == other.rawContent && - responseType == other.responseType - } - - override fun hashCode(): Int = Objects.hash(rawContent, responseType) - - override fun toString(): String = - "${javaClass.simpleName}{responseType=$responseType, rawContent=$rawContent}" - - /** @see ResponseOutputMessage.Content.Visitor */ - interface Visitor { - /** @see ResponseOutputMessage.Content.Visitor.visitOutputText */ - fun visitOutputText(outputText: T): R - - /** @see ResponseOutputMessage.Content.Visitor.visitRefusal */ - fun visitRefusal(refusal: ResponseOutputRefusal): R - - /** @see ResponseOutputMessage.Content.Visitor.unknown */ - fun unknown(json: JsonValue?): R { - throw OpenAIInvalidDataException("Unknown Content: $json") - } - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is StructuredResponseOutputMessage<*> && - responseType == other.responseType && - rawMessage == other.rawMessage - } - - private val hashCode: Int by lazy { Objects.hash(responseType, rawMessage) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "${javaClass.simpleName}{responseType=$responseType, rawMessage=$rawMessage}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseTextConfig.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseTextConfig.kt deleted file mode 100644 index 050def9cb..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/StructuredResponseTextConfig.kt +++ /dev/null @@ -1,143 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.responses - -import com.openai.core.JsonField -import com.openai.core.JsonSchemaLocalValidation -import com.openai.core.JsonValue -import com.openai.core.checkRequired -import com.openai.core.jsonSchemaFromClass -import java.util.Objects -import java.util.Optional - -/** - * A wrapper for [ResponseTextConfig] that provides a type-safe [Builder] that can record the - * [responseType] used to derive a JSON schema from an arbitrary class when using the _Structured - * Outputs_ feature. When a JSON response is received, it is deserialized to an instance of that - * type. See the SDK documentation for more details on _Structured Outputs_. - * - * @param T The type of the class that will be used to derive the JSON schema in the request and to - * which the JSON response will be deserialized. - */ -class StructuredResponseTextConfig -private constructor( - @get:JvmName("responseType") val responseType: Class, - /** - * The raw, underlying response text configuration wrapped by this structured instance of the - * configuration. - */ - @get:JvmName("rawConfig") val rawConfig: ResponseTextConfig, -) { - companion object { - /** - * Returns a mutable builder for constructing an instance of [StructuredResponseTextConfig]. - */ - @JvmStatic fun builder() = Builder() - } - - /** A builder for [StructuredResponseTextConfig]. */ - class Builder internal constructor() { - private var responseType: Class? = null - private var configBuilder = ResponseTextConfig.builder() - - @JvmSynthetic - internal fun wrap( - responseType: Class, - configBuilder: ResponseTextConfig.Builder, - localValidation: JsonSchemaLocalValidation, - ) = apply { - this.responseType = responseType - this.configBuilder = configBuilder - format(responseType, localValidation) - } - - /** Injects a given `ResponseTextConfig.Builder`. For use only when testing. */ - @JvmSynthetic - internal fun inject(configBuilder: ResponseTextConfig.Builder) = apply { - this.configBuilder = configBuilder - } - - /** - * Sets the text configuration's format to a JSON schema derived from the structure of the - * given class. - * - * @see ResponseTextConfig.Builder.format - */ - @JvmOverloads - fun format( - responseType: Class, - localValidation: JsonSchemaLocalValidation = JsonSchemaLocalValidation.YES, - ) = apply { - this.responseType = responseType - configBuilder.format(jsonSchemaFromClass(responseType, localValidation)) - } - - /** @see ResponseTextConfig.Builder.verbosity */ - fun verbosity(verbosity: ResponseTextConfig.Verbosity?) = apply { - configBuilder.verbosity(verbosity) - } - - /** @see ResponseTextConfig.Builder.verbosity */ - fun verbosity(verbosity: Optional) = apply { - configBuilder.verbosity(verbosity) - } - - /** @see ResponseTextConfig.Builder.verbosity */ - fun verbosity(verbosity: JsonField) = apply { - configBuilder.verbosity(verbosity) - } - - /** @see ResponseTextConfig.Builder.additionalProperties */ - fun additionalProperties(additionalProperties: Map) = apply { - configBuilder.additionalProperties(additionalProperties) - } - - /** @see ResponseTextConfig.Builder.putAdditionalProperty */ - fun putAdditionalProperty(key: String, value: JsonValue) = apply { - configBuilder.putAdditionalProperty(key, value) - } - - /** @see ResponseTextConfig.Builder.putAllAdditionalProperties */ - fun putAllAdditionalProperties(additionalProperties: Map) = apply { - configBuilder.putAllAdditionalProperties(additionalProperties) - } - - /** @see ResponseTextConfig.Builder.removeAdditionalProperty */ - fun removeAdditionalProperty(key: String) = apply { - configBuilder.removeAdditionalProperty(key) - } - - /** @see ResponseTextConfig.Builder.removeAllAdditionalProperties */ - fun removeAllAdditionalProperties(keys: Set) = apply { - configBuilder.removeAllAdditionalProperties(keys) - } - - /** - * Returns an immutable instance of [StructuredResponseTextConfig]. - * - * Further updates to this [Builder] will not mutate the returned instance. - */ - fun build(): StructuredResponseTextConfig = - StructuredResponseTextConfig( - checkRequired("responseType", responseType), - configBuilder.build(), - ) - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is StructuredResponseTextConfig<*> && - responseType == other.responseType && - rawConfig == other.rawConfig - } - - private val hashCode: Int by lazy { Objects.hash(responseType, rawConfig) } - - override fun hashCode(): Int = hashCode - - override fun toString() = - "${javaClass.simpleName}{responseType=$responseType, rawConfig=$rawConfig}" -} diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/Video.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/Video.kt index 9980a7df1..7edfb398d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/Video.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/Video.kt @@ -643,9 +643,7 @@ private constructor( progress() prompt() remixedFromVideoId() - // `seconds` can be either one of the known request enum values or an arbitrary - // stitched duration string in responses. - seconds() + seconds().validate() size().validate() status().validate() validated = true diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/WebhookVerificationParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/WebhookVerificationParams.kt deleted file mode 100644 index 0a283e154..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/WebhookVerificationParams.kt +++ /dev/null @@ -1,85 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.webhooks - -import com.openai.core.checkRequired -import com.openai.core.http.Headers -import java.nio.charset.StandardCharsets -import java.time.Duration -import java.util.Objects -import java.util.Optional - -/** Parameters for webhook signature verification. */ -public class WebhookVerificationParams -private constructor( - /** The webhook payload as a byte array */ - @get:JvmName("payload") val payload: ByteArray, - - /** The webhook headers */ - @get:JvmName("headers") val headers: Headers, - - /** The webhook secret (optional, will use client secret if not provided) */ - @get:JvmName("secret") val secret: Optional, - - /** Maximum age of the webhook (default: 5 minutes) */ - @get:JvmName("tolerance") val tolerance: Duration, -) { - companion object { - @JvmStatic fun builder(): Builder = Builder() - } - - class Builder { - private var payload: ByteArray? = null - private var headers: Headers? = null - private var secret: Optional = Optional.empty() - private var tolerance: Duration = Duration.ofMinutes(5) - - /** The webhook payload as a string */ - fun payload(payload: String): Builder = apply { - this.payload = payload.toByteArray(StandardCharsets.UTF_8) - } - - /** The webhook payload as a byte array */ - fun payload(payload: ByteArray): Builder = apply { this.payload = payload } - - /** The webhook headers */ - fun headers(headers: Headers): Builder = apply { this.headers = headers } - - /** The webhook secret (optional, will use client secret if not provided) */ - fun secret(secret: String): Builder = apply { this.secret = Optional.of(secret) } - - /** The webhook secret (optional, will use client secret if not provided) */ - fun secret(secret: Optional): Builder = apply { this.secret = secret } - - /** Maximum age of the webhook (default: 5 minutes) */ - fun tolerance(tolerance: Duration): Builder = apply { this.tolerance = tolerance } - - /** Maximum age of the webhook in seconds (default: 300 = 5 minutes) */ - fun tolerance(toleranceSeconds: Int): Builder = apply { - this.tolerance = Duration.ofSeconds(toleranceSeconds.toLong()) - } - - fun build(): WebhookVerificationParams = - WebhookVerificationParams( - checkRequired("payload", payload), - checkRequired("headers", headers), - secret, - tolerance, - ) - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - return other is WebhookVerificationParams && - payload contentEquals other.payload && - headers == other.headers && - secret == other.secret && - tolerance == other.tolerance - } - - override fun hashCode(): Int = - Objects.hash(payload.contentHashCode(), headers, secret, tolerance) -} diff --git a/openai-java-core/src/main/kotlin/com/openai/services/ResponseStreamEventValidation.kt b/openai-java-core/src/main/kotlin/com/openai/services/ResponseStreamEventValidation.kt deleted file mode 100644 index 250a65ea1..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/services/ResponseStreamEventValidation.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.openai.services - -import com.openai.core.JsonValue -import com.openai.models.responses.ResponseStreamEvent -import kotlin.jvm.optionals.getOrNull - -/** - * Validates a Responses API stream event while allowing the transport-level heartbeat emitted for - * long-running requests. The heartbeat remains an unknown event for forwards compatibility, but it - * must not terminate an otherwise valid stream. All other unknown events retain the existing strict - * validation behavior. - */ -@JvmSynthetic -internal fun ResponseStreamEvent.validateForStream(): ResponseStreamEvent = - if (_json().getOrNull().isKeepalive()) this else validate() - -private fun JsonValue?.isKeepalive(): Boolean = - this?.asObject()?.getOrNull()?.get("type")?.asString()?.getOrNull() == "keepalive" diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsync.kt index 42c3fd7cf..761616917 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsync.kt @@ -5,7 +5,6 @@ package com.openai.services.async import com.openai.core.ClientOptions import com.openai.services.async.beta.AssistantServiceAsync import com.openai.services.async.beta.ChatKitServiceAsync -import com.openai.services.async.beta.RealtimeServiceAsync import com.openai.services.async.beta.ResponseServiceAsync import com.openai.services.async.beta.ThreadServiceAsync import java.util.function.Consumer @@ -24,11 +23,6 @@ interface BetaServiceAsync { */ fun withOptions(modifier: Consumer): BetaServiceAsync - @Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." - ) - fun realtime(): RealtimeServiceAsync - fun responses(): ResponseServiceAsync fun chatkit(): ChatKitServiceAsync @@ -50,11 +44,6 @@ interface BetaServiceAsync { */ fun withOptions(modifier: Consumer): BetaServiceAsync.WithRawResponse - @Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." - ) - fun realtime(): RealtimeServiceAsync.WithRawResponse - fun responses(): ResponseServiceAsync.WithRawResponse fun chatkit(): ChatKitServiceAsync.WithRawResponse diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsyncImpl.kt index 2dc0b526a..3d1aa3887 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsyncImpl.kt @@ -7,8 +7,6 @@ import com.openai.services.async.beta.AssistantServiceAsync import com.openai.services.async.beta.AssistantServiceAsyncImpl import com.openai.services.async.beta.ChatKitServiceAsync import com.openai.services.async.beta.ChatKitServiceAsyncImpl -import com.openai.services.async.beta.RealtimeServiceAsync -import com.openai.services.async.beta.RealtimeServiceAsyncImpl import com.openai.services.async.beta.ResponseServiceAsync import com.openai.services.async.beta.ResponseServiceAsyncImpl import com.openai.services.async.beta.ThreadServiceAsync @@ -22,8 +20,6 @@ class BetaServiceAsyncImpl internal constructor(private val clientOptions: Clien WithRawResponseImpl(clientOptions) } - private val realtime: RealtimeServiceAsync by lazy { RealtimeServiceAsyncImpl(clientOptions) } - private val responses: ResponseServiceAsync by lazy { ResponseServiceAsyncImpl(clientOptions) } private val chatkit: ChatKitServiceAsync by lazy { ChatKitServiceAsyncImpl(clientOptions) } @@ -39,11 +35,6 @@ class BetaServiceAsyncImpl internal constructor(private val clientOptions: Clien override fun withOptions(modifier: Consumer): BetaServiceAsync = BetaServiceAsyncImpl(clientOptions.toBuilder().apply(modifier::accept).build()) - @Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." - ) - override fun realtime(): RealtimeServiceAsync = realtime - override fun responses(): ResponseServiceAsync = responses override fun chatkit(): ChatKitServiceAsync = chatkit @@ -58,10 +49,6 @@ class BetaServiceAsyncImpl internal constructor(private val clientOptions: Clien class WithRawResponseImpl internal constructor(private val clientOptions: ClientOptions) : BetaServiceAsync.WithRawResponse { - private val realtime: RealtimeServiceAsync.WithRawResponse by lazy { - RealtimeServiceAsyncImpl.WithRawResponseImpl(clientOptions) - } - private val responses: ResponseServiceAsync.WithRawResponse by lazy { ResponseServiceAsyncImpl.WithRawResponseImpl(clientOptions) } @@ -85,11 +72,6 @@ class BetaServiceAsyncImpl internal constructor(private val clientOptions: Clien clientOptions.toBuilder().apply(modifier::accept).build() ) - @Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." - ) - override fun realtime(): RealtimeServiceAsync.WithRawResponse = realtime - override fun responses(): ResponseServiceAsync.WithRawResponse = responses override fun chatkit(): ChatKitServiceAsync.WithRawResponse = chatkit diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsync.kt index 9e07ba1fa..0cccc981e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsync.kt @@ -17,8 +17,6 @@ import com.openai.models.responses.ResponseCreateParams import com.openai.models.responses.ResponseDeleteParams import com.openai.models.responses.ResponseRetrieveParams import com.openai.models.responses.ResponseStreamEvent -import com.openai.models.responses.StructuredResponse -import com.openai.models.responses.StructuredResponseCreateParams import com.openai.services.async.responses.InputItemServiceAsync import com.openai.services.async.responses.InputTokenServiceAsync import java.util.concurrent.CompletableFuture @@ -70,30 +68,6 @@ interface ResponseServiceAsync { fun create(requestOptions: RequestOptions): CompletableFuture = create(ResponseCreateParams.none(), requestOptions) - /** - * Creates a model response. The model's structured output in JSON form will be deserialized - * automatically into an instance of the class `T`. See the SDK documentation for more details. - * - * @see create - */ - fun create( - params: StructuredResponseCreateParams - ): CompletableFuture> = create(params, RequestOptions.none()) - - /** - * Creates a model response. The model's structured output in JSON form will be deserialized - * automatically into an instance of the class `T`. See the SDK documentation for more details. - * - * @see create - */ - fun create( - params: StructuredResponseCreateParams, - requestOptions: RequestOptions = RequestOptions.none(), - ): CompletableFuture> = - create(params.rawParams, requestOptions).thenApply { - StructuredResponse(params.responseType, it) - } - /** * Creates a model response. Provide [text](https://platform.openai.com/docs/guides/text) or * [image](https://platform.openai.com/docs/guides/images) inputs to generate @@ -123,26 +97,6 @@ interface ResponseServiceAsync { fun createStreaming(requestOptions: RequestOptions): AsyncStreamResponse = createStreaming(ResponseCreateParams.none(), requestOptions) - /** - * Creates a streaming model response for the given response conversation. The input parameters - * can define a JSON schema derived automatically from an arbitrary class to request a - * structured output in JSON form. However, that structured output is split over multiple - * streamed events, so it will not be deserialized automatically into an instance of that class. - * To deserialize the output, first use a helper class to accumulate the stream of events into a - * single output value. See the - * [SDK documentation](https://github.com/openai/openai-java/#usage-with-streaming) for full - * details. - */ - fun createStreaming( - params: StructuredResponseCreateParams<*> - ): AsyncStreamResponse = createStreaming(params, RequestOptions.none()) - - /** @see [createStreaming] */ - fun createStreaming( - params: StructuredResponseCreateParams<*>, - requestOptions: RequestOptions = RequestOptions.none(), - ): AsyncStreamResponse = createStreaming(params.rawParams, requestOptions) - /** Retrieves a model response with the given ID. */ fun retrieve(responseId: String): CompletableFuture = retrieve(responseId, ResponseRetrieveParams.none()) diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsyncImpl.kt index accef0ba7..8a38b0adb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsyncImpl.kt @@ -37,7 +37,6 @@ import com.openai.services.async.responses.InputItemServiceAsync import com.openai.services.async.responses.InputItemServiceAsyncImpl import com.openai.services.async.responses.InputTokenServiceAsync import com.openai.services.async.responses.InputTokenServiceAsyncImpl -import com.openai.services.validateForStream import java.util.concurrent.CompletableFuture import java.util.function.Consumer import kotlin.jvm.optionals.getOrNull @@ -219,7 +218,7 @@ class ResponseServiceAsyncImpl internal constructor(private val clientOptions: C .let { createStreamingHandler.handle(it) } .let { streamResponse -> if (requestOptions.responseValidation!!) { - streamResponse.map { it.validateForStream() } + streamResponse.map { it.validate() } } else { streamResponse } @@ -297,7 +296,7 @@ class ResponseServiceAsyncImpl internal constructor(private val clientOptions: C .let { retrieveStreamingHandler.handle(it) } .let { streamResponse -> if (requestOptions.responseValidation!!) { - streamResponse.map { it.validateForStream() } + streamResponse.map { it.validate() } } else { streamResponse } diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsync.kt index b781a4179..df2cfc17e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsync.kt @@ -3,8 +3,8 @@ package com.openai.services.async import com.openai.core.ClientOptions +import com.openai.errors.OpenAIInvalidDataException import com.openai.models.webhooks.UnwrapWebhookEvent -import com.openai.models.webhooks.WebhookVerificationParams import java.util.function.Consumer interface WebhookServiceAsync { @@ -24,19 +24,9 @@ interface WebhookServiceAsync { /** * Validates that the given payload was sent by OpenAI and parses the payload. * - * @param params Verification parameters including payload, headers, secret and tolerance - * @throws com.openai.errors.InvalidWebhookSignatureException if the body could not be parsed. + * @throws OpenAIInvalidDataException if the body could not be parsed. */ - fun unwrap(params: WebhookVerificationParams): UnwrapWebhookEvent - - /** - * Validates whether or not the webhook payload was sent by OpenAI. - * - * @param params Verification parameters including payload, headers, secret and tolerance - * @throws com.openai.errors.InvalidWebhookSignatureException if the signature is invalid or - * timestamp is too old/new - */ - fun verifySignature(params: WebhookVerificationParams) + fun unwrap(body: String): UnwrapWebhookEvent /** * A view of [WebhookServiceAsync] that provides access to raw HTTP responses for each method. diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsyncImpl.kt index 6d7fb0cad..b351ebd4b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsyncImpl.kt @@ -4,7 +4,6 @@ package com.openai.services.async import com.openai.core.ClientOptions import com.openai.models.webhooks.UnwrapWebhookEvent -import com.openai.models.webhooks.WebhookVerificationParams import com.openai.services.blocking.WebhookServiceImpl import java.util.function.Consumer @@ -20,11 +19,8 @@ class WebhookServiceAsyncImpl internal constructor(private val clientOptions: Cl override fun withOptions(modifier: Consumer): WebhookServiceAsync = WebhookServiceAsyncImpl(clientOptions.toBuilder().apply(modifier::accept).build()) - override fun unwrap(params: WebhookVerificationParams): UnwrapWebhookEvent = - WebhookServiceImpl(clientOptions).unwrap(params) - - override fun verifySignature(params: WebhookVerificationParams) = - WebhookServiceImpl(clientOptions).verifySignature(params) + override fun unwrap(body: String): UnwrapWebhookEvent = + WebhookServiceImpl(clientOptions).unwrap(body) class WithRawResponseImpl internal constructor(private val clientOptions: ClientOptions) : WebhookServiceAsync.WithRawResponse { diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncImpl.kt index 098b2eccc..7a30b9761 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncImpl.kt @@ -11,7 +11,6 @@ import com.openai.core.handlers.errorHandler import com.openai.core.handlers.jsonHandler import com.openai.core.handlers.mapJson import com.openai.core.handlers.sseHandler -import com.openai.core.handlers.stringHandler import com.openai.core.http.AsyncStreamResponse import com.openai.core.http.HttpMethod import com.openai.core.http.HttpRequest @@ -24,13 +23,11 @@ import com.openai.core.http.multipartFormData import com.openai.core.http.parseable import com.openai.core.http.toAsync import com.openai.core.prepareAsync -import com.openai.models.audio.transcriptions.Transcription import com.openai.models.audio.transcriptions.TranscriptionCreateParams import com.openai.models.audio.transcriptions.TranscriptionCreateResponse import com.openai.models.audio.transcriptions.TranscriptionStreamEvent import java.util.concurrent.CompletableFuture import java.util.function.Consumer -import kotlin.jvm.optionals.getOrNull /** Turn audio into text or text into audio. */ class TranscriptionServiceAsyncImpl internal constructor(private val clientOptions: ClientOptions) : @@ -75,18 +72,8 @@ class TranscriptionServiceAsyncImpl internal constructor(private val clientOptio clientOptions.toBuilder().apply(modifier::accept).build() ) - private val createJsonHandler: Handler = + private val createHandler: Handler = jsonHandler(clientOptions.jsonMapper) - private val createStringHandler: Handler = - object : Handler { - - private val stringHandler = stringHandler() - - override fun handle(response: HttpResponse): TranscriptionCreateResponse = - TranscriptionCreateResponse.ofTranscription( - Transcription.builder().text(stringHandler.handle(response)).build() - ) - } override fun create( params: TranscriptionCreateParams, @@ -108,13 +95,9 @@ class TranscriptionServiceAsyncImpl internal constructor(private val clientOptio return request .thenComposeAsync { clientOptions.httpClient.executeAsync(it, requestOptions) } .thenApply { response -> - val handler = - if (params.responseFormat().getOrNull()?.isJson() != false) - createJsonHandler - else createStringHandler errorHandler.handle(response).parseable { response - .use { handler.handle(it) } + .use { createHandler.handle(it) } .also { if (requestOptions.responseValidation!!) { it.validate() diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/RealtimeServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/RealtimeServiceAsync.kt deleted file mode 100644 index 32e088818..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/RealtimeServiceAsync.kt +++ /dev/null @@ -1,52 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.services.async.beta - -import com.openai.core.ClientOptions -import com.openai.services.async.beta.realtime.SessionServiceAsync -import com.openai.services.async.beta.realtime.TranscriptionSessionServiceAsync -import java.util.function.Consumer - -@Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." -) -interface RealtimeServiceAsync { - - /** - * Returns a view of this service that provides access to raw HTTP responses for each method. - */ - fun withRawResponse(): WithRawResponse - - /** - * Returns a view of this service with the given option modifications applied. - * - * The original service is not modified. - */ - fun withOptions(modifier: Consumer): RealtimeServiceAsync - - fun sessions(): SessionServiceAsync - - fun transcriptionSessions(): TranscriptionSessionServiceAsync - - /** - * A view of [RealtimeServiceAsync] that provides access to raw HTTP responses for each method. - */ - @Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." - ) - interface WithRawResponse { - - /** - * Returns a view of this service with the given option modifications applied. - * - * The original service is not modified. - */ - fun withOptions( - modifier: Consumer - ): RealtimeServiceAsync.WithRawResponse - - fun sessions(): SessionServiceAsync.WithRawResponse - - fun transcriptionSessions(): TranscriptionSessionServiceAsync.WithRawResponse - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/RealtimeServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/RealtimeServiceAsyncImpl.kt deleted file mode 100644 index 4737dd87e..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/RealtimeServiceAsyncImpl.kt +++ /dev/null @@ -1,64 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.services.async.beta - -import com.openai.core.ClientOptions -import com.openai.services.async.beta.realtime.SessionServiceAsync -import com.openai.services.async.beta.realtime.SessionServiceAsyncImpl -import com.openai.services.async.beta.realtime.TranscriptionSessionServiceAsync -import com.openai.services.async.beta.realtime.TranscriptionSessionServiceAsyncImpl -import java.util.function.Consumer - -@Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." -) -class RealtimeServiceAsyncImpl internal constructor(private val clientOptions: ClientOptions) : - RealtimeServiceAsync { - - private val withRawResponse: RealtimeServiceAsync.WithRawResponse by lazy { - WithRawResponseImpl(clientOptions) - } - - private val sessions: SessionServiceAsync by lazy { SessionServiceAsyncImpl(clientOptions) } - - private val transcriptionSessions: TranscriptionSessionServiceAsync by lazy { - TranscriptionSessionServiceAsyncImpl(clientOptions) - } - - override fun withRawResponse(): RealtimeServiceAsync.WithRawResponse = withRawResponse - - override fun withOptions(modifier: Consumer): RealtimeServiceAsync = - RealtimeServiceAsyncImpl(clientOptions.toBuilder().apply(modifier::accept).build()) - - override fun sessions(): SessionServiceAsync = sessions - - override fun transcriptionSessions(): TranscriptionSessionServiceAsync = transcriptionSessions - - @Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." - ) - class WithRawResponseImpl internal constructor(private val clientOptions: ClientOptions) : - RealtimeServiceAsync.WithRawResponse { - - private val sessions: SessionServiceAsync.WithRawResponse by lazy { - SessionServiceAsyncImpl.WithRawResponseImpl(clientOptions) - } - - private val transcriptionSessions: - TranscriptionSessionServiceAsync.WithRawResponse by lazy { - TranscriptionSessionServiceAsyncImpl.WithRawResponseImpl(clientOptions) - } - - override fun withOptions( - modifier: Consumer - ): RealtimeServiceAsync.WithRawResponse = - RealtimeServiceAsyncImpl.WithRawResponseImpl( - clientOptions.toBuilder().apply(modifier::accept).build() - ) - - override fun sessions(): SessionServiceAsync.WithRawResponse = sessions - - override fun transcriptionSessions(): TranscriptionSessionServiceAsync.WithRawResponse = - transcriptionSessions - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ResponseServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ResponseServiceAsyncImpl.kt index 8ddc77f6c..9ac4eb375 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ResponseServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ResponseServiceAsyncImpl.kt @@ -282,8 +282,7 @@ class ResponseServiceAsyncImpl internal constructor(private val clientOptions: C .method(HttpMethod.GET) .baseUrl(clientOptions.baseUrl()) .addPathSegments("responses", params._pathParam(0)) - .putQueryParam("beta", "true") - .putQueryParam("stream", "true") + .putAllQueryParams(mapOf("beta" to "true", "stream" to "true")) .putHeader("Accept", "text/event-stream") .build() .prepareAsync( diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/SessionServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/SessionServiceAsync.kt deleted file mode 100644 index db0081941..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/SessionServiceAsync.kt +++ /dev/null @@ -1,90 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.services.async.beta.realtime - -import com.openai.core.ClientOptions -import com.openai.core.RequestOptions -import com.openai.core.http.HttpResponseFor -import com.openai.models.beta.realtime.sessions.SessionCreateParams -import com.openai.models.beta.realtime.sessions.SessionCreateResponse -import java.util.concurrent.CompletableFuture -import java.util.function.Consumer - -interface SessionServiceAsync { - - /** - * Returns a view of this service that provides access to raw HTTP responses for each method. - */ - fun withRawResponse(): WithRawResponse - - /** - * Returns a view of this service with the given option modifications applied. - * - * The original service is not modified. - */ - fun withOptions(modifier: Consumer): SessionServiceAsync - - /** - * Create an ephemeral API token for use in client-side applications with the Realtime API. Can - * be configured with the same session parameters as the `session.update` client event. - * - * It responds with a session object, plus a `client_secret` key which contains a usable - * ephemeral API token that can be used to authenticate browser clients for the Realtime API. - */ - fun create(): CompletableFuture = create(SessionCreateParams.none()) - - /** @see create */ - fun create( - params: SessionCreateParams = SessionCreateParams.none(), - requestOptions: RequestOptions = RequestOptions.none(), - ): CompletableFuture - - /** @see create */ - fun create( - params: SessionCreateParams = SessionCreateParams.none() - ): CompletableFuture = create(params, RequestOptions.none()) - - /** @see create */ - fun create(requestOptions: RequestOptions): CompletableFuture = - create(SessionCreateParams.none(), requestOptions) - - /** - * A view of [SessionServiceAsync] that provides access to raw HTTP responses for each method. - */ - interface WithRawResponse { - - /** - * Returns a view of this service with the given option modifications applied. - * - * The original service is not modified. - */ - fun withOptions( - modifier: Consumer - ): SessionServiceAsync.WithRawResponse - - /** - * Returns a raw HTTP response for `post /realtime/sessions`, but is otherwise the same as - * [SessionServiceAsync.create]. - */ - fun create(): CompletableFuture> = - create(SessionCreateParams.none()) - - /** @see create */ - fun create( - params: SessionCreateParams = SessionCreateParams.none(), - requestOptions: RequestOptions = RequestOptions.none(), - ): CompletableFuture> - - /** @see create */ - fun create( - params: SessionCreateParams = SessionCreateParams.none() - ): CompletableFuture> = - create(params, RequestOptions.none()) - - /** @see create */ - fun create( - requestOptions: RequestOptions - ): CompletableFuture> = - create(SessionCreateParams.none(), requestOptions) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/SessionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/SessionServiceAsyncImpl.kt deleted file mode 100644 index 1ee8eedce..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/SessionServiceAsyncImpl.kt +++ /dev/null @@ -1,98 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.services.async.beta.realtime - -import com.openai.core.ClientOptions -import com.openai.core.RequestOptions -import com.openai.core.SecurityOptions -import com.openai.core.handlers.errorBodyHandler -import com.openai.core.handlers.errorHandler -import com.openai.core.handlers.jsonHandler -import com.openai.core.http.Headers -import com.openai.core.http.HttpMethod -import com.openai.core.http.HttpRequest -import com.openai.core.http.HttpResponse -import com.openai.core.http.HttpResponse.Handler -import com.openai.core.http.HttpResponseFor -import com.openai.core.http.json -import com.openai.core.http.parseable -import com.openai.core.prepareAsync -import com.openai.models.beta.realtime.sessions.SessionCreateParams -import com.openai.models.beta.realtime.sessions.SessionCreateResponse -import java.util.concurrent.CompletableFuture -import java.util.function.Consumer - -class SessionServiceAsyncImpl internal constructor(private val clientOptions: ClientOptions) : - SessionServiceAsync { - - companion object { - - private val DEFAULT_HEADERS = Headers.builder().put("OpenAI-Beta", "assistants=v2").build() - } - - private val withRawResponse: SessionServiceAsync.WithRawResponse by lazy { - WithRawResponseImpl(clientOptions) - } - - override fun withRawResponse(): SessionServiceAsync.WithRawResponse = withRawResponse - - override fun withOptions(modifier: Consumer): SessionServiceAsync = - SessionServiceAsyncImpl(clientOptions.toBuilder().apply(modifier::accept).build()) - - override fun create( - params: SessionCreateParams, - requestOptions: RequestOptions, - ): CompletableFuture = - // post /realtime/sessions - withRawResponse().create(params, requestOptions).thenApply { it.parse() } - - class WithRawResponseImpl internal constructor(private val clientOptions: ClientOptions) : - SessionServiceAsync.WithRawResponse { - - private val errorHandler: Handler = - errorHandler(errorBodyHandler(clientOptions.jsonMapper)) - - override fun withOptions( - modifier: Consumer - ): SessionServiceAsync.WithRawResponse = - SessionServiceAsyncImpl.WithRawResponseImpl( - clientOptions.toBuilder().apply(modifier::accept).build() - ) - - private val createHandler: Handler = - jsonHandler(clientOptions.jsonMapper) - - override fun create( - params: SessionCreateParams, - requestOptions: RequestOptions, - ): CompletableFuture> { - val request = - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(clientOptions.baseUrl()) - .addPathSegments("realtime", "sessions") - .putAllHeaders(DEFAULT_HEADERS) - .body(json(clientOptions.jsonMapper, params._body())) - .build() - .prepareAsync( - clientOptions, - params, - SecurityOptions.builder().bearerAuth(true).build(), - ) - val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions)) - return request - .thenComposeAsync { clientOptions.httpClient.executeAsync(it, requestOptions) } - .thenApply { response -> - errorHandler.handle(response).parseable { - response - .use { createHandler.handle(it) } - .also { - if (requestOptions.responseValidation!!) { - it.validate() - } - } - } - } - } - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/TranscriptionSessionServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/TranscriptionSessionServiceAsync.kt deleted file mode 100644 index be3e2a795..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/TranscriptionSessionServiceAsync.kt +++ /dev/null @@ -1,93 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.services.async.beta.realtime - -import com.openai.core.ClientOptions -import com.openai.core.RequestOptions -import com.openai.core.http.HttpResponseFor -import com.openai.models.beta.realtime.transcriptionsessions.TranscriptionSession -import com.openai.models.beta.realtime.transcriptionsessions.TranscriptionSessionCreateParams -import java.util.concurrent.CompletableFuture -import java.util.function.Consumer - -interface TranscriptionSessionServiceAsync { - - /** - * Returns a view of this service that provides access to raw HTTP responses for each method. - */ - fun withRawResponse(): WithRawResponse - - /** - * Returns a view of this service with the given option modifications applied. - * - * The original service is not modified. - */ - fun withOptions(modifier: Consumer): TranscriptionSessionServiceAsync - - /** - * Create an ephemeral API token for use in client-side applications with the Realtime API - * specifically for realtime transcriptions. Can be configured with the same session parameters - * as the `transcription_session.update` client event. - * - * It responds with a session object, plus a `client_secret` key which contains a usable - * ephemeral API token that can be used to authenticate browser clients for the Realtime API. - */ - fun create(): CompletableFuture = - create(TranscriptionSessionCreateParams.none()) - - /** @see create */ - fun create( - params: TranscriptionSessionCreateParams = TranscriptionSessionCreateParams.none(), - requestOptions: RequestOptions = RequestOptions.none(), - ): CompletableFuture - - /** @see create */ - fun create( - params: TranscriptionSessionCreateParams = TranscriptionSessionCreateParams.none() - ): CompletableFuture = create(params, RequestOptions.none()) - - /** @see create */ - fun create(requestOptions: RequestOptions): CompletableFuture = - create(TranscriptionSessionCreateParams.none(), requestOptions) - - /** - * A view of [TranscriptionSessionServiceAsync] that provides access to raw HTTP responses for - * each method. - */ - interface WithRawResponse { - - /** - * Returns a view of this service with the given option modifications applied. - * - * The original service is not modified. - */ - fun withOptions( - modifier: Consumer - ): TranscriptionSessionServiceAsync.WithRawResponse - - /** - * Returns a raw HTTP response for `post /realtime/transcription_sessions`, but is otherwise - * the same as [TranscriptionSessionServiceAsync.create]. - */ - fun create(): CompletableFuture> = - create(TranscriptionSessionCreateParams.none()) - - /** @see create */ - fun create( - params: TranscriptionSessionCreateParams = TranscriptionSessionCreateParams.none(), - requestOptions: RequestOptions = RequestOptions.none(), - ): CompletableFuture> - - /** @see create */ - fun create( - params: TranscriptionSessionCreateParams = TranscriptionSessionCreateParams.none() - ): CompletableFuture> = - create(params, RequestOptions.none()) - - /** @see create */ - fun create( - requestOptions: RequestOptions - ): CompletableFuture> = - create(TranscriptionSessionCreateParams.none(), requestOptions) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/TranscriptionSessionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/TranscriptionSessionServiceAsyncImpl.kt deleted file mode 100644 index f14d2ea21..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/realtime/TranscriptionSessionServiceAsyncImpl.kt +++ /dev/null @@ -1,103 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.services.async.beta.realtime - -import com.openai.core.ClientOptions -import com.openai.core.RequestOptions -import com.openai.core.SecurityOptions -import com.openai.core.handlers.errorBodyHandler -import com.openai.core.handlers.errorHandler -import com.openai.core.handlers.jsonHandler -import com.openai.core.http.Headers -import com.openai.core.http.HttpMethod -import com.openai.core.http.HttpRequest -import com.openai.core.http.HttpResponse -import com.openai.core.http.HttpResponse.Handler -import com.openai.core.http.HttpResponseFor -import com.openai.core.http.json -import com.openai.core.http.parseable -import com.openai.core.prepareAsync -import com.openai.models.beta.realtime.transcriptionsessions.TranscriptionSession -import com.openai.models.beta.realtime.transcriptionsessions.TranscriptionSessionCreateParams -import java.util.concurrent.CompletableFuture -import java.util.function.Consumer - -class TranscriptionSessionServiceAsyncImpl -internal constructor(private val clientOptions: ClientOptions) : TranscriptionSessionServiceAsync { - - companion object { - - private val DEFAULT_HEADERS = Headers.builder().put("OpenAI-Beta", "assistants=v2").build() - } - - private val withRawResponse: TranscriptionSessionServiceAsync.WithRawResponse by lazy { - WithRawResponseImpl(clientOptions) - } - - override fun withRawResponse(): TranscriptionSessionServiceAsync.WithRawResponse = - withRawResponse - - override fun withOptions( - modifier: Consumer - ): TranscriptionSessionServiceAsync = - TranscriptionSessionServiceAsyncImpl( - clientOptions.toBuilder().apply(modifier::accept).build() - ) - - override fun create( - params: TranscriptionSessionCreateParams, - requestOptions: RequestOptions, - ): CompletableFuture = - // post /realtime/transcription_sessions - withRawResponse().create(params, requestOptions).thenApply { it.parse() } - - class WithRawResponseImpl internal constructor(private val clientOptions: ClientOptions) : - TranscriptionSessionServiceAsync.WithRawResponse { - - private val errorHandler: Handler = - errorHandler(errorBodyHandler(clientOptions.jsonMapper)) - - override fun withOptions( - modifier: Consumer - ): TranscriptionSessionServiceAsync.WithRawResponse = - TranscriptionSessionServiceAsyncImpl.WithRawResponseImpl( - clientOptions.toBuilder().apply(modifier::accept).build() - ) - - private val createHandler: Handler = - jsonHandler(clientOptions.jsonMapper) - - override fun create( - params: TranscriptionSessionCreateParams, - requestOptions: RequestOptions, - ): CompletableFuture> { - val request = - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(clientOptions.baseUrl()) - .addPathSegments("realtime", "transcription_sessions") - .putAllHeaders(DEFAULT_HEADERS) - .body(json(clientOptions.jsonMapper, params._body())) - .build() - .prepareAsync( - clientOptions, - params, - SecurityOptions.builder().bearerAuth(true).build(), - ) - val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions)) - return request - .thenComposeAsync { clientOptions.httpClient.executeAsync(it, requestOptions) } - .thenApply { response -> - errorHandler.handle(response).parseable { - response - .use { createHandler.handle(it) } - .also { - if (requestOptions.responseValidation!!) { - it.validate() - } - } - } - } - } - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsync.kt index 0076abd22..4d5c729f4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsync.kt @@ -17,8 +17,6 @@ import com.openai.models.chat.completions.ChatCompletionListPageAsync import com.openai.models.chat.completions.ChatCompletionListParams import com.openai.models.chat.completions.ChatCompletionRetrieveParams import com.openai.models.chat.completions.ChatCompletionUpdateParams -import com.openai.models.chat.completions.StructuredChatCompletion -import com.openai.models.chat.completions.StructuredChatCompletionCreateParams import com.openai.services.async.chat.completions.MessageServiceAsync import java.util.concurrent.CompletableFuture import java.util.function.Consumer @@ -71,32 +69,6 @@ interface ChatCompletionServiceAsync { requestOptions: RequestOptions = RequestOptions.none(), ): CompletableFuture - /** - * Creates a model response for the given chat conversation. The model's structured output in - * JSON form will be deserialized automatically into an instance of the class `T`. See the SDK - * documentation for more details. - * - * @see create - */ - fun create( - params: StructuredChatCompletionCreateParams - ): CompletableFuture> = create(params, RequestOptions.none()) - - /** - * Creates a model response for the given chat conversation. The model's structured output in - * JSON form will be deserialized automatically into an instance of the class `T`. See the SDK - * documentation for more details. - * - * @see create - */ - fun create( - params: StructuredChatCompletionCreateParams, - requestOptions: RequestOptions = RequestOptions.none(), - ): CompletableFuture> = - create(params.rawParams, requestOptions).thenApply { - StructuredChatCompletion(params.responseType, it) - } - /** * **Starting a new project?** We recommend trying * [Responses](https://platform.openai.com/docs/api-reference/responses) to take advantage of @@ -128,26 +100,6 @@ interface ChatCompletionServiceAsync { requestOptions: RequestOptions = RequestOptions.none(), ): AsyncStreamResponse - /** - * Creates a streaming model response for the given chat conversation. The input parameters can - * define a JSON schema derived automatically from an arbitrary class to request a structured - * output in JSON form. However, that structured output is split over multiple streamed events, - * so it will not be deserialized automatically into an instance of that class. To deserialize - * the output, first use a helper class to accumulate the stream of events into a single output - * value. See the - * [SDK documentation](https://github.com/openai/openai-java/#usage-with-streaming) for full - * details. - */ - fun createStreaming( - params: StructuredChatCompletionCreateParams<*> - ): AsyncStreamResponse = createStreaming(params, RequestOptions.none()) - - /** @see [createStreaming] */ - fun createStreaming( - params: StructuredChatCompletionCreateParams<*>, - requestOptions: RequestOptions = RequestOptions.none(), - ): AsyncStreamResponse = createStreaming(params.rawParams, requestOptions) - /** * Get a stored chat completion. Only Chat Completions that have been created with the `store` * parameter set to `true` will be returned. diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsyncImpl.kt index 9918a46ec..6cbcca412 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsyncImpl.kt @@ -111,7 +111,7 @@ class PermissionServiceAsyncImpl internal constructor(private val clientOptions: .prepareAsync( clientOptions, params, - SecurityOptions.builder().adminApiKeyAuth(true).build(), + SecurityOptions.builder().bearerAuth(true).build(), ) val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions)) return request @@ -162,7 +162,7 @@ class PermissionServiceAsyncImpl internal constructor(private val clientOptions: .prepareAsync( clientOptions, params, - SecurityOptions.builder().adminApiKeyAuth(true).build(), + SecurityOptions.builder().bearerAuth(true).build(), ) val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions)) return request @@ -204,7 +204,7 @@ class PermissionServiceAsyncImpl internal constructor(private val clientOptions: .prepareAsync( clientOptions, params, - SecurityOptions.builder().adminApiKeyAuth(true).build(), + SecurityOptions.builder().bearerAuth(true).build(), ) val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions)) return request @@ -256,7 +256,7 @@ class PermissionServiceAsyncImpl internal constructor(private val clientOptions: .prepareAsync( clientOptions, params, - SecurityOptions.builder().adminApiKeyAuth(true).build(), + SecurityOptions.builder().bearerAuth(true).build(), ) val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions)) return request diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaService.kt index fc0cc5644..c8d55b74a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaService.kt @@ -5,7 +5,6 @@ package com.openai.services.blocking import com.openai.core.ClientOptions import com.openai.services.blocking.beta.AssistantService import com.openai.services.blocking.beta.ChatKitService -import com.openai.services.blocking.beta.RealtimeService import com.openai.services.blocking.beta.ResponseService import com.openai.services.blocking.beta.ThreadService import java.util.function.Consumer @@ -24,11 +23,6 @@ interface BetaService { */ fun withOptions(modifier: Consumer): BetaService - @Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." - ) - fun realtime(): RealtimeService - fun responses(): ResponseService fun chatkit(): ChatKitService @@ -50,11 +44,6 @@ interface BetaService { */ fun withOptions(modifier: Consumer): BetaService.WithRawResponse - @Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." - ) - fun realtime(): RealtimeService.WithRawResponse - fun responses(): ResponseService.WithRawResponse fun chatkit(): ChatKitService.WithRawResponse diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaServiceImpl.kt index c2c2bc220..6d43821f1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaServiceImpl.kt @@ -7,8 +7,6 @@ import com.openai.services.blocking.beta.AssistantService import com.openai.services.blocking.beta.AssistantServiceImpl import com.openai.services.blocking.beta.ChatKitService import com.openai.services.blocking.beta.ChatKitServiceImpl -import com.openai.services.blocking.beta.RealtimeService -import com.openai.services.blocking.beta.RealtimeServiceImpl import com.openai.services.blocking.beta.ResponseService import com.openai.services.blocking.beta.ResponseServiceImpl import com.openai.services.blocking.beta.ThreadService @@ -21,8 +19,6 @@ class BetaServiceImpl internal constructor(private val clientOptions: ClientOpti WithRawResponseImpl(clientOptions) } - private val realtime: RealtimeService by lazy { RealtimeServiceImpl(clientOptions) } - private val responses: ResponseService by lazy { ResponseServiceImpl(clientOptions) } private val chatkit: ChatKitService by lazy { ChatKitServiceImpl(clientOptions) } @@ -36,11 +32,6 @@ class BetaServiceImpl internal constructor(private val clientOptions: ClientOpti override fun withOptions(modifier: Consumer): BetaService = BetaServiceImpl(clientOptions.toBuilder().apply(modifier::accept).build()) - @Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." - ) - override fun realtime(): RealtimeService = realtime - override fun responses(): ResponseService = responses override fun chatkit(): ChatKitService = chatkit @@ -55,10 +46,6 @@ class BetaServiceImpl internal constructor(private val clientOptions: ClientOpti class WithRawResponseImpl internal constructor(private val clientOptions: ClientOptions) : BetaService.WithRawResponse { - private val realtime: RealtimeService.WithRawResponse by lazy { - RealtimeServiceImpl.WithRawResponseImpl(clientOptions) - } - private val responses: ResponseService.WithRawResponse by lazy { ResponseServiceImpl.WithRawResponseImpl(clientOptions) } @@ -82,11 +69,6 @@ class BetaServiceImpl internal constructor(private val clientOptions: ClientOpti clientOptions.toBuilder().apply(modifier::accept).build() ) - @Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." - ) - override fun realtime(): RealtimeService.WithRawResponse = realtime - override fun responses(): ResponseService.WithRawResponse = responses override fun chatkit(): ChatKitService.WithRawResponse = chatkit diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ImageServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ImageServiceImpl.kt index b7ba8e2c1..6d59457c1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ImageServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ImageServiceImpl.kt @@ -85,7 +85,9 @@ class ImageServiceImpl internal constructor(private val clientOptions: ClientOpt override fun withOptions( modifier: Consumer ): ImageService.WithRawResponse = - WithRawResponseImpl(clientOptions.toBuilder().apply(modifier::accept).build()) + ImageServiceImpl.WithRawResponseImpl( + clientOptions.toBuilder().apply(modifier::accept).build() + ) private val createVariationHandler: Handler = jsonHandler(clientOptions.jsonMapper) diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseService.kt index 85416d68c..9a738760f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseService.kt @@ -16,8 +16,6 @@ import com.openai.models.responses.ResponseCreateParams import com.openai.models.responses.ResponseDeleteParams import com.openai.models.responses.ResponseRetrieveParams import com.openai.models.responses.ResponseStreamEvent -import com.openai.models.responses.StructuredResponse -import com.openai.models.responses.StructuredResponseCreateParams import com.openai.services.blocking.responses.InputItemService import com.openai.services.blocking.responses.InputTokenService import java.util.function.Consumer @@ -67,27 +65,6 @@ interface ResponseService { fun create(requestOptions: RequestOptions): Response = create(ResponseCreateParams.none(), requestOptions) - /** - * Creates a model response. The model's structured output in JSON form will be deserialized - * automatically into an instance of the class `T`. See the SDK documentation for more details. - * - * @see create - */ - fun create(params: StructuredResponseCreateParams): StructuredResponse = - create(params, RequestOptions.none()) - - /** - * Creates a model response. The model's structured output in JSON form will be deserialized - * automatically into an instance of the class `T`. See the SDK documentation for more details. - * - * @see create - */ - fun create( - params: StructuredResponseCreateParams, - requestOptions: RequestOptions = RequestOptions.none(), - ): StructuredResponse = - StructuredResponse(params.responseType, create(params.rawParams, requestOptions)) - /** * Creates a model response. Provide [text](https://platform.openai.com/docs/guides/text) or * [image](https://platform.openai.com/docs/guides/images) inputs to generate @@ -121,28 +98,6 @@ interface ResponseService { fun createStreaming(requestOptions: RequestOptions): StreamResponse = createStreaming(ResponseCreateParams.none(), requestOptions) - /** - * Creates a streaming model response for the given response conversation. The input parameters - * can define a JSON schema derived automatically from an arbitrary class to request a - * structured output in JSON form. However, that structured output is split over multiple - * streamed events, so it will not be deserialized automatically into an instance of that class. - * To deserialize the output, first use a helper class to accumulate the stream of events into a - * single output value. See the - * [SDK documentation](https://github.com/openai/openai-java/#usage-with-streaming) for full - * details. - */ - @MustBeClosed - fun createStreaming( - params: StructuredResponseCreateParams<*> - ): StreamResponse = createStreaming(params, RequestOptions.none()) - - /** @see [createStreaming] */ - @MustBeClosed - fun createStreaming( - params: StructuredResponseCreateParams<*>, - requestOptions: RequestOptions = RequestOptions.none(), - ): StreamResponse = createStreaming(params.rawParams, requestOptions) - /** Retrieves a model response with the given ID. */ fun retrieve(responseId: String): Response = retrieve(responseId, ResponseRetrieveParams.none()) diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseServiceImpl.kt index f75e18a27..6fd9eda32 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseServiceImpl.kt @@ -35,7 +35,6 @@ import com.openai.services.blocking.responses.InputItemService import com.openai.services.blocking.responses.InputItemServiceImpl import com.openai.services.blocking.responses.InputTokenService import com.openai.services.blocking.responses.InputTokenServiceImpl -import com.openai.services.validateForStream import java.util.function.Consumer import kotlin.jvm.optionals.getOrNull @@ -193,7 +192,7 @@ class ResponseServiceImpl internal constructor(private val clientOptions: Client .let { createStreamingHandler.handle(it) } .let { streamResponse -> if (requestOptions.responseValidation!!) { - streamResponse.map { it.validateForStream() } + streamResponse.map { it.validate() } } else { streamResponse } @@ -265,7 +264,7 @@ class ResponseServiceImpl internal constructor(private val clientOptions: Client .let { retrieveStreamingHandler.handle(it) } .let { streamResponse -> if (requestOptions.responseValidation!!) { - streamResponse.map { it.validateForStream() } + streamResponse.map { it.validate() } } else { streamResponse } diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookService.kt index 70315484e..81886d7b3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookService.kt @@ -5,7 +5,6 @@ package com.openai.services.blocking import com.openai.core.ClientOptions import com.openai.errors.OpenAIInvalidDataException import com.openai.models.webhooks.UnwrapWebhookEvent -import com.openai.models.webhooks.WebhookVerificationParams import java.util.function.Consumer interface WebhookService { @@ -25,19 +24,9 @@ interface WebhookService { /** * Validates that the given payload was sent by OpenAI and parses the payload. * - * @param params Verification parameters including payload, headers, secret and tolerance * @throws OpenAIInvalidDataException if the body could not be parsed. */ - fun unwrap(params: WebhookVerificationParams): UnwrapWebhookEvent - - /** - * Validates whether or not the webhook payload was sent by OpenAI. - * - * @param params Verification parameters including payload, headers, secret and tolerance - * @throws InvalidWebhookSignatureException if the signature is invalid or timestamp is too - * old/new - */ - fun verifySignature(params: WebhookVerificationParams) + fun unwrap(body: String): UnwrapWebhookEvent /** A view of [WebhookService] that provides access to raw HTTP responses for each method. */ interface WithRawResponse { diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookServiceImpl.kt index 5f118bcee..63d019c38 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookServiceImpl.kt @@ -4,17 +4,9 @@ package com.openai.services.blocking import com.fasterxml.jackson.module.kotlin.jacksonTypeRef import com.openai.core.ClientOptions -import com.openai.errors.InvalidWebhookSignatureException import com.openai.errors.OpenAIInvalidDataException import com.openai.models.webhooks.UnwrapWebhookEvent -import com.openai.models.webhooks.WebhookVerificationParams -import java.nio.charset.StandardCharsets -import java.security.MessageDigest -import java.time.Instant -import java.util.Base64 import java.util.function.Consumer -import javax.crypto.Mac -import javax.crypto.spec.SecretKeySpec class WebhookServiceImpl internal constructor(private val clientOptions: ClientOptions) : WebhookService { @@ -28,113 +20,12 @@ class WebhookServiceImpl internal constructor(private val clientOptions: ClientO override fun withOptions(modifier: Consumer): WebhookService = WebhookServiceImpl(clientOptions.toBuilder().apply(modifier::accept).build()) - /** - * Validates that the given payload was sent by OpenAI and parses the payload. - * - * @param params Verification parameters including payload, headers, secret and tolerance - * @return The parsed webhook event - * @throws IllegalArgumentException if the signature is invalid or headers are missing - */ - override fun unwrap(params: WebhookVerificationParams): UnwrapWebhookEvent { - verifySignature(params) - - val bodyString = String(params.payload, StandardCharsets.UTF_8) - return try { - clientOptions.jsonMapper.readValue(bodyString, jacksonTypeRef()) + override fun unwrap(body: String): UnwrapWebhookEvent = + try { + clientOptions.jsonMapper.readValue(body, jacksonTypeRef()) } catch (e: Exception) { throw OpenAIInvalidDataException("Error parsing body", e) } - } - - /** - * Validates whether or not the webhook payload was sent by OpenAI. - * - * @param params Verification parameters including payload, headers, secret and tolerance - * @throws IllegalArgumentException if the signature is invalid - */ - override fun verifySignature(params: WebhookVerificationParams) { - val webhookSecret = - params.secret.orElse(null) - ?: clientOptions.webhookSecret().orElse(null) - ?: throw IllegalStateException( - "The webhook secret must either be set using the env var, OPENAI_WEBHOOK_SECRET, " + - "on the client class builder, .webhookSecret(...), or passed to this function" - ) - - // Extract required headers - val signatureHeader = - params.headers.values("webhook-signature").firstOrNull() - ?: throw IllegalArgumentException("Missing required webhook-signature header") - - val timestampHeader = - params.headers.values("webhook-timestamp").firstOrNull() - ?: throw IllegalArgumentException("Missing required webhook-timestamp header") - - val webhookId = - params.headers.values("webhook-id").firstOrNull() - ?: throw IllegalArgumentException("Missing required webhook-id header") - - // Validate timestamp to prevent replay attacks - val timestampSeconds = - try { - timestampHeader.toLong() - } catch (e: NumberFormatException) { - throw InvalidWebhookSignatureException("Invalid webhook timestamp format", e) - } - - val now = Instant.now(clientOptions.clock) - val timestampInstant = Instant.ofEpochSecond(timestampSeconds) - val toleranceDuration = params.tolerance - - if (timestampInstant.isBefore(now.minus(toleranceDuration))) { - throw InvalidWebhookSignatureException("Webhook timestamp is too old") - } - - if (timestampInstant.isAfter(now.plus(toleranceDuration))) { - throw InvalidWebhookSignatureException("Webhook timestamp is too new") - } - - // The signature header can have multiple values, separated by spaces. - val signatures = - signatureHeader - .split("\\s+".toRegex()) - .filter { it.isNotBlank() } - .map { it.removePrefix("v1,") } - - // Decode the secret if it starts with whsec_ - val decodedSecret = - if (webhookSecret.startsWith("whsec_")) { - Base64.getDecoder().decode(webhookSecret.substring(6)) - } else { - webhookSecret.toByteArray(StandardCharsets.UTF_8) - } - - // Create the signed payload: {webhook_id}.{timestamp}.{payload} - val bodyString = String(params.payload, StandardCharsets.UTF_8) - val signedPayload = "$webhookId.$timestampHeader.$bodyString" - - // Compute HMAC-SHA256 signature - val mac = Mac.getInstance("HmacSHA256") - val secretKey = SecretKeySpec(decodedSecret, "HmacSHA256") - mac.init(secretKey) - val expectedSignatureBytes = mac.doFinal(signedPayload.toByteArray(StandardCharsets.UTF_8)) - val expectedSignature = Base64.getEncoder().encodeToString(expectedSignatureBytes) - - // Accept if any signature matches using timing-safe comparison - val signatureMatches = - signatures.any { signature -> - MessageDigest.isEqual( - expectedSignature.toByteArray(StandardCharsets.UTF_8), - signature.toByteArray(StandardCharsets.UTF_8), - ) - } - - if (!signatureMatches) { - throw InvalidWebhookSignatureException( - "The given webhook signature does not match the expected signature" - ) - } - } class WithRawResponseImpl internal constructor(private val clientOptions: ClientOptions) : WebhookService.WithRawResponse { diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranscriptionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranscriptionServiceImpl.kt index 19e5c9ae5..bb5ea2d05 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranscriptionServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranscriptionServiceImpl.kt @@ -11,7 +11,6 @@ import com.openai.core.handlers.errorHandler import com.openai.core.handlers.jsonHandler import com.openai.core.handlers.mapJson import com.openai.core.handlers.sseHandler -import com.openai.core.handlers.stringHandler import com.openai.core.http.HttpMethod import com.openai.core.http.HttpRequest import com.openai.core.http.HttpResponse @@ -22,12 +21,10 @@ import com.openai.core.http.map import com.openai.core.http.multipartFormData import com.openai.core.http.parseable import com.openai.core.prepare -import com.openai.models.audio.transcriptions.Transcription import com.openai.models.audio.transcriptions.TranscriptionCreateParams import com.openai.models.audio.transcriptions.TranscriptionCreateResponse import com.openai.models.audio.transcriptions.TranscriptionStreamEvent import java.util.function.Consumer -import kotlin.jvm.optionals.getOrNull /** Turn audio into text or text into audio. */ class TranscriptionServiceImpl internal constructor(private val clientOptions: ClientOptions) : @@ -69,18 +66,8 @@ class TranscriptionServiceImpl internal constructor(private val clientOptions: C clientOptions.toBuilder().apply(modifier::accept).build() ) - private val createJsonHandler: Handler = + private val createHandler: Handler = jsonHandler(clientOptions.jsonMapper) - private val createStringHandler: Handler = - object : Handler { - - private val stringHandler = stringHandler() - - override fun handle(response: HttpResponse): TranscriptionCreateResponse = - TranscriptionCreateResponse.ofTranscription( - Transcription.builder().text(stringHandler.handle(response)).build() - ) - } override fun create( params: TranscriptionCreateParams, @@ -101,11 +88,8 @@ class TranscriptionServiceImpl internal constructor(private val clientOptions: C val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions)) val response = clientOptions.httpClient.execute(request, requestOptions) return errorHandler.handle(response).parseable { - val handler = - if (params.responseFormat().getOrNull()?.isJson() != false) createJsonHandler - else createStringHandler response - .use { handler.handle(it) } + .use { createHandler.handle(it) } .also { if (requestOptions.responseValidation!!) { it.validate() diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/RealtimeService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/RealtimeService.kt deleted file mode 100644 index e330b5ad1..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/RealtimeService.kt +++ /dev/null @@ -1,48 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.services.blocking.beta - -import com.openai.core.ClientOptions -import com.openai.services.blocking.beta.realtime.SessionService -import com.openai.services.blocking.beta.realtime.TranscriptionSessionService -import java.util.function.Consumer - -@Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." -) -interface RealtimeService { - - /** - * Returns a view of this service that provides access to raw HTTP responses for each method. - */ - fun withRawResponse(): WithRawResponse - - /** - * Returns a view of this service with the given option modifications applied. - * - * The original service is not modified. - */ - fun withOptions(modifier: Consumer): RealtimeService - - fun sessions(): SessionService - - fun transcriptionSessions(): TranscriptionSessionService - - /** A view of [RealtimeService] that provides access to raw HTTP responses for each method. */ - @Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." - ) - interface WithRawResponse { - - /** - * Returns a view of this service with the given option modifications applied. - * - * The original service is not modified. - */ - fun withOptions(modifier: Consumer): RealtimeService.WithRawResponse - - fun sessions(): SessionService.WithRawResponse - - fun transcriptionSessions(): TranscriptionSessionService.WithRawResponse - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/RealtimeServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/RealtimeServiceImpl.kt deleted file mode 100644 index d7b08b29b..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/RealtimeServiceImpl.kt +++ /dev/null @@ -1,63 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.services.blocking.beta - -import com.openai.core.ClientOptions -import com.openai.services.blocking.beta.realtime.SessionService -import com.openai.services.blocking.beta.realtime.SessionServiceImpl -import com.openai.services.blocking.beta.realtime.TranscriptionSessionService -import com.openai.services.blocking.beta.realtime.TranscriptionSessionServiceImpl -import java.util.function.Consumer - -@Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." -) -class RealtimeServiceImpl internal constructor(private val clientOptions: ClientOptions) : - RealtimeService { - - private val withRawResponse: RealtimeService.WithRawResponse by lazy { - WithRawResponseImpl(clientOptions) - } - - private val sessions: SessionService by lazy { SessionServiceImpl(clientOptions) } - - private val transcriptionSessions: TranscriptionSessionService by lazy { - TranscriptionSessionServiceImpl(clientOptions) - } - - override fun withRawResponse(): RealtimeService.WithRawResponse = withRawResponse - - override fun withOptions(modifier: Consumer): RealtimeService = - RealtimeServiceImpl(clientOptions.toBuilder().apply(modifier::accept).build()) - - override fun sessions(): SessionService = sessions - - override fun transcriptionSessions(): TranscriptionSessionService = transcriptionSessions - - @Deprecated( - "Realtime has now launched and is generally available. The old beta API is now deprecated." - ) - class WithRawResponseImpl internal constructor(private val clientOptions: ClientOptions) : - RealtimeService.WithRawResponse { - - private val sessions: SessionService.WithRawResponse by lazy { - SessionServiceImpl.WithRawResponseImpl(clientOptions) - } - - private val transcriptionSessions: TranscriptionSessionService.WithRawResponse by lazy { - TranscriptionSessionServiceImpl.WithRawResponseImpl(clientOptions) - } - - override fun withOptions( - modifier: Consumer - ): RealtimeService.WithRawResponse = - RealtimeServiceImpl.WithRawResponseImpl( - clientOptions.toBuilder().apply(modifier::accept).build() - ) - - override fun sessions(): SessionService.WithRawResponse = sessions - - override fun transcriptionSessions(): TranscriptionSessionService.WithRawResponse = - transcriptionSessions - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ResponseServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ResponseServiceImpl.kt index e5967a5e9..98a378825 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ResponseServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ResponseServiceImpl.kt @@ -258,8 +258,7 @@ class ResponseServiceImpl internal constructor(private val clientOptions: Client .method(HttpMethod.GET) .baseUrl(clientOptions.baseUrl()) .addPathSegments("responses", params._pathParam(0)) - .putQueryParam("beta", "true") - .putQueryParam("stream", "true") + .putAllQueryParams(mapOf("beta" to "true", "stream" to "true")) .putHeader("Accept", "text/event-stream") .build() .prepare( diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/SessionService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/SessionService.kt deleted file mode 100644 index 51b890fa4..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/SessionService.kt +++ /dev/null @@ -1,85 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.services.blocking.beta.realtime - -import com.google.errorprone.annotations.MustBeClosed -import com.openai.core.ClientOptions -import com.openai.core.RequestOptions -import com.openai.core.http.HttpResponseFor -import com.openai.models.beta.realtime.sessions.SessionCreateParams -import com.openai.models.beta.realtime.sessions.SessionCreateResponse -import java.util.function.Consumer - -interface SessionService { - - /** - * Returns a view of this service that provides access to raw HTTP responses for each method. - */ - fun withRawResponse(): WithRawResponse - - /** - * Returns a view of this service with the given option modifications applied. - * - * The original service is not modified. - */ - fun withOptions(modifier: Consumer): SessionService - - /** - * Create an ephemeral API token for use in client-side applications with the Realtime API. Can - * be configured with the same session parameters as the `session.update` client event. - * - * It responds with a session object, plus a `client_secret` key which contains a usable - * ephemeral API token that can be used to authenticate browser clients for the Realtime API. - */ - fun create(): SessionCreateResponse = create(SessionCreateParams.none()) - - /** @see create */ - fun create( - params: SessionCreateParams = SessionCreateParams.none(), - requestOptions: RequestOptions = RequestOptions.none(), - ): SessionCreateResponse - - /** @see create */ - fun create(params: SessionCreateParams = SessionCreateParams.none()): SessionCreateResponse = - create(params, RequestOptions.none()) - - /** @see create */ - fun create(requestOptions: RequestOptions): SessionCreateResponse = - create(SessionCreateParams.none(), requestOptions) - - /** A view of [SessionService] that provides access to raw HTTP responses for each method. */ - interface WithRawResponse { - - /** - * Returns a view of this service with the given option modifications applied. - * - * The original service is not modified. - */ - fun withOptions(modifier: Consumer): SessionService.WithRawResponse - - /** - * Returns a raw HTTP response for `post /realtime/sessions`, but is otherwise the same as - * [SessionService.create]. - */ - @MustBeClosed - fun create(): HttpResponseFor = create(SessionCreateParams.none()) - - /** @see create */ - @MustBeClosed - fun create( - params: SessionCreateParams = SessionCreateParams.none(), - requestOptions: RequestOptions = RequestOptions.none(), - ): HttpResponseFor - - /** @see create */ - @MustBeClosed - fun create( - params: SessionCreateParams = SessionCreateParams.none() - ): HttpResponseFor = create(params, RequestOptions.none()) - - /** @see create */ - @MustBeClosed - fun create(requestOptions: RequestOptions): HttpResponseFor = - create(SessionCreateParams.none(), requestOptions) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/SessionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/SessionServiceImpl.kt deleted file mode 100644 index b683c9f79..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/SessionServiceImpl.kt +++ /dev/null @@ -1,94 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.services.blocking.beta.realtime - -import com.openai.core.ClientOptions -import com.openai.core.RequestOptions -import com.openai.core.SecurityOptions -import com.openai.core.handlers.errorBodyHandler -import com.openai.core.handlers.errorHandler -import com.openai.core.handlers.jsonHandler -import com.openai.core.http.Headers -import com.openai.core.http.HttpMethod -import com.openai.core.http.HttpRequest -import com.openai.core.http.HttpResponse -import com.openai.core.http.HttpResponse.Handler -import com.openai.core.http.HttpResponseFor -import com.openai.core.http.json -import com.openai.core.http.parseable -import com.openai.core.prepare -import com.openai.models.beta.realtime.sessions.SessionCreateParams -import com.openai.models.beta.realtime.sessions.SessionCreateResponse -import java.util.function.Consumer - -class SessionServiceImpl internal constructor(private val clientOptions: ClientOptions) : - SessionService { - - companion object { - - private val DEFAULT_HEADERS = Headers.builder().put("OpenAI-Beta", "assistants=v2").build() - } - - private val withRawResponse: SessionService.WithRawResponse by lazy { - WithRawResponseImpl(clientOptions) - } - - override fun withRawResponse(): SessionService.WithRawResponse = withRawResponse - - override fun withOptions(modifier: Consumer): SessionService = - SessionServiceImpl(clientOptions.toBuilder().apply(modifier::accept).build()) - - override fun create( - params: SessionCreateParams, - requestOptions: RequestOptions, - ): SessionCreateResponse = - // post /realtime/sessions - withRawResponse().create(params, requestOptions).parse() - - class WithRawResponseImpl internal constructor(private val clientOptions: ClientOptions) : - SessionService.WithRawResponse { - - private val errorHandler: Handler = - errorHandler(errorBodyHandler(clientOptions.jsonMapper)) - - override fun withOptions( - modifier: Consumer - ): SessionService.WithRawResponse = - SessionServiceImpl.WithRawResponseImpl( - clientOptions.toBuilder().apply(modifier::accept).build() - ) - - private val createHandler: Handler = - jsonHandler(clientOptions.jsonMapper) - - override fun create( - params: SessionCreateParams, - requestOptions: RequestOptions, - ): HttpResponseFor { - val request = - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(clientOptions.baseUrl()) - .addPathSegments("realtime", "sessions") - .putAllHeaders(DEFAULT_HEADERS) - .body(json(clientOptions.jsonMapper, params._body())) - .build() - .prepare( - clientOptions, - params, - SecurityOptions.builder().bearerAuth(true).build(), - ) - val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions)) - val response = clientOptions.httpClient.execute(request, requestOptions) - return errorHandler.handle(response).parseable { - response - .use { createHandler.handle(it) } - .also { - if (requestOptions.responseValidation!!) { - it.validate() - } - } - } - } - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/TranscriptionSessionService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/TranscriptionSessionService.kt deleted file mode 100644 index 13bd076db..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/TranscriptionSessionService.kt +++ /dev/null @@ -1,93 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.services.blocking.beta.realtime - -import com.google.errorprone.annotations.MustBeClosed -import com.openai.core.ClientOptions -import com.openai.core.RequestOptions -import com.openai.core.http.HttpResponseFor -import com.openai.models.beta.realtime.transcriptionsessions.TranscriptionSession -import com.openai.models.beta.realtime.transcriptionsessions.TranscriptionSessionCreateParams -import java.util.function.Consumer - -interface TranscriptionSessionService { - - /** - * Returns a view of this service that provides access to raw HTTP responses for each method. - */ - fun withRawResponse(): WithRawResponse - - /** - * Returns a view of this service with the given option modifications applied. - * - * The original service is not modified. - */ - fun withOptions(modifier: Consumer): TranscriptionSessionService - - /** - * Create an ephemeral API token for use in client-side applications with the Realtime API - * specifically for realtime transcriptions. Can be configured with the same session parameters - * as the `transcription_session.update` client event. - * - * It responds with a session object, plus a `client_secret` key which contains a usable - * ephemeral API token that can be used to authenticate browser clients for the Realtime API. - */ - fun create(): TranscriptionSession = create(TranscriptionSessionCreateParams.none()) - - /** @see create */ - fun create( - params: TranscriptionSessionCreateParams = TranscriptionSessionCreateParams.none(), - requestOptions: RequestOptions = RequestOptions.none(), - ): TranscriptionSession - - /** @see create */ - fun create( - params: TranscriptionSessionCreateParams = TranscriptionSessionCreateParams.none() - ): TranscriptionSession = create(params, RequestOptions.none()) - - /** @see create */ - fun create(requestOptions: RequestOptions): TranscriptionSession = - create(TranscriptionSessionCreateParams.none(), requestOptions) - - /** - * A view of [TranscriptionSessionService] that provides access to raw HTTP responses for each - * method. - */ - interface WithRawResponse { - - /** - * Returns a view of this service with the given option modifications applied. - * - * The original service is not modified. - */ - fun withOptions( - modifier: Consumer - ): TranscriptionSessionService.WithRawResponse - - /** - * Returns a raw HTTP response for `post /realtime/transcription_sessions`, but is otherwise - * the same as [TranscriptionSessionService.create]. - */ - @MustBeClosed - fun create(): HttpResponseFor = - create(TranscriptionSessionCreateParams.none()) - - /** @see create */ - @MustBeClosed - fun create( - params: TranscriptionSessionCreateParams = TranscriptionSessionCreateParams.none(), - requestOptions: RequestOptions = RequestOptions.none(), - ): HttpResponseFor - - /** @see create */ - @MustBeClosed - fun create( - params: TranscriptionSessionCreateParams = TranscriptionSessionCreateParams.none() - ): HttpResponseFor = create(params, RequestOptions.none()) - - /** @see create */ - @MustBeClosed - fun create(requestOptions: RequestOptions): HttpResponseFor = - create(TranscriptionSessionCreateParams.none(), requestOptions) - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/TranscriptionSessionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/TranscriptionSessionServiceImpl.kt deleted file mode 100644 index b8be22bf5..000000000 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/realtime/TranscriptionSessionServiceImpl.kt +++ /dev/null @@ -1,96 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.services.blocking.beta.realtime - -import com.openai.core.ClientOptions -import com.openai.core.RequestOptions -import com.openai.core.SecurityOptions -import com.openai.core.handlers.errorBodyHandler -import com.openai.core.handlers.errorHandler -import com.openai.core.handlers.jsonHandler -import com.openai.core.http.Headers -import com.openai.core.http.HttpMethod -import com.openai.core.http.HttpRequest -import com.openai.core.http.HttpResponse -import com.openai.core.http.HttpResponse.Handler -import com.openai.core.http.HttpResponseFor -import com.openai.core.http.json -import com.openai.core.http.parseable -import com.openai.core.prepare -import com.openai.models.beta.realtime.transcriptionsessions.TranscriptionSession -import com.openai.models.beta.realtime.transcriptionsessions.TranscriptionSessionCreateParams -import java.util.function.Consumer - -class TranscriptionSessionServiceImpl -internal constructor(private val clientOptions: ClientOptions) : TranscriptionSessionService { - - companion object { - - private val DEFAULT_HEADERS = Headers.builder().put("OpenAI-Beta", "assistants=v2").build() - } - - private val withRawResponse: TranscriptionSessionService.WithRawResponse by lazy { - WithRawResponseImpl(clientOptions) - } - - override fun withRawResponse(): TranscriptionSessionService.WithRawResponse = withRawResponse - - override fun withOptions( - modifier: Consumer - ): TranscriptionSessionService = - TranscriptionSessionServiceImpl(clientOptions.toBuilder().apply(modifier::accept).build()) - - override fun create( - params: TranscriptionSessionCreateParams, - requestOptions: RequestOptions, - ): TranscriptionSession = - // post /realtime/transcription_sessions - withRawResponse().create(params, requestOptions).parse() - - class WithRawResponseImpl internal constructor(private val clientOptions: ClientOptions) : - TranscriptionSessionService.WithRawResponse { - - private val errorHandler: Handler = - errorHandler(errorBodyHandler(clientOptions.jsonMapper)) - - override fun withOptions( - modifier: Consumer - ): TranscriptionSessionService.WithRawResponse = - TranscriptionSessionServiceImpl.WithRawResponseImpl( - clientOptions.toBuilder().apply(modifier::accept).build() - ) - - private val createHandler: Handler = - jsonHandler(clientOptions.jsonMapper) - - override fun create( - params: TranscriptionSessionCreateParams, - requestOptions: RequestOptions, - ): HttpResponseFor { - val request = - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(clientOptions.baseUrl()) - .addPathSegments("realtime", "transcription_sessions") - .putAllHeaders(DEFAULT_HEADERS) - .body(json(clientOptions.jsonMapper, params._body())) - .build() - .prepare( - clientOptions, - params, - SecurityOptions.builder().bearerAuth(true).build(), - ) - val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions)) - val response = clientOptions.httpClient.execute(request, requestOptions) - return errorHandler.handle(response).parseable { - response - .use { createHandler.handle(it) } - .also { - if (requestOptions.responseValidation!!) { - it.validate() - } - } - } - } - } -} diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/ChatCompletionService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/ChatCompletionService.kt index 92c95ae1f..0c74406c1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/ChatCompletionService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/ChatCompletionService.kt @@ -16,8 +16,6 @@ import com.openai.models.chat.completions.ChatCompletionListPage import com.openai.models.chat.completions.ChatCompletionListParams import com.openai.models.chat.completions.ChatCompletionRetrieveParams import com.openai.models.chat.completions.ChatCompletionUpdateParams -import com.openai.models.chat.completions.StructuredChatCompletion -import com.openai.models.chat.completions.StructuredChatCompletionCreateParams import com.openai.services.blocking.chat.completions.MessageService import java.util.function.Consumer @@ -69,30 +67,6 @@ interface ChatCompletionService { requestOptions: RequestOptions = RequestOptions.none(), ): ChatCompletion - /** - * Creates a model response for the given chat conversation. The model's structured output in - * JSON form will be deserialized automatically into an instance of the class `T`. See the SDK - * documentation for more details. - * - * @see create - */ - fun create( - params: StructuredChatCompletionCreateParams - ): StructuredChatCompletion = create(params, RequestOptions.none()) - - /** - * Creates a model response for the given chat conversation. The model's structured output in - * JSON form will be deserialized automatically into an instance of the class `T`. See the SDK - * documentation for more details. - * - * @see create - */ - fun create( - params: StructuredChatCompletionCreateParams, - requestOptions: RequestOptions = RequestOptions.none(), - ): StructuredChatCompletion = - StructuredChatCompletion(params.responseType, create(params.rawParams, requestOptions)) - /** * **Starting a new project?** We recommend trying * [Responses](https://platform.openai.com/docs/api-reference/responses) to take advantage of @@ -125,28 +99,6 @@ interface ChatCompletionService { requestOptions: RequestOptions = RequestOptions.none(), ): StreamResponse - /** - * Creates a streaming model response for the given chat conversation. The input parameters can - * define a JSON schema derived automatically from an arbitrary class to request a structured - * output in JSON form. However, that structured output is split over multiple streamed events, - * so it will not be deserialized automatically into an instance of that class. To deserialize - * the output, first use a helper class to accumulate the stream of events into a single output - * value. See the - * [SDK documentation](https://github.com/openai/openai-java/#usage-with-streaming) for full - * details. - */ - @MustBeClosed - fun createStreaming( - params: StructuredChatCompletionCreateParams<*> - ): StreamResponse = createStreaming(params, RequestOptions.none()) - - /** @see [createStreaming] */ - @MustBeClosed - fun createStreaming( - params: StructuredChatCompletionCreateParams<*>, - requestOptions: RequestOptions = RequestOptions.none(), - ): StreamResponse = createStreaming(params.rawParams, requestOptions) - /** * Get a stored chat completion. Only Chat Completions that have been created with the `store` * parameter set to `true` will be returned. diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionServiceImpl.kt index fb5b8ace7..1fbd02cf7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionServiceImpl.kt @@ -110,7 +110,7 @@ class PermissionServiceImpl internal constructor(private val clientOptions: Clie .prepare( clientOptions, params, - SecurityOptions.builder().adminApiKeyAuth(true).build(), + SecurityOptions.builder().bearerAuth(true).build(), ) val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions)) val response = clientOptions.httpClient.execute(request, requestOptions) @@ -157,7 +157,7 @@ class PermissionServiceImpl internal constructor(private val clientOptions: Clie .prepare( clientOptions, params, - SecurityOptions.builder().adminApiKeyAuth(true).build(), + SecurityOptions.builder().bearerAuth(true).build(), ) val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions)) val response = clientOptions.httpClient.execute(request, requestOptions) @@ -196,7 +196,7 @@ class PermissionServiceImpl internal constructor(private val clientOptions: Clie .prepare( clientOptions, params, - SecurityOptions.builder().adminApiKeyAuth(true).build(), + SecurityOptions.builder().bearerAuth(true).build(), ) val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions)) val response = clientOptions.httpClient.execute(request, requestOptions) @@ -244,7 +244,7 @@ class PermissionServiceImpl internal constructor(private val clientOptions: Clie .prepare( clientOptions, params, - SecurityOptions.builder().adminApiKeyAuth(true).build(), + SecurityOptions.builder().bearerAuth(true).build(), ) val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions)) val response = clientOptions.httpClient.execute(request, requestOptions) diff --git a/openai-java-core/src/main/resources/META-INF/proguard/openai-java-core.pro b/openai-java-core/src/main/resources/META-INF/proguard/openai-java-core.pro deleted file mode 100644 index 09d6b39c6..000000000 --- a/openai-java-core/src/main/resources/META-INF/proguard/openai-java-core.pro +++ /dev/null @@ -1,32 +0,0 @@ -# Jackson uses reflection and depends heavily on runtime attributes. --keepattributes Exceptions,InnerClasses,Signature,Deprecated,*Annotation* - -# Jackson uses Kotlin reflection utilities, which themselves use reflection to access things. --keep class kotlin.reflect.** { *; } --keep class kotlin.Metadata { *; } - -# Jackson uses reflection to access enum members (e.g. via `java.lang.Class.getEnumConstants()`). --keepclassmembers class com.fasterxml.jackson.** extends java.lang.Enum { - ; - public static **[] values(); - public static ** valueOf(java.lang.String); -} - -# Jackson uses reflection to access annotation members. --keepclassmembers @interface com.fasterxml.jackson.annotation.** { - *; -} - -# Jackson uses reified type information to serialize and deserialize our classes (via `TypeReference`). --keep class com.fasterxml.jackson.core.type.TypeReference { *; } --keep class * extends com.fasterxml.jackson.core.type.TypeReference { *; } - -# Jackson uses reflection to access our class serializers and deserializers. --keep @com.fasterxml.jackson.databind.annotation.JsonSerialize class com.openai.** { *; } --keep @com.fasterxml.jackson.databind.annotation.JsonDeserialize class com.openai.** { *; } - -# Jackson uses reflection to serialize and deserialize our classes based on their constructors and annotated members. --keepclassmembers class com.openai.** { - (...); - @com.fasterxml.jackson.annotation.* *; -} \ No newline at end of file diff --git a/openai-java-core/src/test/kotlin/com/openai/TestServerExtension.kt b/openai-java-core/src/test/kotlin/com/openai/TestServerExtension.kt deleted file mode 100644 index c19b328da..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/TestServerExtension.kt +++ /dev/null @@ -1,80 +0,0 @@ -package com.openai - -import java.lang.RuntimeException -import java.lang.reflect.Method -import java.net.URL -import java.nio.channels.FileChannel -import java.nio.file.Paths -import java.nio.file.StandardOpenOption.CREATE -import java.nio.file.StandardOpenOption.WRITE -import java.util.UUID -import java.util.concurrent.locks.ReentrantLock -import kotlin.concurrent.withLock -import org.junit.jupiter.api.extension.BeforeAllCallback -import org.junit.jupiter.api.extension.ConditionEvaluationResult -import org.junit.jupiter.api.extension.ExecutionCondition -import org.junit.jupiter.api.extension.ExtensionContext -import org.junit.jupiter.api.extension.InvocationInterceptor -import org.junit.jupiter.api.extension.ReflectiveInvocationContext - -class TestServerExtension : BeforeAllCallback, ExecutionCondition, InvocationInterceptor { - - override fun beforeAll(context: ExtensionContext?) { - try { - URL(BASE_URL).openConnection().connect() - } catch (e: Exception) { - throw RuntimeException( - """ - The test suite will not run without a mock server running against your OpenAPI spec. - - You can set the environment variable `SKIP_MOCK_TESTS` to `true` to skip running any tests - that require the mock server. - - To fix run `./scripts/mock` in a separate terminal. - """ - .trimIndent(), - e, - ) - } - } - - override fun evaluateExecutionCondition(context: ExtensionContext): ConditionEvaluationResult { - return if (System.getenv(SKIP_TESTS_ENV).toBoolean()) { - ConditionEvaluationResult.disabled( - "Environment variable $SKIP_TESTS_ENV is set to true" - ) - } else { - ConditionEvaluationResult.enabled( - "Environment variable $SKIP_TESTS_ENV is not set to true" - ) - } - } - - override fun interceptTestMethod( - invocation: InvocationInterceptor.Invocation, - invocationContext: ReflectiveInvocationContext, - extensionContext: ExtensionContext, - ) { - PROCESS_LOCK.withLock { - FileChannel.open(LOCK_FILE, CREATE, WRITE).use { channel -> - channel.lock().use { invocation.proceed() } - } - } - } - - companion object { - - val BASE_URL = System.getenv("TEST_API_BASE_URL") ?: "http://localhost:4010" - - const val SKIP_TESTS_ENV: String = "SKIP_MOCK_TESTS" - - // JUnit resource locks do not coordinate separate Gradle test-worker JVMs. Use both a - // process-local lock and an OS file lock so tests sharing one mock server cannot race. - private val PROCESS_LOCK = ReentrantLock(true) - private val LOCK_FILE = - Paths.get( - System.getProperty("java.io.tmpdir"), - "openai-java-test-server-${UUID.nameUUIDFromBytes(BASE_URL.toByteArray())}.lock", - ) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/auth/AzureManagedIdentityTokenProviderTest.kt b/openai-java-core/src/test/kotlin/com/openai/auth/AzureManagedIdentityTokenProviderTest.kt deleted file mode 100644 index 06f4e65ff..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/auth/AzureManagedIdentityTokenProviderTest.kt +++ /dev/null @@ -1,203 +0,0 @@ -package com.openai.auth - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.openai.core.http.HttpClient -import com.openai.core.http.HttpRequest -import com.openai.core.http.HttpResponse -import com.openai.errors.SubjectTokenProviderException -import java.io.ByteArrayInputStream -import java.util.concurrent.CompletableFuture -import java.util.concurrent.ExecutionException -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import org.junit.jupiter.api.extension.ExtendWith -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import org.mockito.Mockito -import org.mockito.junit.jupiter.MockitoExtension -import org.mockito.kotlin.any -import org.mockito.kotlin.mock -import org.mockito.kotlin.whenever - -@ExtendWith(MockitoExtension::class) -internal class AzureManagedIdentityTokenProviderTest { - - private val jsonMapper = JsonMapper() - - private fun SubjectTokenProvider.getToken( - httpClient: HttpClient, - jsonMapper: JsonMapper, - async: Boolean, - ): String = - if (async) getTokenAsync(httpClient, jsonMapper).get() else getToken(httpClient, jsonMapper) - - private fun assertThrowsProviderException( - async: Boolean, - block: () -> Unit, - ): SubjectTokenProviderException { - return if (async) { - val thrown = assertThrows(block) - thrown.cause as SubjectTokenProviderException - } else { - assertThrows(block) - } - } - - private fun mockHttpClient(async: Boolean, response: HttpResponse): HttpClient { - val httpClient = mock() - if (async) { - whenever(httpClient.executeAsync(any())) - .thenReturn(CompletableFuture.completedFuture(response)) - } else { - whenever(httpClient.execute(any())).thenReturn(response) - } - return httpClient - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_success(async: Boolean) { - val expectedToken = "test-azure-access-token" - val responseBody = - """{ - "access_token": "$expectedToken", - "refresh_token": "", - "expires_in": "3599", - "expires_on": "1600003600", - "not_before": "1600000000", - "resource": "https://management.azure.com/", - "token_type": "Bearer" - }""" - - val httpClient = mockHttpClient(async, mockResponse(200, responseBody)) - val provider = AzureManagedIdentityTokenProvider.builder().build() - val token = provider.getToken(httpClient, jsonMapper, async) - - assertThat(token).isEqualTo(expectedToken) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_customResource(async: Boolean) { - val expectedToken = "test-azure-custom-resource-token" - val responseBody = - """{ - "access_token": "$expectedToken", - "expires_in": "3599", - "resource": "https://cognitiveservices.azure.com/", - "token_type": "Bearer" - }""" - - val httpClient = mockHttpClient(async, mockResponse(200, responseBody)) - val provider = - AzureManagedIdentityTokenProvider.builder() - .resource("https://cognitiveservices.azure.com/") - .build() - - val token = provider.getToken(httpClient, jsonMapper, async) - - assertThat(token).isEqualTo(expectedToken) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_404NotFound(async: Boolean) { - val httpClient = mockHttpClient(async, mockResponse(404, "Not Found")) - val provider = AzureManagedIdentityTokenProvider.builder().build() - val exception = - assertThrowsProviderException(async) { - provider.getToken(httpClient, jsonMapper, async) - } - - assertThat(exception.provider).isEqualTo("azure-imds") - assertThat(exception.message).contains("IMDS returned status 404") - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_500InternalServerError(async: Boolean) { - val httpClient = mockHttpClient(async, mockResponse(500, "Internal Server Error")) - val provider = AzureManagedIdentityTokenProvider.builder().build() - val exception = - assertThrowsProviderException(async) { - provider.getToken(httpClient, jsonMapper, async) - } - - assertThat(exception.provider).isEqualTo("azure-imds") - assertThat(exception.message).contains("IMDS returned status 500") - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_missingAccessToken(async: Boolean) { - val responseBody = - """{ - "expires_in": "3599", - "resource": "https://management.azure.com/", - "token_type": "Bearer" - }""" - - val httpClient = mockHttpClient(async, mockResponse(200, responseBody)) - val provider = AzureManagedIdentityTokenProvider.builder().build() - val exception = - assertThrowsProviderException(async) { - provider.getToken(httpClient, jsonMapper, async) - } - - assertThat(exception.provider).isEqualTo("azure-imds") - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_customApiVersion(async: Boolean) { - val expectedToken = "test-token" - val responseBody = - """{ - "access_token": "$expectedToken", - "expires_in": "3599", - "resource": "https://management.azure.com/", - "token_type": "Bearer" - }""" - - val httpClient = mockHttpClient(async, mockResponse(200, responseBody)) - val provider = - AzureManagedIdentityTokenProvider.builder() - .resource("https://api.openai.com") - .apiVersion("2019-08-01") - .build() - - val token = provider.getToken(httpClient, jsonMapper, async) - - assertThat(token).isEqualTo(expectedToken) - } - - @Test - fun builder_withDefaultParameters() { - val provider = AzureManagedIdentityTokenProvider.builder().build() - - assertThat(provider).isNotNull - assertThat(provider.tokenType()).isEqualTo(SubjectTokenType.JWT) - } - - @Test - fun builder_withAllParameters() { - val provider = - AzureManagedIdentityTokenProvider.builder() - .resource("https://management.azure.com/") - .apiVersion("2019-08-01") - .build() - - assertThat(provider).isNotNull - assertThat(provider.tokenType()).isEqualTo(SubjectTokenType.JWT) - } - - private fun mockResponse(statusCode: Int, body: String): HttpResponse { - val response = mock() - whenever(response.statusCode()).thenReturn(statusCode) - Mockito.lenient() - .`when`(response.body()) - .thenReturn(ByteArrayInputStream(body.toByteArray())) - return response - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/auth/GcpIdTokenProviderTest.kt b/openai-java-core/src/test/kotlin/com/openai/auth/GcpIdTokenProviderTest.kt deleted file mode 100644 index 8b1145e16..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/auth/GcpIdTokenProviderTest.kt +++ /dev/null @@ -1,137 +0,0 @@ -package com.openai.auth - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.openai.core.http.HttpClient -import com.openai.core.http.HttpRequest -import com.openai.core.http.HttpResponse -import com.openai.errors.SubjectTokenProviderException -import java.io.ByteArrayInputStream -import java.util.concurrent.CompletableFuture -import java.util.concurrent.ExecutionException -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import org.junit.jupiter.api.extension.ExtendWith -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import org.mockito.Mockito -import org.mockito.junit.jupiter.MockitoExtension -import org.mockito.kotlin.any -import org.mockito.kotlin.mock -import org.mockito.kotlin.whenever - -@ExtendWith(MockitoExtension::class) -internal class GcpIdTokenProviderTest { - - private val jsonMapper = JsonMapper() - - private fun SubjectTokenProvider.getToken( - httpClient: HttpClient, - jsonMapper: JsonMapper, - async: Boolean, - ): String = - if (async) getTokenAsync(httpClient, jsonMapper).get() else getToken(httpClient, jsonMapper) - - private fun assertThrowsProviderException( - async: Boolean, - block: () -> Unit, - ): SubjectTokenProviderException { - return if (async) { - val thrown = assertThrows(block) - thrown.cause as SubjectTokenProviderException - } else { - assertThrows(block) - } - } - - private fun mockHttpClient(async: Boolean, response: HttpResponse): HttpClient { - val httpClient = mock() - if (async) { - whenever(httpClient.executeAsync(any())) - .thenReturn(CompletableFuture.completedFuture(response)) - } else { - whenever(httpClient.execute(any())).thenReturn(response) - } - return httpClient - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_success(async: Boolean) { - val expectedToken = "test-gcp-id-token" - - val httpClient = mockHttpClient(async, mockResponse(200, expectedToken)) - val provider = GcpIdTokenProvider.builder().build() - val token = provider.getToken(httpClient, jsonMapper, async) - - assertThat(token).isEqualTo(expectedToken) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_customAudience(async: Boolean) { - val expectedToken = "test-gcp-custom-audience-token" - - val httpClient = mockHttpClient(async, mockResponse(200, expectedToken)) - val provider = - GcpIdTokenProvider.builder().audience("https://custom-service.example.com").build() - - val token = provider.getToken(httpClient, jsonMapper, async) - - assertThat(token).isEqualTo(expectedToken) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_404NotFound(async: Boolean) { - val httpClient = mockHttpClient(async, mockResponse(404, "Not Found")) - val provider = GcpIdTokenProvider.builder().build() - val exception = - assertThrowsProviderException(async) { - provider.getToken(httpClient, jsonMapper, async) - } - - assertThat(exception.provider).isEqualTo("gcp-metadata") - assertThat(exception.message).contains("metadata server returned status 404") - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_500InternalServerError(async: Boolean) { - val httpClient = mockHttpClient(async, mockResponse(500, "Internal Server Error")) - val provider = GcpIdTokenProvider.builder().build() - val exception = - assertThrowsProviderException(async) { - provider.getToken(httpClient, jsonMapper, async) - } - - assertThat(exception.provider).isEqualTo("gcp-metadata") - assertThat(exception.message).contains("metadata server returned status 500") - } - - @Test - fun builder_withDefaultParameters() { - val provider = GcpIdTokenProvider.builder().build() - - assertThat(provider).isNotNull - assertThat(provider.tokenType()).isEqualTo(SubjectTokenType.ID) - } - - @Test - fun builder_withAllParameters() { - val provider = - GcpIdTokenProvider.builder().audience("https://custom-service.example.com").build() - - assertThat(provider).isNotNull - assertThat(provider.tokenType()).isEqualTo(SubjectTokenType.ID) - } - - private fun mockResponse(statusCode: Int, body: String): HttpResponse { - val response = mock() - whenever(response.statusCode()).thenReturn(statusCode) - Mockito.lenient() - .`when`(response.body()) - .thenReturn(ByteArrayInputStream(body.toByteArray())) - return response - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/auth/K8sServiceAccountTokenProviderTest.kt b/openai-java-core/src/test/kotlin/com/openai/auth/K8sServiceAccountTokenProviderTest.kt deleted file mode 100644 index b60e08ee2..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/auth/K8sServiceAccountTokenProviderTest.kt +++ /dev/null @@ -1,120 +0,0 @@ -package com.openai.auth - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.openai.core.http.HttpClient -import com.openai.errors.SubjectTokenProviderException -import java.io.IOException -import java.nio.file.Path -import java.nio.file.Paths -import java.util.concurrent.ExecutionException -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import org.junit.jupiter.api.io.TempDir -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import org.mockito.kotlin.mock - -internal class K8sServiceAccountTokenProviderTest { - - private fun SubjectTokenProvider.getToken(async: Boolean): String { - val httpClient = mock() - val jsonMapper = JsonMapper() - return if (async) getTokenAsync(httpClient, jsonMapper).get() - else getToken(httpClient, jsonMapper) - } - - private fun assertThrowsProviderException( - async: Boolean, - block: () -> Unit, - ): SubjectTokenProviderException { - return if (async) { - val thrown = assertThrows(block) - thrown.cause as SubjectTokenProviderException - } else { - assertThrows(block) - } - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_success(async: Boolean, @TempDir tempDir: Path) { - val tokenFile = tempDir.resolve("token") - val expectedToken = "test-k8s-service-account-token" - tokenFile.toFile().writeText(expectedToken) - - val provider = K8sServiceAccountTokenProvider.builder().tokenPath(tokenFile).build() - val token = provider.getToken(async) - - assertThat(token).isEqualTo(expectedToken) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_successWithWhitespace(async: Boolean, @TempDir tempDir: Path) { - val tokenFile = tempDir.resolve("token") - val expectedToken = "test-token-with-whitespace" - tokenFile.toFile().writeText(" $expectedToken\n\t") - - val provider = K8sServiceAccountTokenProvider.builder().tokenPath(tokenFile).build() - val token = provider.getToken(async) - - assertThat(token).isEqualTo(expectedToken) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_emptyToken(async: Boolean, @TempDir tempDir: Path) { - val tokenFile = tempDir.resolve("token") - tokenFile.toFile().writeText("") - - val provider = K8sServiceAccountTokenProvider.builder().tokenPath(tokenFile).build() - val exception = assertThrowsProviderException(async) { provider.getToken(async) } - - assertThat(exception.provider).isEqualTo("kubernetes") - assertThat(exception.message).contains("service account token is empty") - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_fileNotFound(async: Boolean) { - val nonExistentPath = Paths.get("/nonexistent/path/to/token") - - val provider = K8sServiceAccountTokenProvider.builder().tokenPath(nonExistentPath).build() - val exception = assertThrowsProviderException(async) { provider.getToken(async) } - - assertThat(exception.provider).isEqualTo("kubernetes") - assertThat(exception.message).contains("failed to read service account token") - assertThat(exception.message).contains(nonExistentPath.toString()) - assertThat(exception.cause).isInstanceOf(IOException::class.java) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun getToken_fileIsDirectory(async: Boolean, @TempDir tempDir: Path) { - val provider = K8sServiceAccountTokenProvider.builder().tokenPath(tempDir).build() - val exception = assertThrowsProviderException(async) { provider.getToken(async) } - - assertThat(exception.provider).isEqualTo("kubernetes") - assertThat(exception.message).contains("failed to read service account token") - assertThat(exception.message).contains(tempDir.toString()) - } - - @Test - fun builder_withDefaultPath() { - val provider = K8sServiceAccountTokenProvider.builder().build() - - assertThat(provider).isNotNull - assertThat(provider.tokenType()).isEqualTo(SubjectTokenType.JWT) - } - - @Test - fun builder_withCustomPath(@TempDir tempDir: Path) { - val tokenFile = tempDir.resolve("custom-token") - - val provider = K8sServiceAccountTokenProvider.builder().tokenPath(tokenFile).build() - - assertThat(provider).isNotNull - assertThat(provider.tokenType()).isEqualTo(SubjectTokenType.JWT) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/auth/WorkloadIdentityAuthTest.kt b/openai-java-core/src/test/kotlin/com/openai/auth/WorkloadIdentityAuthTest.kt deleted file mode 100644 index 075239dd4..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/auth/WorkloadIdentityAuthTest.kt +++ /dev/null @@ -1,544 +0,0 @@ -package com.openai.auth - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.openai.core.http.Headers -import com.openai.core.http.HttpClient -import com.openai.core.http.HttpRequest -import com.openai.core.http.HttpResponse -import com.openai.errors.BadRequestException -import java.io.ByteArrayInputStream -import java.io.ByteArrayOutputStream -import java.util.concurrent.CompletableFuture -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import org.junit.jupiter.api.extension.ExtendWith -import org.mockito.junit.jupiter.MockitoExtension -import org.mockito.kotlin.any -import org.mockito.kotlin.mock -import org.mockito.kotlin.times -import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyNoInteractions -import org.mockito.kotlin.whenever - -@ExtendWith(MockitoExtension::class) -internal class WorkloadIdentityAuthTest { - - private val httpClient = mock() - - @Test - fun getToken_propagatesProviderFailure() { - val failure = IllegalStateException("provider failed") - val auth = - WorkloadIdentityAuth( - config = - WorkloadIdentity.builder() - .clientId("client-id") - .identityProviderId("provider-id") - .serviceAccountId("service-account-id") - .provider( - object : SubjectTokenProvider { - override fun tokenType() = SubjectTokenType.JWT - - override fun getToken( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): String { - throw failure - } - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = - CompletableFuture().also { - it.completeExceptionally(failure) - } - } - ) - .build(), - httpClient = httpClient, - jsonMapper = JsonMapper(), - ) - - val thrown = assertThrows { auth.getToken() } - - org.assertj.core.api.Assertions.assertThat(thrown).isSameAs(failure) - verifyNoInteractions(httpClient) - } - - @Test - fun getToken_success() { - val subjectToken = "subject-token" - val accessToken = "test-access-token" - val oauthResponse = - """ - { - "access_token": "$accessToken", - "issued_token_type": "urn:ietf:params:oauth:token-type:access_token", - "token_type": "Bearer", - "expires_in": 3600 - } - """ - .trimIndent() - - val provider = - object : SubjectTokenProvider { - override fun tokenType() = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String = - subjectToken - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = CompletableFuture.completedFuture(subjectToken) - } - - val httpClient = mock() - val response = mockResponse(200, oauthResponse) - whenever(httpClient.execute(any())).thenReturn(response) - - val auth = - WorkloadIdentityAuth( - config = - WorkloadIdentity.builder() - .clientId("client-id") - .identityProviderId("provider-id") - .serviceAccountId("service-account-id") - .provider(provider) - .build(), - httpClient = httpClient, - jsonMapper = JsonMapper(), - ) - - val token = auth.getToken() - - assertThat(token).isEqualTo(accessToken) - verify(httpClient, times(1)).execute(any()) - } - - @Test - fun getToken_omitsClientIdFromTokenExchangeRequestWhenUnset() { - val subjectToken = "subject-token" - val accessToken = "test-access-token" - val oauthResponse = - """ - { - "access_token": "$accessToken", - "issued_token_type": "urn:ietf:params:oauth:token-type:access_token", - "token_type": "Bearer", - "expires_in": 3600 - } - """ - .trimIndent() - - val provider = - object : SubjectTokenProvider { - override fun tokenType() = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String = - subjectToken - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = CompletableFuture.completedFuture(subjectToken) - } - - val httpClient = mock() - val response = mockResponse(200, oauthResponse) - var capturedRequest: HttpRequest? = null - whenever(httpClient.execute(any())).thenAnswer { invocation -> - capturedRequest = invocation.getArgument(0) - response - } - - val auth = - WorkloadIdentityAuth( - config = - WorkloadIdentity.builder() - .identityProviderId("provider-id") - .serviceAccountId("service-account-id") - .provider(provider) - .build(), - httpClient = httpClient, - jsonMapper = JsonMapper(), - ) - - val token = auth.getToken() - - val requestJson = requestJson(checkNotNull(capturedRequest)) - assertThat(token).isEqualTo(accessToken) - assertThat(requestJson.has("client_id")).isFalse() - assertThat(requestJson.get("grant_type").asText()) - .isEqualTo("urn:ietf:params:oauth:grant-type:token-exchange") - assertThat(requestJson.get("subject_token").asText()).isEqualTo(subjectToken) - assertThat(requestJson.get("identity_provider_id").asText()).isEqualTo("provider-id") - assertThat(requestJson.get("service_account_id").asText()).isEqualTo("service-account-id") - } - - @Test - fun getToken_includesClientIdInTokenExchangeRequestWhenSet() { - val subjectToken = "subject-token" - val accessToken = "test-access-token" - val oauthResponse = - """ - { - "access_token": "$accessToken", - "issued_token_type": "urn:ietf:params:oauth:token-type:access_token", - "token_type": "Bearer", - "expires_in": 3600 - } - """ - .trimIndent() - - val provider = - object : SubjectTokenProvider { - override fun tokenType() = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String = - subjectToken - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = CompletableFuture.completedFuture(subjectToken) - } - - val httpClient = mock() - val response = mockResponse(200, oauthResponse) - var capturedRequest: HttpRequest? = null - whenever(httpClient.execute(any())).thenAnswer { invocation -> - capturedRequest = invocation.getArgument(0) - response - } - - val auth = - WorkloadIdentityAuth( - config = - WorkloadIdentity.builder() - .clientId("client-id") - .identityProviderId("provider-id") - .serviceAccountId("service-account-id") - .provider(provider) - .build(), - httpClient = httpClient, - jsonMapper = JsonMapper(), - ) - - val token = auth.getToken() - - val requestJson = requestJson(checkNotNull(capturedRequest)) - assertThat(token).isEqualTo(accessToken) - assertThat(requestJson.get("client_id").asText()).isEqualTo("client-id") - } - - @Test - fun getToken_cachesToken() { - val subjectToken = "subject-token" - val accessToken = "test-access-token" - val oauthResponse = - """ - { - "access_token": "$accessToken", - "issued_token_type": "urn:ietf:params:oauth:token-type:access_token", - "token_type": "Bearer", - "expires_in": 3600 - } - """ - .trimIndent() - - val provider = - object : SubjectTokenProvider { - override fun tokenType() = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String = - subjectToken - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = CompletableFuture.completedFuture(subjectToken) - } - - val httpClient = mock() - val response = mockResponse(200, oauthResponse) - whenever(httpClient.execute(any())).thenReturn(response) - - val auth = - WorkloadIdentityAuth( - config = - WorkloadIdentity.builder() - .clientId("client-id") - .identityProviderId("provider-id") - .serviceAccountId("service-account-id") - .provider(provider) - .build(), - httpClient = httpClient, - jsonMapper = JsonMapper(), - ) - - val token1 = auth.getToken() - val token2 = auth.getToken() - - assertThat(token1).isEqualTo(accessToken) - assertThat(token2).isEqualTo(accessToken) - verify(httpClient, times(1)).execute(any()) - } - - @Test - fun getToken_refreshesExpiredToken() { - val subjectToken = "subject-token" - val accessToken1 = "test-access-token-1" - val accessToken2 = "test-access-token-2" - val oauthResponse1 = - """ - { - "access_token": "$accessToken1", - "issued_token_type": "urn:ietf:params:oauth:token-type:access_token", - "token_type": "Bearer", - "expires_in": 1 - } - """ - .trimIndent() - val oauthResponse2 = - """ - { - "access_token": "$accessToken2", - "issued_token_type": "urn:ietf:params:oauth:token-type:access_token", - "token_type": "Bearer", - "expires_in": 3600 - } - """ - .trimIndent() - - val provider = - object : SubjectTokenProvider { - override fun tokenType() = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String = - subjectToken - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = CompletableFuture.completedFuture(subjectToken) - } - - val httpClient = mock() - val response1 = mockResponse(200, oauthResponse1) - val response2 = mockResponse(200, oauthResponse2) - whenever(httpClient.execute(any())).thenReturn(response1).thenReturn(response2) - - val auth = - WorkloadIdentityAuth( - config = - WorkloadIdentity.builder() - .clientId("client-id") - .identityProviderId("provider-id") - .serviceAccountId("service-account-id") - .provider(provider) - .refreshBufferSeconds(0) - .build(), - httpClient = httpClient, - jsonMapper = JsonMapper(), - ) - - val token1 = auth.getToken() - Thread.sleep(1100) - val token2 = auth.getToken() - - assertThat(token1).isEqualTo(accessToken1) - assertThat(token2).isEqualTo(accessToken2) - verify(httpClient, times(2)).execute(any()) - } - - @Test - fun getToken_handlesOAuthError() { - val subjectToken = "subject-token" - val oauthErrorResponse = - """ - { - "error": "invalid_grant", - "error_description": "The grant is invalid" - } - """ - .trimIndent() - - val provider = - object : SubjectTokenProvider { - override fun tokenType() = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String = - subjectToken - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = CompletableFuture.completedFuture(subjectToken) - } - - val httpClient = mock() - val response = mockResponse(400, oauthErrorResponse, stubHeaders = true) - whenever(httpClient.execute(any())).thenReturn(response) - - val auth = - WorkloadIdentityAuth( - config = - WorkloadIdentity.builder() - .clientId("client-id") - .identityProviderId("provider-id") - .serviceAccountId("service-account-id") - .provider(provider) - .build(), - httpClient = httpClient, - jsonMapper = JsonMapper(), - ) - - val thrown = assertThrows { auth.getToken() } - - assertThat(thrown.statusCode()).isEqualTo(400) - assertThat(thrown.code().get()).isEqualTo("invalid_grant") - assertThat(thrown.message).contains("The grant is invalid") - } - - @Test - fun getToken_usesDefaultExpiry() { - val subjectToken = "subject-token" - val accessToken = "test-access-token" - val oauthResponse = - """ - { - "access_token": "$accessToken", - "issued_token_type": "urn:ietf:params:oauth:token-type:access_token", - "token_type": "Bearer" - } - """ - .trimIndent() - - val provider = - object : SubjectTokenProvider { - override fun tokenType() = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String = - subjectToken - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = CompletableFuture.completedFuture(subjectToken) - } - - val httpClient = mock() - val response = mockResponse(200, oauthResponse) - whenever(httpClient.execute(any())).thenReturn(response) - - val auth = - WorkloadIdentityAuth( - config = - WorkloadIdentity.builder() - .clientId("client-id") - .identityProviderId("provider-id") - .serviceAccountId("service-account-id") - .provider(provider) - .build(), - httpClient = httpClient, - jsonMapper = JsonMapper(), - ) - - val token1 = auth.getToken() - val token2 = auth.getToken() - - assertThat(token1).isEqualTo(accessToken) - assertThat(token2).isEqualTo(accessToken) - verify(httpClient, times(1)).execute(any()) - } - - @Test - fun invalidateToken_clearsCache() { - val subjectToken = "subject-token" - val accessToken1 = "test-access-token-1" - val accessToken2 = "test-access-token-2" - val oauthResponse1 = - """ - { - "access_token": "$accessToken1", - "issued_token_type": "urn:ietf:params:oauth:token-type:access_token", - "token_type": "Bearer", - "expires_in": 3600 - } - """ - .trimIndent() - val oauthResponse2 = - """ - { - "access_token": "$accessToken2", - "issued_token_type": "urn:ietf:params:oauth:token-type:access_token", - "token_type": "Bearer", - "expires_in": 3600 - } - """ - .trimIndent() - - val provider = - object : SubjectTokenProvider { - override fun tokenType() = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String = - subjectToken - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = CompletableFuture.completedFuture(subjectToken) - } - - val httpClient = mock() - val response1 = mockResponse(200, oauthResponse1) - val response2 = mockResponse(200, oauthResponse2) - whenever(httpClient.execute(any())).thenReturn(response1).thenReturn(response2) - - val auth = - WorkloadIdentityAuth( - config = - WorkloadIdentity.builder() - .clientId("client-id") - .identityProviderId("provider-id") - .serviceAccountId("service-account-id") - .provider(provider) - .build(), - httpClient = httpClient, - jsonMapper = JsonMapper(), - ) - - val token1 = auth.getToken() - auth.invalidateToken() - val token2 = auth.getToken() - - assertThat(token1).isEqualTo(accessToken1) - assertThat(token2).isEqualTo(accessToken2) - verify(httpClient, times(2)).execute(any()) - } - - private fun mockResponse( - statusCode: Int, - body: String, - stubHeaders: Boolean = false, - ): HttpResponse { - val response = mock() - whenever(response.statusCode()).thenReturn(statusCode) - if (stubHeaders) whenever(response.headers()).thenReturn(Headers.builder().build()) - whenever(response.body()).thenReturn(ByteArrayInputStream(body.toByteArray())) - return response - } - - private fun requestJson(request: HttpRequest) = - JsonMapper().readTree(ByteArrayInputStream(requestBodyBytes(request))) - - private fun requestBodyBytes(request: HttpRequest): ByteArray { - val outputStream = ByteArrayOutputStream() - checkNotNull(request.body).writeTo(outputStream) - return outputStream.toByteArray() - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/azure/AzureUrlCategoryTest.kt b/openai-java-core/src/test/kotlin/com/openai/azure/AzureUrlCategoryTest.kt deleted file mode 100644 index bf878178f..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/azure/AzureUrlCategoryTest.kt +++ /dev/null @@ -1,344 +0,0 @@ -package com.openai.azure - -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class AzureUrlCategoryTest { - - @Test - fun isAzure() { - assertThat(AzureUrlCategory.AZURE_LEGACY.isAzure()).isTrue() - assertThat(AzureUrlCategory.AZURE_UNIFIED.isAzure()).isTrue() - assertThat(AzureUrlCategory.NON_AZURE.isAzure()).isFalse() - } - - @Test - fun categorizeBaseUrl_knownHosts() { - // known legacy endpoint - no trailing slash - force configuration - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.openai.azure.com", - AzureUrlPathMode.LEGACY, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.openai.azure.com", - AzureUrlPathMode.UNIFIED, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.openai.azure.com", - AzureUrlPathMode.AUTO, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - - // known legacy endpoint - trailing slash - force configuration - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.openai.azure.com/", - AzureUrlPathMode.LEGACY, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.openai.azure.com/", - AzureUrlPathMode.UNIFIED, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.openai.azure.com/", - AzureUrlPathMode.AUTO, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - - // known unified endpoint - forced into legacy - no trailing slash - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.openai.azure.com/openai/v1", - AzureUrlPathMode.LEGACY, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.openai.azure.com/openai/v1", - AzureUrlPathMode.UNIFIED, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.openai.azure.com/openai/v1", - AzureUrlPathMode.AUTO, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - - // known legacy endpoint - forced into unified - no trailing slash - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.services.ai.azure.com", - AzureUrlPathMode.LEGACY, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.services.ai.azure.com", - AzureUrlPathMode.UNIFIED, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.services.ai.azure.com", - AzureUrlPathMode.AUTO, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - - // known legacy endpoint - forced into unified - trailing slash - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.services.ai.azure.com/", - AzureUrlPathMode.LEGACY, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.services.ai.azure.com/", - AzureUrlPathMode.UNIFIED, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.services.ai.azure.com/", - AzureUrlPathMode.AUTO, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - - // known unified endpoint - forced into legacy - no trailing slash - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.services.ai.azure.com/openai/v1", - AzureUrlPathMode.LEGACY, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.services.ai.azure.com/openai/v1", - AzureUrlPathMode.UNIFIED, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.services.ai.azure.com/openai/v1", - AzureUrlPathMode.AUTO, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - - // known legacy endpoint - no trailing slash - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.azure-api.net", - AzureUrlPathMode.LEGACY, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.azure-api.net", - AzureUrlPathMode.UNIFIED, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.azure-api.net", - AzureUrlPathMode.AUTO, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - - // known legacy endpoint - trailing slash - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.azure-api.net/", - AzureUrlPathMode.LEGACY, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.azure-api.net/", - AzureUrlPathMode.UNIFIED, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.azure-api.net/", - AzureUrlPathMode.AUTO, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - - // known unified endpoint - no trailing slash - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.azure-api.net/openai/v1", - AzureUrlPathMode.LEGACY, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.azure-api.net/openai/v1", - AzureUrlPathMode.UNIFIED, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.azure-api.net/openai/v1", - AzureUrlPathMode.AUTO, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - - // known legacy endpoint - no trailing slash - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.cognitiveservices.azure.com", - AzureUrlPathMode.LEGACY, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.cognitiveservices.azure.com", - AzureUrlPathMode.UNIFIED, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.cognitiveservices.azure.com", - AzureUrlPathMode.AUTO, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - - // known unified endpoint - trailing slash - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.cognitiveservices.azure.com/", - AzureUrlPathMode.LEGACY, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.cognitiveservices.azure.com/", - AzureUrlPathMode.UNIFIED, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.cognitiveservices.azure.com/", - AzureUrlPathMode.AUTO, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - - // known unified endpoint - no trailing slash - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.cognitiveservices.azure.com/openai/v1", - AzureUrlPathMode.LEGACY, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.cognitiveservices.azure.com/openai/v1", - AzureUrlPathMode.UNIFIED, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://region.cognitiveservices.azure.com/openai/v1", - AzureUrlPathMode.AUTO, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - } - - @Test - fun categorizeBaseUrl_otherUrls() { - assertThat( - AzureUrlCategory.categorizeBaseUrl("https://example.com", AzureUrlPathMode.LEGACY) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl("https://example.com", AzureUrlPathMode.UNIFIED) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat(AzureUrlCategory.categorizeBaseUrl("https://example.com", AzureUrlPathMode.AUTO)) - .isEqualTo(AzureUrlCategory.NON_AZURE) - - assertThat( - AzureUrlCategory.categorizeBaseUrl("https://example.com/", AzureUrlPathMode.LEGACY) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl("https://example.com/", AzureUrlPathMode.UNIFIED) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat( - AzureUrlCategory.categorizeBaseUrl("https://example.com/", AzureUrlPathMode.AUTO) - ) - .isEqualTo(AzureUrlCategory.NON_AZURE) - - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://example.com/openai/v1", - AzureUrlPathMode.LEGACY, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_LEGACY) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://example.com/openai/v1", - AzureUrlPathMode.UNIFIED, - ) - ) - .isEqualTo(AzureUrlCategory.AZURE_UNIFIED) - assertThat( - AzureUrlCategory.categorizeBaseUrl( - "https://example.com/openai/v1", - AzureUrlPathMode.AUTO, - ) - ) - .isEqualTo(AzureUrlCategory.NON_AZURE) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/AutoPagerAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/AutoPagerAsyncTest.kt deleted file mode 100644 index e9e9137e6..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/AutoPagerAsyncTest.kt +++ /dev/null @@ -1,182 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core - -import com.openai.core.http.AsyncStreamResponse -import java.util.Optional -import java.util.concurrent.CompletableFuture -import java.util.concurrent.Executor -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.catchThrowable -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import org.mockito.junit.jupiter.MockitoExtension -import org.mockito.kotlin.any -import org.mockito.kotlin.clearInvocations -import org.mockito.kotlin.doAnswer -import org.mockito.kotlin.inOrder -import org.mockito.kotlin.mock -import org.mockito.kotlin.never -import org.mockito.kotlin.spy -import org.mockito.kotlin.times -import org.mockito.kotlin.verify -import org.mockito.kotlin.whenever - -@ExtendWith(MockitoExtension::class) -internal class AutoPagerAsyncTest { - - companion object { - - private val ERROR = RuntimeException("ERROR!") - } - - private class PageAsyncImpl( - private val items: List, - private val hasNext: Boolean = true, - ) : PageAsync { - - val nextPageFuture: CompletableFuture> = CompletableFuture() - - override fun hasNextPage(): Boolean = hasNext - - override fun nextPage(): CompletableFuture> = nextPageFuture - - override fun items(): List = items - } - - private val executor = - spy { - doAnswer { invocation -> invocation.getArgument(0).run() } - .whenever(it) - .execute(any()) - } - private val handler = mock>() - - @Test - fun subscribe_whenAlreadySubscribed_throws() { - val autoPagerAsync = AutoPagerAsync.from(PageAsyncImpl(emptyList()), executor) - autoPagerAsync.subscribe {} - clearInvocations(executor) - - val throwable = catchThrowable { autoPagerAsync.subscribe {} } - - assertThat(throwable).isInstanceOf(IllegalStateException::class.java) - assertThat(throwable).hasMessage("Cannot subscribe more than once") - verify(executor, never()).execute(any()) - } - - @Test - fun subscribe_whenClosed_throws() { - val autoPagerAsync = AutoPagerAsync.from(PageAsyncImpl(emptyList()), executor) - autoPagerAsync.close() - - val throwable = catchThrowable { autoPagerAsync.subscribe {} } - - assertThat(throwable).isInstanceOf(IllegalStateException::class.java) - assertThat(throwable).hasMessage("Cannot subscribe after the response is closed") - verify(executor, never()).execute(any()) - } - - @Test - fun subscribe_whenFirstPageNonEmpty_runsHandler() { - val page = PageAsyncImpl(listOf("item1", "item2", "item3"), hasNext = false) - val autoPagerAsync = AutoPagerAsync.from(page, executor) - - autoPagerAsync.subscribe(handler) - - inOrder(executor, handler) { - verify(executor, times(1)).execute(any()) - verify(handler, times(1)).onNext("item1") - verify(handler, times(1)).onNext("item2") - verify(handler, times(1)).onNext("item3") - verify(handler, times(1)).onComplete(Optional.empty()) - } - } - - @Test - fun subscribe_whenFutureCompletesAfterClose_doesNothing() { - val page = PageAsyncImpl(listOf("page1")) - val autoPagerAsync = AutoPagerAsync.from(page, executor) - autoPagerAsync.subscribe(handler) - autoPagerAsync.close() - - page.nextPageFuture.complete(PageAsyncImpl(listOf("page2"))) - - verify(handler, times(1)).onNext("page1") - verify(handler, never()).onNext("page2") - verify(handler, times(1)).onComplete(Optional.empty()) - verify(executor, times(1)).execute(any()) - } - - @Test - fun subscribe_whenFutureErrors_callsOnComplete() { - val page = PageAsyncImpl(emptyList()) - val autoPagerAsync = AutoPagerAsync.from(page, executor) - autoPagerAsync.subscribe(handler) - - page.nextPageFuture.completeExceptionally(ERROR) - - verify(executor, times(1)).execute(any()) - verify(handler, never()).onNext(any()) - verify(handler, times(1)).onComplete(Optional.of(ERROR)) - } - - @Test - fun subscribe_whenFutureCompletes_runsHandler() { - val page = PageAsyncImpl(listOf("chunk1", "chunk2")) - val autoPagerAsync = AutoPagerAsync.from(page, executor) - - autoPagerAsync.subscribe(handler) - - verify(handler, never()).onComplete(any()) - inOrder(executor, handler) { - verify(executor, times(1)).execute(any()) - verify(handler, times(1)).onNext("chunk1") - verify(handler, times(1)).onNext("chunk2") - } - clearInvocations(executor, handler) - - page.nextPageFuture.complete(PageAsyncImpl(listOf("chunk3", "chunk4"), hasNext = false)) - - verify(executor, never()).execute(any()) - inOrder(handler) { - verify(handler, times(1)).onNext("chunk3") - verify(handler, times(1)).onNext("chunk4") - verify(handler, times(1)).onComplete(Optional.empty()) - } - } - - @Test - fun onCompleteFuture_whenNextPageFutureNotCompleted_onCompleteFutureNotCompleted() { - val page = PageAsyncImpl(listOf("chunk1", "chunk2")) - val autoPagerAsync = AutoPagerAsync.from(page, executor) - autoPagerAsync.subscribe {} - - val onCompletableFuture = autoPagerAsync.onCompleteFuture() - - assertThat(onCompletableFuture).isNotCompleted - } - - @Test - fun onCompleteFuture_whenNextPageFutureErrors_onCompleteFutureCompletedExceptionally() { - val page = PageAsyncImpl(listOf("chunk1", "chunk2")) - val autoPagerAsync = AutoPagerAsync.from(page, executor) - autoPagerAsync.subscribe {} - page.nextPageFuture.completeExceptionally(ERROR) - - val onCompletableFuture = autoPagerAsync.onCompleteFuture() - - assertThat(onCompletableFuture).isCompletedExceptionally - } - - @Test - fun onCompleteFuture_whenNoNextPage_onCompleteFutureCompleted() { - val page = PageAsyncImpl(listOf("chunk1", "chunk2"), hasNext = false) - val autoPagerAsync = AutoPagerAsync.from(page, executor) - autoPagerAsync.subscribe {} - - val onCompletableFuture = autoPagerAsync.onCompleteFuture() - - assertThat(onCompletableFuture).isCompleted - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/AutoPagerTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/AutoPagerTest.kt deleted file mode 100644 index 17e586320..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/AutoPagerTest.kt +++ /dev/null @@ -1,41 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core - -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class AutoPagerTest { - - private class PageImpl( - private val items: List, - private val nextPage: Page? = null, - ) : Page { - - override fun hasNextPage(): Boolean = nextPage != null - - override fun nextPage(): Page = nextPage!! - - override fun items(): List = items - } - - @Test - fun iterator() { - val firstPage = - PageImpl(listOf("chunk1", "chunk2"), nextPage = PageImpl(listOf("chunk3", "chunk4"))) - - val autoPager = AutoPager.from(firstPage) - - assertThat(autoPager).containsExactly("chunk1", "chunk2", "chunk3", "chunk4") - } - - @Test - fun stream() { - val firstPage = - PageImpl(listOf("chunk1", "chunk2"), nextPage = PageImpl(listOf("chunk3", "chunk4"))) - - val autoPager = AutoPager.from(firstPage) - - assertThat(autoPager.stream()).containsExactly("chunk1", "chunk2", "chunk3", "chunk4") - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/ClientOptionsTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/ClientOptionsTest.kt deleted file mode 100644 index ace2f857f..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/ClientOptionsTest.kt +++ /dev/null @@ -1,388 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core - -import com.fasterxml.jackson.databind.json.JsonMapper -import com.openai.auth.SubjectTokenProvider -import com.openai.auth.SubjectTokenType -import com.openai.auth.WorkloadIdentity -import com.openai.azure.credential.AzureApiKeyCredential -import com.openai.core.http.HttpClient -import com.openai.core.http.HttpRequest -import com.openai.core.http.HttpRequestAuthenticator -import com.openai.credential.BearerTokenCredential -import com.openai.credential.WorkloadIdentityCredential -import java.util.concurrent.CompletableFuture -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import org.junit.jupiter.api.extension.ExtendWith -import org.mockito.junit.jupiter.MockitoExtension -import org.mockito.kotlin.mock -import org.mockito.kotlin.never -import org.mockito.kotlin.verify - -@ExtendWith(MockitoExtension::class) -internal class ClientOptionsTest { - - private val httpClient = mock() - - @Test - fun build_withApiKey_success() { - val clientOptions = - ClientOptions.builder().httpClient(httpClient).apiKey("My API Key").build() - - assertThat( - clientOptions - .securityHeaders(SecurityOptions.builder().bearerAuth(true).build()) - .values("Authorization") - ) - .containsExactly("Bearer My API Key") - } - - @Test - fun build_withAzureApiKeyCredential_success() { - val clientOptions = - ClientOptions.builder() - .httpClient(httpClient) - .credential(AzureApiKeyCredential.create("My Azure API Key")) - .build() - - assertThat( - clientOptions - .securityHeaders(SecurityOptions.builder().bearerAuth(true).build()) - .values("api-key") - ) - .containsExactly("My Azure API Key") - } - - @Test - fun build_withCredentialAfterApiKey_usesCredential() { - val clientOptions = - ClientOptions.builder() - .httpClient(httpClient) - .apiKey("Old API Key") - .credential(BearerTokenCredential.create("New API Key")) - .build() - - assertThat(clientOptions.apiKey()).isEmpty() - assertThat( - clientOptions - .securityHeaders(SecurityOptions.builder().bearerAuth(true).build()) - .values("Authorization") - ) - .containsExactly("Bearer New API Key") - } - - @Test - fun build_withApiKeyAndAdminApiKey_usesRouteSpecificAuth() { - val clientOptions = - ClientOptions.builder() - .httpClient(httpClient) - .apiKey("My API Key") - .adminApiKey("My Admin API Key") - .build() - - assertThat( - clientOptions - .securityHeaders(SecurityOptions.builder().bearerAuth(true).build()) - .values("Authorization") - ) - .containsExactly("Bearer My API Key") - assertThat( - clientOptions - .securityHeaders(SecurityOptions.builder().adminApiKeyAuth(true).build()) - .values("Authorization") - ) - .containsExactly("Bearer My Admin API Key") - } - - @Test - fun build_withAdminApiKeyOnly_success() { - val clientOptions = - ClientOptions.builder().httpClient(httpClient).adminApiKey("My Admin API Key").build() - - assertThat(clientOptions.apiKey()).isEmpty() - assertThat(clientOptions.adminApiKey()).contains("My Admin API Key") - assertThat( - clientOptions - .securityHeaders(SecurityOptions.builder().adminApiKeyAuth(true).build()) - .values("Authorization") - ) - .containsExactly("Bearer My Admin API Key") - } - - @Test - fun build_withAdminApiKeyOnly_bearerAuthThrows() { - val clientOptions = - ClientOptions.builder().httpClient(httpClient).adminApiKey("My Admin API Key").build() - - val thrown = - assertThrows { - clientOptions.securityHeaders(SecurityOptions.builder().bearerAuth(true).build()) - } - - assertThat(thrown.message).contains("requires apiKey or workloadIdentity") - } - - @Test - fun build_withoutCredentials_throws() { - val thrown = - assertThrows { - ClientOptions.builder().httpClient(httpClient).build() - } - - assertThat(thrown.message).contains("At least one credential source") - } - - @Test - fun build_withHttpRequestAuthenticator_satisfiesAuthenticationAndSurvivesCloning() { - val authenticator = - object : HttpRequestAuthenticator { - override fun authenticate(request: HttpRequest): HttpRequest = request - } - - val clientOptions = - ClientOptions.builder() - .httpClient(httpClient) - .httpRequestAuthenticator(authenticator) - .build() - .toBuilder() - .build() - - assertThat( - clientOptions.securityHeaders(SecurityOptions.builder().bearerAuth(true).build()) - ) - .isEqualTo(com.openai.core.http.Headers.builder().build()) - assertThat( - clientOptions.securityHeaders( - SecurityOptions.builder().adminApiKeyAuth(true).build() - ) - ) - .isEqualTo(com.openai.core.http.Headers.builder().build()) - } - - @Test - fun build_withHttpRequestAuthenticatorAndApiKey_throws() { - val authenticator = - object : HttpRequestAuthenticator { - override fun authenticate(request: HttpRequest): HttpRequest = request - } - - val thrown = - assertThrows { - ClientOptions.builder() - .httpClient(httpClient) - .httpRequestAuthenticator(authenticator) - .apiKey("test-api-key") - .build() - } - - assertThat(thrown.message).contains("Provider authentication cannot be combined") - } - - @Test - fun putHeader_canOverwriteDefaultHeader() { - val clientOptions = - ClientOptions.builder() - .httpClient(httpClient) - .putHeader("User-Agent", "My User Agent") - .apiKey("My API Key") - .adminApiKey("My Admin API Key") - .build() - - assertThat(clientOptions.headers.values("User-Agent")).containsExactly("My User Agent") - } - - @Test - fun toBuilder_organizationCanBeUpdated() { - var clientOptions = - ClientOptions.builder() - .httpClient(httpClient) - .organization("My Organization") - .apiKey("My API Key") - .adminApiKey("My Admin API Key") - .build() - - clientOptions = clientOptions.toBuilder().organization("another My Organization").build() - - assertThat(clientOptions.headers.values("OpenAI-Organization")) - .containsExactly("another My Organization") - } - - @Test - fun toBuilder_whenOriginalClientOptionsGarbageCollected_doesNotCloseOriginalClient() { - var clientOptions = - ClientOptions.builder() - .httpClient(httpClient) - .apiKey("My API Key") - .adminApiKey("My Admin API Key") - .build() - verify(httpClient, never()).close() - - // Overwrite the `clientOptions` variable so that the original `ClientOptions` is GC'd. - clientOptions = clientOptions.toBuilder().build() - System.gc() - Thread.sleep(100) - - verify(httpClient, never()).close() - // This exists so that `clientOptions` is still reachable. - assertThat(clientOptions).isEqualTo(clientOptions) - } - - @Test - fun toBuilder_whenOriginalClientOptionsGarbageCollected_doesNotCloseAuthenticator() { - val authenticator = mock() - var clientOptions = - ClientOptions.builder() - .httpClient(httpClient) - .httpRequestAuthenticator(authenticator) - .build() - verify(authenticator, never()).close() - - clientOptions = clientOptions.toBuilder().build() - System.gc() - Thread.sleep(100) - - verify(authenticator, never()).close() - // This exists so that `clientOptions` is still reachable. - assertThat(clientOptions).isEqualTo(clientOptions) - } - - @Test - fun build_withWorkloadIdentity_success() { - val provider = - object : SubjectTokenProvider { - override fun tokenType() = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String = - "test-token" - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = CompletableFuture.completedFuture("test-token") - } - - val workloadIdentity = - WorkloadIdentity.builder() - .identityProviderId("provider-id") - .serviceAccountId("service-account-id") - .provider(provider) - .build() - - val clientOptions = - ClientOptions.builder() - .httpClient(httpClient) - .workloadIdentity(workloadIdentity) - .build() - - assertThat(clientOptions.credential).isInstanceOf(WorkloadIdentityCredential::class.java) - } - - @Test - fun toBuilder_withWorkloadIdentity_success() { - val provider = - object : SubjectTokenProvider { - override fun tokenType() = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String = - "test-token" - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = CompletableFuture.completedFuture("test-token") - } - - val workloadIdentity = - WorkloadIdentity.builder() - .identityProviderId("provider-id") - .serviceAccountId("service-account-id") - .provider(provider) - .build() - - var clientOptions = - ClientOptions.builder() - .httpClient(httpClient) - .workloadIdentity(workloadIdentity) - .build() - - clientOptions = clientOptions.toBuilder().build() - - assertThat(clientOptions.credential).isInstanceOf(WorkloadIdentityCredential::class.java) - } - - @Test - fun toBuilder_workloadIdentityCanBeSwitchedToApiKey() { - val provider = - object : SubjectTokenProvider { - override fun tokenType() = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String = - "test-token" - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = CompletableFuture.completedFuture("test-token") - } - - val workloadIdentity = - WorkloadIdentity.builder() - .identityProviderId("provider-id") - .serviceAccountId("service-account-id") - .provider(provider) - .build() - - val original = - ClientOptions.builder() - .httpClient(httpClient) - .workloadIdentity(workloadIdentity) - .build() - - val updated = original.toBuilder().workloadIdentity(null).apiKey("new-api-key").build() - - assertThat(updated.credential).isNotInstanceOf(WorkloadIdentityCredential::class.java) - assertThat( - updated - .securityHeaders(SecurityOptions.builder().bearerAuth(true).build()) - .values("Authorization") - ) - .containsExactly("Bearer new-api-key") - } - - @Test - fun build_withBothCredentialAndWorkloadIdentity_throws() { - val provider = - object : SubjectTokenProvider { - override fun tokenType() = SubjectTokenType.JWT - - override fun getToken(httpClient: HttpClient, jsonMapper: JsonMapper): String = - "test-token" - - override fun getTokenAsync( - httpClient: HttpClient, - jsonMapper: JsonMapper, - ): CompletableFuture = CompletableFuture.completedFuture("test-token") - } - - val workloadIdentity = - WorkloadIdentity.builder() - .identityProviderId("provider-id") - .serviceAccountId("service-account-id") - .provider(provider) - .build() - - val thrown = - assertThrows { - ClientOptions.builder() - .httpClient(httpClient) - .apiKey("test-api-key") - .workloadIdentity(workloadIdentity) - .build() - } - - assertThat(thrown.message).contains("Cannot specify both") - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/JacksonVersionTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/JacksonVersionTest.kt deleted file mode 100644 index f21098860..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/JacksonVersionTest.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.openai.core - -import com.fasterxml.jackson.annotation.JacksonAnnotation -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class JacksonVersionTest { - - @Test - fun runtimeJacksonVersionsMatchExpectedVersion() { - val expectedVersion = checkNotNull(System.getProperty("expected.jackson.version")) - val runtimeVersions = - mapOf( - "jackson-annotations" to - JacksonAnnotation::class.java.`package`.implementationVersion, - "jackson-core" to com.fasterxml.jackson.core.json.PackageVersion.VERSION.toString(), - "jackson-databind" to - com.fasterxml.jackson.databind.cfg.PackageVersion.VERSION.toString(), - "jackson-datatype-jdk8" to - com.fasterxml.jackson.datatype.jdk8.PackageVersion.VERSION.toString(), - "jackson-datatype-jsr310" to - com.fasterxml.jackson.datatype.jsr310.PackageVersion.VERSION.toString(), - "jackson-module-kotlin" to - com.fasterxml.jackson.module.kotlin.PackageVersion.VERSION.toString(), - ) - - runtimeVersions.forEach { (module, runtimeVersion) -> - assertThat(runtimeVersion) - .describedAs("%s runtime version", module) - .isEqualTo(expectedVersion) - } - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/ObjectMappersTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/ObjectMappersTest.kt deleted file mode 100644 index 260b499a1..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/ObjectMappersTest.kt +++ /dev/null @@ -1,117 +0,0 @@ -package com.openai.core - -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.databind.exc.MismatchedInputException -import com.fasterxml.jackson.module.kotlin.readValue -import java.time.LocalDate -import java.time.LocalTime -import java.time.OffsetDateTime -import java.time.ZoneOffset -import kotlin.reflect.KClass -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.catchThrowable -import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.EnumSource -import org.junitpioneer.jupiter.cartesian.CartesianTest - -internal class ObjectMappersTest { - - internal class ClassWithBooleanFieldPrefixedWithIs(private val isActive: JsonField) { - - @JsonProperty("is_active") @ExcludeMissing fun _isActive() = isActive - } - - @Test - fun write_whenFieldPrefixedWithIs_keepsPrefix() { - val value = ClassWithBooleanFieldPrefixedWithIs(JsonField.of(true)) - - val json = jsonMapper().writeValueAsString(value) - - assertThat(json).isEqualTo("{\"is_active\":true}") - } - - internal class Class(@get:JsonProperty("field") @JsonProperty("field") val field: String) - - enum class ShapeTestCase(val value: Any, val kClass: KClass<*>) { - STRING("Hello World!", String::class), - BOOLEAN(true, Boolean::class), - FLOAT(3.14F, Float::class), - DOUBLE(3.14, Double::class), - INTEGER(42, Int::class), - LONG(42L, Long::class), - MAP(mapOf("property" to "value"), Map::class), - CLASS(Class("Hello World!"), Class::class), - LIST(listOf(1, 2, 3), List::class); - - companion object { - val VALID_CONVERSIONS = - listOf( - FLOAT to DOUBLE, - DOUBLE to FLOAT, - INTEGER to FLOAT, - INTEGER to DOUBLE, - INTEGER to LONG, - LONG to FLOAT, - LONG to DOUBLE, - LONG to INTEGER, - CLASS to MAP, - ) - } - } - - @CartesianTest - fun read(@CartesianTest.Enum shape1: ShapeTestCase, @CartesianTest.Enum shape2: ShapeTestCase) { - val jsonMapper = jsonMapper() - val json = jsonMapper.writeValueAsString(shape1.value) - - val e = catchThrowable { jsonMapper.readValue(json, shape2.kClass.java) } - - if (shape1 == shape2 || shape1 to shape2 in ShapeTestCase.VALID_CONVERSIONS) { - assertThat(e).isNull() - } else { - assertThat(e).isInstanceOf(MismatchedInputException::class.java) - } - } - - enum class LenientOffsetDateTimeTestCase( - val string: String, - val expectedOffsetDateTime: OffsetDateTime, - ) { - DATE( - "1998-04-21", - expectedOffsetDateTime = - OffsetDateTime.of(LocalDate.of(1998, 4, 21), LocalTime.of(0, 0), ZoneOffset.UTC), - ), - DATE_TIME( - "1998-04-21T04:00:00", - expectedOffsetDateTime = - OffsetDateTime.of(LocalDate.of(1998, 4, 21), LocalTime.of(4, 0), ZoneOffset.UTC), - ), - ZONED_DATE_TIME_1( - "1998-04-21T04:00:00+03:00", - expectedOffsetDateTime = - OffsetDateTime.of( - LocalDate.of(1998, 4, 21), - LocalTime.of(4, 0), - ZoneOffset.ofHours(3), - ), - ), - ZONED_DATE_TIME_2( - "1998-04-21T04:00:00Z", - expectedOffsetDateTime = - OffsetDateTime.of(LocalDate.of(1998, 4, 21), LocalTime.of(4, 0), ZoneOffset.UTC), - ), - } - - @ParameterizedTest - @EnumSource - fun readOffsetDateTime_lenient(testCase: LenientOffsetDateTimeTestCase) { - val jsonMapper = jsonMapper() - val json = jsonMapper.writeValueAsString(testCase.string) - - val offsetDateTime = jsonMapper().readValue(json) - - assertThat(offsetDateTime).isEqualTo(testCase.expectedOffsetDateTime) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/PhantomReachableTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/PhantomReachableTest.kt deleted file mode 100644 index 7ca627384..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/PhantomReachableTest.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.openai.core - -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class PhantomReachableTest { - - @Test - fun closeWhenPhantomReachable_whenObservedIsGarbageCollected_closesCloseable() { - var closed = false - val closeable = AutoCloseable { closed = true } - - closeWhenPhantomReachable( - // Pass an inline object for the object to observe so that it becomes immediately - // unreachable. - Any(), - closeable, - ) - - assertThat(closed).isFalse() - - System.gc() - Thread.sleep(100) - - assertThat(closed).isTrue() - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/PrepareRequestTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/PrepareRequestTest.kt deleted file mode 100644 index fa7d9ff62..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/PrepareRequestTest.kt +++ /dev/null @@ -1,109 +0,0 @@ -package com.openai.core - -import com.openai.core.http.Headers -import com.openai.core.http.QueryParams -import com.openai.models.chat.completions.ChatCompletionListParams -import com.openai.models.embeddings.EmbeddingCreateParams -import com.openai.models.embeddings.EmbeddingModel -import com.openai.models.uploads.UploadCancelParams -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.assertThatNoException -import org.junit.jupiter.api.Test - -internal class PrepareRequestTest { - @Test - fun noModelFunction() { - val params = UploadCancelParams.builder().uploadId("my-upload-id").build() - - assertThat(params.modelNameOrNull()).isNull() - } - - @Test - fun modelLiteralNotNull() { - val params = - EmbeddingCreateParams.builder().model("my-model").input("Hello, world!").build() - - assertThat(params.modelNameOrNull()).isNotNull() - assertThat(params.modelNameOrNull()).isEqualTo("my-model") - } - - @Test - fun modelEnumNotNull() { - val params = - EmbeddingCreateParams.builder() - .model(EmbeddingModel.TEXT_EMBEDDING_3_LARGE) - .input("Hello, world!") - .build() - - assertThat(params.modelNameOrNull()).isNotNull() - assertThat(params.modelNameOrNull()).isEqualTo("text-embedding-3-large") - } - - @Test - fun modelNull() { - // There are no instances where a `Params.model()` returns a nullable value. If a model can - // be `null`, it is always returned in a non-nullable `Optional`. - } - - @Test - fun modelOptionalNotNull() { - val params = ChatCompletionListParams.builder().model("my-model-id").build() - - assertThat(params.modelNameOrNull()).isNotNull() - assertThat(params.modelNameOrNull()).isEqualTo("my-model-id") - } - - @Test - fun modelOptionalNull() { - // Test the same type of `Params` with and without `null`, to ensure `model()` is being - // detected, but its `null` value is correctly returned when set. (Rather than `model()` - // not being detected, which would also return `null`.) - val params1 = ChatCompletionListParams.builder().model("my-model-id").build() - val params2 = ChatCompletionListParams.builder().model(null).build() - - assertThat(params1.modelNameOrNull()).isNotNull() - assertThat(params1.modelNameOrNull()).isEqualTo("my-model-id") - - assertThat(params2.modelNameOrNull()).isNull() - } - - @Test - fun modelCannotBeCalledIfPrivate() { - class X : Params { - private fun model(): String = "my-model-id" - - override fun _headers(): Headers { - throw RuntimeException() - } - - override fun _queryParams(): QueryParams { - throw RuntimeException() - } - } - - val params = X() - - assertThatNoException().isThrownBy { params.modelNameOrNull() } - assertThat(params.modelNameOrNull()).isNull() - } - - @Test - fun modelCannotBeCalledIfHasParameters() { - class X : Params { - private fun model(s: String): String = "my-model-id" - - override fun _headers(): Headers { - throw RuntimeException() - } - - override fun _queryParams(): QueryParams { - throw RuntimeException() - } - } - - val params = X() - - assertThatNoException().isThrownBy { params.modelNameOrNull() } - assertThat(params.modelNameOrNull()).isNull() - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/StructuredOutputsTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/StructuredOutputsTest.kt deleted file mode 100644 index 218407e43..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/StructuredOutputsTest.kt +++ /dev/null @@ -1,2154 +0,0 @@ -package com.openai.core - -import com.fasterxml.jackson.annotation.JsonClassDescription -import com.fasterxml.jackson.annotation.JsonIgnore -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.annotation.JsonPropertyDescription -import com.fasterxml.jackson.annotation.JsonTypeName -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.databind.node.ObjectNode -import com.openai.errors.OpenAIInvalidDataException -import io.swagger.v3.oas.annotations.media.ArraySchema -import io.swagger.v3.oas.annotations.media.Schema -import java.util.Optional -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.assertThatNoException -import org.assertj.core.api.Assertions.assertThatThrownBy -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.AfterTestExecutionCallback -import org.junit.jupiter.api.extension.RegisterExtension - -/** Tests for the `StructuredOutputs` functions and the [JsonSchemaValidator]. */ -internal class StructuredOutputsTest { - companion object { - private const val SCHEMA = "\$schema" - private const val SCHEMA_VER = "https://json-schema.org/draft/2020-12/schema" - private const val DEFS = "\$defs" - private const val REF = "\$ref" - - /** - * `true` to print the schema and validation errors for all executed tests, or `false` to - * print them only for failed tests. - */ - private const val VERBOSE_MODE = false - - private fun parseJson(schemaString: String) = ObjectMapper().readTree(schemaString) - } - - /** - * A validator that can be used by each unit test. A new validation instance is created for each - * test, as each test is run from its own instance of the test class. If a test fails, any - * validation errors are automatically printed to standard output to aid diagnosis. - */ - val validator = JsonSchemaValidator.create() - - /** - * The schema that was created by the unit test. This may be printed out after a test fails to - * aid in diagnosing the cause of the failure. In that case, this property must be set, or an - * error will occur. However, it will only be printed if the failed test method has the name - * prefix `schemaTest_`, so only test methods with that naming pattern need to set this field. - */ - lateinit var schema: JsonNode - - /** - * An extension to JUnit that prints the [schema] and the validation status (including any - * errors) when a test fails. This applies only to test methods whose names are prefixed with - * `schemaTest_`. An error will occur if [schema] was not set, but this can be avoided by only - * using the method name prefix for test methods that set [schema]. This reporting is intended - * as an aid to diagnosing test failures. - */ - @Suppress("unused") - @RegisterExtension - val printValidationErrorsOnFailure: AfterTestExecutionCallback = - AfterTestExecutionCallback { context -> - if ( - context.displayName.startsWith("schemaTest_") && - (VERBOSE_MODE || context.executionException.isPresent) - ) { - // Test failed. - println("Schema: ${schema.toPrettyString()}\n") - println("$validator\n") - } - } - - // NOTE: In most of these tests, it is assumed that the schema is generated as expected; it is - // not examined in fine detail if the validator succeeds or fails with the expected errors. - - @Test - fun schemaTest_minimalSchema() { - class X() - - schema = extractSchema(X::class.java) - validator.validate(schema) - - // Expect a failure. If a class has no properties, then the schema is meaningless to the - // AI. It can only reply with values to _named_ properties, so there must be at least one. - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .startsWith("#: 'properties' field is missing, empty or not an object.") - } - - @Test - fun schemaTest_mapHasNoNamedProperties() { - @Suppress("unused") class X(val m: Map) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - // A map results in a schema that declares an "object" sub-schema, but that sub-schema has - // no named `"properties"` and no `"required"` array. Only the first problem is reported. - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .startsWith("#/properties/m: 'properties' field is missing, empty or not an object.") - - // Do this check of `toString()` once for a validation failure, but do not repeat it in - // other tests. - assertThat(validator.toString()) - .startsWith( - "JsonSchemaValidator{isValidationComplete=true, totalStringLength=1, " + - "totalObjectProperties=1, totalEnumValues=0, errors=[" + - "#/properties/m: 'properties' field is missing, empty or not an object." - ) - } - - @Test - fun schemaTest_minimalListSchema() { - val s: List = listOf() - - schema = extractSchema(s.javaClass) - validator.validate(schema) - - // Currently, the generated schema looks like this: - // - // { - // "$schema" : "https://json-schema.org/draft/2020-12/schema", - // "type" : "array", - // "items" : { } - // } - // - // That causes an error, as the `"items"` object is empty when it should be a valid - // sub-schema. Something like this is what would be valid: - // - // { - // "$schema" : "https://json-schema.org/draft/2020-12/schema", - // "type" : "array", - // "items" : { - // "type" : "string" - // } - // } - // - // The reason for the failure is that generic type information is erased for scopes like - // local variables, but generic type information for fields is retained as part of the class - // metadata. This is the expected behavior in Java, so this test expects an invalid schema. - // - // The `extractSchema` function could be defined to accept type parameters and these could - // be passed to the schema generator (which accepts them) and the above would work. However, - // there would be no simple way to deserialize the JSON response back to a parameterized - // type like `List` without again providing the type parameters. - assertThat(validator.isValid()).isFalse - assertThat(validator.errors()).hasSize(2) - assertThat(validator.errors()[0]).isEqualTo("#/items: Schema or sub-schema is empty.") - assertThat(validator.errors()[1]) - .isEqualTo("#/items: Expected exactly one of 'type' or 'anyOf' or '$REF'.") - } - - @Test - fun schemaTest_listFieldSchema() { - @Suppress("unused") class X(val s: List) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - // This gives a root schema with `"type" : "string"` and `"const" : "HELLO"` - // Unfortunately, an "enum class" cannot be defined within a function or within a class within - // a function. - @Suppress("unused") - enum class MinimalEnum1 { - HELLO - } - - @Test - fun schemaTest_minimalEnumSchema1() { - schema = extractSchema(MinimalEnum1::class.java) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - // This gives a root schema with `"type" : "string"` and `"enum" : [ "HELLO", "WORLD" ]` - @Suppress("unused") - enum class MinimalEnum2 { - HELLO, - WORLD, - } - - @Test - fun schemaTest_minimalEnumSchema2() { - schema = extractSchema(MinimalEnum2::class.java) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - - // Do this check of `toString()` once for a validation success, but do not repeat it in - // other tests. - assertThat(validator.toString()) - .isEqualTo( - "JsonSchemaValidator{isValidationComplete=true, totalStringLength=10, " + - "totalObjectProperties=0, totalEnumValues=2, errors=[]}" - ) - } - - @Test - fun schemaTest_nonStringEnum() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "integer", - "enum" : [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_tinySchema() { - @Suppress("unused") class X(val s: String) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_tinySchemaFromOptionalString() { - // Using an `Optional` will result in this JSON: `"type" : [ "string", "null" ]`. - // That is supported by the OpenAI Structured Outputs API spec, as long as the field is also - // marked as required. Though required, it is still allowed for the field to be explicitly - // set to `"null"`. - @Suppress("unused") class X(val s: Optional) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_tinySchemaFromOptionalBoolean() { - @Suppress("unused") class X(val b: Optional) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_tinySchemaFromOptionalInteger() { - @Suppress("unused") class X(val i: Optional) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_tinySchemaFromOptionalNumber() { - @Suppress("unused") class X(val n: Optional) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_arraySchemaFromOptional() { - @Suppress("unused") class X(val s: Optional>) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_arrayTypeMissingItems() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "array" - } - """ - ) - validator.validate(schema) - - // Check once here that "validator.isValid()" returns "false" when there is an error. In - // the other tests, there is no need to repeat this assertion, as it would be redundant. - assertThat(validator.isValid()).isFalse - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#: 'items' field is missing or is not an object.") - } - - @Test - fun schemaTest_arrayTypeWithWrongItemsType() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "array", - "items" : [ "should_not_be_an_array" ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#: 'items' field is missing or is not an object.") - } - - @Test - @Suppress("unused") - fun schemaTest_objectSubSchemaFromOptional() { - class X(val s: Optional) - class Y(val x: Optional) - - schema = extractSchema(Y::class.java) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_badOptionalTypeNotArray() { - // Testing more for code coverage than for anything expected to go wrong in practice. - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : { "type" : "string" } - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#: 'type' field is not a type name or array of type names.") - } - - @Test - fun schemaTest_badOptionalTypeNoNull1() { - // Testing more for code coverage than for anything expected to go wrong in practice. - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : [ "string" ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#/type: Expected exactly two types, both strings.") - } - - @Test - fun schemaTest_badOptionalTypeNoNull2() { - // If "type" is an array, one of the two "type" values must be "null". - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : [ "string", "number" ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#/type: Expected one type name and one \"null\".") - } - - @Test - fun schemaTest_badOptionalTypeNoNull3() { - // If "type" is an array, there must be two type values only, one of them "null". - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : [ "string", "number", "null" ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#/type: Expected exactly two types, both strings.") - } - - @Test - fun schemaTest_badOptionalTypeNoStringTypeNames() { - // If "type" is an array, there must be two type values only, one of them "null". - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : [ "string", null ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#/type: Expected exactly two types, both strings.") - } - - @Test - fun schemaTest_badOptionalTypeAllNull() { - // If "type" is an array, there must be two type values only, and only one of them "null". - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : [ "null", "null" ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#/type: Expected one type name and one \"null\".") - } - - @Test - fun schemaTest_badOptionalTypeUnknown() { - // If "type" is an array, there must be two type values only, and only one of them "null". - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : [ "unknown", "null" ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]).isEqualTo("#/type: Unsupported 'type' value: 'unknown'.") - } - - @Test - fun schemaTest_goodOptionalTypeNullFirst() { - // The validator should be lenient about the order of the null/not-null types in the array. - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : [ "null", "string" ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_tinyRecursiveSchema() { - @Suppress("unused") class X(val s: String, val x: X?) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_unsupportedKeywords() { - // OpenAI lists a set of keywords that are allowed (for non "fine-tuned" models). Check that - // a selection of keywords that are not listed as supported are identified as not allowed. - // Check at the root schema and a sub-schema. There is no need to match the keywords to - // their expected schema types or be concerned about the values of the keyword fields, which - // makes testing easier. Supported keywords are tested elsewhere (mostly when applied via - // annotations). - val keywordsNotAllowed = - listOf( - "minLength", - "maxLength", - "patternProperties", - "unevaluatedProperties", - "propertyNames", - "minProperties", - "maxProperties", - "unevaluatedItems", - "contains", - "minContains", - "maxContains", - "uniqueItems", - ) - val notAllowedUses = keywordsNotAllowed.joinToString(", ") { "\"$it\" : \"\"" } - - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { - "x" : { - "type" : "string", - $notAllowedUses - } - }, - $notAllowedUses, - "additionalProperties" : false, - "required" : [ "x" ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(keywordsNotAllowed.size * 2) - keywordsNotAllowed.forEachIndexed { index, keyword -> - assertThat(validator.errors()[index]) - .isEqualTo("#: Use of '$keyword' is not supported here.") - assertThat(validator.errors()[index + keywordsNotAllowed.size]) - .isEqualTo("#/properties/x: Use of '$keyword' is not supported here.") - } - } - - @Test - fun schemaTest_propertyNotMarkedRequired() { - // Use two properties, so the `"required"` array is not empty, but is still not listing - // _all_ of the properties. - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { - "name" : { "type" : "string" }, - "address" : { "type" : "string" } - }, - "additionalProperties" : false, - "required" : [ "name" ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#/required: 'properties' field 'address' is not listed as 'required'.") - } - - @Test - fun schemaTest_requiredArrayEmpty() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { "name" : { "type" : "string" } }, - "additionalProperties" : false, - "required" : [ ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#: 'required' field is missing, empty or not an array.") - } - - @Test - fun schemaTest_requiredArrayNull() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { "name" : { "type" : "string" } }, - "additionalProperties" : false, - "required" : null - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#: 'required' field is missing, empty or not an array.") - } - - @Test - fun schemaTest_requiredArrayMissing() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { "name" : { "type" : "string" } }, - "additionalProperties" : false - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#: 'required' field is missing, empty or not an array.") - } - - @Test - fun schemaTest_additionalPropertiesMissing() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { "name" : { "type" : "string" } }, - "required" : [ "name" ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#: 'additionalProperties' field is missing or is not set to 'false'.") - } - - @Test - fun schemaTest_additionalPropertiesTrue() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { "name" : { "type" : "string" } }, - "additionalProperties" : true, - "required" : [ "name" ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#: 'additionalProperties' field is missing or is not set to 'false'.") - } - - @Test - fun schemaTest_objectPropertiesMissing() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "additionalProperties" : false, - "required" : [ ] - } - """ - ) - validator.validate(schema) - - // An object must explicitly declare some properties, as no `"additionalProperties"` will - // be allowed and the AI model will have nothing it can populate. - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .startsWith("#: 'properties' field is missing, empty or not an object.") - } - - @Test - fun schemaTest_objectPropertiesNotObject() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : [ "name", "age" ], - "additionalProperties" : false, - "required" : [ "name", "age" ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .startsWith("#: 'properties' field is missing, empty or not an object.") - } - - @Test - fun schemaTest_objectPropertiesEmpty() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { }, - "additionalProperties" : false, - "required" : [ ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .startsWith("#: 'properties' field is missing, empty or not an object.") - } - - @Test - fun schemaTest_anyOfInRootSchema() { - // OpenAI does not allow `"anyOf"` to appear at the root level of a schema. - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "anyOf" : [ { - "type" : "object", - "properties" : { "name" : { "type" : "string" } }, - "additionalProperties" : false, - "required" : ["name"] - }, { - "type" : "array", - "items" : { - "type" : "object", - "properties" : { "name" : { "type" : "string" } }, - "additionalProperties" : false, - "required" : ["name"] - } - } ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]).isEqualTo("#: Root schema contains 'anyOf' field.") - } - - @Test - fun schemaTest_anyOfNotArray() { - // Unlikely that this can occur in a generated schema, so this is more about code coverage. - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { - "name" : { - "anyOf" : { - "type" : "string" - } - } - }, - "additionalProperties" : false, - "required" : ["name"] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#/properties/name: 'anyOf' field is not a non-empty array.") - } - - @Test - fun schemaTest_anyOfIsEmptyArray() { - // Unlikely that this can occur in a generated schema, so this is more about code coverage. - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { - "name" : { - "anyOf" : [ ] - } - }, - "additionalProperties" : false, - "required" : ["name"] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#/properties/name: 'anyOf' field is not a non-empty array.") - } - - @Test - fun schemaTest_anyOfInSubSchemaArray() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { - "value" : { - "anyOf" : [ - { "type" : "string" }, - { "type" : "number" } - ] - } - }, - "additionalProperties" : false, - "required" : ["value"] - } - """ - ) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_noSchemaFieldRootSchema() { - @Suppress("unused") class X(val s: String) - - schema = extractSchema(X::class.java) - (schema as ObjectNode).remove(SCHEMA) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]).isEqualTo("#: Root schema missing '$SCHEMA' field.") - } - - @Test - @Suppress("unused") - fun schemaTest_deepNestingAtLimit() { - class U(val s: String) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - - schema = extractSchema(Y::class.java) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - @Suppress("unused") - fun schemaTest_deepNestingBeyondLimit() { - class A(val s: String) - class Q(val u: A) - class R(val u: Q) - class S(val u: R) - class T(val u: S) - class U(val u: T) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - class Z(val y: Y) - - schema = extractSchema(Z::class.java) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .contains("Current nesting depth is 11, but maximum is 10.") - } - - @Test - fun schemaTest_stringEnum250ValueOverSizeLimit() { - // OpenAI specification: "For a single enum property with string values, the total string - // length of all enum values cannot exceed 7,500 characters when there are more than 250 - // enum values." - - // This test creates an enum with exactly 250 string values with more than 7,500 characters - // in total (31 characters per value for a total of 7,750 characters). No error is expected. - val values = (1..250).joinToString(", ") { "\"%s%03d\"".format("x".repeat(28), it) } - - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "string", - "enum" : [ $values ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_stringEnum251ValueUnderSizeLimit() { - // This test creates an enum with exactly 251 string values with fewer than 7,500 characters - // in total (29 characters per value for a total of 7,279 characters). No error is expected. - val values = (1..251).joinToString(", ") { "\"%s%03d\"".format("x".repeat(26), it) } - - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "string", - "enum" : [ $values ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_stringEnum251ValueOverSizeLimit() { - // This test creates an enum with exactly 251 string values with fewer than 7,500 characters - // in total (30 characters per value for a total of 7,530 characters). An error is expected. - val values = (1..251).joinToString(", ") { "\"%s%03d\"".format("x".repeat(27), it) } - - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "string", - "enum" : [ $values ] - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo( - "#/enum: Total string length (7530) of values of an enum " + - "with 251 values exceeds limit of 7500." - ) - } - - @Test - fun schemaTest_totalEnumValuesAtLimit() { - // OpenAI specification: "A schema may have up to 500 enum values across all enum - // properties." - - // This test creates two enums with a total of 500 values. The total string length of the - // values is well within the limits (2,000 characters). - val valuesA = (1..250).joinToString(", ") { "\"a%03d\"".format(it) } - val valuesB = (1..250).joinToString(", ") { "\"b%03d\"".format(it) } - - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { - "a" : { - "type" : "string", - "enum" : [ $valuesA ] - }, - "b" : { - "type" : "string", - "enum" : [ $valuesB ] - } - }, - "required" : [ "a", "b" ], - "additionalProperties" : false - } - """ - ) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_totalEnumValuesOverLimit() { - // This test creates two enums with a total of 501 values. The total string length of the - // values is well within the limits (2,004 characters). - val valuesA = (1..250).joinToString(", ") { "\"a%03d\"".format(it) } - val valuesB = (1..251).joinToString(", ") { "\"b%03d\"".format(it) } - - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { - "a" : { - "type" : "string", - "enum" : [ $valuesA ] - }, - "b" : { - "type" : "string", - "enum" : [ $valuesB ] - } - }, - "required" : [ "a", "b" ], - "additionalProperties" : false - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#: Total number of enum values (501) exceeds limit of 500.") - } - - @Test - fun schemaTest_maxObjectPropertiesAtLimit() { - // This test creates two object schemas with a total of 100 object properties. OpenAI does - // not support more than 100 properties total in the whole schema. Two objects are used to - // ensure that counting is not done per object, but across all objects. Note that each - // object schema is itself a property, so there are two properties at the top level and 49 - // properties each at the next level. No error is expected, as the limit is not exceeded. - val propUses = - (1..49).joinToString(", ") { "\"x%02d\" : { \"type\" : \"string\" }".format(it) } - val propNames = (1..49).joinToString(", ") { "\"x%02d\"".format(it) } - - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { - "a" : { - "type" : "object", - "properties" : { - $propUses - }, - "required" : [ $propNames ], - "additionalProperties" : false - }, - "b" : { - "type" : "object", - "properties" : { - $propUses - }, - "required" : [ $propNames ], - "additionalProperties" : false - } - }, - "required" : [ "a", "b" ], - "additionalProperties" : false - } - """ - ) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_maxObjectPropertiesOverLimit() { - // This test creates two object schemas with a total of 101 object properties. OpenAI does - // not support more than 100 properties total in the whole schema. Expect an error. - val propUses = - (1..49).joinToString(", ") { "\"x_%02d\" : { \"type\" : \"string\" }".format(it) } - val propNames = (1..49).joinToString(", ") { "\"x_%02d\"".format(it) } - - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "type" : "object", - "properties" : { - "a" : { - "type" : "object", - "properties" : { - $propUses - }, - "required" : [ $propNames ], - "additionalProperties" : false - }, - "b" : { - "type" : "object", - "properties" : { - $propUses, - "property_101" : { "type" : "string" } - }, - "required" : [ $propNames, "property_101" ], - "additionalProperties" : false - } - }, - "required" : [ "a", "b" ], - "additionalProperties" : false - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#: Total number of object properties (101) exceeds limit of 100.") - } - - @Test - fun schemaTest_maxStringLengthAtLimit() { - // OpenAI specification: "In a schema, total string length of all property names, definition - // names, enum values, and const values cannot exceed 15,000 characters." - // - // This test creates a schema with many property names, definition names, enum values, and - // const values calculated to have a total string length of 15,000 characters. No error is - // expected. - // - // The test creates a schema that looks like the following, with the numbers adjusted to - // achieve a total of 15,000 characters for the relevant elements. - // - // { - // "$schema" : "...", - // "$defs" : { - // "d_001" : { - // "type" : "string", - // "const" : "c_001" - // }, - // ..., - // "d_nnn" : { - // "type" : "string", - // "const" : "c_nnn" - // } - // }, - // "type" : "object", - // "properties" : { - // "p_001" : { - // "type" : "string", - // "enum" : [ "eeeee..._001", ..., "eeeee..._nnn" ] - // }, - // ..., - // "p_nnn" : { - // "type" : "string", - // "enum" : [ "eeeee..._001", ..., "eeeee..._nnn" ] - // } - // }, - // "required" : [ "p_001", ..., "p_nnn" ], - // "additionalProperties" : false - // } - - val numDefs = 65 // Each also has one "const" value. - val numProps = 70 // Each also has "numEnumValues" enum values. - val nameLen = 5 // Length of names of definitions, properties and const values. - val numEnumValues = 5 // numProps * numEnumValues <= 500 limit (OpenAI) - val enumValueLen = 40 // Length of enum values. - val expectedTotalStringLength = - nameLen * (numProps + numDefs * 2) + numProps * enumValueLen * numEnumValues - - val enumValues = - (1..numEnumValues).joinToString(", ") { "\"%s_%03d\"".format("e".repeat(36), it) } - val defs = - (1..numDefs).joinToString(", ") { - "\"d_%03d\" : { \"type\" : \"string\", \"const\" : \"c_%03d\" }".format(it, it) - } - val props = - (1..numProps).joinToString(", ") { - "\"p_%03d\" : { \"type\" : \"string\", \"enum\" : [ $enumValues ] }".format(it) - } - val propNames = (1..numProps).joinToString(", ") { "\"p_%03d\"".format(it) } - - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "$DEFS" : { $defs }, - "type" : "object", - "properties" : { $props }, - "required" : [ $propNames ], - "additionalProperties" : false - } - """ - ) - validator.validate(schema) - - assertThat(expectedTotalStringLength).isEqualTo(15_000) // Exactly on the limit. - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_maxStringLengthOverLimit() { - // OpenAI specification: "In a schema, total string length of all property names, definition - // names, enum values, and const values cannot exceed 15,000 characters." - // - // This test creates a schema with many property names, definition names, enum values, and - // const values calculated to have a total string length of just over 15,000 characters. An - // error is expected. - - val numDefs = 66 // Each also has one "const" value. - val numProps = 70 // Each also has "numEnumValues" enum values. - val numEnumValues = 5 // numProps * numEnumValues <= 500 limit (OpenAI) - val nameLen = 5 // Length of names of definitions, properties and const values. - val enumValueLen = 40 // Length of enum values. - val expectedTotalStringLength = - nameLen * (numProps + numDefs * 2) + numProps * enumValueLen * numEnumValues - - val enumValues = - (1..numEnumValues).joinToString(", ") { "\"%s_%03d\"".format("e".repeat(36), it) } - val defs = - (1..numDefs).joinToString(", ") { - "\"d_%03d\" : { \"type\" : \"string\", \"const\" : \"c_%03d\" }".format(it, it) - } - val props = - (1..numProps).joinToString(", ") { - "\"p_%03d\" : { \"type\" : \"string\", \"enum\" : [ $enumValues ] }".format(it) - } - val propNames = (1..numProps).joinToString(", ") { "\"p_%03d\"".format(it) } - - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "$DEFS" : { $defs }, - "type" : "object", - "properties" : { $props }, - "required" : [ $propNames ], - "additionalProperties" : false - } - """ - ) - validator.validate(schema) - - assertThat(expectedTotalStringLength).isGreaterThan(15_000) - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#: Total string length of all values (15010) exceeds limit of 15000.") - } - - @Test - fun schemaTest_annotatedWithJsonClassDescription() { - // Add a "description" to the root schema using an annotation. - @Suppress("unused") @JsonClassDescription("A simple schema.") class X(val s: String) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - // Assume that the schema is well-formed. - val desc = schema.get("description") - - assertThat(validator.isValid()).isTrue - assertThat(desc).isNotNull - assertThat(desc.isTextual).isTrue - assertThat(desc.asText()).isEqualTo("A simple schema.") - } - - @Test - fun schemaTest_annotatedWithJsonPropertyDescription() { - // Add a "description" to the property using an annotation. - @Suppress("unused") class X(@get:JsonPropertyDescription("A string value.") val s: String) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - // Assume that the schema is well-formed. - val properties = schema.get("properties") - val stringProperty = properties.get("s") - val desc = stringProperty.get("description") - - assertThat(validator.isValid()).isTrue - assertThat(desc).isNotNull - assertThat(desc.isTextual).isTrue - assertThat(desc.asText()).isEqualTo("A string value.") - } - - @Test - fun schemaTest_annotatedWithJsonProperty() { - // Override the default name of the property using the annotation. - @Suppress("unused") class X(@get:JsonProperty("a_string") val s: String) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - // Assume that the schema is well-formed. - val properties = schema.get("properties") - val stringProperty = properties.get("a_string") - - assertThat(validator.isValid()).isTrue - assertThat(stringProperty).isNotNull - } - - @Test - fun schemaTest_annotatedWithJsonPropertyRejectDefaultValue() { - // Set a default value for the property. It should be ignored when the schema is generated, - // as default property values are not supported in OpenAI JSON schemas. (The Victools docs - // have examples of how to add support for this default values via annotations or initial - // values, should support for default values be needed in the future.) - // - // Lack of support is not mentioned in the specification, but see the evidence at: - // https://engineering.fractional.ai/openai-structured-output-fixes - @Suppress("unused") - class X( - @get:JsonProperty(defaultValue = "default_value_1") val s: String = "default_value_2" - ) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - // Assume that the schema is well-formed. - val properties = schema.get("properties") - val stringProperty = properties.get("s") - - assertThat(validator.isValid()).isTrue - assertThat(stringProperty).isNotNull - assertThat(stringProperty.get("default")).isNull() - } - - @Test - fun schemaTest_annotatedWithJsonIgnore() { - // Override the default name of the property using the annotation. - @Suppress("unused") class X(@get:JsonIgnore val s1: String, val s2: String) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - // Assume that the schema is well-formed. - val properties = schema.get("properties") - val s1Property = properties.get("s1") - val s2Property = properties.get("s2") - - assertThat(validator.isValid()).isTrue - assertThat(s1Property).isNull() - assertThat(s2Property).isNotNull - } - - @Test - fun schemaTest_annotatedWithSchemaStringConstraints() { - @Suppress("unused") - class X(@get:Schema(pattern = "^[a-z]+$", format = "email") val s: String) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - val properties = schema.get("properties") - val stringProperty = properties.get("s") - - assertThat(validator.isValid()).isTrue - assertThat(stringProperty).isNotNull - - assertThat(stringProperty.get("pattern")).isNotNull - assertThat(stringProperty.get("pattern").isTextual).isTrue - assertThat(stringProperty.get("pattern").asText()).isEqualTo("^[a-z]+$") - - assertThat(stringProperty.get("format")).isNotNull - assertThat(stringProperty.get("format").isTextual).isTrue - assertThat(stringProperty.get("format").asText()).isEqualTo("email") - } - - @Test - fun schemaTest_annotatedWithSchemaNumberConstraints() { - @Suppress("unused") - class X(@get:Schema(multipleOf = 5.0, minimum = "10.0", maximum = "55.0") val d: Double) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - val properties = schema.get("properties") - val numberProperty = properties.get("d") - - assertThat(validator.isValid()).isTrue - assertThat(numberProperty).isNotNull - - assertThat(numberProperty.get("multipleOf")).isNotNull - assertThat(numberProperty.get("multipleOf").isNumber).isTrue - assertThat(numberProperty.get("multipleOf").asDouble()).isEqualTo(5.0) - - assertThat(numberProperty.get("minimum")).isNotNull - assertThat(numberProperty.get("minimum").isNumber).isTrue - assertThat(numberProperty.get("minimum").asDouble()).isEqualTo(10.0) - - assertThat(numberProperty.get("maximum")).isNotNull - assertThat(numberProperty.get("maximum").isNumber).isTrue - assertThat(numberProperty.get("maximum").asDouble()).isEqualTo(55.0) - } - - @Test - fun schemaTest_annotatedWithSchemaNumberConstraintsExclusive() { - @Suppress("unused") - class X( - @get:Schema( - multipleOf = 5.0, - minimum = "10.0", - exclusiveMinimum = true, - maximum = "55.0", - exclusiveMaximum = true, - ) - val d: Double - ) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - val properties = schema.get("properties") - val numberProperty = properties.get("d") - - assertThat(validator.isValid()).isTrue - assertThat(numberProperty).isNotNull - - assertThat(numberProperty.get("multipleOf")).isNotNull - assertThat(numberProperty.get("multipleOf").isNumber).isTrue - assertThat(numberProperty.get("multipleOf").asDouble()).isEqualTo(5.0) - - // The pairing of `minimum` and `exclusiveMinimum` in the annotation is reduced to a single - // `"exclusiveMinimum"` field in the schema with a numeric value. Same for the maximum. - assertThat(numberProperty.get("exclusiveMinimum")).isNotNull - assertThat(numberProperty.get("exclusiveMinimum").isNumber).isTrue - assertThat(numberProperty.get("exclusiveMinimum").asDouble()).isEqualTo(10.0) - - assertThat(numberProperty.get("exclusiveMaximum")).isNotNull - assertThat(numberProperty.get("exclusiveMaximum").isNumber).isTrue - assertThat(numberProperty.get("exclusiveMaximum").asDouble()).isEqualTo(55.0) - } - - @Test - fun schemaTest_annotatedWithSchemaIntegerConstraints() { - @Suppress("unused") - class X(@get:Schema(multipleOf = 5.0, minimum = "10", maximum = "55") val i: Int) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - val properties = schema.get("properties") - val integerProperty = properties.get("i") - - assertThat(validator.isValid()).isTrue - assertThat(integerProperty).isNotNull - - assertThat(integerProperty.get("multipleOf")).isNotNull - assertThat(integerProperty.get("multipleOf").isNumber).isTrue - assertThat(integerProperty.get("multipleOf").asDouble()).isEqualTo(5.0) - - assertThat(integerProperty.get("minimum")).isNotNull - assertThat(integerProperty.get("minimum").isNumber).isTrue - assertThat(integerProperty.get("minimum").asInt()).isEqualTo(10) - - assertThat(integerProperty.get("maximum")).isNotNull - assertThat(integerProperty.get("maximum").isNumber).isTrue - assertThat(integerProperty.get("maximum").asInt()).isEqualTo(55) - } - - @Test - fun schemaTest_annotatedWithSchemaIntegerConstraintsExclusive() { - @Suppress("unused") - class X( - @get:Schema( - multipleOf = 5.0, - minimum = "10", - exclusiveMinimum = true, - maximum = "55", - exclusiveMaximum = true, - ) - val i: Int - ) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - val properties = schema.get("properties") - val integerProperty = properties.get("i") - - assertThat(validator.isValid()).isTrue - assertThat(integerProperty).isNotNull - - assertThat(integerProperty.get("multipleOf")).isNotNull - assertThat(integerProperty.get("multipleOf").isNumber).isTrue - assertThat(integerProperty.get("multipleOf").asDouble()).isEqualTo(5.0) - - // The pairing of `minimum` and `exclusiveMinimum` in the annotation is reduced to a single - // `"exclusiveMinimum"` field in the schema with a numeric value. Same for the maximum. - assertThat(integerProperty.get("exclusiveMinimum")).isNotNull - assertThat(integerProperty.get("exclusiveMinimum").isNumber).isTrue - assertThat(integerProperty.get("exclusiveMinimum").asInt()).isEqualTo(10) - - assertThat(integerProperty.get("exclusiveMaximum")).isNotNull - assertThat(integerProperty.get("exclusiveMaximum").isNumber).isTrue - assertThat(integerProperty.get("exclusiveMaximum").asInt()).isEqualTo(55) - } - - @Test - fun schemaTest_annotatedWithArraySchemaArrayConstraints() { - @Suppress("unused") - class X(@get:ArraySchema(minItems = 11, maxItems = 42) val a: List) - - schema = extractSchema(X::class.java) - validator.validate(schema) - - val properties = schema.get("properties") - val arrayProperty = properties.get("a") - - assertThat(validator.isValid()).isTrue - assertThat(arrayProperty).isNotNull - - assertThat(arrayProperty.get("minItems")).isNotNull - assertThat(arrayProperty.get("minItems").isInt).isTrue - assertThat(arrayProperty.get("minItems").asInt()).isEqualTo(11) - - assertThat(arrayProperty.get("maxItems")).isNotNull - assertThat(arrayProperty.get("maxItems").isInt).isTrue - assertThat(arrayProperty.get("maxItems").asInt()).isEqualTo(42) - } - - @Test - fun schemaTest_emptyDefinitions() { - // Be lenient about empty definitions. - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "$DEFS" : { }, - "type" : "string" - } - """ - ) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun schemaTest_referenceMissingReferent() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "$DEFS" : { }, - "$REF" : "#/$DEFS/Person" - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]) - .isEqualTo("#/$REF: Invalid or unsupported reference: '#/$DEFS/Person'.") - } - - @Test - fun schemaTest_referenceFieldIsNotTextual() { - schema = - parseJson( - """ - { - "$SCHEMA" : "$SCHEMA_VER", - "$DEFS" : { }, - "$REF" : 42 - } - """ - ) - validator.validate(schema) - - assertThat(validator.errors()).hasSize(1) - assertThat(validator.errors()[0]).isEqualTo("#/$REF: '$REF' field is not a text value.") - } - - @Test - fun validatorBeforeValidation() { - assertThat(validator.errors()).isEmpty() - assertThat(validator.isValid()).isFalse - - // Do this check of `toString()` once for an unused validator, but do not repeat it in other - // tests. - assertThat(validator.toString()) - .isEqualTo( - "JsonSchemaValidator{isValidationComplete=false, totalStringLength=0, " + - "totalObjectProperties=0, totalEnumValues=0, errors=[]}" - ) - } - - @Test - fun validatorReused() { - class X() - - schema = extractSchema(X::class.java) - validator.validate(schema) - - // Should fail if an attempt is made to reuse the validator. - assertThatThrownBy { validator.validate(schema) } - .isExactlyInstanceOf(IllegalStateException::class.java) - .hasMessageContaining("Validation already complete.") - } - - @Test - @Suppress("unused") - fun schemaTest_largeLaureatesSchema() { - // This covers many cases: large and complex "$defs", resolution of references, recursive - // references, etc. The output is assumed to be good (it has been checked by eye) and the - // test just shows that the validator can handle the complexity without crashing or emitting - // spurious errors. - class Name(val givenName: String, val familyName: String) - - class Person( - @get:JsonPropertyDescription("The name of the person.") val name: Name, - @get:JsonProperty(value = "date_of_birth", defaultValue = "unknown_1") - @get:JsonPropertyDescription("The date of birth of the person.") - var dateOfBirth: String, - @get:JsonPropertyDescription("The country of citizenship of the person.") - var nationality: String, - // A child being a `Person` results in a recursive schema. - @get:JsonPropertyDescription("The children (if any) of the person.") - val children: List, - ) { - @get:JsonPropertyDescription("The other name of the person.") - var otherName: Name = Name("Bob", "Smith") - } - - class Laureate( - val laureate: Person, - val majorContribution: String, - val yearOfWinning: String, - @get:JsonIgnore val favoriteColor: String, - ) - - class Laureates( - // Two lists results in a `Laureate` definition that is referenced in the schema. - var laureates1901to1950: List, - var laureates1951to2025: List, - ) - - schema = extractSchema(Laureates::class.java) - validator.validate(schema) - - assertThat(validator.isValid()).isTrue - } - - @Test - fun fromJsonSuccess() { - @Suppress("unused") class X(val s: String) - - val x = responseTypeFromJson("{\"s\" : \"hello\"}", X::class.java) - - assertThat(x.s).isEqualTo("hello") - } - - @Test - fun fromJsonFailure1() { - @Suppress("unused") class X(val s: String) - - // Well-formed JSON, but it does not match the schema of class `X`. - assertThatThrownBy { responseTypeFromJson("{\"wrong\" : \"hello\"}", X::class.java) } - .isExactlyInstanceOf(OpenAIInvalidDataException::class.java) - .hasMessage("Error parsing JSON: {\"wrong\" : \"hello\"}") - } - - @Test - fun fromJsonFailure2() { - @Suppress("unused") class X(val s: String) - - // Malformed JSON. - assertThatThrownBy { responseTypeFromJson("{\"truncated", X::class.java) } - .isExactlyInstanceOf(OpenAIInvalidDataException::class.java) - .hasMessage("Error parsing JSON: {\"truncated") - } - - @Test - fun responseFormatFromClassEnablesStrictAdherenceToSchema() { - @Suppress("unused") class X(val s: String) - - val jsonSchema = responseFormatFromClass(X::class.java) - - // The "strict" flag _must_ be set to ensure that the model's output will _always_ conform - // to the JSON schema. - assertThat(jsonSchema.jsonSchema().strict()).isPresent - assertThat(jsonSchema.jsonSchema().strict().get()).isTrue - - // The `schema()` accessor cannot be called successfully because of the way the field was - // set to a schema. This is OK, as the serialization will still work. Just confirm the - // expected failure, so if the conditions change, they will be noticed. - assertThatThrownBy { jsonSchema.jsonSchema().schema() } - .isExactlyInstanceOf(OpenAIInvalidDataException::class.java) - - // Use the `_schema()` accessor instead and check that the value is not null or missing. - assertThat(jsonSchema.jsonSchema()._schema()) - .isNotInstanceOfAny(JsonMissing::class.java, JsonNull::class.java) - } - - @Test - @Suppress("unused") - fun responseFormatFromClassSuccessWithoutValidation() { - // Exceed the maximum nesting depth, but do not enable validation. - class U(val s: String) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - class Z(val y: Y) - - assertThatNoException().isThrownBy { - responseFormatFromClass(Z::class.java, JsonSchemaLocalValidation.NO) - } - } - - @Test - fun responseFormatFromClassSuccessWithValidation() { - @Suppress("unused") class X(val s: String) - - assertThatNoException().isThrownBy { - responseFormatFromClass(X::class.java, JsonSchemaLocalValidation.YES) - } - } - - @Test - @Suppress("unused") - fun responseFormatFromClassFailureWithValidation() { - // Exceed the maximum nesting depth and enable validation. - class A(val s: String) - class Q(val u: A) - class R(val u: Q) - class S(val u: R) - class T(val u: S) - class U(val u: T) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - class Z(val y: Y) - - assertThatThrownBy { responseFormatFromClass(Z::class.java, JsonSchemaLocalValidation.YES) } - .isExactlyInstanceOf(IllegalArgumentException::class.java) - .hasMessage( - "Local validation failed for JSON schema derived from ${Z::class.java}:\n" + - " - #/properties/y/properties/x/properties/w/properties/v/properties/u/properties/u/properties/u/properties/u/properties/u/properties/u" + - "/properties/s: Current nesting depth is 11, but maximum is 10." - ) - } - - @Test - @Suppress("unused") - fun responseFormatFromClassFailureWithValidationDefault() { - // Confirm that the default value of the `localValidation` argument is `YES` by expecting - // a validation error when that argument is not given an explicit value. - class A(val s: String) - class Q(val u: A) - class R(val u: Q) - class S(val u: R) - class T(val u: S) - class U(val u: T) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - class Z(val y: Y) - // Use default for `localValidation` flag. - assertThatThrownBy { responseFormatFromClass(Z::class.java) } - .isExactlyInstanceOf(IllegalArgumentException::class.java) - .hasMessage( - "Local validation failed for JSON schema derived from ${Z::class.java}:\n" + - " - #/properties/y/properties/x/properties/w/properties/v/properties/u/properties/u/properties/u/properties/u/properties/u/properties/u" + - "/properties/s: Current nesting depth is 11, but maximum is 10." - ) - } - - @Test - fun textConfigFromClassEnablesStrictAdherenceToSchema() { - @Suppress("unused") class X(val s: String) - - val textConfig = textConfigFromClass(X::class.java) - val jsonSchema = textConfig.format().get().jsonSchema().get() - - // The "strict" flag _must_ be set to ensure that the model's output will _always_ conform - // to the JSON schema. - assertThat(jsonSchema.strict()).isPresent - assertThat(jsonSchema.strict().get()).isTrue - - // The `schema()` accessor cannot be called successfully because of the way the field was - // set to a schema. This is OK, as the serialization will still work. Just confirm the - // expected failure, so if the conditions change, they will be noticed. - assertThatThrownBy { jsonSchema.schema() } - .isExactlyInstanceOf(OpenAIInvalidDataException::class.java) - - // Use the `_schema()` accessor instead and check that the value is not null or missing. - assertThat(jsonSchema._schema()) - .isNotInstanceOfAny(JsonMissing::class.java, JsonNull::class.java) - } - - @Test - @Suppress("unused") - fun textConfigFromClassSuccessWithoutValidation() { - // Exceed the maximum nesting depth, but do not enable validation. - class U(val s: String) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - class Z(val y: Y) - - assertThatNoException().isThrownBy { - textConfigFromClass(Z::class.java, JsonSchemaLocalValidation.NO) - } - } - - @Test - fun textConfigFromClassSuccessWithValidation() { - @Suppress("unused") class X(val s: String) - - assertThatNoException().isThrownBy { - textConfigFromClass(X::class.java, JsonSchemaLocalValidation.YES) - } - } - - @Test - @Suppress("unused") - fun textConfigFromClassFailureWithValidation() { - // Exceed the maximum nesting depth and enable validation. - class A(val s: String) - class Q(val u: A) - class R(val u: Q) - class S(val u: R) - class T(val u: S) - class U(val u: T) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - class Z(val y: Y) - assertThatThrownBy { textConfigFromClass(Z::class.java, JsonSchemaLocalValidation.YES) } - .isExactlyInstanceOf(IllegalArgumentException::class.java) - .hasMessage( - "Local validation failed for JSON schema derived from ${Z::class.java}:\n" + - " - #/properties/y/properties/x/properties/w/properties/v/properties/u/properties/u/properties/u/properties/u/properties/u/properties/u" + - "/properties/s: Current nesting depth is 11, but maximum is 10." - ) - } - - @Test - @Suppress("unused") - fun textConfigFromClassFailureWithValidationDefault() { - // Confirm that the default value of the `localValidation` argument is `YES` by expecting - // a validation error when that argument is not given an explicit value. - class A(val s: String) - class Q(val u: A) - class R(val u: Q) - class S(val u: R) - class T(val u: S) - class U(val u: T) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - class Z(val y: Y) - - // Use default for `localValidation` flag. - assertThatThrownBy { textConfigFromClass(Z::class.java) } - .isExactlyInstanceOf(IllegalArgumentException::class.java) - .hasMessage( - "Local validation failed for JSON schema derived from ${Z::class.java}:\n" + - " - #/properties/y/properties/x/properties/w/properties/v/properties/u/properties/u/properties/u/properties/u/properties/u/properties/u" + - "/properties/s: Current nesting depth is 11, but maximum is 10." - ) - } - - @Test - fun extractFunctionInfoUsingClassNameAndNoDescription() { - @Suppress("unused") class X(val s: String) - - val info = extractFunctionInfo(X::class.java, JsonSchemaLocalValidation.NO) - - assertThat(info.name).isEqualTo("X") - assertThat(info.description).isNull() - } - - @Test - fun extractFunctionInfoUsingAnnotationNameAndNoDescription() { - @Suppress("unused") @JsonTypeName("fnX") class X(val s: String) - - val info = extractFunctionInfo(X::class.java, JsonSchemaLocalValidation.NO) - - assertThat(info.name).isEqualTo("fnX") - assertThat(info.description).isNull() - } - - @Test - fun extractFunctionInfoUsingClassNameAndAnnotationDescription() { - @Suppress("unused") @JsonClassDescription("Something about X") class X(val s: String) - - val info = extractFunctionInfo(X::class.java, JsonSchemaLocalValidation.NO) - - assertThat(info.name).isEqualTo("X") - assertThat(info.description).isEqualTo("Something about X") - // If the description annotation is set, it will be added to the schema by the generator, - // but should them be moved out by `extractFunctionInfo` into the function info. - assertThat(info.schema.get("description")).isNull() - } - - @Test - fun functionToolFromClassEnablesStrictAdherenceToSchema() { - @Suppress("unused") @JsonClassDescription("Something about X") class X(val s: String) - - val functionTool = functionToolFromClass(X::class.java) - val fnDef = functionTool.function().get().function() - - // The "strict" flag _must_ be set to ensure that the model's output will _always_ conform - // to the JSON schema. - assertThat(fnDef.strict()).isPresent - assertThat(fnDef.strict().get()).isTrue - // Test here that the name, description and parameters (schema) are applied. There is no - // need to test these again for the other cases. - assertThat(fnDef.name()).isEqualTo("X") - assertThat(fnDef.description()).isPresent - assertThat(fnDef.description().get()).isEqualTo("Something about X") - - // The `parameters()` accessor cannot be called successfully because of the way the field - // was set to a schema. This is OK, as the serialization will still work. Just confirm the - // expected failure, so if the conditions change, they will be noticed. - assertThatThrownBy { fnDef.parameters() } - .isExactlyInstanceOf(OpenAIInvalidDataException::class.java) - - // Use the `_parameters()` accessor instead and check that the value is not null or missing. - assertThat(fnDef._parameters()) - .isNotInstanceOfAny(JsonMissing::class.java, JsonNull::class.java) - } - - @Test - @Suppress("unused") - fun functionToolFromClassSuccessWithoutValidation() { - // Exceed the maximum nesting depth, but do not enable validation. - class U(val s: String) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - class Z(val y: Y) - - assertThatNoException().isThrownBy { - functionToolFromClass(Z::class.java, JsonSchemaLocalValidation.NO) - } - } - - @Test - fun functionToolFromClassSuccessWithValidation() { - @Suppress("unused") class X(val s: String) - - assertThatNoException().isThrownBy { - functionToolFromClass(X::class.java, JsonSchemaLocalValidation.YES) - } - } - - @Test - @Suppress("unused") - fun functionToolFromClassFailureWithValidation() { - // Exceed the maximum nesting depth and enable validation. - class A(val s: String) - class Q(val u: A) - class R(val u: Q) - class S(val u: R) - class T(val u: S) - class U(val u: T) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - class Z(val y: Y) - - assertThatThrownBy { functionToolFromClass(Z::class.java, JsonSchemaLocalValidation.YES) } - .isExactlyInstanceOf(IllegalArgumentException::class.java) - .hasMessage( - "Local validation failed for JSON schema derived from ${Z::class.java}:\n" + - " - #/properties/y/properties/x/properties/w/properties/v/properties/u/properties/u/properties/u/properties/u/properties/u/properties/u" + - "/properties/s: Current nesting depth is 11, but maximum is 10." - ) - } - - @Test - @Suppress("unused") - fun functionToolFromClassFailureWithValidationDefault() { - // Confirm that the default value of the `localValidation` argument is `YES` by expecting a - // validation error when that argument is not given an explicit value. - class A(val s: String) - class Q(val u: A) - class R(val u: Q) - class S(val u: R) - class T(val u: S) - class U(val u: T) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - class Z(val y: Y) - - // Use default for `localValidation` flag. - assertThatThrownBy { functionToolFromClass(Z::class.java) } - .isExactlyInstanceOf(IllegalArgumentException::class.java) - .hasMessage( - "Local validation failed for JSON schema derived from ${Z::class.java}:\n" + - " - #/properties/y/properties/x/properties/w/properties/v/properties/u/properties/u/properties/u/properties/u/properties/u/properties/u" + - "/properties/s: Current nesting depth is 11, but maximum is 10." - ) - } - - @Test - fun responseFunctionToolFromClassEnablesStrictAdherenceToSchema() { - @Suppress("unused") @JsonClassDescription("Something about X") class X(val s: String) - - val fnTool = responseFunctionToolFromClass(X::class.java) - - // The "strict" flag _must_ be set to ensure that the model's output will _always_ conform - // to the JSON schema. - assertThat(fnTool.strict()).isPresent - assertThat(fnTool.strict().get()).isTrue - // Test here that the name, description and parameters (schema) are applied. There is no - // need to test these again for the other cases. - assertThat(fnTool.name()).isEqualTo("X") - assertThat(fnTool.description()).isPresent - assertThat(fnTool.description().get()).isEqualTo("Something about X") - - // The `parameters()` accessor cannot be called successfully because of the way the field - // was set to a schema. This is OK, as the serialization will still work. Just confirm the - // expected failure, so if the conditions change, they will be noticed. - assertThatThrownBy { fnTool.parameters() } - .isExactlyInstanceOf(OpenAIInvalidDataException::class.java) - - // Use the `_parameters()` accessor instead and check that the value is not null or missing. - assertThat(fnTool._parameters()) - .isNotInstanceOfAny(JsonMissing::class.java, JsonNull::class.java) - } - - @Test - @Suppress("unused") - fun responseFunctionToolFromClassSuccessWithoutValidation() { - // Exceed the maximum nesting depth, but do not enable validation. - class U(val s: String) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - class Z(val y: Y) - - assertThatNoException().isThrownBy { - responseFunctionToolFromClass(Z::class.java, JsonSchemaLocalValidation.NO) - } - } - - @Test - fun responseFunctionToolFromClassSuccessWithValidation() { - @Suppress("unused") class X(val s: String) - - assertThatNoException().isThrownBy { - responseFunctionToolFromClass(X::class.java, JsonSchemaLocalValidation.YES) - } - } - - @Test - @Suppress("unused") - fun responseFunctionToolFromClassFailureWithValidation() { - // Exceed the maximum nesting depth and enable validation. - class A(val s: String) - class Q(val u: A) - class R(val u: Q) - class S(val u: R) - class T(val u: S) - class U(val u: T) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - class Z(val y: Y) - - assertThatThrownBy { - responseFunctionToolFromClass(Z::class.java, JsonSchemaLocalValidation.YES) - } - .isExactlyInstanceOf(IllegalArgumentException::class.java) - .hasMessage( - "Local validation failed for JSON schema derived from ${Z::class.java}:\n" + - " - #/properties/y/properties/x/properties/w/properties/v/properties/u/properties/u/properties/u/properties/u/properties/u/properties/u" + - "/properties/s: Current nesting depth is 11, but maximum is 10." - ) - } - - @Test - @Suppress("unused") - fun responseFunctionToolFromClassFailureWithValidationDefault() { - // Confirm that the default value of the `localValidation` argument is `YES` by expecting - // a validation error when that argument is not given an explicit value. - class A(val s: String) - class Q(val u: A) - class R(val u: Q) - class S(val u: R) - class T(val u: S) - class U(val u: T) - class V(val u: U) - class W(val v: V) - class X(val w: W) - class Y(val x: X) - class Z(val y: Y) - - // Use default for `localValidation` flag. - assertThatThrownBy { responseFunctionToolFromClass(Z::class.java) } - .isExactlyInstanceOf(IllegalArgumentException::class.java) - .hasMessage( - "Local validation failed for JSON schema derived from ${Z::class.java}:\n" + - " - #/properties/y/properties/x/properties/w/properties/v/properties/u/properties/u/properties/u/properties/u/properties/u/properties/u" + - "/properties/s: Current nesting depth is 11, but maximum is 10." - ) - } - - @Test - fun toJsonString() { - val boolPrimitive = toJsonString(true) - val boolObject = toJsonString(java.lang.Boolean.TRUE) - val numberPrimitive = toJsonString(42) - val numberObject = toJsonString(Integer.valueOf(42)) - val stringObject = toJsonString("Hello, World!") - val optional = toJsonString(Optional.of("optional")) - val optionalNullable = toJsonString(Optional.ofNullable(null)) - - assertThat(boolPrimitive).isEqualTo("true") - assertThat(boolObject).isEqualTo("true") - assertThat(numberPrimitive).isEqualTo("42") - assertThat(numberObject).isEqualTo("42") - // String values should be in quotes. - assertThat(stringObject).isEqualTo("\"Hello, World!\"") - assertThat(optional).isEqualTo("\"optional\"") - assertThat(optionalNullable).isEqualTo("null") - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/StructuredOutputsTestUtils.kt b/openai-java-core/src/test/kotlin/com/openai/core/StructuredOutputsTestUtils.kt deleted file mode 100644 index 54945fba6..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/StructuredOutputsTestUtils.kt +++ /dev/null @@ -1,371 +0,0 @@ -package com.openai.core - -import java.lang.reflect.Method -import java.util.Optional -import kotlin.reflect.KClass -import kotlin.reflect.KFunction -import kotlin.reflect.KVisibility -import kotlin.reflect.full.declaredFunctions -import kotlin.reflect.jvm.javaMethod -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.fail -import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.`when` -import org.mockito.kotlin.times -import org.mockito.kotlin.verify - -// Constants for values that can be used in many of the tests as sample input or output values. -// -// Where a function returns `Optional`, `JsonField` or `JsonValue` There is no need to provide -// a value that matches the type ``, a simple `String` value of `"a-string"` will work OK. -internal const val STRING = "a-string" -internal val NULLABLE_STRING: String? = null -internal val OPTIONAL = Optional.of(STRING) -internal val JSON_FIELD = JsonField.of(STRING) -internal val JSON_VALUE = JsonValue.from(STRING) -internal val NULLABLE = null -internal const val BOOLEAN: Boolean = true -internal val NULLABLE_BOOLEAN: Boolean? = null -internal const val LONG: Long = 42L -internal val NULLABLE_LONG: Long? = null -internal const val DOUBLE: Double = 42.0 -internal val NULLABLE_DOUBLE: Double? = null -internal val LIST = listOf(STRING) -internal val SET = setOf(STRING) -internal val MAP = mapOf(STRING to STRING) -internal val CLASS = X::class.java - -/** - * Defines a test case where a function in a delegator returns a value from a corresponding function - * in a delegate. - */ -internal data class DelegationReadTestCase(val functionName: String, val expectedValue: Any) - -/** - * Defines a test case where a function in a delegator passes its parameters through to a - * corresponding function in a delegate. - */ -// Want `vararg`, so cannot use `data class`. Needs a custom `toString`, anyway. -internal class DelegationWriteTestCase( - val functionName: String, - /** - * The values to pass to the function being tested. If the first input value is `null`, it must - * be the only value. Only the first input value may be `null`, all others must be non-`null`. - * This is not enforced by this class, but is assumed by the related utility functions. - */ - vararg val inputValues: Any?, -) { - /** Gets the string representation that identifies the test function when running JUnit. */ - override fun toString(): String = - "$functionName(${inputValues.joinToString(", ") { - it?.javaClass?.simpleName ?: "null" - }})" -} - -/** A basic class used as the generic type when testing. */ -internal class X(val s: String) { - override fun equals(other: Any?) = other is X && other.s == s - - override fun hashCode() = s.hashCode() -} - -/** - * Checks that all functions in one class have a corresponding function with the same name and - * parameter types in another class. A list of function names that should be allowed as exceptions - * can be given. Non-public functions are ignored, as they are considered to be implementation - * details of each class. - * - * Call this function twice, changing the order of the two classes to ensure that both classes - * contain the same set of functions (barring exceptions), should that be the expectation. - * - * @param subsetClass The class whose functions should be a subset of the functions of the other - * class. - * @param supersetClass The class whose functions should be a superset of the functions of the other - * class. - */ -internal fun checkAllDelegation( - subsetClass: KClass<*>, - supersetClass: KClass<*>, - vararg exceptFunctionNames: String, -) { - assertThat(subsetClass != supersetClass) - .describedAs { "The two classes should not be the same." } - .isTrue - - val subsetFunctions = subsetClass.declaredFunctions - val missingFunctions = mutableListOf>() - - for (subsetFunction in subsetFunctions) { - if (subsetFunction.visibility != KVisibility.PUBLIC) { - continue - } - - if (subsetFunction.name in exceptFunctionNames) { - continue - } - - // Drop the first parameter from each function, as it is the implicit "this" object and has - // the type of the class declaring the function, which will never match. Compare only the - // "classifiers" of the types, so that generic type parameters are ignored. For example, - // one `java.lang.Class` is then considered equal to another `java.lang.Class`. For - // the data set being processed, this simplification does not cause any problems. - val supersetFunction = - supersetClass.declaredFunctions.find { - it.name == subsetFunction.name && - it.parameters.drop(1).map { it.type.classifier } == - subsetFunction.parameters.drop(1).map { it.type.classifier } - } - - if (supersetFunction == null) { - missingFunctions.add(subsetFunction) - } - } - - assertThat(missingFunctions) - .describedAs { - "Function(s) not found in ${supersetClass.simpleName}:\n" + - missingFunctions.joinToString("\n") { " - $it" } - } - .isEmpty() -} - -/** - * Checks that the delegator function calls the corresponding delegate function and no other - * functions on the delegate. The test case defines the function name and the sample return value. - * All functions take no arguments. - */ -internal fun checkOneDelegationRead( - delegator: Any, - mockDelegate: Any, - testCase: DelegationReadTestCase, -) { - // Stub the method in the mock delegate using reflection - val delegateMethod = mockDelegate::class.java.getMethod(testCase.functionName) - `when`(delegateMethod.invoke(mockDelegate)).thenReturn(testCase.expectedValue) - - // Call the corresponding method on the delegator using reflection - val delegatorMethod = delegator::class.java.getMethod(testCase.functionName) - val result = delegatorMethod.invoke(delegator) - - // Verify that the corresponding method on the mock delegate was called exactly once - verify(mockDelegate, times(1)).apply { delegateMethod.invoke(mockDelegate) } - verifyNoMoreInteractions(mockDelegate) - - // Assert that the result matches the expected value - assertThat(result).isEqualTo(testCase.expectedValue) -} - -/** - * Checks that the delegator function calls the corresponding delegate function and no other - * functions on the delegate. The test case defines the function name and sample parameter values. - */ -internal fun checkOneDelegationWrite( - delegator: Any, - mockDelegate: Any, - testCase: DelegationWriteTestCase, -) { - invokeMethod(findDelegationMethod(delegator, testCase), delegator, testCase) - - // Verify that the corresponding method on the mock delegate was called exactly once. - verify(mockDelegate, times(1)).apply { - invokeMethod(findDelegationMethod(mockDelegate, testCase), mockDelegate, testCase) - } - verifyNoMoreInteractions(mockDelegate) -} - -private fun invokeMethod(method: Method, target: Any, testCase: DelegationWriteTestCase) { - val numParams = testCase.inputValues.size - - when (numParams) { - 0 -> method.invoke(target) - 1 -> method.invoke(target, testCase.inputValues[0]) - 2 -> method.invoke(target, testCase.inputValues[0], testCase.inputValues.getOrNull(1)) - else -> fail { "Unexpected number of function parameters ($numParams)." } - } -} - -/** - * Finds the java method matching the test case's function name and parameter types in the delegator - * or delegate `target`. - */ -internal fun findDelegationMethod(target: Any, testCase: DelegationWriteTestCase): Method { - val numParams = testCase.inputValues.size - val inputValue1: Any? = if (numParams > 0) testCase.inputValues[0] else null - val inputValue2 = if (numParams > 1) testCase.inputValues[1] else null - - val method = - when (numParams) { - 0 -> findJavaMethod(target.javaClass, testCase.functionName) - 1 -> - if (inputValue1 != null) { - findJavaMethod( - target.javaClass, - testCase.functionName, - toJavaType(inputValue1.javaClass), - ) - } else { - // Only the first parameter may be nullable and only if it is the only - // parameter. If the first parameter is nullable, it will be the only function - // of the same name with a nullable first parameter. To handle the potentially - // nullable first parameter, Kotlin reflection is needed. This allows a function - // `f(Boolean)` to be distinguished from `f(Boolean?)`. For the tests, if the - // parameter type is nullable, the parameter value will always be `null` (if - // not, the function with the nullable parameter would not be matched). - // - // Using Kotlin reflection, the first parameter (zero index) is `this` object, - // so start matching from the second parameter onwards. - target::class - .declaredFunctions - .find { - it.name == testCase.functionName && - it.parameters[1].type.isMarkedNullable - } - ?.javaMethod - } - - 2 -> - if (inputValue1 != null && inputValue2 != null) { - findJavaMethod( - target.javaClass, - testCase.functionName, - toJavaType(inputValue1.javaClass), - toJavaType(inputValue2.javaClass), - ) - } else { - // There are no instances where there are two parameters and one of them is - // nullable. - fail { "Function $testCase second parameter must not be null." } - } - - else -> fail { "Function $testCase has unsupported number of parameters." } - } ?: fail { "Function $testCase cannot be found in $target." } - - // Using `fail` conditionally above, so the compiler knows the code will not continue and can - // infer that `method` is not null. It cannot do that for `assertThat...isNotNull`. - return method -} - -/** Finds a Java method in a class that matches a method name and a list of parameter types. */ -private fun findJavaMethod( - clazz: Class<*>, - methodName: String, - vararg parameterTypes: Class<*>, -): Method? = - clazz.declaredMethods.firstOrNull { method -> - method.name == methodName && - method.parameterTypes.size == parameterTypes.size && - method.parameterTypes.indices.all { index -> - (parameterTypes[index].isPrimitive && - method.parameterTypes[index] == parameterTypes[index]) || - method.parameterTypes[index].isAssignableFrom(parameterTypes[index]) - } - } - -/** - * Returns the Java type to use when matching type parameters for a Java method. The type is the - * type of the input value that will be used when the method is invoked. For most types, the given - * type is returned. However, if the type represents a Kotlin primitive, it will be converted to a - * Java primitive. This allows matching of methods with parameter types that are non-nullable Kotlin - * primitives. If not translated, methods with parameter types that are nullable Kotlin primitives - * would always be matched instead. - */ -private fun toJavaType(type: Class<*>) = - when (type) { - // This only needs to cover the types used in the test cases. - java.lang.Long::class.java -> java.lang.Long.TYPE - java.lang.Boolean::class.java -> java.lang.Boolean.TYPE - java.lang.Double::class.java -> java.lang.Double.TYPE - else -> type - } - -/** - * Checks that all delegating functions in a delegator class have corresponding unit tests. The - * read-only functions should take no parameters; only return a value. - * - * @param delegatorClass The delegator class whose functions are tested. Every named function in - * this class must be identified in one of the given sources of function names or a failure will - * occur. - * @param delegationTestCases The tests cases that identify the names of delegating functions for - * which parameterized unit tests have been defined. - * @param exceptionalTestedFns The names of delegating functions that are tested separately, not as - * parameterized unit tests. This is usually because they require special handling in the test. - * @param nonDelegatingFns The names of functions that do not perform any delegation and for which - * delegation tests are not required. - */ -internal fun checkAllDelegatorReadFunctionsAreTested( - delegatorClass: KClass<*>, - delegationTestCases: List, - exceptionalTestedFns: Set, - nonDelegatingFns: Set, -) { - val testedFns = delegationTestCases.map { it.functionName }.toSet() + exceptionalTestedFns - val delegatorFunctions = delegatorClass.declaredFunctions - val untestedFunctions = - delegatorFunctions.filter { it.name !in testedFns && it.name !in nonDelegatingFns } - - assertThat(untestedFunctions) - .describedAs( - "Delegation is not tested for function(s):\n" + - untestedFunctions.joinToString("\n") { " - $it" } - ) - .isEmpty() -} - -/** - * Checks that all delegating functions in a delegator class have corresponding unit tests. The - * write-only functions should take parameters and return no value. - * - * @param delegatorClass The delegator class whose functions are tested. Every named function in - * this class must be identified in one of the given sources of function names or a failure will - * occur. - * @param delegationTestCases The tests cases that identify the names of delegating functions for - * which parameterized unit tests have been defined. - * @param exceptionalTestedFns The names of delegating functions that are tested separately, not as - * parameterized unit tests. This is usually because they require special handling in the test. If - * functions are overloaded, repeat the name for of the function for each overload. - * @param nonDelegatingFns The names of functions that do not perform any delegation and for which - * delegation tests are not required. - */ -internal fun checkAllDelegatorWriteFunctionsAreTested( - delegatorClass: KClass<*>, - delegationTestCases: List, - exceptionalTestedFns: List, - nonDelegatingFns: Set, -) { - // There are exceptional test cases for some functions. Most other functions are part of the - // list of those using the parameterized test. There are many overloaded functions, so the - // approach here is to build a list (_not_ a set) of all function names and then "subtract" - // those for which tests are defined and see what remains. For example, there could be eight - // `addMessage` functions, so there must be eight tests defined for functions named `addMessage` - // that will be subtracted from the list of functions matching that name. Parameter types are - // not checked, as that is awkward and probably overkill. Therefore, this scheme is not reliable - // if a function is tested more than once. - val testedFns = - (delegationTestCases.map { it.functionName } + exceptionalTestedFns).toMutableList() - // Only interested in the names of the functions (which may contain duplicates): parameters are - // not matched, so any signatures could be misleading when reporting errors. - val delegatorFns = delegatorClass.declaredFunctions.map { it.name }.toMutableList() - - // Making modifications to the list, so clone it with `toList()` before iterating. - for (fnName in delegatorFns.toList()) { - if (fnName in testedFns) { - testedFns.remove(fnName) - delegatorFns.remove(fnName) - } - if (fnName in nonDelegatingFns) { - delegatorFns.remove(fnName) - } - } - - // If there are function names remaining in `delegatorFns`, then there are tests missing. - assertThat(delegatorFns) - .describedAs { "Delegation is not tested for functions $delegatorFns." } - .isEmpty() - - // If there are function names remaining in `testedFns`, then there are more tests than there - // should be. Functions might be tested twice, or there may be tests for functions that have - // since been removed from the delegate (though those tests probably failed). - assertThat(testedFns) - .describedAs { "Unexpected or redundant tests for functions $testedFns." } - .isEmpty() -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/UtilsTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/UtilsTest.kt deleted file mode 100644 index 2f3a54ba3..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/UtilsTest.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.openai.core - -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class UtilsTest { - @Test - fun contentDeepEquals() { - assertThat(42 contentEquals 42).isTrue() - assertThat(42 contentEquals "Hello World!").isFalse() - assertThat(byteArrayOf(1, 2, 3) contentEquals byteArrayOf(1, 2, 3)).isTrue() - assertThat(byteArrayOf(1, 2, 3) contentEquals byteArrayOf(1, 2, 4)).isFalse() - assertThat( - arrayOf(byteArrayOf(1, 2), byteArrayOf(3)) contentEquals - arrayOf(byteArrayOf(1, 2), byteArrayOf(3)) - ) - .isTrue() - assertThat( - arrayOf(byteArrayOf(1, 2), byteArrayOf(3)) contentEquals - arrayOf(byteArrayOf(1), byteArrayOf(2, 3)) - ) - .isFalse() - } - - @Test - fun contentToString() { - assertThat((42).contentToString()).isEqualTo("42") - assertThat("Hello World!".contentToString()).isEqualTo("Hello World!") - assertThat(byteArrayOf(1, 2, 3).contentToString()).isEqualTo("[1, 2, 3]") - assertThat(arrayOf(byteArrayOf(1, 2), byteArrayOf(3)).contentToString()) - .isEqualTo("[[1, 2], [3]]") - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/ValuesTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/ValuesTest.kt deleted file mode 100644 index 92d10682e..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/ValuesTest.kt +++ /dev/null @@ -1,144 +0,0 @@ -package com.openai.core - -import java.util.Optional -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.EnumSource - -internal class ValuesTest { - companion object { - private val NON_JSON = Any() - } - - enum class TestCase( - val value: JsonField<*>, - val expectedIsMissing: Boolean = false, - val expectedIsNull: Boolean = false, - val expectedAsKnown: Optional<*> = Optional.empty(), - val expectedAsBoolean: Optional = Optional.empty(), - val expectedAsNumber: Optional = Optional.empty(), - val expectedAsString: Optional = Optional.empty(), - val expectedAsArray: Optional> = Optional.empty(), - val expectedAsObject: Optional> = Optional.empty(), - ) { - MISSING(JsonMissing.of(), expectedIsMissing = true), - NULL(JsonNull.of(), expectedIsNull = true), - KNOWN(KnownValue.of(NON_JSON), expectedAsKnown = Optional.of(NON_JSON)), - KNOWN_BOOLEAN( - KnownValue.of(true), - expectedAsKnown = Optional.of(true), - expectedAsBoolean = Optional.of(true), - ), - BOOLEAN(JsonBoolean.of(true), expectedAsBoolean = Optional.of(true)), - KNOWN_NUMBER( - KnownValue.of(42), - expectedAsKnown = Optional.of(42), - expectedAsNumber = Optional.of(42), - ), - NUMBER(JsonNumber.of(42), expectedAsNumber = Optional.of(42)), - KNOWN_STRING( - KnownValue.of("hello"), - expectedAsKnown = Optional.of("hello"), - expectedAsString = Optional.of("hello"), - ), - STRING(JsonString.of("hello"), expectedAsString = Optional.of("hello")), - KNOWN_ARRAY_NOT_ALL_JSON( - KnownValue.of(listOf("a", "b", NON_JSON)), - expectedAsKnown = Optional.of(listOf("a", "b", NON_JSON)), - ), - KNOWN_ARRAY( - KnownValue.of(listOf("a", "b", "c")), - expectedAsKnown = Optional.of(listOf("a", "b", "c")), - expectedAsArray = - Optional.of(listOf(JsonString.of("a"), JsonString.of("b"), JsonString.of("c"))), - ), - ARRAY( - JsonArray.of(listOf(JsonString.of("a"), JsonString.of("b"), JsonString.of("c"))), - expectedAsArray = - Optional.of(listOf(JsonString.of("a"), JsonString.of("b"), JsonString.of("c"))), - ), - KNOWN_OBJECT_NOT_ALL_STRING_KEYS( - KnownValue.of(mapOf("a" to "b", 42 to "c")), - expectedAsKnown = Optional.of(mapOf("a" to "b", 42 to "c")), - ), - KNOWN_OBJECT_NOT_ALL_JSON( - KnownValue.of(mapOf("a" to "b", "b" to NON_JSON)), - expectedAsKnown = Optional.of(mapOf("a" to "b", "b" to NON_JSON)), - ), - KNOWN_OBJECT( - KnownValue.of(mapOf("a" to "b", "b" to "c")), - expectedAsKnown = Optional.of(mapOf("a" to "b", "b" to "c")), - expectedAsObject = - Optional.of(mapOf("a" to JsonString.of("b"), "b" to JsonString.of("c"))), - ), - OBJECT( - JsonObject.of(mapOf("a" to JsonString.of("b"), "b" to JsonString.of("c"))), - expectedAsObject = - Optional.of(mapOf("a" to JsonString.of("b"), "b" to JsonString.of("c"))), - ), - } - - @ParameterizedTest - @EnumSource - fun isMissing(testCase: TestCase) { - val isMissing = testCase.value.isMissing() - - assertThat(isMissing).isEqualTo(testCase.expectedIsMissing) - } - - @ParameterizedTest - @EnumSource - fun isNull(testCase: TestCase) { - val isNull = testCase.value.isNull() - - assertThat(isNull).isEqualTo(testCase.expectedIsNull) - } - - @ParameterizedTest - @EnumSource - fun asKnown(testCase: TestCase) { - val known = testCase.value.asKnown() - - assertThat(known).isEqualTo(testCase.expectedAsKnown) - } - - @ParameterizedTest - @EnumSource - fun asBoolean(testCase: TestCase) { - val boolean = testCase.value.asBoolean() - - assertThat(boolean).isEqualTo(testCase.expectedAsBoolean) - } - - @ParameterizedTest - @EnumSource - fun asNumber(testCase: TestCase) { - val number = testCase.value.asNumber() - - assertThat(number).isEqualTo(testCase.expectedAsNumber) - } - - @ParameterizedTest - @EnumSource - fun asString(testCase: TestCase) { - val string = testCase.value.asString() - - assertThat(string).isEqualTo(testCase.expectedAsString) - } - - @ParameterizedTest - @EnumSource - fun asArray(testCase: TestCase) { - val array = testCase.value.asArray() - - assertThat(array).isEqualTo(testCase.expectedAsArray) - } - - @ParameterizedTest - @EnumSource - fun asObject(testCase: TestCase) { - val obj = testCase.value.asObject() - - assertThat(obj).isEqualTo(testCase.expectedAsObject) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/WireMockHandlebarsCompatibilityTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/WireMockHandlebarsCompatibilityTest.kt deleted file mode 100644 index 89efb0eac..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/WireMockHandlebarsCompatibilityTest.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.openai.core - -import com.github.tomakehurst.wiremock.WireMockServer -import com.github.tomakehurst.wiremock.client.WireMock.aResponse -import com.github.tomakehurst.wiremock.client.WireMock.get -import com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo -import com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig -import java.net.HttpURLConnection -import java.net.URL -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class WireMockHandlebarsCompatibilityTest { - - @Test - fun rendersResponseTemplate() { - val server = WireMockServer(wireMockConfig().dynamicPort()) - server.start() - - try { - server.stubFor( - get(urlEqualTo("/greeting")) - .willReturn( - aResponse() - .withTransformers("response-template") - .withBody("Hello {{request.headers.X-Name}}!") - ) - ) - - val connection = - URL("${server.baseUrl()}/greeting").openConnection() as HttpURLConnection - connection.setRequestProperty("X-Name", "SDK") - - assertThat(connection.inputStream.bufferedReader().use { it.readText() }) - .isEqualTo("Hello SDK!") - } finally { - server.stop() - } - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/handlers/SseHandlerTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/handlers/SseHandlerTest.kt deleted file mode 100644 index c4cc0525a..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/handlers/SseHandlerTest.kt +++ /dev/null @@ -1,196 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core.handlers - -import com.openai.core.http.Headers -import com.openai.core.http.HttpResponse -import com.openai.core.http.SseMessage -import com.openai.core.jsonMapper -import com.openai.errors.SseException -import com.openai.models.ErrorObject -import java.io.InputStream -import java.util.stream.Collectors.toList -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.catchThrowable -import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.EnumSource - -internal class SseHandlerTest { - - enum class TestCase( - internal val body: String, - internal val expectedMessages: List? = null, - internal val expectedException: Exception? = null, - ) { - DATA_MISSING_EVENT( - buildString { - append("data: {\"foo\":true}\n") - append("\n") - }, - listOf(sseMessageBuilder().data("{\"foo\":true}").build()), - ), - MULTIPLE_DATA_MISSING_EVENT( - buildString { - append("data: {\"foo\":true}\n") - append("\n") - append("data: {\"bar\":false}\n") - append("\n") - }, - listOf( - sseMessageBuilder().data("{\"foo\":true}").build(), - sseMessageBuilder().data("{\"bar\":false}").build(), - ), - ), - RETRY_MISSING_DATA( - buildString { - append("retry: 10000\n") - append("\n") - append("data: {\"foo\":true}\n") - append("\n") - }, - listOf(sseMessageBuilder().data("{\"foo\":true}").build()), - ), - EVENT_MISSING_DATA( - buildString { - append("event: ignored\n") - append("\n") - append("data: {\"foo\":true}\n") - append("\n") - append("data: {\"bar\":false}\n") - append("\n") - }, - listOf( - sseMessageBuilder().data("{\"foo\":true}").build(), - sseMessageBuilder().data("{\"bar\":false}").build(), - ), - ), - ID_MISSING_DATA( - buildString { - append("id: 1\n") - append("\n") - append("data: {\"foo\":true}\n") - append("\n") - }, - listOf(sseMessageBuilder().data("{\"foo\":true}").id("1").build()), - ), - EMPTY_DATA( - buildString { - append("data:\n") - append("\n") - }, - listOf(sseMessageBuilder().data("").build()), - ), - DATA_JSON_ESCAPED_DOUBLE_NEW_LINE( - buildString { - append("data: {\n") - append("data: \"foo\":\n") - append("data: true}\n") - append("\n\n") - }, - listOf(sseMessageBuilder().data("{\n\"foo\":\ntrue}").build()), - ), - MULTIPLE_DATA_LINES( - buildString { - append("data: {\n") - append("data: \"foo\":\n") - append("data: true}\n") - append("\n\n") - }, - listOf(sseMessageBuilder().data("{\n\"foo\":\ntrue}").build()), - ), - SPECIAL_NEW_LINE_CHARACTER( - buildString { - append("data: {\"content\":\" culpa\"}\n") - append("\n") - append("data: {\"content\":\" \u2028\"}\n") - append("\n") - append("data: {\"content\":\"foo\"}\n") - append("\n") - }, - listOf( - sseMessageBuilder().data("{\"content\":\" culpa\"}").build(), - sseMessageBuilder().data("{\"content\":\" \u2028\"}").build(), - sseMessageBuilder().data("{\"content\":\"foo\"}").build(), - ), - ), - MULTI_BYTE_CHARACTER( - buildString { - append("data: {\"content\":\"\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0438\"}\n") - append("\n") - }, - listOf(sseMessageBuilder().data("{\"content\":\"известни\"}").build()), - ), - ERROR_PROPERTY( - buildString { - append( - "data: {\"error\":{\"code\":\"code\",\"message\":\"message\",\"param\":\"param\",\"type\":\"type\"}}\n" - ) - append("\n") - }, - expectedException = - SseException.builder() - .statusCode(0) - .headers(Headers.builder().build()) - .error( - ErrorObject.builder() - .code("code") - .message("message") - .param("param") - .type("type") - .build() - ) - .build(), - ), - } - - @ParameterizedTest - @EnumSource - fun handle(testCase: TestCase) { - val response = httpResponse(testCase.body) - var messages: List? = null - var exception: Exception? = null - - try { - messages = - sseHandler(jsonMapper()).handle(response).use { it.stream().collect(toList()) } - } catch (e: Exception) { - exception = e - } - - if (testCase.expectedMessages != null) { - assertThat(messages).containsExactlyElementsOf(testCase.expectedMessages) - } - if (testCase.expectedException != null) { - assertThat(exception).isInstanceOf(testCase.expectedException.javaClass) - assertThat(exception).hasMessage(testCase.expectedException.message) - } - } - - @Test - fun cannotReuseStream() { - val response = httpResponse("body") - val streamResponse = sseHandler(jsonMapper()).handle(response) - - val throwable = - streamResponse.use { - it.stream().collect(toList()) - catchThrowable { it.stream().collect(toList()) } - } - - assertThat(throwable).isInstanceOf(IllegalStateException::class.java) - } -} - -private fun httpResponse(body: String): HttpResponse = - object : HttpResponse { - override fun statusCode(): Int = 0 - - override fun headers(): Headers = Headers.builder().build() - - override fun body(): InputStream = body.toByteArray().inputStream() - - override fun close() {} - } - -private fun sseMessageBuilder() = SseMessage.builder().jsonMapper(jsonMapper()) diff --git a/openai-java-core/src/test/kotlin/com/openai/core/handlers/StreamHandlerTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/handlers/StreamHandlerTest.kt deleted file mode 100644 index 1ebcb16d7..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/handlers/StreamHandlerTest.kt +++ /dev/null @@ -1,94 +0,0 @@ -package com.openai.core.handlers - -import com.openai.core.http.Headers -import com.openai.core.http.HttpResponse -import com.openai.errors.OpenAIIoException -import java.io.IOException -import java.io.InputStream -import kotlin.streams.asSequence -import kotlin.test.Test -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.assertThrows - -internal class StreamHandlerTest { - - @Test - fun streamHandler_splitsStreamOnNewlines() { - val handler = streamHandler { _, lines -> yieldAll(lines) } - val streamResponse = handler.handle(httpResponse("a\nbb\nccc\ndddd".byteInputStream())) - - val lines = streamResponse.stream().asSequence().toList() - - assertThat(lines).containsExactly("a", "bb", "ccc", "dddd") - } - - @Test - fun streamHandler_whenClosedEarly_stopsYielding() { - val handler = streamHandler { _, lines -> yieldAll(lines) } - val streamResponse = handler.handle(httpResponse("a\nbb\nccc\ndddd".byteInputStream())) - - val lines = - streamResponse - .stream() - .asSequence() - .onEach { - if (it == "bb") { - streamResponse.close() - } - } - .toList() - - assertThat(lines).containsExactly("a", "bb") - } - - @Test - fun streamHandler_whenReaderThrowsIOException_wrapsException() { - val handler = streamHandler { _, lines -> lines.forEach {} } - val streamResponse = handler.handle(httpResponse("a\nb\nc\n".byteInputStream().throwing())) - - val e = assertThrows { streamResponse.stream().forEach {} } - assertThat(e).hasMessage("Stream failed") - assertThat(e).hasCauseInstanceOf(IOException::class.java) - } - - @Test - fun streamHandler_whenBlockThrowsIOException_doesNotWrapException() { - val ioException = IOException("BOOM!") - val handler = - streamHandler { _, lines -> - lines.forEachIndexed { index, _ -> - if (index == 2) { - throw ioException - } - } - } - val streamResponse = handler.handle(httpResponse("a\nb\nc\n".byteInputStream())) - - val e = assertThrows { streamResponse.stream().forEach {} } - assertThat(e).isSameAs(ioException) - } - - private fun httpResponse(body: InputStream): HttpResponse = - object : HttpResponse { - - override fun statusCode(): Int = 0 - - override fun headers(): Headers = Headers.builder().build() - - override fun body(): InputStream = body - - override fun close() {} - } - - private fun InputStream.throwing(): InputStream = - object : InputStream() { - - override fun read(): Int { - val byte = this@throwing.read() - if (byte == -1) { - throw IOException("BOOM!") - } - return byte - } - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/http/AsyncStreamResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/http/AsyncStreamResponseTest.kt deleted file mode 100644 index 976bcd6da..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/http/AsyncStreamResponseTest.kt +++ /dev/null @@ -1,268 +0,0 @@ -package com.openai.core.http - -import java.util.* -import java.util.concurrent.CompletableFuture -import java.util.concurrent.Executor -import java.util.stream.Stream -import kotlin.streams.asStream -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.catchThrowable -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertDoesNotThrow -import org.junit.jupiter.api.extension.ExtendWith -import org.mockito.junit.jupiter.MockitoExtension -import org.mockito.kotlin.* - -@ExtendWith(MockitoExtension::class) -internal class AsyncStreamResponseTest { - - companion object { - private val ERROR = RuntimeException("ERROR!") - } - - private val streamResponse = - spy> { - doReturn(Stream.of("chunk1", "chunk2", "chunk3")).whenever(it).stream() - } - private val erroringStreamResponse = - spy> { - doReturn( - sequence { - yield("chunk1") - yield("chunk2") - throw ERROR - } - .asStream() - ) - .whenever(it) - .stream() - } - private val executor = - spy { - doAnswer { invocation -> invocation.getArgument(0).run() } - .whenever(it) - .execute(any()) - } - private val handler = mock>() - - @Test - fun subscribe_whenAlreadySubscribed_throws() { - val asyncStreamResponse = CompletableFuture>().toAsync(executor) - asyncStreamResponse.subscribe {} - - val throwable = catchThrowable { asyncStreamResponse.subscribe {} } - - assertThat(throwable).isInstanceOf(IllegalStateException::class.java) - assertThat(throwable).hasMessage("Cannot subscribe more than once") - verify(executor, never()).execute(any()) - } - - @Test - fun subscribe_whenClosed_throws() { - val asyncStreamResponse = CompletableFuture>().toAsync(executor) - asyncStreamResponse.close() - - val throwable = catchThrowable { asyncStreamResponse.subscribe {} } - - assertThat(throwable).isInstanceOf(IllegalStateException::class.java) - assertThat(throwable).hasMessage("Cannot subscribe after the response is closed") - verify(executor, never()).execute(any()) - } - - @Test - fun subscribe_whenFutureCompletesAfterClose_doesNothing() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - asyncStreamResponse.subscribe(handler) - asyncStreamResponse.close() - - future.complete(streamResponse) - - verify(handler, never()).onNext(any()) - verify(handler, never()).onComplete(any()) - verify(executor, times(1)).execute(any()) - } - - @Test - fun subscribe_whenFutureErrors_callsOnComplete() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - asyncStreamResponse.subscribe(handler) - - future.completeExceptionally(ERROR) - - verify(handler, never()).onNext(any()) - verify(handler, times(1)).onComplete(Optional.of(ERROR)) - verify(executor, times(1)).execute(any()) - } - - @Test - fun subscribe_whenFutureCompletes_runsHandler() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - asyncStreamResponse.subscribe(handler) - - future.complete(streamResponse) - - inOrder(handler, streamResponse) { - verify(handler, times(1)).onNext("chunk1") - verify(handler, times(1)).onNext("chunk2") - verify(handler, times(1)).onNext("chunk3") - verify(handler, times(1)).onComplete(Optional.empty()) - verify(streamResponse, times(1)).close() - } - verify(executor, times(1)).execute(any()) - } - - @Test - fun subscribe_whenStreamErrors_callsOnCompleteEarly() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - asyncStreamResponse.subscribe(handler) - - future.complete(erroringStreamResponse) - - inOrder(handler, erroringStreamResponse) { - verify(handler, times(1)).onNext("chunk1") - verify(handler, times(1)).onNext("chunk2") - verify(handler, times(1)).onComplete(Optional.of(ERROR)) - verify(erroringStreamResponse, times(1)).close() - } - verify(executor, times(1)).execute(any()) - } - - @Test - fun onCompleteFuture_whenStreamResponseFutureNotCompleted_onCompleteFutureNotCompleted() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - - val onCompletableFuture = asyncStreamResponse.onCompleteFuture() - - assertThat(onCompletableFuture).isNotCompleted - } - - @Test - fun onCompleteFuture_whenStreamResponseFutureErrors_onCompleteFutureCompletedExceptionally() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - future.completeExceptionally(ERROR) - - val onCompletableFuture = asyncStreamResponse.onCompleteFuture() - - assertThat(onCompletableFuture).isCompletedExceptionally - } - - @Test - fun onCompleteFuture_whenStreamResponseFutureCompletedButStillStreaming_onCompleteFutureNotCompleted() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - future.complete(streamResponse) - - val onCompletableFuture = asyncStreamResponse.onCompleteFuture() - - assertThat(onCompletableFuture).isNotCompleted - } - - @Test - fun onCompleteFuture_whenStreamResponseFutureCompletedAndStreamErrors_onCompleteFutureCompletedExceptionally() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - asyncStreamResponse.subscribe(handler) - future.complete(erroringStreamResponse) - - val onCompletableFuture = asyncStreamResponse.onCompleteFuture() - - assertThat(onCompletableFuture).isCompletedExceptionally - } - - @Test - fun onCompleteFuture_whenStreamResponseFutureCompletedAndStreamCompleted_onCompleteFutureCompleted() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - asyncStreamResponse.subscribe(handler) - future.complete(streamResponse) - - val onCompletableFuture = asyncStreamResponse.onCompleteFuture() - - assertThat(onCompletableFuture).isCompleted - } - - @Test - fun onCompleteFuture_whenHandlerOnCompleteWithoutThrowableThrows_onCompleteFutureCompleted() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - asyncStreamResponse.subscribe( - object : AsyncStreamResponse.Handler { - override fun onNext(value: String) {} - - override fun onComplete(error: Optional) = throw ERROR - } - ) - future.complete(streamResponse) - - val onCompletableFuture = asyncStreamResponse.onCompleteFuture() - - assertThat(onCompletableFuture).isCompleted - } - - @Test - fun onCompleteFuture_whenHandlerOnCompleteWithThrowableThrows_onCompleteFutureCompletedExceptionally() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - asyncStreamResponse.subscribe( - object : AsyncStreamResponse.Handler { - override fun onNext(value: String) {} - - override fun onComplete(error: Optional) = throw ERROR - } - ) - future.complete(erroringStreamResponse) - - val onCompletableFuture = asyncStreamResponse.onCompleteFuture() - - assertThat(onCompletableFuture).isCompletedExceptionally - } - - @Test - fun onCompleteFuture_whenClosed_onCompleteFutureCompleted() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - asyncStreamResponse.close() - - val onCompletableFuture = asyncStreamResponse.onCompleteFuture() - - assertThat(onCompletableFuture).isCompleted - } - - @Test - fun close_whenNotClosed_closesStreamResponse() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - - asyncStreamResponse.close() - future.complete(streamResponse) - - verify(streamResponse, times(1)).close() - } - - @Test - fun close_whenAlreadyClosed_doesNothing() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - asyncStreamResponse.close() - future.complete(streamResponse) - - asyncStreamResponse.close() - - verify(streamResponse, times(1)).close() - } - - @Test - fun close_whenFutureErrors_doesNothing() { - val future = CompletableFuture>() - val asyncStreamResponse = future.toAsync(executor) - asyncStreamResponse.close() - - assertDoesNotThrow { future.completeExceptionally(ERROR) } - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/http/AuthenticatingHttpClientTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/http/AuthenticatingHttpClientTest.kt deleted file mode 100644 index 4bf8c94e6..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/http/AuthenticatingHttpClientTest.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.openai.core.http - -import java.util.concurrent.TimeUnit -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Assumptions.assumeTrue -import org.junit.jupiter.api.Test -import org.mockito.kotlin.doThrow -import org.mockito.kotlin.mock -import org.mockito.kotlin.verify -import org.mockito.kotlin.whenever - -internal class AuthenticatingHttpClientTest { - - @Test - fun closeClosesDelegateAndSuppressesItsFailureWhenAuthenticatorCloseFails() { - val authenticatorFailure = IllegalStateException("authenticator close failed") - val delegateFailure = IllegalArgumentException("delegate close failed") - val authenticator = mock() - val delegate = mock() - doThrow(authenticatorFailure).whenever(authenticator).close() - doThrow(delegateFailure).whenever(delegate).close() - val client = AuthenticatingHttpClient(delegate, authenticator) - - val thrown = runCatching { client.close() }.exceptionOrNull() - - assertThat(thrown).isSameAs(authenticatorFailure) - assertThat(thrown!!.suppressed).containsExactly(delegateFailure) - verify(delegate).close() - } - - @Test - fun closePropagatesDelegateFailureWhenAuthenticatorClosesSuccessfully() { - val delegateFailure = IllegalStateException("delegate close failed") - val authenticator = mock() - val delegate = mock() - doThrow(delegateFailure).whenever(delegate).close() - val client = AuthenticatingHttpClient(delegate, authenticator) - - val thrown = runCatching { client.close() }.exceptionOrNull() - - assertThat(thrown).isSameAs(delegateFailure) - verify(authenticator).close() - verify(delegate).close() - } - - @Test - fun phantomReachableAuthenticatorWrapperClosesAuthenticator() { - assumeTrue( - runCatching { Class.forName("java.lang.ref.Cleaner") }.isSuccess, - "Cleaner is unavailable before Java 9", - ) - val authenticator = mock() - - PhantomReachableClosingHttpRequestAuthenticator(authenticator) - - val deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(5) - while (System.nanoTime() < deadline) { - System.gc() - if (runCatching { verify(authenticator).close() }.isSuccess) { - return - } - Thread.sleep(10) - } - - verify(authenticator).close() - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/http/ClientOptionsTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/http/ClientOptionsTest.kt deleted file mode 100644 index 26a5e6f49..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/http/ClientOptionsTest.kt +++ /dev/null @@ -1,106 +0,0 @@ -package com.openai.core.http - -import com.openai.azure.AzureUrlPathMode -import com.openai.azure.credential.AzureApiKeyCredential -import com.openai.client.okhttp.OkHttpClient -import com.openai.core.ClientOptions -import com.openai.credential.BearerTokenCredential -import java.util.stream.Stream -import kotlin.test.Test -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.assertThatThrownBy -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.MethodSource - -internal class ClientOptionsTest { - - companion object { - private const val FAKE_API_KEY = "test-api-key" - - @JvmStatic - private fun createOkHttpClient(): OkHttpClient { - return OkHttpClient.builder().build() - } - - @JvmStatic - private fun provideBaseUrls(): Stream { - return Stream.of( - "https://api.openai.com/v1", - "https://example.openai.azure.com", - "https://example.azure-api.net", - ) - } - } - - fun clientOptionsWithoutBaseUrl() { - // Arrange - val apiKey = FAKE_API_KEY - - // Act - val clientOptions = - ClientOptions.builder() - .httpClient(createOkHttpClient()) - .credential(BearerTokenCredential.create(apiKey)) - .build() - - // Assert - assertThat(clientOptions.baseUrl()).isEqualTo(ClientOptions.PRODUCTION_URL) - } - - @ParameterizedTest - @MethodSource("provideBaseUrls") - fun throwExceptionWhenNullCredential(baseUrl: String) { - // Act - val clientOptionsBuilder = - ClientOptions.builder().httpClient(createOkHttpClient()).baseUrl(baseUrl) - - // Assert - assertThatThrownBy { clientOptionsBuilder.build() } - .isInstanceOf(IllegalStateException::class.java) - .hasMessage( - "At least one credential source must be specified: credential (apiKey), workloadIdentity, or adminApiKey" - ) - } - - @Test - fun throwExceptionWhenEmptyCredential() { - assertThatThrownBy { AzureApiKeyCredential.create("") } - .isInstanceOf(IllegalArgumentException::class.java) - .hasMessage("Azure API key cannot be empty.") - } - - @Test - fun azureUrlPathMode_setToLegacy() { - val clientOptions = - ClientOptions.builder() - .httpClient(createOkHttpClient()) - .credential(BearerTokenCredential.create(FAKE_API_KEY)) - .azureUrlPathMode(AzureUrlPathMode.LEGACY) - .build() - - assertThat(clientOptions.azureUrlPathMode).isEqualTo(AzureUrlPathMode.LEGACY) - } - - @Test - fun azureUrlPathMode_setToUnified() { - val clientOptions = - ClientOptions.builder() - .httpClient(createOkHttpClient()) - .credential(BearerTokenCredential.create(FAKE_API_KEY)) - .azureUrlPathMode(AzureUrlPathMode.UNIFIED) - .build() - - assertThat(clientOptions.azureUrlPathMode).isEqualTo(AzureUrlPathMode.UNIFIED) - } - - @Test - fun azureUrlPathMode_defaultsToAuto() { - val clientOptions = - ClientOptions.builder() - .httpClient(createOkHttpClient()) - .credential(BearerTokenCredential.create(FAKE_API_KEY)) - .build() - - assertThat(clientOptions.azureUrlPathMode).isEqualTo(AzureUrlPathMode.AUTO) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/http/HeadersTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/http/HeadersTest.kt deleted file mode 100644 index e88766c6c..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/http/HeadersTest.kt +++ /dev/null @@ -1,242 +0,0 @@ -package com.openai.core.http - -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.EnumSource - -internal class HeadersTest { - - enum class TestCase( - val headers: Headers, - val expectedMap: Map>, - val expectedSize: Int, - ) { - EMPTY(Headers.builder().build(), expectedMap = mapOf(), expectedSize = 0), - PUT_ONE( - Headers.builder().put("name", "value").build(), - expectedMap = mapOf("name" to listOf("value")), - expectedSize = 1, - ), - PUT_MULTIPLE( - Headers.builder().put("name", listOf("value1", "value2")).build(), - expectedMap = mapOf("name" to listOf("value1", "value2")), - expectedSize = 2, - ), - MULTIPLE_PUT( - Headers.builder().put("name1", "value").put("name2", "value").build(), - expectedMap = mapOf("name1" to listOf("value"), "name2" to listOf("value")), - expectedSize = 2, - ), - MULTIPLE_PUT_SAME_NAME( - Headers.builder().put("name", "value1").put("name", "value2").build(), - expectedMap = mapOf("name" to listOf("value1", "value2")), - expectedSize = 2, - ), - MULTIPLE_PUT_MULTIPLE( - Headers.builder() - .put("name", listOf("value1", "value2")) - .put("name", listOf("value1", "value2")) - .build(), - expectedMap = mapOf("name" to listOf("value1", "value2", "value1", "value2")), - expectedSize = 4, - ), - PUT_CASE_INSENSITIVE( - Headers.builder() - .put("name", "value1") - .put("NAME", "value2") - .put("nAmE", "value3") - .build(), - expectedMap = mapOf("name" to listOf("value1", "value2", "value3")), - expectedSize = 3, - ), - PUT_ALL_MAP( - Headers.builder() - .putAll( - mapOf( - "name1" to listOf("value1", "value2"), - "name2" to listOf("value1", "value2"), - ) - ) - .build(), - expectedMap = - mapOf("name1" to listOf("value1", "value2"), "name2" to listOf("value1", "value2")), - expectedSize = 4, - ), - PUT_ALL_HEADERS( - Headers.builder().putAll(Headers.builder().put("name", "value").build()).build(), - expectedMap = mapOf("name" to listOf("value")), - expectedSize = 1, - ), - PUT_ALL_CASE_INSENSITIVE( - Headers.builder() - .putAll( - mapOf( - "name" to listOf("value1"), - "NAME" to listOf("value2"), - "nAmE" to listOf("value3"), - ) - ) - .build(), - expectedMap = mapOf("name" to listOf("value1", "value2", "value3")), - expectedSize = 3, - ), - REMOVE_ABSENT( - Headers.builder().remove("name").build(), - expectedMap = mapOf(), - expectedSize = 0, - ), - REMOVE_PRESENT_ONE( - Headers.builder().put("name", "value").remove("name").build(), - expectedMap = mapOf(), - expectedSize = 0, - ), - REMOVE_PRESENT_MULTIPLE( - Headers.builder().put("name", listOf("value1", "value2")).remove("name").build(), - expectedMap = mapOf(), - expectedSize = 0, - ), - REMOVE_CASE_INSENSITIVE( - Headers.builder().put("name", listOf("value1", "value2")).remove("NAME").build(), - expectedMap = mapOf(), - expectedSize = 0, - ), - REMOVE_ALL( - Headers.builder() - .put("name1", "value") - .put("name3", "value") - .removeAll(setOf("name1", "name2", "name3")) - .build(), - expectedMap = mapOf(), - expectedSize = 0, - ), - REMOVE_ALL_CASE_INSENSITIVE( - Headers.builder() - .put("name1", "value") - .put("name3", "value") - .removeAll(setOf("NAME1", "nAmE3")) - .build(), - expectedMap = mapOf(), - expectedSize = 0, - ), - CLEAR( - Headers.builder().put("name1", "value").put("name2", "value").clear().build(), - expectedMap = mapOf(), - expectedSize = 0, - ), - REPLACE_ONE_ABSENT( - Headers.builder().replace("name", "value").build(), - expectedMap = mapOf("name" to listOf("value")), - expectedSize = 1, - ), - REPLACE_ONE_PRESENT_ONE( - Headers.builder().put("name", "value1").replace("name", "value2").build(), - expectedMap = mapOf("name" to listOf("value2")), - expectedSize = 1, - ), - REPLACE_ONE_PRESENT_MULTIPLE( - Headers.builder() - .put("name", listOf("value1", "value2")) - .replace("name", "value3") - .build(), - expectedMap = mapOf("name" to listOf("value3")), - expectedSize = 1, - ), - REPLACE_MULTIPLE_ABSENT( - Headers.builder().replace("name", listOf("value1", "value2")).build(), - expectedMap = mapOf("name" to listOf("value1", "value2")), - expectedSize = 2, - ), - REPLACE_MULTIPLE_PRESENT_ONE( - Headers.builder() - .put("name", "value1") - .replace("name", listOf("value2", "value3")) - .build(), - expectedMap = mapOf("name" to listOf("value2", "value3")), - expectedSize = 2, - ), - REPLACE_MULTIPLE_PRESENT_MULTIPLE( - Headers.builder() - .put("name", listOf("value1", "value2")) - .replace("name", listOf("value3", "value4")) - .build(), - expectedMap = mapOf("name" to listOf("value3", "value4")), - expectedSize = 2, - ), - REPLACE_CASE_INSENSITIVE( - Headers.builder() - .put("name", "value1") - .replace("NAME", listOf("value2", "value3")) - .build(), - expectedMap = mapOf("NAME" to listOf("value2", "value3")), - expectedSize = 2, - ), - REPLACE_ALL_MAP( - Headers.builder() - .put("name1", "value1") - .put("name2", "value1") - .put("name3", "value1") - .replaceAll(mapOf("name1" to listOf("value2"), "name3" to listOf("value2"))) - .build(), - expectedMap = - mapOf( - "name1" to listOf("value2"), - "name2" to listOf("value1"), - "name3" to listOf("value2"), - ), - expectedSize = 3, - ), - REPLACE_ALL_HEADERS( - Headers.builder() - .put("name1", "value1") - .put("name2", "value1") - .put("name3", "value1") - .replaceAll(Headers.builder().put("name1", "value2").put("name3", "value2").build()) - .build(), - expectedMap = - mapOf( - "name1" to listOf("value2"), - "name2" to listOf("value1"), - "name3" to listOf("value2"), - ), - expectedSize = 3, - ), - REPLACE_ALL_CASE_INSENSITIVE( - Headers.builder() - .put("name1", "value1") - .put("name2", "value1") - .replaceAll(mapOf("NAME1" to listOf("value2"), "nAmE2" to listOf("value2"))) - .build(), - expectedMap = mapOf("NAME1" to listOf("value2"), "nAmE2" to listOf("value2")), - expectedSize = 2, - ), - } - - @ParameterizedTest - @EnumSource - fun namesAndValues(testCase: TestCase) { - val map = mutableMapOf>() - val headers = testCase.headers - headers.names().forEach { name -> map[name] = headers.values(name) } - - assertThat(map).isEqualTo(testCase.expectedMap) - } - - @ParameterizedTest - @EnumSource - fun caseInsensitiveNames(testCase: TestCase) { - val headers = testCase.headers - - for (name in headers.names()) { - assertThat(headers.values(name)).isEqualTo(headers.values(name.lowercase())) - assertThat(headers.values(name)).isEqualTo(headers.values(name.uppercase())) - } - } - - @ParameterizedTest - @EnumSource - fun size(testCase: TestCase) { - val size = testCase.headers.size - - assertThat(size).isEqualTo(testCase.expectedSize) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/http/HttpRequestBodiesTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/http/HttpRequestBodiesTest.kt deleted file mode 100644 index e4281b24b..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/http/HttpRequestBodiesTest.kt +++ /dev/null @@ -1,739 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core.http - -import com.openai.core.MultipartField -import com.openai.core.jsonMapper -import java.io.ByteArrayOutputStream -import java.io.InputStream -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class HttpRequestBodiesTest { - - @Test - fun multipartFormData_serializesFieldWithFilename() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "file" to - MultipartField.builder() - .value("hello") - .filename("hello.txt") - .contentType("text/plain") - .build() - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(output.size().toLong()).isEqualTo(body.contentLength()) - val boundary = body.contentType()!!.substringAfter("multipart/form-data; boundary=") - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="file"; filename="hello.txt" - |Content-Type: text/plain - | - |hello - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_serializesFieldWithoutFilename() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "field" to - MultipartField.builder() - .value("value") - .contentType("text/plain") - .build() - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(output.size().toLong()).isEqualTo(body.contentLength()) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="field" - |Content-Type: text/plain - | - |value - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_serializesInputStream() { - // Use `.buffered()` to get a non-ByteArrayInputStream, which hits the non-repeatable code - // path. - val inputStream = "stream content".byteInputStream().buffered() - val body = - multipartFormData( - jsonMapper(), - mapOf( - "data" to - MultipartField.builder() - .value(inputStream) - .contentType("application/octet-stream") - .build() - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isFalse() - assertThat(body.contentLength()).isEqualTo(-1L) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="data" - |Content-Type: application/octet-stream - | - |stream content - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_serializesByteArray() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "binary" to - MultipartField.builder() - .value("abc".toByteArray()) - .contentType("application/octet-stream") - .build() - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(body.contentLength()).isEqualTo(output.size().toLong()) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="binary" - |Content-Type: application/octet-stream - | - |abc - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_serializesBooleanValue() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "flag" to - MultipartField.builder() - .value(true) - .contentType("text/plain") - .build() - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(body.contentLength()).isEqualTo(output.size().toLong()) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="flag" - |Content-Type: text/plain - | - |true - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_serializesNumberValue() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "count" to - MultipartField.builder().value(42).contentType("text/plain").build() - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(body.contentLength()).isEqualTo(output.size().toLong()) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="count" - |Content-Type: text/plain - | - |42 - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_serializesNullValueAsNoParts() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "present" to - MultipartField.builder() - .value("yes") - .contentType("text/plain") - .build(), - "absent" to - MultipartField.builder() - .value(null as String?) - .contentType("text/plain") - .build(), - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(body.contentLength()).isEqualTo(output.size().toLong()) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="present" - |Content-Type: text/plain - | - |yes - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_serializesArray() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "items" to - MultipartField.builder>() - .value(listOf("alpha", "beta", "gamma")) - .contentType("text/plain") - .build() - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(body.contentLength()).isEqualTo(output.size().toLong()) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="items[]" - |Content-Type: text/plain - | - |alpha - |--$boundary - |Content-Disposition: form-data; name="items[]" - |Content-Type: text/plain - | - |beta - |--$boundary - |Content-Disposition: form-data; name="items[]" - |Content-Type: text/plain - | - |gamma - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_serializesObjectAsNestedParts() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "meta" to - MultipartField.builder>() - .value(mapOf("key1" to "val1", "key2" to "val2")) - .contentType("text/plain") - .build() - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(body.contentLength()).isEqualTo(output.size().toLong()) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="meta[key1]" - |Content-Type: text/plain - | - |val1 - |--$boundary - |Content-Disposition: form-data; name="meta[key2]" - |Content-Type: text/plain - | - |val2 - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_serializesMultipleFields() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "name" to - MultipartField.builder() - .value("Alice") - .contentType("text/plain") - .build(), - "age" to - MultipartField.builder().value(30).contentType("text/plain").build(), - "file" to - MultipartField.builder() - .value("file contents") - .filename("doc.txt") - .contentType("text/plain") - .build(), - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(body.contentLength()).isEqualTo(output.size().toLong()) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="name" - |Content-Type: text/plain - | - |Alice - |--$boundary - |Content-Disposition: form-data; name="age" - |Content-Type: text/plain - | - |30 - |--$boundary - |Content-Disposition: form-data; name="file"; filename="doc.txt" - |Content-Type: text/plain - | - |file contents - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_quotesSpecialCharactersInNameAndFilename() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "field\nname" to - MultipartField.builder() - .value("value") - .filename("file\r\"name.txt") - .contentType("text/plain") - .build() - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(body.contentLength()).isEqualTo(output.size().toLong()) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="field%0Aname"; filename="file%0D%22name.txt" - |Content-Type: text/plain - | - |value - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_writeIsRepeatable() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "field" to - MultipartField.builder() - .value("repeatable") - .contentType("text/plain") - .build() - ), - ) - - val output1 = ByteArrayOutputStream() - body.writeTo(output1) - val output2 = ByteArrayOutputStream() - body.writeTo(output2) - - assertThat(body.repeatable()).isTrue() - assertThat(body.contentLength()).isEqualTo(output1.size().toLong()) - val boundary = boundary(body) - val expected = - """ - |--$boundary - |Content-Disposition: form-data; name="field" - |Content-Type: text/plain - | - |repeatable - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - assertThat(output1.toString("UTF-8")).isEqualTo(expected) - assertThat(output2.toString("UTF-8")).isEqualTo(expected) - } - - @Test - fun multipartFormData_serializesByteArrayInputStream() { - // ByteArrayInputStream is specifically handled as repeatable with known content length. - val inputStream = "byte array stream".byteInputStream() - val body = - multipartFormData( - jsonMapper(), - mapOf( - "data" to - MultipartField.builder() - .value(inputStream) - .contentType("application/octet-stream") - .build() - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(body.contentLength()).isEqualTo(output.size().toLong()) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="data" - |Content-Type: application/octet-stream - | - |byte array stream - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_serializesInputStreamWithFilename() { - // Use `.buffered()` to get a non-ByteArrayInputStream, which hits the non-repeatable code - // path. - val inputStream = "file data".byteInputStream().buffered() - val body = - multipartFormData( - jsonMapper(), - mapOf( - "upload" to - MultipartField.builder() - .value(inputStream) - .filename("upload.bin") - .contentType("application/octet-stream") - .build() - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isFalse() - assertThat(body.contentLength()).isEqualTo(-1L) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="upload"; filename="upload.bin" - |Content-Type: application/octet-stream - | - |file data - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_serializesNestedArrayInObject() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "data" to - MultipartField.builder>>() - .value(mapOf("tags" to listOf("a", "b"))) - .contentType("text/plain") - .build() - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(body.contentLength()).isEqualTo(output.size().toLong()) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="data[tags][]" - |Content-Type: text/plain - | - |a - |--$boundary - |Content-Disposition: form-data; name="data[tags][]" - |Content-Type: text/plain - | - |b - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_contentLengthIsUnknownWhenInputStreamPresent() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "text" to - MultipartField.builder() - .value("hello") - .contentType("text/plain") - .build(), - "stream" to - MultipartField.builder() - // Use `.buffered()` to get a non-ByteArrayInputStream, which hits the - // non-repeatable code path. - .value("data".byteInputStream().buffered()) - .contentType("application/octet-stream") - .build(), - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isFalse() - assertThat(body.contentLength()).isEqualTo(-1L) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="text" - |Content-Type: text/plain - | - |hello - |--$boundary - |Content-Disposition: form-data; name="stream" - |Content-Type: application/octet-stream - | - |data - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_serializesEmptyArray() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "required" to - MultipartField.builder() - .value("present") - .contentType("text/plain") - .build(), - "items" to - MultipartField.builder>() - .value(emptyList()) - .contentType("text/plain") - .build(), - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(body.contentLength()).isEqualTo(output.size().toLong()) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="required" - |Content-Type: text/plain - | - |present - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - @Test - fun multipartFormData_serializesEmptyObject() { - val body = - multipartFormData( - jsonMapper(), - mapOf( - "required" to - MultipartField.builder() - .value("present") - .contentType("text/plain") - .build(), - "meta" to - MultipartField.builder>() - .value(emptyMap()) - .contentType("text/plain") - .build(), - ), - ) - - val output = ByteArrayOutputStream() - body.writeTo(output) - - assertThat(body.repeatable()).isTrue() - assertThat(body.contentLength()).isEqualTo(output.size().toLong()) - val boundary = boundary(body) - assertThat(output.toString("UTF-8")) - .isEqualTo( - """ - |--$boundary - |Content-Disposition: form-data; name="required" - |Content-Type: text/plain - | - |present - |--$boundary-- - | - """ - .trimMargin() - .replace("\n", "\r\n") - ) - } - - private fun boundary(body: HttpRequestBody): String = - body.contentType()!!.substringAfter("multipart/form-data; boundary=") -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/http/HttpRequestTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/http/HttpRequestTest.kt deleted file mode 100644 index 7a0fa54ce..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/http/HttpRequestTest.kt +++ /dev/null @@ -1,110 +0,0 @@ -package com.openai.core.http - -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.EnumSource - -internal class HttpRequestTest { - - enum class UrlTestCase(val request: HttpRequest, val expectedUrl: String) { - BASE_URL_ONLY( - HttpRequest.builder().method(HttpMethod.GET).baseUrl("https://api.example.com").build(), - expectedUrl = "https://api.example.com", - ), - BASE_URL_WITH_TRAILING_SLASH( - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com/") - .build(), - expectedUrl = "https://api.example.com/", - ), - SINGLE_PATH_SEGMENT( - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com") - .addPathSegment("users") - .build(), - expectedUrl = "https://api.example.com/users", - ), - MULTIPLE_PATH_SEGMENTS( - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com") - .addPathSegments("users", "123", "profile") - .build(), - expectedUrl = "https://api.example.com/users/123/profile", - ), - PATH_SEGMENT_WITH_SPECIAL_CHARS( - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com") - .addPathSegment("user name") - .build(), - expectedUrl = "https://api.example.com/user+name", - ), - SINGLE_QUERY_PARAM( - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com") - .addPathSegment("users") - .putQueryParam("limit", "10") - .build(), - expectedUrl = "https://api.example.com/users?limit=10", - ), - MULTIPLE_QUERY_PARAMS( - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com") - .addPathSegment("users") - .putQueryParam("limit", "10") - .putQueryParam("offset", "20") - .build(), - expectedUrl = "https://api.example.com/users?limit=10&offset=20", - ), - QUERY_PARAM_WITH_SPECIAL_CHARS( - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com") - .addPathSegment("search") - .putQueryParam("q", "hello world") - .build(), - expectedUrl = "https://api.example.com/search?q=hello+world", - ), - MULTIPLE_VALUES_SAME_PARAM( - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com") - .addPathSegment("users") - .putQueryParams("tags", listOf("admin", "user")) - .build(), - expectedUrl = "https://api.example.com/users?tags=admin&tags=user", - ), - BASE_URL_WITH_TRAILING_SLASH_AND_PATH( - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com/") - .addPathSegment("users") - .build(), - expectedUrl = "https://api.example.com/users", - ), - COMPLEX_URL( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl("https://api.example.com") - .addPathSegments("v1", "users", "123") - .putQueryParams("include", listOf("profile", "settings")) - .putQueryParam("format", "json") - .build(), - expectedUrl = - "https://api.example.com/v1/users/123?include=profile&include=settings&format=json", - ), - } - - @ParameterizedTest - @EnumSource - fun url(testCase: UrlTestCase) { - val actualUrl = testCase.request.url() - - assertThat(actualUrl).isEqualTo(testCase.expectedUrl) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/http/LoggingHttpClientTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/http/LoggingHttpClientTest.kt deleted file mode 100644 index 0ca2eb9a2..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/http/LoggingHttpClientTest.kt +++ /dev/null @@ -1,1013 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core.http - -import com.openai.core.LogLevel -import com.openai.core.RequestOptions -import java.io.ByteArrayInputStream -import java.io.ByteArrayOutputStream -import java.io.IOException -import java.io.InputStream -import java.io.OutputStream -import java.io.PrintStream -import java.nio.charset.StandardCharsets -import java.time.Clock -import java.time.Instant -import java.time.ZoneOffset -import java.util.concurrent.CompletableFuture -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.assertThatThrownBy -import org.junit.jupiter.api.AfterEach -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.parallel.ResourceLock -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import org.slf4j.LoggerFactory - -@ResourceLock("stderr") -internal class LoggingHttpClientTest { - - private lateinit var originalErr: PrintStream - private lateinit var errContent: ByteArrayOutputStream - - @BeforeEach - fun beforeEach() { - // Initialize SLF4J before redirecting stderr so its one-time diagnostics cannot - // contaminate these assertions under parallel test execution. - LoggerFactory.getILoggerFactory() - originalErr = System.err - errContent = ByteArrayOutputStream() - System.setErr(PrintStream(errContent)) - } - - @AfterEach - fun afterEach() { - System.setErr(originalErr) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun offLevel_noOutput(async: Boolean) { - val client = loggingClient(fakeHttpClient(), LogLevel.OFF) - - val response = client.execute(simpleGetRequest(), async).apply { body().readBytes() } - - assertThat(response.statusCode()).isEqualTo(200) - assertThat(stderrOutput()).isEmpty() - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun infoLevel_logsGetRequest(async: Boolean) { - val client = loggingClient(fakeHttpClient(), LogLevel.INFO) - - client.execute(simpleGetRequest(), async).body().readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |<-- 200 (0s) - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun infoLevel_logsPostRequestWithBodySize(async: Boolean) { - val client = loggingClient(fakeHttpClient(), LogLevel.INFO) - - client.execute(postRequestWithBody("""{"key":"value"}"""), async).body().readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> POST https://api.example.com/v1/resources (15-byte body) - |<-- 200 (0s) - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun infoLevel_logsRequestWithUnknownLengthBody(async: Boolean) { - val client = loggingClient(fakeHttpClient(), LogLevel.INFO) - - client - .execute(postRequestWithBody("""{"key":"value"}""", contentLength = -1L), async) - .body() - .readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> POST https://api.example.com/v1/resources (unknown-length body) - |<-- 200 (0s) - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun infoLevel_logsResponseStatusAndDuration(async: Boolean) { - val clock = - clockFrom( - Instant.parse("1998-04-21T00:00:00Z"), - Instant.parse("1998-04-21T00:00:01.234Z"), - ) - val client = loggingClient(fakeHttpClient(statusCode = 201), LogLevel.INFO, clock) - - client.execute(simpleGetRequest(), async).body().readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |<-- 201 (1s 234ms) - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun infoLevel_logsResponseContentLength(async: Boolean) { - val headers = - Headers.builder().put("Content-Length", "42").put("Content-Type", "text/plain").build() - val client = loggingClient(fakeHttpClient(responseHeaders = headers), LogLevel.INFO) - - client.execute(simpleGetRequest(), async).body().readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |<-- 200 (0s, 42-byte body) - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun infoLevel_doesNotLogHeaders(async: Boolean) { - val headers = Headers.builder().put("X-Custom", "visible").build() - val client = loggingClient(fakeHttpClient(responseHeaders = headers), LogLevel.INFO) - - client - .execute( - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com") - .addPathSegment("v1") - .putHeader("X-Request-Custom", "req-value") - .build(), - async, - ) - .body() - .readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1 - |<-- 200 (0s) - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_logsGetWithEndMarker(async: Boolean) { - val client = loggingClient(fakeHttpClient(), LogLevel.DEBUG) - - client.execute(simpleGetRequest(), async).body().readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |--> END GET - | - |<-- 200 (0s) - |<-- END HTTP (0-byte body) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_logsRequestAndResponseHeaders(async: Boolean) { - val responseHeaders = - Headers.builder() - .put("X-Response-Id", "abc-123") - .put("Content-Type", "text/plain") - .build() - val client = - loggingClient(fakeHttpClient(responseHeaders = responseHeaders), LogLevel.DEBUG) - - client - .execute( - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com") - .addPathSegment("test") - .putHeader("X-Custom", "my-value") - .build(), - async, - ) - .body() - .readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/test - |X-Custom: my-value - |--> END GET - | - |<-- 200 (0s) - |Content-Type: text/plain - |X-Response-Id: abc-123 - |<-- END HTTP (0-byte body) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_redactsSensitiveHeaders(async: Boolean) { - val client = - loggingClient( - fakeHttpClient(), - LogLevel.DEBUG, - redactedHeaders = setOf("Authorization", "X-Amz-Security-Token", "X-Secret"), - ) - - client - .execute( - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com") - .addPathSegment("test") - .putHeader("Authorization", "Bearer token-123") - .putHeader("X-Amz-Security-Token", "aws-session-token") - .putHeader("X-Secret", "secret-value") - .putHeader("X-Public", "public-value") - .build(), - async, - ) - .body() - .readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/test - |Authorization: ██ - |X-Amz-Security-Token: ██ - |X-Public: public-value - |X-Secret: ██ - |--> END GET - | - |<-- 200 (0s) - |<-- END HTTP (0-byte body) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_redactsHeadersCaseInsensitively(async: Boolean) { - val client = - loggingClient( - fakeHttpClient(), - LogLevel.DEBUG, - redactedHeaders = setOf("Authorization"), - ) - - client - .execute( - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com") - .addPathSegment("test") - .putHeader("authorization", "Bearer secret") - .build(), - async, - ) - .body() - .readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/test - |authorization: ██ - |--> END GET - | - |<-- 200 (0s) - |<-- END HTTP (0-byte body) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_logsRequestBody(async: Boolean) { - val client = loggingClient(fakeHttpClient(), LogLevel.DEBUG) - val body = """{"name":"test","value":42}""" - - client.execute(postRequestWithBody(body), async).body().readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> POST https://api.example.com/v1/resources (26-byte body) - | - |{"name":"test","value":42} - |--> END POST (26-byte body) - | - |<-- 200 (0s) - |<-- END HTTP (0-byte body) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_logsResponseBody(async: Boolean) { - val responseBody = """{"id":1,"status":"ok"}""" - val headers = Headers.builder().put("Content-Type", "application/json").build() - val client = - loggingClient( - fakeHttpClient( - responseHeaders = headers, - responseBody = responseBody.toByteArray(StandardCharsets.UTF_8), - ), - LogLevel.DEBUG, - ) - - val response = client.execute(simpleGetRequest(), async) - val body = response.body().readBytes().toString(StandardCharsets.UTF_8) - - assertThat(body).isEqualTo(responseBody) - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |--> END GET - | - |<-- 200 (0s) - |Content-Type: application/json - | - |{"id":1,"status":"ok"} - |<-- END HTTP (22-byte body) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_logsBinaryResponseBodyAsOmitted(async: Boolean) { - val binaryBody = ByteArray(256) { it.toByte() } - val client = loggingClient(fakeHttpClient(responseBody = binaryBody), LogLevel.DEBUG) - - client.execute(simpleGetRequest(), async).body().readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |--> END GET - | - |<-- 200 (0s) - | - |(binary body omitted) - |<-- END HTTP (256-byte body) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_logsMultilineResponseBody(async: Boolean) { - val multilineBody = "line1\nline2\nline3" - val headers = Headers.builder().put("Content-Type", "text/plain; charset=utf-8").build() - val client = - loggingClient( - fakeHttpClient( - responseHeaders = headers, - responseBody = multilineBody.toByteArray(StandardCharsets.UTF_8), - ), - LogLevel.DEBUG, - ) - - client.execute(simpleGetRequest(), async).body().readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |--> END GET - | - |<-- 200 (0s) - |Content-Type: text/plain; charset=utf-8 - | - |line1 - |line2 - |line3 - |<-- END HTTP (17-byte body) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_logsResponseBodyWithExplicitCharset(async: Boolean) { - val responseBody = "héllo wörld" - val headers = Headers.builder().put("Content-Type", "text/plain; charset=utf-8").build() - val client = - loggingClient( - fakeHttpClient( - responseHeaders = headers, - responseBody = responseBody.toByteArray(StandardCharsets.UTF_8), - ), - LogLevel.DEBUG, - ) - - client.execute(simpleGetRequest(), async).body().readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |--> END GET - | - |<-- 200 (0s) - |Content-Type: text/plain; charset=utf-8 - | - |héllo wörld - |<-- END HTTP (13-byte body) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_logsResponseBodyWithNoContentType(async: Boolean) { - val responseBody = "plain text body" - val client = - loggingClient( - fakeHttpClient(responseBody = responseBody.toByteArray(StandardCharsets.UTF_8)), - LogLevel.DEBUG, - ) - - client.execute(simpleGetRequest(), async).body().readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |--> END GET - | - |<-- 200 (0s) - | - |plain text body - |<-- END HTTP (15-byte body) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_logsEmptyResponseBody(async: Boolean) { - val client = loggingClient(fakeHttpClient(), LogLevel.DEBUG) - - client.execute(simpleGetRequest(), async).body().readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |--> END GET - | - |<-- 200 (0s) - |<-- END HTTP (0-byte body) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_logsEndHttpMarkerOnEarlyClose(async: Boolean) { - val responseBody = """{"id":1,"status":"ok"}""" - val headers = Headers.builder().put("Content-Type", "application/json").build() - val client = - loggingClient( - fakeHttpClient( - responseHeaders = headers, - responseBody = responseBody.toByteArray(StandardCharsets.UTF_8), - ), - LogLevel.DEBUG, - ) - - val body = client.execute(simpleGetRequest(), async).body() - body.read(ByteArray(5)) - body.close() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |--> END GET - | - |<-- 200 (0s) - |Content-Type: application/json - | - |{"id" - |<-- END HTTP (5-byte body, closed early) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_logsEndHttpMarkerOnCloseWithoutReading(async: Boolean) { - val responseBody = """{"id":1,"status":"ok"}""" - val headers = Headers.builder().put("Content-Type", "application/json").build() - val client = - loggingClient( - fakeHttpClient( - responseHeaders = headers, - responseBody = responseBody.toByteArray(StandardCharsets.UTF_8), - ), - LogLevel.DEBUG, - ) - - client.execute(simpleGetRequest(), async).body().close() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |--> END GET - | - |<-- 200 (0s) - |Content-Type: application/json - |<-- END HTTP (0-byte body, closed early) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_logsEndHttpMarkerWhenResponseClosedAfterPartialRead(async: Boolean) { - val responseBody = """{"id":1,"status":"ok"}""" - val headers = Headers.builder().put("Content-Type", "application/json").build() - val client = - loggingClient( - fakeHttpClient( - responseHeaders = headers, - responseBody = responseBody.toByteArray(StandardCharsets.UTF_8), - ), - LogLevel.DEBUG, - ) - - val response = client.execute(simpleGetRequest(), async) - response.body().read(ByteArray(5)) - response.close() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |--> END GET - | - |<-- 200 (0s) - |Content-Type: application/json - | - |{"id" - |<-- END HTTP (5-byte body, closed early) - | - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_doesNotLogEndHttpMarkerWhenResponseClosedWithoutBodyAccess(async: Boolean) { - val responseBody = """{"id":1,"status":"ok"}""" - val headers = Headers.builder().put("Content-Type", "application/json").build() - val client = - loggingClient( - fakeHttpClient( - responseHeaders = headers, - responseBody = responseBody.toByteArray(StandardCharsets.UTF_8), - ), - LogLevel.DEBUG, - ) - - client.execute(simpleGetRequest(), async).close() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |--> END GET - | - |<-- 200 (0s) - |Content-Type: application/json - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun errorLevel_logsRequestFailure(async: Boolean) { - val clock = - clockFrom( - Instant.parse("1998-04-21T00:00:00Z"), - Instant.parse("1998-04-21T00:00:01.234Z"), - ) - val client = - loggingClient( - failingHttpClient(IOException("Connection refused")), - LogLevel.ERROR, - clock, - ) - - assertThatThrownBy { client.execute(simpleGetRequest(), async) } - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |<-- !! IOException: Connection refused (1s 234ms) - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun infoLevel_doesNotLogRequestFailure(async: Boolean) { - val client = - loggingClient(failingHttpClient(IOException("Connection refused")), LogLevel.INFO) - - assertThatThrownBy { client.execute(simpleGetRequest(), async) } - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun debugLevel_logsRequestFailureAfterHeaders(async: Boolean) { - val client = - loggingClient(failingHttpClient(IOException("Connection refused")), LogLevel.DEBUG) - - assertThatThrownBy { client.execute(simpleGetRequest(), async) } - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |--> END GET - | - |<-- !! IOException: Connection refused (0s) - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun errorLevel_logsRequestFailureWithoutMessage(async: Boolean) { - val client = loggingClient(failingHttpClient(IOException()), LogLevel.ERROR) - - assertThatThrownBy { client.execute(simpleGetRequest(), async) } - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |<-- !! IOException (0s) - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun offLevel_doesNotLogRequestFailure(async: Boolean) { - val client = - loggingClient(failingHttpClient(IOException("Connection refused")), LogLevel.OFF) - - assertThatThrownBy { client.execute(simpleGetRequest(), async) } - - assertThat(stderrOutput()).isEmpty() - } - - @Test - fun errorLevel_logsExecuteAsyncSynchronousThrow() { - val error = IOException("Connection refused") - val client = - loggingClient( - object : HttpClient { - override fun execute( - request: HttpRequest, - requestOptions: RequestOptions, - ): HttpResponse = throw UnsupportedOperationException() - - override fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture = throw error - - override fun close() {} - }, - LogLevel.ERROR, - ) - - assertThatThrownBy { client.execute(simpleGetRequest(), async = true) }.isSameAs(error) - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |<-- !! IOException: Connection refused (0s) - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun durationFormat_seconds(async: Boolean) { - val clock = - clockFrom( - Instant.parse("1998-04-21T00:00:00Z"), - Instant.parse("1998-04-21T00:00:02.500Z"), - ) - val client = loggingClient(fakeHttpClient(), LogLevel.INFO, clock) - - client.execute(simpleGetRequest(), async).body().readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |<-- 200 (2s 500ms) - |""" - .trimMargin() - ) - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun durationFormat_minutesAndSeconds(async: Boolean) { - val clock = - clockFrom( - Instant.parse("1998-04-21T00:00:00Z"), - Instant.parse("1998-04-21T00:01:40.467Z"), - ) - val client = loggingClient(fakeHttpClient(), LogLevel.INFO, clock) - - client.execute(simpleGetRequest(), async).body().readBytes() - - assertThat(stderrOutput()) - .isEqualTo( - """ - |--> GET https://api.example.com/v1/resources - |<-- 200 (1m 40s 467ms) - |""" - .trimMargin() - ) - } - - @Test - fun builder_toBuilder_roundtrips() { - val delegate = fakeHttpClient() - val clock = Clock.fixed(Instant.parse("1998-04-21T00:00:00Z"), ZoneOffset.UTC) - val client = - LoggingHttpClient.builder() - .httpClient(delegate) - .level(LogLevel.DEBUG) - .redactedHeaders(setOf("X-Secret")) - .clock(clock) - .build() - - val rebuilt = client.toBuilder().build() - - assertThat(rebuilt.httpClient).isSameAs(delegate) - assertThat(rebuilt.level).isEqualTo(LogLevel.DEBUG) - assertThat(rebuilt.redactedHeaders).containsExactly("X-Secret") - assertThat(rebuilt.clock).isEqualTo(clock) - } - - @Test - fun close_delegatesToUnderlyingClient() { - var closed = false - val delegate = - object : HttpClient { - override fun execute( - request: HttpRequest, - requestOptions: RequestOptions, - ): HttpResponse = throw UnsupportedOperationException() - - override fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture = throw UnsupportedOperationException() - - override fun close() { - closed = true - } - } - val client = loggingClient(delegate, LogLevel.OFF) - - client.close() - - assertThat(closed).isTrue() - } - - private fun stderrOutput(): String = errContent.toString("UTF-8") - - private fun loggingClient( - httpClient: HttpClient, - level: LogLevel, - clock: Clock = clockFrom(Instant.parse("1998-04-21T00:00:00Z")), - redactedHeaders: Set = - setOf( - "authorization", - "api-key", - "x-api-key", - "x-amz-security-token", - "cookie", - "set-cookie", - ), - ): LoggingHttpClient = - LoggingHttpClient.builder() - .httpClient(httpClient) - .level(level) - .clock(clock) - .redactedHeaders(redactedHeaders) - .build() - - private fun simpleGetRequest(): HttpRequest = - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.example.com") - .addPathSegment("v1") - .addPathSegment("resources") - .build() - - private fun postRequestWithBody( - body: String, - contentType: String = "application/json", - contentLength: Long? = null, - ): HttpRequest = - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl("https://api.example.com") - .addPathSegment("v1") - .addPathSegment("resources") - .body( - object : HttpRequestBody { - private val bytes = body.toByteArray(StandardCharsets.UTF_8) - - override fun writeTo(outputStream: OutputStream) { - outputStream.write(bytes) - } - - override fun contentType(): String = contentType - - override fun contentLength(): Long = contentLength ?: bytes.size.toLong() - - override fun repeatable(): Boolean = true - - override fun close() {} - } - ) - .build() - - private fun fakeHttpClient( - statusCode: Int = 200, - responseHeaders: Headers = Headers.builder().build(), - responseBody: ByteArray = ByteArray(0), - ): HttpClient = - object : HttpClient { - override fun execute( - request: HttpRequest, - requestOptions: RequestOptions, - ): HttpResponse { - // Consume the request body if present to trigger logging. - request.body?.let { - val out = ByteArrayOutputStream() - it.writeTo(out) - } - return fakeResponse(statusCode, responseHeaders, responseBody) - } - - override fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture = - CompletableFuture.completedFuture(execute(request, requestOptions)) - - override fun close() {} - } - - private fun failingHttpClient(error: Throwable): HttpClient = - object : HttpClient { - override fun execute( - request: HttpRequest, - requestOptions: RequestOptions, - ): HttpResponse { - request.body?.let { - val out = ByteArrayOutputStream() - it.writeTo(out) - } - throw error - } - - override fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture { - val future = CompletableFuture() - future.completeExceptionally(error) - return future - } - - override fun close() {} - } - - private fun fakeResponse(statusCode: Int, headers: Headers, body: ByteArray): HttpResponse = - object : HttpResponse { - override fun statusCode(): Int = statusCode - - override fun headers(): Headers = headers - - override fun body(): InputStream = ByteArrayInputStream(body) - - override fun close() {} - } - - private fun clockFrom(vararg instants: Instant): Clock = - object : Clock() { - private var index = 0 - - override fun getZone() = ZoneOffset.UTC - - override fun withZone(zone: java.time.ZoneId?) = this - - override fun instant(): Instant { - val instant = instants[index % instants.size] - index++ - return instant - } - } - - private fun HttpClient.execute(request: HttpRequest, async: Boolean): HttpResponse = - if (async) executeAsync(request).get() else execute(request) -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/http/QueryParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/http/QueryParamsTest.kt deleted file mode 100644 index 0305b2774..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/http/QueryParamsTest.kt +++ /dev/null @@ -1,180 +0,0 @@ -package com.openai.core.http - -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.EnumSource - -internal class QueryParamsTest { - - enum class TestCase( - val queryParams: QueryParams, - val expectedMap: Map>, - val expectedSize: Int, - ) { - EMPTY(QueryParams.builder().build(), expectedMap = mapOf(), expectedSize = 0), - PUT_ONE( - QueryParams.builder().put("key", "value").build(), - expectedMap = mapOf("key" to listOf("value")), - expectedSize = 1, - ), - PUT_MULTIPLE( - QueryParams.builder().put("key", listOf("value1", "value2")).build(), - expectedMap = mapOf("key" to listOf("value1", "value2")), - expectedSize = 2, - ), - MULTIPLE_PUT( - QueryParams.builder().put("key1", "value").put("key2", "value").build(), - expectedMap = mapOf("key1" to listOf("value"), "key2" to listOf("value")), - expectedSize = 2, - ), - MULTIPLE_PUT_SAME_NAME( - QueryParams.builder().put("key", "value1").put("key", "value2").build(), - expectedMap = mapOf("key" to listOf("value1", "value2")), - expectedSize = 2, - ), - MULTIPLE_PUT_MULTIPLE( - QueryParams.builder() - .put("key", listOf("value1", "value2")) - .put("key", listOf("value1", "value2")) - .build(), - expectedMap = mapOf("key" to listOf("value1", "value2", "value1", "value2")), - expectedSize = 4, - ), - PUT_ALL_MAP( - QueryParams.builder() - .putAll( - mapOf( - "key1" to listOf("value1", "value2"), - "key2" to listOf("value1", "value2"), - ) - ) - .build(), - expectedMap = - mapOf("key1" to listOf("value1", "value2"), "key2" to listOf("value1", "value2")), - expectedSize = 4, - ), - PUT_ALL_HEADERS( - QueryParams.builder().putAll(QueryParams.builder().put("key", "value").build()).build(), - expectedMap = mapOf("key" to listOf("value")), - expectedSize = 1, - ), - REMOVE_ABSENT( - QueryParams.builder().remove("key").build(), - expectedMap = mapOf(), - expectedSize = 0, - ), - REMOVE_PRESENT_ONE( - QueryParams.builder().put("key", "value").remove("key").build(), - expectedMap = mapOf(), - expectedSize = 0, - ), - REMOVE_PRESENT_MULTIPLE( - QueryParams.builder().put("key", listOf("value1", "value2")).remove("key").build(), - expectedMap = mapOf(), - expectedSize = 0, - ), - REMOVE_ALL( - QueryParams.builder() - .put("key1", "value") - .put("key3", "value") - .removeAll(setOf("key1", "key2", "key3")) - .build(), - expectedMap = mapOf(), - expectedSize = 0, - ), - CLEAR( - QueryParams.builder().put("key1", "value").put("key2", "value").clear().build(), - expectedMap = mapOf(), - expectedSize = 0, - ), - REPLACE_ONE_ABSENT( - QueryParams.builder().replace("key", "value").build(), - expectedMap = mapOf("key" to listOf("value")), - expectedSize = 1, - ), - REPLACE_ONE_PRESENT_ONE( - QueryParams.builder().put("key", "value1").replace("key", "value2").build(), - expectedMap = mapOf("key" to listOf("value2")), - expectedSize = 1, - ), - REPLACE_ONE_PRESENT_MULTIPLE( - QueryParams.builder() - .put("key", listOf("value1", "value2")) - .replace("key", "value3") - .build(), - expectedMap = mapOf("key" to listOf("value3")), - expectedSize = 1, - ), - REPLACE_MULTIPLE_ABSENT( - QueryParams.builder().replace("key", listOf("value1", "value2")).build(), - expectedMap = mapOf("key" to listOf("value1", "value2")), - expectedSize = 2, - ), - REPLACE_MULTIPLE_PRESENT_ONE( - QueryParams.builder() - .put("key", "value1") - .replace("key", listOf("value2", "value3")) - .build(), - expectedMap = mapOf("key" to listOf("value2", "value3")), - expectedSize = 2, - ), - REPLACE_MULTIPLE_PRESENT_MULTIPLE( - QueryParams.builder() - .put("key", listOf("value1", "value2")) - .replace("key", listOf("value3", "value4")) - .build(), - expectedMap = mapOf("key" to listOf("value3", "value4")), - expectedSize = 2, - ), - REPLACE_ALL_MAP( - QueryParams.builder() - .put("key1", "value1") - .put("key2", "value1") - .put("key3", "value1") - .replaceAll(mapOf("key1" to listOf("value2"), "key3" to listOf("value2"))) - .build(), - expectedMap = - mapOf( - "key1" to listOf("value2"), - "key2" to listOf("value1"), - "key3" to listOf("value2"), - ), - expectedSize = 3, - ), - REPLACE_ALL_HEADERS( - QueryParams.builder() - .put("key1", "value1") - .put("key2", "value1") - .put("key3", "value1") - .replaceAll( - QueryParams.builder().put("key1", "value2").put("key3", "value2").build() - ) - .build(), - expectedMap = - mapOf( - "key1" to listOf("value2"), - "key2" to listOf("value1"), - "key3" to listOf("value2"), - ), - expectedSize = 3, - ), - } - - @ParameterizedTest - @EnumSource - fun keysAndValues(testCase: TestCase) { - val map = mutableMapOf>() - val queryParams = testCase.queryParams - queryParams.keys().forEach { key -> map[key] = queryParams.values(key) } - - assertThat(map).isEqualTo(testCase.expectedMap) - } - - @ParameterizedTest - @EnumSource - fun size(testCase: TestCase) { - val size = testCase.queryParams.size - - assertThat(size).isEqualTo(testCase.expectedSize) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/http/RetryingHttpClientTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/http/RetryingHttpClientTest.kt deleted file mode 100644 index 21834efab..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/http/RetryingHttpClientTest.kt +++ /dev/null @@ -1,525 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.core.http - -import com.github.tomakehurst.wiremock.client.WireMock.equalTo -import com.github.tomakehurst.wiremock.client.WireMock.matching -import com.github.tomakehurst.wiremock.client.WireMock.ok -import com.github.tomakehurst.wiremock.client.WireMock.post -import com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor -import com.github.tomakehurst.wiremock.client.WireMock.resetAllScenarios -import com.github.tomakehurst.wiremock.client.WireMock.serviceUnavailable -import com.github.tomakehurst.wiremock.client.WireMock.stubFor -import com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo -import com.github.tomakehurst.wiremock.client.WireMock.verify -import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo -import com.github.tomakehurst.wiremock.junit5.WireMockTest -import com.github.tomakehurst.wiremock.stubbing.Scenario -import com.openai.client.okhttp.OkHttpClient -import com.openai.core.RequestOptions -import com.openai.core.Sleeper -import com.openai.errors.OpenAIRetryableException -import java.io.InputStream -import java.time.Clock -import java.time.Duration -import java.time.OffsetDateTime -import java.time.ZoneOffset -import java.time.format.DateTimeFormatter -import java.util.concurrent.CompletableFuture -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.parallel.ResourceLock -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource - -@WireMockTest -@ResourceLock("https://github.com/wiremock/wiremock/issues/169") -internal class RetryingHttpClientTest { - - private var openResponseCount = 0 - private lateinit var baseUrl: String - private lateinit var httpClient: HttpClient - - private class RecordingSleeper : Sleeper { - val durations = mutableListOf() - - override fun sleep(duration: Duration) { - durations.add(duration) - } - - override fun sleepAsync(duration: Duration): CompletableFuture { - durations.add(duration) - return CompletableFuture.completedFuture(null) - } - - override fun close() {} - } - - @BeforeEach - fun beforeEach(wmRuntimeInfo: WireMockRuntimeInfo) { - baseUrl = wmRuntimeInfo.httpBaseUrl - val okHttpClient = OkHttpClient.builder().build() - httpClient = - object : HttpClient { - - override fun execute( - request: HttpRequest, - requestOptions: RequestOptions, - ): HttpResponse = trackClose(okHttpClient.execute(request, requestOptions)) - - override fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture = - okHttpClient.executeAsync(request, requestOptions).thenApply { trackClose(it) } - - override fun close() = okHttpClient.close() - - private fun trackClose(response: HttpResponse): HttpResponse { - openResponseCount++ - return object : HttpResponse { - - private var isClosed = false - - override fun statusCode(): Int = response.statusCode() - - override fun headers(): Headers = response.headers() - - override fun body(): InputStream = response.body() - - override fun close() { - response.close() - if (isClosed) { - return - } - openResponseCount-- - isClosed = true - } - } - } - } - resetAllScenarios() - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun execute(async: Boolean) { - stubFor(post(urlPathEqualTo("/something")).willReturn(ok())) - val sleeper = RecordingSleeper() - val retryingClient = retryingHttpClientBuilder(sleeper).build() - - val response = - retryingClient.execute( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(baseUrl) - .addPathSegment("something") - .build(), - async, - ) - - assertThat(response.statusCode()).isEqualTo(200) - verify(1, postRequestedFor(urlPathEqualTo("/something"))) - assertThat(sleeper.durations).isEmpty() - assertNoResponseLeaks() - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun execute_withIdempotencyHeader(async: Boolean) { - stubFor( - post(urlPathEqualTo("/something")) - .withHeader("X-Some-Header", matching("stainless-java-retry-.+")) - .willReturn(ok()) - ) - val sleeper = RecordingSleeper() - val retryingClient = - retryingHttpClientBuilder(sleeper) - .maxRetries(2) - .idempotencyHeader("X-Some-Header") - .build() - - val response = - retryingClient.execute( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(baseUrl) - .addPathSegment("something") - .build(), - async, - ) - - assertThat(response.statusCode()).isEqualTo(200) - verify(1, postRequestedFor(urlPathEqualTo("/something"))) - assertThat(sleeper.durations).isEmpty() - assertNoResponseLeaks() - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun execute_withRetryAfterHeader(async: Boolean) { - val retryAfterDate = "Wed, 21 Oct 2015 07:28:00 GMT" - stubFor( - post(urlPathEqualTo("/something")) - // First we fail with a retry after header given as a date - .inScenario("foo") - .whenScenarioStateIs(Scenario.STARTED) - .willReturn(serviceUnavailable().withHeader("Retry-After", retryAfterDate)) - .willSetStateTo("RETRY_AFTER_DATE") - ) - stubFor( - post(urlPathEqualTo("/something")) - // Then we fail with a retry after header given as a delay - .inScenario("foo") - .whenScenarioStateIs("RETRY_AFTER_DATE") - .willReturn(serviceUnavailable().withHeader("Retry-After", "1.234")) - .willSetStateTo("RETRY_AFTER_DELAY") - ) - stubFor( - post(urlPathEqualTo("/something")) - // Then we return a success - .inScenario("foo") - .whenScenarioStateIs("RETRY_AFTER_DELAY") - .willReturn(ok()) - .willSetStateTo("COMPLETED") - ) - // Fix the clock to 5 seconds before the Retry-After date so the date-based backoff is - // deterministic. - val retryAfterDateTime = - OffsetDateTime.parse(retryAfterDate, DateTimeFormatter.RFC_1123_DATE_TIME) - val clock = Clock.fixed(retryAfterDateTime.minusSeconds(5).toInstant(), ZoneOffset.UTC) - val sleeper = RecordingSleeper() - val retryingClient = retryingHttpClientBuilder(sleeper, clock).maxRetries(2).build() - - val response = - retryingClient.execute( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(baseUrl) - .addPathSegment("something") - .build(), - async, - ) - - assertThat(response.statusCode()).isEqualTo(200) - verify( - 1, - postRequestedFor(urlPathEqualTo("/something")) - .withHeader("x-stainless-retry-count", equalTo("0")), - ) - verify( - 1, - postRequestedFor(urlPathEqualTo("/something")) - .withHeader("x-stainless-retry-count", equalTo("1")), - ) - verify( - 1, - postRequestedFor(urlPathEqualTo("/something")) - .withHeader("x-stainless-retry-count", equalTo("2")), - ) - assertThat(sleeper.durations) - .containsExactly(Duration.ofSeconds(5), Duration.ofMillis(1234)) - assertNoResponseLeaks() - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun execute_withOverwrittenRetryCountHeader(async: Boolean) { - val retryAfterDate = "Wed, 21 Oct 2015 07:28:00 GMT" - stubFor( - post(urlPathEqualTo("/something")) - .inScenario("foo") // first we fail with a retry after header given as a date - .whenScenarioStateIs(Scenario.STARTED) - .willReturn(serviceUnavailable().withHeader("Retry-After", retryAfterDate)) - .willSetStateTo("RETRY_AFTER_DATE") - ) - stubFor( - post(urlPathEqualTo("/something")) - .inScenario("foo") // then we return a success - .whenScenarioStateIs("RETRY_AFTER_DATE") - .willReturn(ok()) - .willSetStateTo("COMPLETED") - ) - val retryAfterDateTime = - OffsetDateTime.parse(retryAfterDate, DateTimeFormatter.RFC_1123_DATE_TIME) - val clock = Clock.fixed(retryAfterDateTime.minusSeconds(5).toInstant(), ZoneOffset.UTC) - val sleeper = RecordingSleeper() - val retryingClient = retryingHttpClientBuilder(sleeper, clock).maxRetries(2).build() - - val response = - retryingClient.execute( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(baseUrl) - .addPathSegment("something") - .putHeader("x-stainless-retry-count", "42") - .build(), - async, - ) - - assertThat(response.statusCode()).isEqualTo(200) - verify( - 2, - postRequestedFor(urlPathEqualTo("/something")) - .withHeader("x-stainless-retry-count", equalTo("42")), - ) - assertThat(sleeper.durations).containsExactly(Duration.ofSeconds(5)) - assertNoResponseLeaks() - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun execute_withRetryAfterMsHeader(async: Boolean) { - stubFor( - post(urlPathEqualTo("/something")) - .inScenario("foo") - .whenScenarioStateIs(Scenario.STARTED) - .willReturn(serviceUnavailable().withHeader("Retry-After-Ms", "10")) - .willSetStateTo("RETRY_AFTER_DELAY") - ) - stubFor( - post(urlPathEqualTo("/something")) - .inScenario("foo") // then we return a success - .whenScenarioStateIs("RETRY_AFTER_DELAY") - .willReturn(ok()) - .willSetStateTo("COMPLETED") - ) - val sleeper = RecordingSleeper() - val retryingClient = retryingHttpClientBuilder(sleeper).maxRetries(1).build() - - val response = - retryingClient.execute( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(baseUrl) - .addPathSegment("something") - .build(), - async, - ) - - assertThat(response.statusCode()).isEqualTo(200) - verify(2, postRequestedFor(urlPathEqualTo("/something"))) - assertThat(sleeper.durations).containsExactly(Duration.ofMillis(10)) - assertNoResponseLeaks() - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun execute_withRetryableException(async: Boolean) { - stubFor(post(urlPathEqualTo("/something")).willReturn(ok())) - - var callCount = 0 - val failingHttpClient = - object : HttpClient { - override fun execute( - request: HttpRequest, - requestOptions: RequestOptions, - ): HttpResponse { - callCount++ - if (callCount == 1) { - throw OpenAIRetryableException("Simulated retryable failure") - } - return httpClient.execute(request, requestOptions) - } - - override fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture { - callCount++ - if (callCount == 1) { - val future = CompletableFuture() - future.completeExceptionally( - OpenAIRetryableException("Simulated retryable failure") - ) - return future - } - return httpClient.executeAsync(request, requestOptions) - } - - override fun close() = httpClient.close() - } - - val sleeper = RecordingSleeper() - val retryingClient = - RetryingHttpClient.builder() - .httpClient(failingHttpClient) - .maxRetries(2) - .sleeper(sleeper) - .build() - - val response = - retryingClient.execute( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(baseUrl) - .addPathSegment("something") - .build(), - async, - ) - - assertThat(response.statusCode()).isEqualTo(200) - verify( - 1, - postRequestedFor(urlPathEqualTo("/something")) - .withHeader("x-stainless-retry-count", equalTo("1")), - ) - verify( - 0, - postRequestedFor(urlPathEqualTo("/something")) - .withHeader("x-stainless-retry-count", equalTo("0")), - ) - // Exponential backoff with jitter: 0.5s * jitter where jitter is in [0.75, 1.0]. - assertThat(sleeper.durations).hasSize(1) - assertThat(sleeper.durations[0]).isBetween(Duration.ofMillis(375), Duration.ofMillis(500)) - assertNoResponseLeaks() - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun execute_withExponentialBackoff(async: Boolean) { - stubFor(post(urlPathEqualTo("/something")).willReturn(serviceUnavailable())) - val sleeper = RecordingSleeper() - val retryingClient = retryingHttpClientBuilder(sleeper).maxRetries(3).build() - - val response = - retryingClient.execute( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(baseUrl) - .addPathSegment("something") - .build(), - async, - ) - - // All retries exhausted; the last 503 response is returned. - assertThat(response.statusCode()).isEqualTo(503) - verify(4, postRequestedFor(urlPathEqualTo("/something"))) - // Exponential backoff with jitter: backoff = min(0.5 * 2^(retries-1), 8) * jitter where - // jitter is in [0.75, 1.0]. - assertThat(sleeper.durations).hasSize(3) - // retries=1: 0.5s * [0.75, 1.0] - assertThat(sleeper.durations[0]).isBetween(Duration.ofMillis(375), Duration.ofMillis(500)) - // retries=2: 1s * [0.75, 1.0] - assertThat(sleeper.durations[1]).isBetween(Duration.ofMillis(750), Duration.ofMillis(1000)) - // retries=3: 2s * [0.75, 1.0] - assertThat(sleeper.durations[2]).isBetween(Duration.ofMillis(1500), Duration.ofMillis(2000)) - assertNoResponseLeaks() - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun execute_withExponentialBackoffCap(async: Boolean) { - stubFor(post(urlPathEqualTo("/something")).willReturn(serviceUnavailable())) - val sleeper = RecordingSleeper() - val retryingClient = retryingHttpClientBuilder(sleeper).maxRetries(6).build() - - val response = - retryingClient.execute( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(baseUrl) - .addPathSegment("something") - .build(), - async, - ) - - assertThat(response.statusCode()).isEqualTo(503) - verify(7, postRequestedFor(urlPathEqualTo("/something"))) - assertThat(sleeper.durations).hasSize(6) - // retries=5: backoff hits the 8s cap * [0.75, 1.0] - assertThat(sleeper.durations[4]).isBetween(Duration.ofMillis(6000), Duration.ofMillis(8000)) - // retries=6: still capped at 8s * [0.75, 1.0] - assertThat(sleeper.durations[5]).isBetween(Duration.ofMillis(6000), Duration.ofMillis(8000)) - assertNoResponseLeaks() - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun execute_withRetryAfterMsPriorityOverRetryAfter(async: Boolean) { - stubFor( - post(urlPathEqualTo("/something")) - .inScenario("foo") - .whenScenarioStateIs(Scenario.STARTED) - .willReturn( - serviceUnavailable() - .withHeader("Retry-After-Ms", "50") - .withHeader("Retry-After", "2") - ) - .willSetStateTo("RETRY") - ) - stubFor( - post(urlPathEqualTo("/something")) - .inScenario("foo") - .whenScenarioStateIs("RETRY") - .willReturn(ok()) - .willSetStateTo("COMPLETED") - ) - val sleeper = RecordingSleeper() - val retryingClient = retryingHttpClientBuilder(sleeper).maxRetries(1).build() - - val response = - retryingClient.execute( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(baseUrl) - .addPathSegment("something") - .build(), - async, - ) - - assertThat(response.statusCode()).isEqualTo(200) - // Retry-After-Ms (50ms) takes priority over Retry-After (2s). - assertThat(sleeper.durations).containsExactly(Duration.ofMillis(50)) - assertNoResponseLeaks() - } - - @ParameterizedTest - @ValueSource(booleans = [false, true]) - fun execute_withRetryAfterUnparseable(async: Boolean) { - stubFor( - post(urlPathEqualTo("/something")) - .inScenario("foo") - .whenScenarioStateIs(Scenario.STARTED) - .willReturn(serviceUnavailable().withHeader("Retry-After", "not-a-date-or-number")) - .willSetStateTo("RETRY") - ) - stubFor( - post(urlPathEqualTo("/something")) - .inScenario("foo") - .whenScenarioStateIs("RETRY") - .willReturn(ok()) - .willSetStateTo("COMPLETED") - ) - val sleeper = RecordingSleeper() - val retryingClient = retryingHttpClientBuilder(sleeper).maxRetries(1).build() - - val response = - retryingClient.execute( - HttpRequest.builder() - .method(HttpMethod.POST) - .baseUrl(baseUrl) - .addPathSegment("something") - .build(), - async, - ) - - assertThat(response.statusCode()).isEqualTo(200) - // Unparseable Retry-After falls through to exponential backoff. - assertThat(sleeper.durations).hasSize(1) - assertThat(sleeper.durations[0]).isBetween(Duration.ofMillis(375), Duration.ofMillis(500)) - assertNoResponseLeaks() - } - - private fun retryingHttpClientBuilder( - sleeper: RecordingSleeper, - clock: Clock = Clock.systemUTC(), - ) = RetryingHttpClient.builder().httpClient(httpClient).sleeper(sleeper).clock(clock) - - private fun HttpClient.execute(request: HttpRequest, async: Boolean): HttpResponse = - if (async) executeAsync(request).get() else execute(request) - - // When retrying, all failed responses should be closed. Only the final returned response should - // be open. - private fun assertNoResponseLeaks() = assertThat(openResponseCount).isEqualTo(1) -} diff --git a/openai-java-core/src/test/kotlin/com/openai/core/http/WorkloadIdentityHttpClientTest.kt b/openai-java-core/src/test/kotlin/com/openai/core/http/WorkloadIdentityHttpClientTest.kt deleted file mode 100644 index 2efd06e13..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/core/http/WorkloadIdentityHttpClientTest.kt +++ /dev/null @@ -1,148 +0,0 @@ -package com.openai.core.http - -import com.openai.auth.WorkloadIdentityAuth -import com.openai.core.RequestOptions -import com.openai.errors.OpenAIRetryableException -import java.io.ByteArrayInputStream -import java.io.InputStream -import java.util.concurrent.CompletableFuture -import java.util.concurrent.ExecutionException -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.assertThatThrownBy -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import org.mockito.junit.jupiter.MockitoExtension -import org.mockito.kotlin.any -import org.mockito.kotlin.argThat -import org.mockito.kotlin.mock -import org.mockito.kotlin.verify -import org.mockito.kotlin.whenever - -@ExtendWith(MockitoExtension::class) -internal class WorkloadIdentityHttpClientTest { - - @Test - fun execute_injectsBearerToken() { - val token = "test-token" - val workloadIdentityAuth = mock() - whenever(workloadIdentityAuth.getToken()).thenReturn(token) - - val delegateHttpClient = mock() - val response = mockResponse(200, "success") - whenever(delegateHttpClient.execute(any(), any())).thenReturn(response) - - val client = WorkloadIdentityHttpClient(delegateHttpClient, workloadIdentityAuth) - - val request = - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.openai.com/v1/models") - .build() - - val result = client.execute(request, RequestOptions.none()) - - assertThat(result.statusCode()).isEqualTo(200) - verify(delegateHttpClient) - .execute( - argThat { req -> req.headers.values("Authorization").contains("Bearer $token") }, - any(), - ) - } - - @Test - fun execute_on401_invalidatesTokenAndThrowsRetryableException() { - val token = "test-token" - val workloadIdentityAuth = mock() - whenever(workloadIdentityAuth.getToken()).thenReturn(token) - - val delegateHttpClient = mock() - val response401 = mockResponse(401, "Unauthorized") - whenever(delegateHttpClient.execute(any(), any())).thenReturn(response401) - - val client = WorkloadIdentityHttpClient(delegateHttpClient, workloadIdentityAuth) - - val request = - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.openai.com/v1/models") - .build() - - assertThatThrownBy { client.execute(request, RequestOptions.none()) } - .isInstanceOf(OpenAIRetryableException::class.java) - .hasMessage("OAuth token is expired") - - verify(workloadIdentityAuth).invalidateToken() - } - - @Test - fun executeAsync_on401_invalidatesTokenAndThrowsRetryableException() { - val token = "test-token" - val workloadIdentityAuth = mock() - whenever(workloadIdentityAuth.getTokenAsync()) - .thenReturn(CompletableFuture.completedFuture(token)) - - val delegateHttpClient = mock() - val response401 = mockResponse(401, "Unauthorized") - whenever(delegateHttpClient.executeAsync(any(), any())) - .thenReturn(CompletableFuture.completedFuture(response401)) - - val client = WorkloadIdentityHttpClient(delegateHttpClient, workloadIdentityAuth) - - val request = - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.openai.com/v1/models") - .build() - - assertThatThrownBy { client.executeAsync(request, RequestOptions.none()).get() } - .isInstanceOf(ExecutionException::class.java) - .hasCauseInstanceOf(OpenAIRetryableException::class.java) - .cause() - .hasMessage("OAuth token is expired") - - verify(workloadIdentityAuth).invalidateToken() - } - - @Test - fun executeAsync_injectsBearerToken() { - val token = "test-token" - val workloadIdentityAuth = mock() - whenever(workloadIdentityAuth.getTokenAsync()) - .thenReturn(CompletableFuture.completedFuture(token)) - - val delegateHttpClient = mock() - val response = mockResponse(200, "success") - whenever(delegateHttpClient.executeAsync(any(), any())) - .thenReturn(CompletableFuture.completedFuture(response)) - - val client = WorkloadIdentityHttpClient(delegateHttpClient, workloadIdentityAuth) - - val request = - HttpRequest.builder() - .method(HttpMethod.GET) - .baseUrl("https://api.openai.com/v1/models") - .build() - - val resultFuture = client.executeAsync(request, RequestOptions.none()) - val result = resultFuture.get() - - assertThat(result.statusCode()).isEqualTo(200) - verify(delegateHttpClient) - .executeAsync( - argThat { req -> req.headers.values("Authorization").contains("Bearer $token") }, - any(), - ) - } - - private fun mockResponse(statusCode: Int, body: String): HttpResponse { - return object : HttpResponse { - override fun statusCode() = statusCode - - override fun headers() = Headers.builder().build() - - override fun body(): InputStream = ByteArrayInputStream(body.toByteArray()) - - override fun close() {} - } - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/helpers/ChatCompletionAccumulatorTest.kt b/openai-java-core/src/test/kotlin/com/openai/helpers/ChatCompletionAccumulatorTest.kt deleted file mode 100644 index 7f2ea4445..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/helpers/ChatCompletionAccumulatorTest.kt +++ /dev/null @@ -1,713 +0,0 @@ -package com.openai.helpers - -import com.openai.core.JsonMissing -import com.openai.core.JsonValue -import com.openai.models.chat.completions.* -import com.openai.models.completions.CompletionUsage -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.assertThatThrownBy -import org.junit.jupiter.api.Test - -internal class ChatCompletionAccumulatorTest { - @Test - fun convertFunctionCallWithoutAdditionalProperties() { - val functionCall = - ChatCompletionAccumulator.convertFunctionCall( - functionCall( - additionalProperties = - mapOf("a" to JsonValue.from("a-value"), "b" to JsonValue.from("b-value")) - ) - ) - - assertThat(functionCall.name()).isEqualTo("fc_fn_name") - assertThat(functionCall.arguments()).isEqualTo("[arg1, arg2]") - assertThat(functionCall._additionalProperties()).isNotEmpty() - assertThat(functionCall._additionalProperties()["a"]!!.asString().get()) - .isEqualTo("a-value") - assertThat(functionCall._additionalProperties()["b"]!!.asString().get()) - .isEqualTo("b-value") - } - - @Test - fun convertFunctionCallWithAdditionalProperties() { - val functionCall = ChatCompletionAccumulator.convertFunctionCall(functionCall()) - - assertThat(functionCall.name()).isEqualTo("fc_fn_name") - assertThat(functionCall.arguments()).isEqualTo("[arg1, arg2]") - assertThat(functionCall._additionalProperties()).isEmpty() - } - - @Test - fun chatCompletionBeforeAnyAccumulation() { - val accumulator = ChatCompletionAccumulator.create() - - assertThatThrownBy { accumulator.chatCompletion() } - .isExactlyInstanceOf(IllegalStateException::class.java) - .hasMessage("Final chat completion chunk(s) not yet received.") - } - - @Test - fun chatCompletionAfterAccumulation() { - val accumulator = ChatCompletionAccumulator.create() - - accumulator.accumulate(finalChunk()) - - val chatCompletion = accumulator.chatCompletion() - - assertThat(chatCompletion.choices()[0].finishReason()) - .isEqualTo(ChatCompletion.Choice.FinishReason.STOP) - assertThat(chatCompletion.usage()).isNotPresent() - assertThat(chatCompletion.systemFingerprint().get()).isEqualTo("fingerprint") - assertThat(chatCompletion.serviceTier().get()).isEqualTo(ChatCompletion.ServiceTier.AUTO) - } - - @Test - fun chatCompletionAfterAccumulationWithUsage() { - val accumulator = ChatCompletionAccumulator.create() - - accumulator.accumulate(finalChunk()) - - val chatCompletionA = accumulator.chatCompletion() - - // Accumulating a usage chunk should create a new "final" `ChatCompletion`. - accumulator.accumulate(finalUsageChunk()) - - val chatCompletionB = accumulator.chatCompletion() - - // Expect that a new `ChatCompletion` instance was created after the usage was accumulated. - assertThat(chatCompletionA).isNotSameAs(chatCompletionB) - - assertThat(chatCompletionA.choices()[0].finishReason()) - .isEqualTo(ChatCompletion.Choice.FinishReason.STOP) - assertThat(chatCompletionA.usage()).isNotPresent() - assertThat(chatCompletionA.systemFingerprint().get()).isEqualTo("fingerprint") - assertThat(chatCompletionA.serviceTier().get()).isEqualTo(ChatCompletion.ServiceTier.AUTO) - - assertThat(chatCompletionB.choices()[0].finishReason()) - .isEqualTo(ChatCompletion.Choice.FinishReason.STOP) - assertThat(chatCompletionB.usage()).isPresent() - assertThat(chatCompletionB.usage().get().completionTokens()).isEqualTo(10L) - assertThat(chatCompletionB.usage().get().promptTokens()).isEqualTo(5L) - assertThat(chatCompletionB.usage().get().totalTokens()).isEqualTo(15L) - // The `finalUsageChunk()` had `null` values for `systemFingerprint` and `serviceTier`, but - // those should _not_ have overwritten the non-`null` values on the `finalChunk()`. - assertThat(chatCompletionB.systemFingerprint().get()).isEqualTo("fingerprint") - assertThat(chatCompletionB.serviceTier().get()).isEqualTo(ChatCompletion.ServiceTier.AUTO) - } - - @Test - fun accumulateFinalChunkAfterFinalChunk() { - val accumulator = ChatCompletionAccumulator.create() - - accumulator.accumulate(finalChunk()) - - assertThatThrownBy { accumulator.accumulate(finalChunk()) } - .isExactlyInstanceOf(IllegalStateException::class.java) - .hasMessage("Already accumulated the final chunk(s).") - } - - @Test - fun accumulateTextChunkAfterFinalChunk() { - val accumulator = ChatCompletionAccumulator.create() - - accumulator.accumulate(finalChunk()) - - assertThatThrownBy { accumulator.accumulate(textChunk("hello")) } - .isExactlyInstanceOf(IllegalStateException::class.java) - .hasMessage("Already accumulated the final chunk(s).") - } - - @Test - fun accumulateFinalUsageChunkAfterFinalUsageChunk() { - val accumulator = ChatCompletionAccumulator.create() - - accumulator.accumulate(finalChunk()) - accumulator.accumulate(finalUsageChunk()) - - assertThatThrownBy { accumulator.accumulate(finalUsageChunk()) } - .isExactlyInstanceOf(IllegalStateException::class.java) - .hasMessage("Already accumulated the final chunk(s).") - } - - @Test - fun accumulateFinalChunkAfterFinalUsageChunk() { - val accumulator = ChatCompletionAccumulator.create() - - accumulator.accumulate(finalChunk()) - accumulator.accumulate(finalUsageChunk()) - - assertThatThrownBy { accumulator.accumulate(finalChunk()) } - .isExactlyInstanceOf(IllegalStateException::class.java) - .hasMessage("Already accumulated the final chunk(s).") - } - - @Test - fun accumulateTextChunkAfterFinalUsageChunk() { - val accumulator = ChatCompletionAccumulator.create() - - accumulator.accumulate(finalChunk()) - accumulator.accumulate(finalUsageChunk()) - - assertThatThrownBy { accumulator.accumulate(textChunk("hello")) } - .isExactlyInstanceOf(IllegalStateException::class.java) - .hasMessage("Already accumulated the final chunk(s).") - } - - @Test - fun accumulateText() { - val accumulator = ChatCompletionAccumulator.create() - - // Vertical slices through these text chunks define the text of three messages, each will - // be accumulated in its own `Choice`. Here, `n` = 3, so there should be three final chunks - // to finalize each of the three messages. - accumulator.accumulate(textChunk("Hello", "How", "See ")) - accumulator.accumulate(textChunk(", ", " are", "the ba")) - accumulator.accumulate(textChunk("World", " you", "ll ")) - accumulator.accumulate(textChunk("!", "?", "game?")) - - // These failures checks are not destructive, so they will not affect the later success. - assertThatThrownBy { accumulator.chatCompletion() } - .isExactlyInstanceOf(IllegalStateException::class.java) - .hasMessage("Final chat completion chunk(s) not yet received.") - - accumulator.accumulate(finalChunk(0L)) - - assertThatThrownBy { accumulator.chatCompletion() } - .isExactlyInstanceOf(IllegalStateException::class.java) - .hasMessage("Final chat completion chunk(s) not yet received.") - - accumulator.accumulate(finalChunk(1L)) - - assertThatThrownBy { accumulator.chatCompletion() } - .isExactlyInstanceOf(IllegalStateException::class.java) - .hasMessage("Final chat completion chunk(s) not yet received.") - - accumulator.accumulate(finalChunk(2L)) - - var chatCompletion = accumulator.chatCompletion() - - assertThat(chatCompletion.choices().size).isEqualTo(3) - assertThat(chatCompletion.choices()[0].message()._role().asString().get()) - .isEqualTo("assistant") - assertThat(chatCompletion.choices()[0].message().content().get()).isEqualTo("Hello, World!") - assertThat(chatCompletion.choices()[1].message().content().get()).isEqualTo("How are you?") - assertThat(chatCompletion.choices()[2].message().content().get()) - .isEqualTo("See the ball game?") - } - - @Test - fun accumulateRefusal() { - // Refusals are not tested in as in-depth a manner as with the text content chunks. It is - // known that the code has the same logic for content and refusals, so testing one should be - // enough to test the other. - val accumulator = ChatCompletionAccumulator.create() - - accumulator.accumulate(textChunk("hello")) - accumulator.accumulate(textChunk(" world")) - accumulator.accumulate(refusalChunk("I ")) - accumulator.accumulate(refusalChunk("cannot ")) - accumulator.accumulate(refusalChunk("answer ")) - accumulator.accumulate(refusalChunk("that!")) - accumulator.accumulate(finalChunk()) - - val chatCompletion = accumulator.chatCompletion() - - assertThat(chatCompletion.choices().size).isEqualTo(1) - assertThat(chatCompletion.choices()[0].message().content().get()).isEqualTo("hello world") - assertThat(chatCompletion.choices()[0].message().refusal().get()) - .isEqualTo("I cannot answer that!") - } - - @Test - fun accumulateTextChunksWithLogprobs() { - val accumulator = ChatCompletionAccumulator.create() - - accumulator.accumulate(textChunk("Hello,", withLogprobContents = true)) - accumulator.accumulate(textChunk(" World", withLogprobContents = true)) - accumulator.accumulate(textChunk(". What's", withLogprobRefusals = true)) - accumulator.accumulate(textChunk(" up?", withLogprobRefusals = true)) - accumulator.accumulate(finalChunk()) - - val chatCompletion = accumulator.chatCompletion() - - assertThat(chatCompletion.choices().size).isEqualTo(1) - assertThat(chatCompletion.choices()[0].message().content().get()) - .isEqualTo("Hello, World. What's up?") - - assertThat(chatCompletion.choices()[0].logprobs().get().content().get().size).isEqualTo(4) - assertThat(chatCompletion.choices()[0].logprobs().get().refusal().get().size).isEqualTo(4) - assertThat(chatCompletion.choices()[0].logprobs().get().refusal().get()[0].token()) - .isEqualTo("refusal-1") - assertThat(chatCompletion.choices()[0].logprobs().get().refusal().get()[1].token()) - .isEqualTo("refusal-2") - assertThat(chatCompletion.choices()[0].logprobs().get().refusal().get()[2].token()) - .isEqualTo("refusal-1") - assertThat(chatCompletion.choices()[0].logprobs().get().refusal().get()[3].token()) - .isEqualTo("refusal-2") - } - - @Test - fun accumulateCustomRole() { - // The default role is "assistant"; check that a non-default role is copied as expected. - val accumulator = ChatCompletionAccumulator.create() - - accumulator.accumulate( - textChunk("hello", role = ChatCompletionChunk.Choice.Delta.Role.DEVELOPER) - ) - accumulator.accumulate(finalChunk()) - - var chatCompletion = accumulator.chatCompletion() - - assertThat(chatCompletion.choices().size).isEqualTo(1) - assertThat(chatCompletion.choices()[0].message()._role().asString().get()) - .isEqualTo("developer") - assertThat(chatCompletion.choices()[0].message().content().get()).isEqualTo("hello") - } - - @Test - fun accumulateFunctionCallAndToolCall() { - val accumulator = ChatCompletionAccumulator.create() - - // Due to the way the test fixtures are created with a limited number of arguments (for - // legibility), the indexes are hard-coded. If more than one tool call is added, it will - // overwrite the previous tool call with the same index. - accumulator.accumulate(textChunk("hello", withToolCall = true)) - accumulator.accumulate(textChunk(" world", withFunctionCall = true)) - accumulator.accumulate(finalChunk()) - - var chatCompletion = accumulator.chatCompletion() - - assertThat(chatCompletion.choices().size).isEqualTo(1) - assertThat(chatCompletion.choices()[0].message().functionCall().get().name()) - .isEqualTo("fc_fn_name") - assertThat(chatCompletion.choices()[0].message().toolCalls().get().size).isEqualTo(1) - assertThat( - chatCompletion - .choices()[0] - .message() - .toolCalls() - .get()[0] - .asFunction() - .function() - .name() - ) - .isEqualTo("tc_fn_name") - assertThat(chatCompletion.choices()[0].message().content().get()).isEqualTo("hello world") - } - - @Test - fun accumulateToolCallsFromFragments() { - val accumulator = ChatCompletionAccumulator.create() - - // Accumulate two choices/messages. Each has two tool calls. Each tool call is constructed - // from four chunks. The first chunk has the tool call ID and function name. The second, - // third and fourth chunks have the fragments of the function arguments. Naming relates to - // the choice index and the respective tool call index for that choice. The arguments are - // not expected to be parsed to JSON, just compared as a string. The accumulated result that - // is expected is as follows: - // - // Choice 0 - // Tool Call 0: id=tc-id-0-0, function: name=fn-0-0, args={a-0-0-0, a-0-0-1} - // Tool Call 1: id=tc-id-0-1, function: name=fn-0-1, args={a-0-1-0, a-0-1-1} - // - // Choice 1 - // Tool Call 0: id=tc-id-1-0, function: name=fn-1-0, args={a-1-0-0, a-1-0-1} - // Tool Call 1: id=tc-id-1-1, function: name=fn-1-1, args={a-1-1-0, a-1-1-1} - // - // The chunks are deliberately accumulated out-of-order to ensure that ordering is - // identified correctly from indexes, not from order of encounter. The chunks carrying the - // fragments of the arguments for one tool call must be in encounter order (just like for - // text chunks), but they are interleaved with other chunks. - accumulator.accumulate( - toolCallChunk( - choiceIndex = 0L, - toolCallIndex = 0L, - toolCallId = "tc-id-0-0", - functionName = "fn-0-0", - ) - ) - accumulator.accumulate( - toolCallChunk(choiceIndex = 0L, toolCallIndex = 0L, argsFragment = "{a-0-0-0") - ) - - accumulator.accumulate( - toolCallChunk( - choiceIndex = 0L, - toolCallIndex = 1L, - toolCallId = "tc-id-0-1", - functionName = "fn-0-1", - ) - ) - accumulator.accumulate( - toolCallChunk(choiceIndex = 0L, toolCallIndex = 0L, argsFragment = ", ") - ) - accumulator.accumulate( - toolCallChunk(choiceIndex = 0L, toolCallIndex = 0L, argsFragment = "a-0-0-1}") - ) - accumulator.accumulate( - toolCallChunk(choiceIndex = 0L, toolCallIndex = 1L, argsFragment = "{a-0-1-0") - ) - accumulator.accumulate( - toolCallChunk( - choiceIndex = 1L, - toolCallIndex = 1L, - toolCallId = "tc-id-1-1", - functionName = "fn-1-1", - ) - ) - - accumulator.accumulate( - toolCallChunk( - choiceIndex = 1L, - toolCallIndex = 0L, - toolCallId = "tc-id-1-0", - functionName = "fn-1-0", - ) - ) - accumulator.accumulate( - toolCallChunk(choiceIndex = 1L, toolCallIndex = 0L, argsFragment = "{a-1-0-0") - ) - accumulator.accumulate( - toolCallChunk(choiceIndex = 0L, toolCallIndex = 1L, argsFragment = ", ") - ) - accumulator.accumulate( - toolCallChunk(choiceIndex = 1L, toolCallIndex = 0L, argsFragment = ", ") - ) - - accumulator.accumulate( - toolCallChunk(choiceIndex = 1L, toolCallIndex = 1L, argsFragment = "{a-1-1-0") - ) - accumulator.accumulate( - toolCallChunk(choiceIndex = 1L, toolCallIndex = 1L, argsFragment = ", ") - ) - accumulator.accumulate( - toolCallChunk(choiceIndex = 1L, toolCallIndex = 0L, argsFragment = "a-1-0-1}") - ) - accumulator.accumulate( - toolCallChunk(choiceIndex = 1L, toolCallIndex = 1L, argsFragment = "a-1-1-1}") - ) - accumulator.accumulate(finalChunk(0L)) - accumulator.accumulate( - toolCallChunk(choiceIndex = 0L, toolCallIndex = 1L, argsFragment = "a-0-1-1}") - ) - accumulator.accumulate(finalChunk(1L)) - - val chatCompletion = accumulator.chatCompletion() - var tc: ChatCompletionMessageFunctionToolCall - - // Not interested in much here except the order and details of the accumulated tool calls. - assertThat(chatCompletion.choices().size).isEqualTo(2) - - assertThat(chatCompletion.choices()[0].message().toolCalls().get().size).isEqualTo(2) - tc = chatCompletion.choices()[0].message().toolCalls().get()[0].asFunction() - assertThat(tc.id()).isEqualTo("tc-id-0-0") - assertThat(tc.function().name()).isEqualTo("fn-0-0") - assertThat(tc.function().arguments()).isEqualTo("{a-0-0-0, a-0-0-1}") - tc = chatCompletion.choices()[0].message().toolCalls().get()[1].asFunction() - assertThat(tc.id()).isEqualTo("tc-id-0-1") - assertThat(tc.function().name()).isEqualTo("fn-0-1") - assertThat(tc.function().arguments()).isEqualTo("{a-0-1-0, a-0-1-1}") - - assertThat(chatCompletion.choices()[1].message().toolCalls().get().size).isEqualTo(2) - tc = chatCompletion.choices()[1].message().toolCalls().get()[0].asFunction() - assertThat(tc.id()).isEqualTo("tc-id-1-0") - assertThat(tc.function().name()).isEqualTo("fn-1-0") - assertThat(tc.function().arguments()).isEqualTo("{a-1-0-0, a-1-0-1}") - tc = chatCompletion.choices()[1].message().toolCalls().get()[1].asFunction() - assertThat(tc.id()).isEqualTo("tc-id-1-1") - assertThat(tc.function().name()).isEqualTo("fn-1-1") - assertThat(tc.function().arguments()).isEqualTo("{a-1-1-0, a-1-1-1}") - } - - // ------------------------------------------------------------------------- - // Helper functions to create test fixtures. - - private fun finalChunk( - index: Long = 0L, - finishReason: ChatCompletionChunk.Choice.FinishReason = - ChatCompletionChunk.Choice.FinishReason.STOP, - ) = - ChatCompletionChunk.builder() - .id("final-chunk-id") - .created(123_456_789L) - .model("model-id") - .systemFingerprint("fingerprint") - .serviceTier(ChatCompletionChunk.ServiceTier.AUTO) - .addChoice( - ChatCompletionChunk.Choice.builder() - .finishReason(finishReason) - .index(index) - .delta(emptyDelta()) - .build() - ) - .build() - - private fun finalUsageChunk( - finishReason: ChatCompletionChunk.Choice.FinishReason = - ChatCompletionChunk.Choice.FinishReason.STOP - ) = - ChatCompletionChunk.builder() - // Unlike in `finalChunk()`, there is no `systemFingerprint` and no `serviceTier` set - // here. This allows testing that `null` values do not overwrite non-`null` values. - .id("final-chunk-id") - .created(123_456_789L) - .model("model-id") - .usage(usage()) - // If the usage is present on a chunk, there will never be any choices. - .choices(listOf()) - .build() - - private fun usage() = - CompletionUsage.builder().completionTokens(10L).promptTokens(5L).totalTokens(15L).build() - - /** - * Creates a text chunk with one or more text choices. The choices are indexed in the order - * given. Each text string corresponds to a separate completion choice and will be accumulated - * in a separate `ChatCompletionMessage` in each `Choice` of the final `ChatCompletion`. The - * number of indexes corresponds to the `n` value in the request. For example, if there are - * three text chunks each with three text strings: `["A", "B", "C"]`, `["D", "E", "F"]`, `["G", - * "H", "I"]`, then the accumulation will contain three choices each with a single message with - * the respective text `"ADG"`, `"BEH"`, or `"CFI"`. - */ - private fun textChunk( - text: String, - vararg moreText: String, - withLogprobContents: Boolean = false, - withLogprobRefusals: Boolean = false, - withFunctionCall: Boolean = false, - withToolCall: Boolean = false, - role: ChatCompletionChunk.Choice.Delta.Role? = null, - ) = - ChatCompletionChunk.builder() - .id("text-chunk-id") - .created(123_456_789L) - .model("model-id") - .addChoice( - textChoice( - 0L, - text, - withLogprobContents, - withLogprobRefusals, - withFunctionCall, - withToolCall, - role, - ) - ) - .apply { - moreText.forEachIndexed { index, it -> - addChoice( - textChoice( - index + 1L, - it, - withLogprobContents, - withLogprobRefusals, - withFunctionCall, - withToolCall, - role, - ) - ) - } - } - .build() - - private fun textChoice( - index: Long = 0L, - text: String, - withLogprobContents: Boolean = false, - withLogprobRefusals: Boolean = false, - withFunctionCall: Boolean = false, - withToolCall: Boolean = false, - role: ChatCompletionChunk.Choice.Delta.Role? = null, - ) = - ChatCompletionChunk.Choice.builder() - .delta(textDelta(text, withFunctionCall, withToolCall, role)) - .index(index) - .applyIf(withLogprobContents || withLogprobRefusals) { - logprobs( - logprobs(withContents = withLogprobContents, withRefusals = withLogprobRefusals) - ) - } - .finishReason(null) - .build() - - private fun textDelta( - text: String, - withFunctionCall: Boolean = false, - withToolCall: Boolean = false, - role: ChatCompletionChunk.Choice.Delta.Role? = null, - ) = - ChatCompletionChunk.Choice.Delta.builder() - .content(text) - .applyIf(withFunctionCall) { functionCall(functionCall()) } - .applyIf(withToolCall) { addToolCall(toolCall()) } - .apply { role?.let { role(it) } } - .build() - - private fun toolCallChunk( - choiceIndex: Long, - toolCallIndex: Long, - toolCallId: String? = null, - functionName: String? = null, - argsFragment: String? = null, - ) = - ChatCompletionChunk.builder() - .id("tc-chunk-id") - .created(123_456_789L) - .model("model-id") - .addChoice( - toolCallChoice(choiceIndex, toolCallIndex, toolCallId, functionName, argsFragment) - ) - .build() - - private fun toolCallChoice( - choiceIndex: Long, - toolCallIndex: Long, - toolCallId: String? = null, - functionName: String? = null, - argsFragment: String? = null, - ) = - ChatCompletionChunk.Choice.builder() - .delta(toolCallDelta(toolCallIndex, toolCallId, functionName, argsFragment)) - .index(choiceIndex) - .finishReason(null) - .build() - - private fun toolCallDelta( - toolCallIndex: Long, - toolCallId: String? = null, - functionName: String? = null, - argsFragment: String? = null, - ) = - ChatCompletionChunk.Choice.Delta.builder() - .content("hello") - .addToolCall( - ChatCompletionChunk.Choice.Delta.ToolCall.builder() - // Some validations to ensure the caller knows how this method is expected to - // be used. - .applyIf((toolCallId == null) != (functionName == null)) { - throw IllegalArgumentException( - "Set both toolCallId and functionName. or set neither." - ) - } - .applyIf(functionName != null && argsFragment != null) { - throw IllegalArgumentException( - "Set functionName or argsFragment, but not both." - ) - } - .applyIf(toolCallId == null && functionName == null && argsFragment == null) { - throw IllegalArgumentException( - "Set toolCallId and functionName, or set argsFragment." - ) - } - .applyIf(toolCallId != null) { id(toolCallId!!) } - .applyIf(functionName != null) { - function( - ChatCompletionChunk.Choice.Delta.ToolCall.Function.builder() - .name(functionName!!) - .arguments(JsonMissing.of()) - .build() - ) - } - .applyIf(argsFragment != null) { - function( - ChatCompletionChunk.Choice.Delta.ToolCall.Function.builder() - .name(JsonMissing.of()) - .arguments(argsFragment!!) - .build() - ) - } - .index(toolCallIndex) - .build() - ) - .build() - - private fun refusalChunk(text: String) = - ChatCompletionChunk.builder() - .id("refusal-chunk-id") - .created(123_456_789L) - .model("model-id") - .addChoice(refusalChoice(0L, text)) - .build() - - private fun refusalChoice(index: Long = 0L, text: String) = - ChatCompletionChunk.Choice.builder() - .delta(refusalDelta(text)) - .index(index) - .finishReason(null) - .build() - - private fun refusalDelta(text: String) = - ChatCompletionChunk.Choice.Delta.builder().refusal(text).build() - - private fun emptyDelta() = ChatCompletionChunk.Choice.Delta.builder().build() - - private fun toolCall( - toolCallId: String = "tool-call-id", - toolCallFunction: ChatCompletionChunk.Choice.Delta.ToolCall.Function = toolCallFunction(), - additionalProperties: Map? = null, - ) = - ChatCompletionChunk.Choice.Delta.ToolCall.builder() - .id(toolCallId) - // Currently, the implementation ignores the `index`. That might change later. - .index(1L) - .function(toolCallFunction) - .apply { additionalProperties?.let { additionalProperties(it) } } - .build() - - private fun toolCallFunction( - functionName: String = "tc_fn_name", - functionArguments: String = "[arg1, arg2]", - additionalProperties: Map? = null, - ) = - ChatCompletionChunk.Choice.Delta.ToolCall.Function.builder() - .name(functionName) - .arguments(functionArguments) - .apply { additionalProperties?.let { additionalProperties(it) } } - .build() - - private fun functionCall( - functionName: String = "fc_fn_name", - functionArguments: String = "[arg1, arg2]", - additionalProperties: Map? = null, - ) = - ChatCompletionChunk.Choice.Delta.FunctionCall.builder() - .name(functionName) - .arguments(functionArguments) - .apply { additionalProperties?.let { additionalProperties(it) } } - .build() - - private fun logprobs(withContents: Boolean = true, withRefusals: Boolean = true) = - ChatCompletionChunk.Choice.Logprobs.builder() - .applyIf(withContents) { - addContent(tokenLogprob("content-1")) - addContent(tokenLogprob("content-2")) - } - .applyIf(!withContents) { content(listOf()) } - .applyIf(withRefusals) { - addRefusal(tokenLogprob("refusal-1")) - addRefusal(tokenLogprob("refusal-2")) - } - .applyIf(!withRefusals) { refusal(listOf()) } - .build() - - private fun tokenLogprob(token: String = "hello") = - ChatCompletionTokenLogprob.builder() - .token(token) - .bytes(listOf(123L, 456L, 789L)) - .logprob(0.123456789) - .addTopLogprob( - ChatCompletionTokenLogprob.TopLogprob.builder() - .token("$token-top") - .bytes(listOf(234L, 567L, 890L)) - .logprob(0.23456789) - .build() - ) - .build() - - private inline fun T.applyIf(condition: Boolean, block: T.() -> Unit): T { - if (condition) { - this.block() - } - return this - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/helpers/ResponseAccumulatorTest.kt b/openai-java-core/src/test/kotlin/com/openai/helpers/ResponseAccumulatorTest.kt deleted file mode 100644 index 170272c43..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/helpers/ResponseAccumulatorTest.kt +++ /dev/null @@ -1,224 +0,0 @@ -package com.openai.helpers - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonNull -import com.openai.core.http.StreamResponse -import com.openai.core.http.map -import com.openai.core.jsonMapper -import com.openai.models.ResponsesModel -import com.openai.models.responses.Response -import com.openai.models.responses.ResponseCompletedEvent -import com.openai.models.responses.ResponseCreatedEvent -import com.openai.models.responses.ResponseFailedEvent -import com.openai.models.responses.ResponseInProgressEvent -import com.openai.models.responses.ResponseIncompleteEvent -import com.openai.models.responses.ResponseOutputItem -import com.openai.models.responses.ResponseOutputMessage -import com.openai.models.responses.ResponseOutputText -import com.openai.models.responses.ResponseStreamEvent -import java.util.stream.Stream -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.assertThatNoException -import org.assertj.core.api.Assertions.assertThatThrownBy -import org.junit.jupiter.api.Test - -internal class ResponseAccumulatorTest { - - @Test - fun responseBeforeAccumulation() { - val accumulator = ResponseAccumulator.create() - - assertThatThrownBy { accumulator.response() } - .isExactlyInstanceOf(IllegalStateException::class.java) - .hasMessage("Completed response is not yet received.") - } - - @Test - fun structuredResponseBeforeAccumulation() { - val accumulator = ResponseAccumulator.create() - - assertThatThrownBy { accumulator.response(String::class.java) } - .isExactlyInstanceOf(IllegalStateException::class.java) - .hasMessage("Completed response is not yet received.") - } - - @Test - fun responseAfterAccumulation() { - val accumulator = ResponseAccumulator.create() - - accumulator.accumulate(ResponseStreamEvent.ofCompleted(responseCompletedEvent())) - - assertThatNoException().isThrownBy { accumulator.response() } - assertThat(accumulator.response().id()).isEqualTo("response-id") - } - - @Test - fun structuredResponseAfterAccumulation() { - val accumulator = ResponseAccumulator.create() - - accumulator.accumulate(ResponseStreamEvent.ofCompleted(responseCompletedEvent())) - - // No deserialization is attempted, so the `Class` does not matter. Deserialization is - // beyond the scope of this test; it is tested elsewhere at a lower level. - assertThatNoException().isThrownBy { accumulator.response(String::class.java) } - assertThat(accumulator.response(String::class.java).id()).isEqualTo("response-id") - assertThat(accumulator.response(String::class.java).responseType) - .isEqualTo(String::class.java) - } - - @Test - fun accumulateAfterCompletedIgnoresPostCompletionEvents() { - val accumulator = ResponseAccumulator.create() - - accumulator.accumulate(ResponseStreamEvent.ofCompleted(responseCompletedEvent())) - - assertThatNoException().isThrownBy { - accumulator.accumulate(responseRateLimitsUpdatedEvent()) - } - assertThat(accumulator.response().id()).isEqualTo("response-id") - } - - @Test - fun responseValidationRejectsUnknownPostCompletionEventBeforeAccumulation() { - val accumulator = ResponseAccumulator.create() - - accumulator.accumulate(ResponseStreamEvent.ofCompleted(responseCompletedEvent())) - val streamResponse = streamResponseOf(responseRateLimitsUpdatedEvent()) - val validatedStreamResponse = streamResponse.map { it.validate() } - - // This mirrors the realistic client path when response validation is enabled: - // - // OpenAIClient client = OpenAIOkHttpClient.builder() - // .fromEnv() - // .responseValidation(true) - // .build(); - // - // ResponseCreateParams params = ResponseCreateParams.builder() - // .input("example input") - // .build(); - // - // ResponseAccumulator accumulator = ResponseAccumulator.create(); - // - // try (StreamResponse stream = - // client.responses().createStreaming(params)) { - // stream.stream().forEach(accumulator::accumulate); - // } - // - // In that client configuration, generated service code validates each streamed event with - // `streamResponse.map { it.validate() }` before user code receives it. So an unknown - // post-completion event can throw during validation before `ResponseAccumulator` gets the - // chance to ignore it. - assertThatThrownBy { - validatedStreamResponse.stream().forEach { accumulator.accumulate(it) } - } - .hasMessageStartingWith("Unknown ResponseStreamEvent") - } - - @Test - fun accumulateUntilCompleted() { - val accumulator = ResponseAccumulator.create() - - accumulator.accumulate(ResponseStreamEvent.ofCreated(responseCreatedEvent())) - accumulator.accumulate(ResponseStreamEvent.ofInProgress(responseInProgressEvent())) - accumulator.accumulate(ResponseStreamEvent.ofInProgress(responseInProgressEvent())) - accumulator.accumulate(ResponseStreamEvent.ofInProgress(responseInProgressEvent())) - accumulator.accumulate(ResponseStreamEvent.ofCompleted(responseCompletedEvent())) - - val response = accumulator.response() - - assertThat(response.id()).isEqualTo("response-id") - } - - @Test - fun accumulateUntilIncomplete() { - val accumulator = ResponseAccumulator.create() - - accumulator.accumulate(ResponseStreamEvent.ofCreated(responseCreatedEvent())) - accumulator.accumulate(ResponseStreamEvent.ofInProgress(responseInProgressEvent())) - accumulator.accumulate(ResponseStreamEvent.ofInProgress(responseInProgressEvent())) - accumulator.accumulate(ResponseStreamEvent.ofInProgress(responseInProgressEvent())) - accumulator.accumulate(ResponseStreamEvent.ofIncomplete(responseIncompleteEvent())) - - val response = accumulator.response() - - assertThat(response.id()).isEqualTo("response-id") - } - - @Test - fun accumulateUntilFailed() { - val accumulator = ResponseAccumulator.create() - - accumulator.accumulate(ResponseStreamEvent.ofCreated(responseCreatedEvent())) - accumulator.accumulate(ResponseStreamEvent.ofInProgress(responseInProgressEvent())) - accumulator.accumulate(ResponseStreamEvent.ofInProgress(responseInProgressEvent())) - accumulator.accumulate(ResponseStreamEvent.ofInProgress(responseInProgressEvent())) - accumulator.accumulate(ResponseStreamEvent.ofFailed(responseFailedEvent())) - - val response = accumulator.response() - - assertThat(response.id()).isEqualTo("response-id") - } - - private fun responseCreatedEvent() = - ResponseCreatedEvent.builder().response(response()).sequenceNumber(1L).build() - - private fun responseInProgressEvent() = - ResponseInProgressEvent.builder().response(response()).sequenceNumber(1L).build() - - private fun responseCompletedEvent() = - ResponseCompletedEvent.builder().response(response()).sequenceNumber(1L).build() - - private fun responseFailedEvent() = - ResponseFailedEvent.builder().response(response()).sequenceNumber(1L).build() - - private fun responseIncompleteEvent() = - ResponseIncompleteEvent.builder().response(response()).sequenceNumber(1L).build() - - private fun responseRateLimitsUpdatedEvent(): ResponseStreamEvent = - jsonMapper() - .readValue( - """{"type":"response.rate_limits.updated","sequence_number":2,"rate_limits":[]}""", - jacksonTypeRef(), - ) - - private fun streamResponseOf(event: ResponseStreamEvent): StreamResponse = - object : StreamResponse { - override fun stream(): Stream = Stream.of(event) - - override fun close() {} - } - - private fun response() = - Response.builder() - .id("response-id") - .createdAt(System.currentTimeMillis() / 1_000.0) - .error(null) - .incompleteDetails(null) - .instructions(null) - .metadata(null) - .model(ResponsesModel.ResponsesOnlyModel.O1_PRO) - .addOutput(responseOutputItemOfMessage()) - .parallelToolCalls(false) - .temperature(null) - .toolChoice(JsonNull.of()) - .tools(listOf()) - .topP(null) - .build() - - private fun responseOutputItemOfMessage() = - ResponseOutputItem.ofMessage(responseOutputMessage()) - - private fun responseOutputMessage() = - ResponseOutputMessage.builder() - .id("message-id") - .addContent(ResponseOutputMessage.Content.ofOutputText(responseOutputText())) - .status(ResponseOutputMessage.Status.COMPLETED) - .build() - - private fun responseOutputText() = - ResponseOutputText.builder() - .text("Hello World") - .annotations(listOf()) - .logprobs(listOf()) - .build() -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationCreatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationCreatedEventTest.kt deleted file mode 100644 index 05e867e77..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationCreatedEventTest.kt +++ /dev/null @@ -1,57 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationCreatedEventTest { - - @Test - fun create() { - val conversationCreatedEvent = - ConversationCreatedEvent.builder() - .conversation( - ConversationCreatedEvent.Conversation.builder() - .id("id") - .object_(ConversationCreatedEvent.Conversation.Object.REALTIME_CONVERSATION) - .build() - ) - .eventId("event_id") - .build() - - assertThat(conversationCreatedEvent.conversation()) - .isEqualTo( - ConversationCreatedEvent.Conversation.builder() - .id("id") - .object_(ConversationCreatedEvent.Conversation.Object.REALTIME_CONVERSATION) - .build() - ) - assertThat(conversationCreatedEvent.eventId()).isEqualTo("event_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationCreatedEvent = - ConversationCreatedEvent.builder() - .conversation( - ConversationCreatedEvent.Conversation.builder() - .id("id") - .object_(ConversationCreatedEvent.Conversation.Object.REALTIME_CONVERSATION) - .build() - ) - .eventId("event_id") - .build() - - val roundtrippedConversationCreatedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(conversationCreatedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationCreatedEvent).isEqualTo(conversationCreatedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemContentTest.kt deleted file mode 100644 index 241b69eea..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemContentTest.kt +++ /dev/null @@ -1,50 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationItemContentTest { - - @Test - fun create() { - val conversationItemContent = - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - - assertThat(conversationItemContent.id()).contains("id") - assertThat(conversationItemContent.audio()).contains("audio") - assertThat(conversationItemContent.text()).contains("text") - assertThat(conversationItemContent.transcript()).contains("transcript") - assertThat(conversationItemContent.type()).contains(ConversationItemContent.Type.INPUT_TEXT) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationItemContent = - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - - val roundtrippedConversationItemContent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(conversationItemContent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationItemContent).isEqualTo(conversationItemContent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemCreateEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemCreateEventTest.kt deleted file mode 100644 index c4bb90df4..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemCreateEventTest.kt +++ /dev/null @@ -1,108 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationItemCreateEventTest { - - @Test - fun create() { - val conversationItemCreateEvent = - ConversationItemCreateEvent.builder() - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .eventId("event_id") - .previousItemId("previous_item_id") - .build() - - assertThat(conversationItemCreateEvent.item()) - .isEqualTo( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - assertThat(conversationItemCreateEvent.eventId()).contains("event_id") - assertThat(conversationItemCreateEvent.previousItemId()).contains("previous_item_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationItemCreateEvent = - ConversationItemCreateEvent.builder() - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .eventId("event_id") - .previousItemId("previous_item_id") - .build() - - val roundtrippedConversationItemCreateEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(conversationItemCreateEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationItemCreateEvent).isEqualTo(conversationItemCreateEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemCreatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemCreatedEventTest.kt deleted file mode 100644 index 6865539fb..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemCreatedEventTest.kt +++ /dev/null @@ -1,108 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationItemCreatedEventTest { - - @Test - fun create() { - val conversationItemCreatedEvent = - ConversationItemCreatedEvent.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .previousItemId("previous_item_id") - .build() - - assertThat(conversationItemCreatedEvent.eventId()).isEqualTo("event_id") - assertThat(conversationItemCreatedEvent.item()) - .isEqualTo( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - assertThat(conversationItemCreatedEvent.previousItemId()).contains("previous_item_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationItemCreatedEvent = - ConversationItemCreatedEvent.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .previousItemId("previous_item_id") - .build() - - val roundtrippedConversationItemCreatedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(conversationItemCreatedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationItemCreatedEvent).isEqualTo(conversationItemCreatedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemDeleteEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemDeleteEventTest.kt deleted file mode 100644 index 99d119a4e..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemDeleteEventTest.kt +++ /dev/null @@ -1,35 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationItemDeleteEventTest { - - @Test - fun create() { - val conversationItemDeleteEvent = - ConversationItemDeleteEvent.builder().itemId("item_id").eventId("event_id").build() - - assertThat(conversationItemDeleteEvent.itemId()).isEqualTo("item_id") - assertThat(conversationItemDeleteEvent.eventId()).contains("event_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationItemDeleteEvent = - ConversationItemDeleteEvent.builder().itemId("item_id").eventId("event_id").build() - - val roundtrippedConversationItemDeleteEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(conversationItemDeleteEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationItemDeleteEvent).isEqualTo(conversationItemDeleteEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemDeletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemDeletedEventTest.kt deleted file mode 100644 index 519c48304..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemDeletedEventTest.kt +++ /dev/null @@ -1,35 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationItemDeletedEventTest { - - @Test - fun create() { - val conversationItemDeletedEvent = - ConversationItemDeletedEvent.builder().eventId("event_id").itemId("item_id").build() - - assertThat(conversationItemDeletedEvent.eventId()).isEqualTo("event_id") - assertThat(conversationItemDeletedEvent.itemId()).isEqualTo("item_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationItemDeletedEvent = - ConversationItemDeletedEvent.builder().eventId("event_id").itemId("item_id").build() - - val roundtrippedConversationItemDeletedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(conversationItemDeletedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationItemDeletedEvent).isEqualTo(conversationItemDeletedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionCompletedEventTest.kt deleted file mode 100644 index 8242cffc1..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionCompletedEventTest.kt +++ /dev/null @@ -1,135 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import kotlin.jvm.optionals.getOrNull -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationItemInputAudioTranscriptionCompletedEventTest { - - @Test - fun create() { - val conversationItemInputAudioTranscriptionCompletedEvent = - ConversationItemInputAudioTranscriptionCompletedEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .transcript("transcript") - .usage( - ConversationItemInputAudioTranscriptionCompletedEvent.Usage - .TranscriptTextUsageTokens - .builder() - .inputTokens(0L) - .outputTokens(0L) - .totalTokens(0L) - .inputTokenDetails( - ConversationItemInputAudioTranscriptionCompletedEvent.Usage - .TranscriptTextUsageTokens - .InputTokenDetails - .builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .build() - ) - .addLogprob( - ConversationItemInputAudioTranscriptionCompletedEvent.Logprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .build() - ) - .build() - - assertThat(conversationItemInputAudioTranscriptionCompletedEvent.contentIndex()) - .isEqualTo(0L) - assertThat(conversationItemInputAudioTranscriptionCompletedEvent.eventId()) - .isEqualTo("event_id") - assertThat(conversationItemInputAudioTranscriptionCompletedEvent.itemId()) - .isEqualTo("item_id") - assertThat(conversationItemInputAudioTranscriptionCompletedEvent.transcript()) - .isEqualTo("transcript") - assertThat(conversationItemInputAudioTranscriptionCompletedEvent.usage()) - .isEqualTo( - ConversationItemInputAudioTranscriptionCompletedEvent.Usage - .ofTranscriptTextUsageTokens( - ConversationItemInputAudioTranscriptionCompletedEvent.Usage - .TranscriptTextUsageTokens - .builder() - .inputTokens(0L) - .outputTokens(0L) - .totalTokens(0L) - .inputTokenDetails( - ConversationItemInputAudioTranscriptionCompletedEvent.Usage - .TranscriptTextUsageTokens - .InputTokenDetails - .builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .build() - ) - ) - assertThat(conversationItemInputAudioTranscriptionCompletedEvent.logprobs().getOrNull()) - .containsExactly( - ConversationItemInputAudioTranscriptionCompletedEvent.Logprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .build() - ) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationItemInputAudioTranscriptionCompletedEvent = - ConversationItemInputAudioTranscriptionCompletedEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .transcript("transcript") - .usage( - ConversationItemInputAudioTranscriptionCompletedEvent.Usage - .TranscriptTextUsageTokens - .builder() - .inputTokens(0L) - .outputTokens(0L) - .totalTokens(0L) - .inputTokenDetails( - ConversationItemInputAudioTranscriptionCompletedEvent.Usage - .TranscriptTextUsageTokens - .InputTokenDetails - .builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .build() - ) - .addLogprob( - ConversationItemInputAudioTranscriptionCompletedEvent.Logprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .build() - ) - .build() - - val roundtrippedConversationItemInputAudioTranscriptionCompletedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString( - conversationItemInputAudioTranscriptionCompletedEvent - ), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationItemInputAudioTranscriptionCompletedEvent) - .isEqualTo(conversationItemInputAudioTranscriptionCompletedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionDeltaEventTest.kt deleted file mode 100644 index 4c53456b9..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionDeltaEventTest.kt +++ /dev/null @@ -1,72 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import kotlin.jvm.optionals.getOrNull -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationItemInputAudioTranscriptionDeltaEventTest { - - @Test - fun create() { - val conversationItemInputAudioTranscriptionDeltaEvent = - ConversationItemInputAudioTranscriptionDeltaEvent.builder() - .eventId("event_id") - .itemId("item_id") - .contentIndex(0L) - .delta("delta") - .addLogprob( - ConversationItemInputAudioTranscriptionDeltaEvent.Logprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .build() - ) - .build() - - assertThat(conversationItemInputAudioTranscriptionDeltaEvent.eventId()) - .isEqualTo("event_id") - assertThat(conversationItemInputAudioTranscriptionDeltaEvent.itemId()).isEqualTo("item_id") - assertThat(conversationItemInputAudioTranscriptionDeltaEvent.contentIndex()).contains(0L) - assertThat(conversationItemInputAudioTranscriptionDeltaEvent.delta()).contains("delta") - assertThat(conversationItemInputAudioTranscriptionDeltaEvent.logprobs().getOrNull()) - .containsExactly( - ConversationItemInputAudioTranscriptionDeltaEvent.Logprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .build() - ) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationItemInputAudioTranscriptionDeltaEvent = - ConversationItemInputAudioTranscriptionDeltaEvent.builder() - .eventId("event_id") - .itemId("item_id") - .contentIndex(0L) - .delta("delta") - .addLogprob( - ConversationItemInputAudioTranscriptionDeltaEvent.Logprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .build() - ) - .build() - - val roundtrippedConversationItemInputAudioTranscriptionDeltaEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(conversationItemInputAudioTranscriptionDeltaEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationItemInputAudioTranscriptionDeltaEvent) - .isEqualTo(conversationItemInputAudioTranscriptionDeltaEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionFailedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionFailedEventTest.kt deleted file mode 100644 index 936a52f4b..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemInputAudioTranscriptionFailedEventTest.kt +++ /dev/null @@ -1,71 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationItemInputAudioTranscriptionFailedEventTest { - - @Test - fun create() { - val conversationItemInputAudioTranscriptionFailedEvent = - ConversationItemInputAudioTranscriptionFailedEvent.builder() - .contentIndex(0L) - .error( - ConversationItemInputAudioTranscriptionFailedEvent.Error.builder() - .code("code") - .message("message") - .param("param") - .type("type") - .build() - ) - .eventId("event_id") - .itemId("item_id") - .build() - - assertThat(conversationItemInputAudioTranscriptionFailedEvent.contentIndex()).isEqualTo(0L) - assertThat(conversationItemInputAudioTranscriptionFailedEvent.error()) - .isEqualTo( - ConversationItemInputAudioTranscriptionFailedEvent.Error.builder() - .code("code") - .message("message") - .param("param") - .type("type") - .build() - ) - assertThat(conversationItemInputAudioTranscriptionFailedEvent.eventId()) - .isEqualTo("event_id") - assertThat(conversationItemInputAudioTranscriptionFailedEvent.itemId()).isEqualTo("item_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationItemInputAudioTranscriptionFailedEvent = - ConversationItemInputAudioTranscriptionFailedEvent.builder() - .contentIndex(0L) - .error( - ConversationItemInputAudioTranscriptionFailedEvent.Error.builder() - .code("code") - .message("message") - .param("param") - .type("type") - .build() - ) - .eventId("event_id") - .itemId("item_id") - .build() - - val roundtrippedConversationItemInputAudioTranscriptionFailedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(conversationItemInputAudioTranscriptionFailedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationItemInputAudioTranscriptionFailedEvent) - .isEqualTo(conversationItemInputAudioTranscriptionFailedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemRetrieveEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemRetrieveEventTest.kt deleted file mode 100644 index 8b7acab2b..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemRetrieveEventTest.kt +++ /dev/null @@ -1,36 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationItemRetrieveEventTest { - - @Test - fun create() { - val conversationItemRetrieveEvent = - ConversationItemRetrieveEvent.builder().itemId("item_id").eventId("event_id").build() - - assertThat(conversationItemRetrieveEvent.itemId()).isEqualTo("item_id") - assertThat(conversationItemRetrieveEvent.eventId()).contains("event_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationItemRetrieveEvent = - ConversationItemRetrieveEvent.builder().itemId("item_id").eventId("event_id").build() - - val roundtrippedConversationItemRetrieveEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(conversationItemRetrieveEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationItemRetrieveEvent) - .isEqualTo(conversationItemRetrieveEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemTest.kt deleted file mode 100644 index 5eeac9dd9..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemTest.kt +++ /dev/null @@ -1,91 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import kotlin.jvm.optionals.getOrNull -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationItemTest { - - @Test - fun create() { - val conversationItem = - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - - assertThat(conversationItem.id()).contains("id") - assertThat(conversationItem.arguments()).contains("arguments") - assertThat(conversationItem.callId()).contains("call_id") - assertThat(conversationItem.content().getOrNull()) - .containsExactly( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - assertThat(conversationItem.name()).contains("name") - assertThat(conversationItem.object_()).contains(ConversationItem.Object.REALTIME_ITEM) - assertThat(conversationItem.output()).contains("output") - assertThat(conversationItem.role()).contains(ConversationItem.Role.USER) - assertThat(conversationItem.status()).contains(ConversationItem.Status.COMPLETED) - assertThat(conversationItem.type()).contains(ConversationItem.Type.MESSAGE) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationItem = - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - - val roundtrippedConversationItem = - jsonMapper.readValue( - jsonMapper.writeValueAsString(conversationItem), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationItem).isEqualTo(conversationItem) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemTruncateEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemTruncateEventTest.kt deleted file mode 100644 index 783e6d7c6..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemTruncateEventTest.kt +++ /dev/null @@ -1,48 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationItemTruncateEventTest { - - @Test - fun create() { - val conversationItemTruncateEvent = - ConversationItemTruncateEvent.builder() - .audioEndMs(0L) - .contentIndex(0L) - .itemId("item_id") - .eventId("event_id") - .build() - - assertThat(conversationItemTruncateEvent.audioEndMs()).isEqualTo(0L) - assertThat(conversationItemTruncateEvent.contentIndex()).isEqualTo(0L) - assertThat(conversationItemTruncateEvent.itemId()).isEqualTo("item_id") - assertThat(conversationItemTruncateEvent.eventId()).contains("event_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationItemTruncateEvent = - ConversationItemTruncateEvent.builder() - .audioEndMs(0L) - .contentIndex(0L) - .itemId("item_id") - .eventId("event_id") - .build() - - val roundtrippedConversationItemTruncateEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(conversationItemTruncateEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationItemTruncateEvent) - .isEqualTo(conversationItemTruncateEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemTruncatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemTruncatedEventTest.kt deleted file mode 100644 index 8bc77f1b3..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemTruncatedEventTest.kt +++ /dev/null @@ -1,48 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationItemTruncatedEventTest { - - @Test - fun create() { - val conversationItemTruncatedEvent = - ConversationItemTruncatedEvent.builder() - .audioEndMs(0L) - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .build() - - assertThat(conversationItemTruncatedEvent.audioEndMs()).isEqualTo(0L) - assertThat(conversationItemTruncatedEvent.contentIndex()).isEqualTo(0L) - assertThat(conversationItemTruncatedEvent.eventId()).isEqualTo("event_id") - assertThat(conversationItemTruncatedEvent.itemId()).isEqualTo("item_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationItemTruncatedEvent = - ConversationItemTruncatedEvent.builder() - .audioEndMs(0L) - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .build() - - val roundtrippedConversationItemTruncatedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(conversationItemTruncatedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationItemTruncatedEvent) - .isEqualTo(conversationItemTruncatedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemWithReferenceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemWithReferenceTest.kt deleted file mode 100644 index 9d531b92d..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ConversationItemWithReferenceTest.kt +++ /dev/null @@ -1,96 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import kotlin.jvm.optionals.getOrNull -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ConversationItemWithReferenceTest { - - @Test - fun create() { - val conversationItemWithReference = - ConversationItemWithReference.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemWithReference.Content.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemWithReference.Content.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItemWithReference.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItemWithReference.Role.USER) - .status(ConversationItemWithReference.Status.COMPLETED) - .type(ConversationItemWithReference.Type.MESSAGE) - .build() - - assertThat(conversationItemWithReference.id()).contains("id") - assertThat(conversationItemWithReference.arguments()).contains("arguments") - assertThat(conversationItemWithReference.callId()).contains("call_id") - assertThat(conversationItemWithReference.content().getOrNull()) - .containsExactly( - ConversationItemWithReference.Content.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemWithReference.Content.Type.INPUT_TEXT) - .build() - ) - assertThat(conversationItemWithReference.name()).contains("name") - assertThat(conversationItemWithReference.object_()) - .contains(ConversationItemWithReference.Object.REALTIME_ITEM) - assertThat(conversationItemWithReference.output()).contains("output") - assertThat(conversationItemWithReference.role()) - .contains(ConversationItemWithReference.Role.USER) - assertThat(conversationItemWithReference.status()) - .contains(ConversationItemWithReference.Status.COMPLETED) - assertThat(conversationItemWithReference.type()) - .contains(ConversationItemWithReference.Type.MESSAGE) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val conversationItemWithReference = - ConversationItemWithReference.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemWithReference.Content.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemWithReference.Content.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItemWithReference.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItemWithReference.Role.USER) - .status(ConversationItemWithReference.Status.COMPLETED) - .type(ConversationItemWithReference.Type.MESSAGE) - .build() - - val roundtrippedConversationItemWithReference = - jsonMapper.readValue( - jsonMapper.writeValueAsString(conversationItemWithReference), - jacksonTypeRef(), - ) - - assertThat(roundtrippedConversationItemWithReference) - .isEqualTo(conversationItemWithReference) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ErrorEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ErrorEventTest.kt deleted file mode 100644 index 53786941d..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ErrorEventTest.kt +++ /dev/null @@ -1,66 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ErrorEventTest { - - @Test - fun create() { - val errorEvent = - ErrorEvent.builder() - .error( - ErrorEvent.Error.builder() - .message("message") - .type("type") - .code("code") - .eventId("event_id") - .param("param") - .build() - ) - .eventId("event_id") - .build() - - assertThat(errorEvent.error()) - .isEqualTo( - ErrorEvent.Error.builder() - .message("message") - .type("type") - .code("code") - .eventId("event_id") - .param("param") - .build() - ) - assertThat(errorEvent.eventId()).isEqualTo("event_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val errorEvent = - ErrorEvent.builder() - .error( - ErrorEvent.Error.builder() - .message("message") - .type("type") - .code("code") - .eventId("event_id") - .param("param") - .build() - ) - .eventId("event_id") - .build() - - val roundtrippedErrorEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(errorEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedErrorEvent).isEqualTo(errorEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferAppendEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferAppendEventTest.kt deleted file mode 100644 index bd48c1296..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferAppendEventTest.kt +++ /dev/null @@ -1,35 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class InputAudioBufferAppendEventTest { - - @Test - fun create() { - val inputAudioBufferAppendEvent = - InputAudioBufferAppendEvent.builder().audio("audio").eventId("event_id").build() - - assertThat(inputAudioBufferAppendEvent.audio()).isEqualTo("audio") - assertThat(inputAudioBufferAppendEvent.eventId()).contains("event_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val inputAudioBufferAppendEvent = - InputAudioBufferAppendEvent.builder().audio("audio").eventId("event_id").build() - - val roundtrippedInputAudioBufferAppendEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(inputAudioBufferAppendEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedInputAudioBufferAppendEvent).isEqualTo(inputAudioBufferAppendEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearEventTest.kt deleted file mode 100644 index 817ae9b28..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearEventTest.kt +++ /dev/null @@ -1,34 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class InputAudioBufferClearEventTest { - - @Test - fun create() { - val inputAudioBufferClearEvent = - InputAudioBufferClearEvent.builder().eventId("event_id").build() - - assertThat(inputAudioBufferClearEvent.eventId()).contains("event_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val inputAudioBufferClearEvent = - InputAudioBufferClearEvent.builder().eventId("event_id").build() - - val roundtrippedInputAudioBufferClearEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(inputAudioBufferClearEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedInputAudioBufferClearEvent).isEqualTo(inputAudioBufferClearEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearedEventTest.kt deleted file mode 100644 index f46cb1bd7..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferClearedEventTest.kt +++ /dev/null @@ -1,34 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class InputAudioBufferClearedEventTest { - - @Test - fun create() { - val inputAudioBufferClearedEvent = - InputAudioBufferClearedEvent.builder().eventId("event_id").build() - - assertThat(inputAudioBufferClearedEvent.eventId()).isEqualTo("event_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val inputAudioBufferClearedEvent = - InputAudioBufferClearedEvent.builder().eventId("event_id").build() - - val roundtrippedInputAudioBufferClearedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(inputAudioBufferClearedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedInputAudioBufferClearedEvent).isEqualTo(inputAudioBufferClearedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommitEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommitEventTest.kt deleted file mode 100644 index df2df76de..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommitEventTest.kt +++ /dev/null @@ -1,34 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class InputAudioBufferCommitEventTest { - - @Test - fun create() { - val inputAudioBufferCommitEvent = - InputAudioBufferCommitEvent.builder().eventId("event_id").build() - - assertThat(inputAudioBufferCommitEvent.eventId()).contains("event_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val inputAudioBufferCommitEvent = - InputAudioBufferCommitEvent.builder().eventId("event_id").build() - - val roundtrippedInputAudioBufferCommitEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(inputAudioBufferCommitEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedInputAudioBufferCommitEvent).isEqualTo(inputAudioBufferCommitEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommittedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommittedEventTest.kt deleted file mode 100644 index db11b068b..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferCommittedEventTest.kt +++ /dev/null @@ -1,45 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class InputAudioBufferCommittedEventTest { - - @Test - fun create() { - val inputAudioBufferCommittedEvent = - InputAudioBufferCommittedEvent.builder() - .eventId("event_id") - .itemId("item_id") - .previousItemId("previous_item_id") - .build() - - assertThat(inputAudioBufferCommittedEvent.eventId()).isEqualTo("event_id") - assertThat(inputAudioBufferCommittedEvent.itemId()).isEqualTo("item_id") - assertThat(inputAudioBufferCommittedEvent.previousItemId()).contains("previous_item_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val inputAudioBufferCommittedEvent = - InputAudioBufferCommittedEvent.builder() - .eventId("event_id") - .itemId("item_id") - .previousItemId("previous_item_id") - .build() - - val roundtrippedInputAudioBufferCommittedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(inputAudioBufferCommittedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedInputAudioBufferCommittedEvent) - .isEqualTo(inputAudioBufferCommittedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStartedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStartedEventTest.kt deleted file mode 100644 index 73df3ccc2..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStartedEventTest.kt +++ /dev/null @@ -1,45 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class InputAudioBufferSpeechStartedEventTest { - - @Test - fun create() { - val inputAudioBufferSpeechStartedEvent = - InputAudioBufferSpeechStartedEvent.builder() - .audioStartMs(0L) - .eventId("event_id") - .itemId("item_id") - .build() - - assertThat(inputAudioBufferSpeechStartedEvent.audioStartMs()).isEqualTo(0L) - assertThat(inputAudioBufferSpeechStartedEvent.eventId()).isEqualTo("event_id") - assertThat(inputAudioBufferSpeechStartedEvent.itemId()).isEqualTo("item_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val inputAudioBufferSpeechStartedEvent = - InputAudioBufferSpeechStartedEvent.builder() - .audioStartMs(0L) - .eventId("event_id") - .itemId("item_id") - .build() - - val roundtrippedInputAudioBufferSpeechStartedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(inputAudioBufferSpeechStartedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedInputAudioBufferSpeechStartedEvent) - .isEqualTo(inputAudioBufferSpeechStartedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStoppedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStoppedEventTest.kt deleted file mode 100644 index fd17c393e..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/InputAudioBufferSpeechStoppedEventTest.kt +++ /dev/null @@ -1,45 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class InputAudioBufferSpeechStoppedEventTest { - - @Test - fun create() { - val inputAudioBufferSpeechStoppedEvent = - InputAudioBufferSpeechStoppedEvent.builder() - .audioEndMs(0L) - .eventId("event_id") - .itemId("item_id") - .build() - - assertThat(inputAudioBufferSpeechStoppedEvent.audioEndMs()).isEqualTo(0L) - assertThat(inputAudioBufferSpeechStoppedEvent.eventId()).isEqualTo("event_id") - assertThat(inputAudioBufferSpeechStoppedEvent.itemId()).isEqualTo("item_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val inputAudioBufferSpeechStoppedEvent = - InputAudioBufferSpeechStoppedEvent.builder() - .audioEndMs(0L) - .eventId("event_id") - .itemId("item_id") - .build() - - val roundtrippedInputAudioBufferSpeechStoppedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(inputAudioBufferSpeechStoppedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedInputAudioBufferSpeechStoppedEvent) - .isEqualTo(inputAudioBufferSpeechStoppedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RateLimitsUpdatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RateLimitsUpdatedEventTest.kt deleted file mode 100644 index 02c693329..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RateLimitsUpdatedEventTest.kt +++ /dev/null @@ -1,63 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class RateLimitsUpdatedEventTest { - - @Test - fun create() { - val rateLimitsUpdatedEvent = - RateLimitsUpdatedEvent.builder() - .eventId("event_id") - .addRateLimit( - RateLimitsUpdatedEvent.RateLimit.builder() - .limit(0L) - .name(RateLimitsUpdatedEvent.RateLimit.Name.REQUESTS) - .remaining(0L) - .resetSeconds(0.0) - .build() - ) - .build() - - assertThat(rateLimitsUpdatedEvent.eventId()).isEqualTo("event_id") - assertThat(rateLimitsUpdatedEvent.rateLimits()) - .containsExactly( - RateLimitsUpdatedEvent.RateLimit.builder() - .limit(0L) - .name(RateLimitsUpdatedEvent.RateLimit.Name.REQUESTS) - .remaining(0L) - .resetSeconds(0.0) - .build() - ) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val rateLimitsUpdatedEvent = - RateLimitsUpdatedEvent.builder() - .eventId("event_id") - .addRateLimit( - RateLimitsUpdatedEvent.RateLimit.builder() - .limit(0L) - .name(RateLimitsUpdatedEvent.RateLimit.Name.REQUESTS) - .remaining(0L) - .resetSeconds(0.0) - .build() - ) - .build() - - val roundtrippedRateLimitsUpdatedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(rateLimitsUpdatedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRateLimitsUpdatedEvent).isEqualTo(rateLimitsUpdatedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeClientEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeClientEventTest.kt deleted file mode 100644 index 484287d4a..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeClientEventTest.kt +++ /dev/null @@ -1,920 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonValue -import com.openai.core.jsonMapper -import com.openai.errors.OpenAIInvalidDataException -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.EnumSource - -internal class RealtimeClientEventTest { - - @Test - fun ofConversationItemCreate() { - val conversationItemCreate = - ConversationItemCreateEvent.builder() - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .eventId("event_id") - .previousItemId("previous_item_id") - .build() - - val realtimeClientEvent = - RealtimeClientEvent.ofConversationItemCreate(conversationItemCreate) - - assertThat(realtimeClientEvent.conversationItemCreate()).contains(conversationItemCreate) - assertThat(realtimeClientEvent.conversationItemDelete()).isEmpty - assertThat(realtimeClientEvent.conversationItemRetrieve()).isEmpty - assertThat(realtimeClientEvent.conversationItemTruncate()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferAppend()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.outputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferCommit()).isEmpty - assertThat(realtimeClientEvent.responseCancel()).isEmpty - assertThat(realtimeClientEvent.responseCreate()).isEmpty - assertThat(realtimeClientEvent.sessionUpdate()).isEmpty - assertThat(realtimeClientEvent.transcriptionSessionUpdate()).isEmpty - } - - @Test - fun ofConversationItemCreateRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeClientEvent = - RealtimeClientEvent.ofConversationItemCreate( - ConversationItemCreateEvent.builder() - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .eventId("event_id") - .previousItemId("previous_item_id") - .build() - ) - - val roundtrippedRealtimeClientEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeClientEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeClientEvent).isEqualTo(realtimeClientEvent) - } - - @Test - fun ofConversationItemDelete() { - val conversationItemDelete = - ConversationItemDeleteEvent.builder().itemId("item_id").eventId("event_id").build() - - val realtimeClientEvent = - RealtimeClientEvent.ofConversationItemDelete(conversationItemDelete) - - assertThat(realtimeClientEvent.conversationItemCreate()).isEmpty - assertThat(realtimeClientEvent.conversationItemDelete()).contains(conversationItemDelete) - assertThat(realtimeClientEvent.conversationItemRetrieve()).isEmpty - assertThat(realtimeClientEvent.conversationItemTruncate()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferAppend()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.outputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferCommit()).isEmpty - assertThat(realtimeClientEvent.responseCancel()).isEmpty - assertThat(realtimeClientEvent.responseCreate()).isEmpty - assertThat(realtimeClientEvent.sessionUpdate()).isEmpty - assertThat(realtimeClientEvent.transcriptionSessionUpdate()).isEmpty - } - - @Test - fun ofConversationItemDeleteRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeClientEvent = - RealtimeClientEvent.ofConversationItemDelete( - ConversationItemDeleteEvent.builder().itemId("item_id").eventId("event_id").build() - ) - - val roundtrippedRealtimeClientEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeClientEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeClientEvent).isEqualTo(realtimeClientEvent) - } - - @Test - fun ofConversationItemRetrieve() { - val conversationItemRetrieve = - ConversationItemRetrieveEvent.builder().itemId("item_id").eventId("event_id").build() - - val realtimeClientEvent = - RealtimeClientEvent.ofConversationItemRetrieve(conversationItemRetrieve) - - assertThat(realtimeClientEvent.conversationItemCreate()).isEmpty - assertThat(realtimeClientEvent.conversationItemDelete()).isEmpty - assertThat(realtimeClientEvent.conversationItemRetrieve()) - .contains(conversationItemRetrieve) - assertThat(realtimeClientEvent.conversationItemTruncate()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferAppend()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.outputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferCommit()).isEmpty - assertThat(realtimeClientEvent.responseCancel()).isEmpty - assertThat(realtimeClientEvent.responseCreate()).isEmpty - assertThat(realtimeClientEvent.sessionUpdate()).isEmpty - assertThat(realtimeClientEvent.transcriptionSessionUpdate()).isEmpty - } - - @Test - fun ofConversationItemRetrieveRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeClientEvent = - RealtimeClientEvent.ofConversationItemRetrieve( - ConversationItemRetrieveEvent.builder() - .itemId("item_id") - .eventId("event_id") - .build() - ) - - val roundtrippedRealtimeClientEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeClientEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeClientEvent).isEqualTo(realtimeClientEvent) - } - - @Test - fun ofConversationItemTruncate() { - val conversationItemTruncate = - ConversationItemTruncateEvent.builder() - .audioEndMs(0L) - .contentIndex(0L) - .itemId("item_id") - .eventId("event_id") - .build() - - val realtimeClientEvent = - RealtimeClientEvent.ofConversationItemTruncate(conversationItemTruncate) - - assertThat(realtimeClientEvent.conversationItemCreate()).isEmpty - assertThat(realtimeClientEvent.conversationItemDelete()).isEmpty - assertThat(realtimeClientEvent.conversationItemRetrieve()).isEmpty - assertThat(realtimeClientEvent.conversationItemTruncate()) - .contains(conversationItemTruncate) - assertThat(realtimeClientEvent.inputAudioBufferAppend()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.outputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferCommit()).isEmpty - assertThat(realtimeClientEvent.responseCancel()).isEmpty - assertThat(realtimeClientEvent.responseCreate()).isEmpty - assertThat(realtimeClientEvent.sessionUpdate()).isEmpty - assertThat(realtimeClientEvent.transcriptionSessionUpdate()).isEmpty - } - - @Test - fun ofConversationItemTruncateRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeClientEvent = - RealtimeClientEvent.ofConversationItemTruncate( - ConversationItemTruncateEvent.builder() - .audioEndMs(0L) - .contentIndex(0L) - .itemId("item_id") - .eventId("event_id") - .build() - ) - - val roundtrippedRealtimeClientEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeClientEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeClientEvent).isEqualTo(realtimeClientEvent) - } - - @Test - fun ofInputAudioBufferAppend() { - val inputAudioBufferAppend = - InputAudioBufferAppendEvent.builder().audio("audio").eventId("event_id").build() - - val realtimeClientEvent = - RealtimeClientEvent.ofInputAudioBufferAppend(inputAudioBufferAppend) - - assertThat(realtimeClientEvent.conversationItemCreate()).isEmpty - assertThat(realtimeClientEvent.conversationItemDelete()).isEmpty - assertThat(realtimeClientEvent.conversationItemRetrieve()).isEmpty - assertThat(realtimeClientEvent.conversationItemTruncate()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferAppend()).contains(inputAudioBufferAppend) - assertThat(realtimeClientEvent.inputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.outputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferCommit()).isEmpty - assertThat(realtimeClientEvent.responseCancel()).isEmpty - assertThat(realtimeClientEvent.responseCreate()).isEmpty - assertThat(realtimeClientEvent.sessionUpdate()).isEmpty - assertThat(realtimeClientEvent.transcriptionSessionUpdate()).isEmpty - } - - @Test - fun ofInputAudioBufferAppendRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeClientEvent = - RealtimeClientEvent.ofInputAudioBufferAppend( - InputAudioBufferAppendEvent.builder().audio("audio").eventId("event_id").build() - ) - - val roundtrippedRealtimeClientEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeClientEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeClientEvent).isEqualTo(realtimeClientEvent) - } - - @Test - fun ofInputAudioBufferClear() { - val inputAudioBufferClear = InputAudioBufferClearEvent.builder().eventId("event_id").build() - - val realtimeClientEvent = RealtimeClientEvent.ofInputAudioBufferClear(inputAudioBufferClear) - - assertThat(realtimeClientEvent.conversationItemCreate()).isEmpty - assertThat(realtimeClientEvent.conversationItemDelete()).isEmpty - assertThat(realtimeClientEvent.conversationItemRetrieve()).isEmpty - assertThat(realtimeClientEvent.conversationItemTruncate()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferAppend()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferClear()).contains(inputAudioBufferClear) - assertThat(realtimeClientEvent.outputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferCommit()).isEmpty - assertThat(realtimeClientEvent.responseCancel()).isEmpty - assertThat(realtimeClientEvent.responseCreate()).isEmpty - assertThat(realtimeClientEvent.sessionUpdate()).isEmpty - assertThat(realtimeClientEvent.transcriptionSessionUpdate()).isEmpty - } - - @Test - fun ofInputAudioBufferClearRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeClientEvent = - RealtimeClientEvent.ofInputAudioBufferClear( - InputAudioBufferClearEvent.builder().eventId("event_id").build() - ) - - val roundtrippedRealtimeClientEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeClientEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeClientEvent).isEqualTo(realtimeClientEvent) - } - - @Test - fun ofOutputAudioBufferClear() { - val outputAudioBufferClear = - RealtimeClientEvent.OutputAudioBufferClear.builder().eventId("event_id").build() - - val realtimeClientEvent = - RealtimeClientEvent.ofOutputAudioBufferClear(outputAudioBufferClear) - - assertThat(realtimeClientEvent.conversationItemCreate()).isEmpty - assertThat(realtimeClientEvent.conversationItemDelete()).isEmpty - assertThat(realtimeClientEvent.conversationItemRetrieve()).isEmpty - assertThat(realtimeClientEvent.conversationItemTruncate()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferAppend()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.outputAudioBufferClear()).contains(outputAudioBufferClear) - assertThat(realtimeClientEvent.inputAudioBufferCommit()).isEmpty - assertThat(realtimeClientEvent.responseCancel()).isEmpty - assertThat(realtimeClientEvent.responseCreate()).isEmpty - assertThat(realtimeClientEvent.sessionUpdate()).isEmpty - assertThat(realtimeClientEvent.transcriptionSessionUpdate()).isEmpty - } - - @Test - fun ofOutputAudioBufferClearRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeClientEvent = - RealtimeClientEvent.ofOutputAudioBufferClear( - RealtimeClientEvent.OutputAudioBufferClear.builder().eventId("event_id").build() - ) - - val roundtrippedRealtimeClientEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeClientEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeClientEvent).isEqualTo(realtimeClientEvent) - } - - @Test - fun ofInputAudioBufferCommit() { - val inputAudioBufferCommit = - InputAudioBufferCommitEvent.builder().eventId("event_id").build() - - val realtimeClientEvent = - RealtimeClientEvent.ofInputAudioBufferCommit(inputAudioBufferCommit) - - assertThat(realtimeClientEvent.conversationItemCreate()).isEmpty - assertThat(realtimeClientEvent.conversationItemDelete()).isEmpty - assertThat(realtimeClientEvent.conversationItemRetrieve()).isEmpty - assertThat(realtimeClientEvent.conversationItemTruncate()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferAppend()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.outputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferCommit()).contains(inputAudioBufferCommit) - assertThat(realtimeClientEvent.responseCancel()).isEmpty - assertThat(realtimeClientEvent.responseCreate()).isEmpty - assertThat(realtimeClientEvent.sessionUpdate()).isEmpty - assertThat(realtimeClientEvent.transcriptionSessionUpdate()).isEmpty - } - - @Test - fun ofInputAudioBufferCommitRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeClientEvent = - RealtimeClientEvent.ofInputAudioBufferCommit( - InputAudioBufferCommitEvent.builder().eventId("event_id").build() - ) - - val roundtrippedRealtimeClientEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeClientEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeClientEvent).isEqualTo(realtimeClientEvent) - } - - @Test - fun ofResponseCancel() { - val responseCancel = - ResponseCancelEvent.builder().eventId("event_id").responseId("response_id").build() - - val realtimeClientEvent = RealtimeClientEvent.ofResponseCancel(responseCancel) - - assertThat(realtimeClientEvent.conversationItemCreate()).isEmpty - assertThat(realtimeClientEvent.conversationItemDelete()).isEmpty - assertThat(realtimeClientEvent.conversationItemRetrieve()).isEmpty - assertThat(realtimeClientEvent.conversationItemTruncate()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferAppend()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.outputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferCommit()).isEmpty - assertThat(realtimeClientEvent.responseCancel()).contains(responseCancel) - assertThat(realtimeClientEvent.responseCreate()).isEmpty - assertThat(realtimeClientEvent.sessionUpdate()).isEmpty - assertThat(realtimeClientEvent.transcriptionSessionUpdate()).isEmpty - } - - @Test - fun ofResponseCancelRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeClientEvent = - RealtimeClientEvent.ofResponseCancel( - ResponseCancelEvent.builder().eventId("event_id").responseId("response_id").build() - ) - - val roundtrippedRealtimeClientEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeClientEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeClientEvent).isEqualTo(realtimeClientEvent) - } - - @Test - fun ofResponseCreate() { - val responseCreate = - ResponseCreateEvent.builder() - .eventId("event_id") - .response( - ResponseCreateEvent.Response.builder() - .conversation(ResponseCreateEvent.Response.Conversation.AUTO) - .addInput( - ConversationItemWithReference.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemWithReference.Content.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemWithReference.Content.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItemWithReference.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItemWithReference.Role.USER) - .status(ConversationItemWithReference.Status.COMPLETED) - .type(ConversationItemWithReference.Type.MESSAGE) - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .metadata( - ResponseCreateEvent.Response.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(ResponseCreateEvent.Response.Modality.TEXT) - .outputAudioFormat(ResponseCreateEvent.Response.OutputAudioFormat.PCM16) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - ResponseCreateEvent.Response.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(ResponseCreateEvent.Response.Tool.Type.FUNCTION) - .build() - ) - .voice(ResponseCreateEvent.Response.Voice.ALLOY) - .build() - ) - .build() - - val realtimeClientEvent = RealtimeClientEvent.ofResponseCreate(responseCreate) - - assertThat(realtimeClientEvent.conversationItemCreate()).isEmpty - assertThat(realtimeClientEvent.conversationItemDelete()).isEmpty - assertThat(realtimeClientEvent.conversationItemRetrieve()).isEmpty - assertThat(realtimeClientEvent.conversationItemTruncate()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferAppend()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.outputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferCommit()).isEmpty - assertThat(realtimeClientEvent.responseCancel()).isEmpty - assertThat(realtimeClientEvent.responseCreate()).contains(responseCreate) - assertThat(realtimeClientEvent.sessionUpdate()).isEmpty - assertThat(realtimeClientEvent.transcriptionSessionUpdate()).isEmpty - } - - @Test - fun ofResponseCreateRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeClientEvent = - RealtimeClientEvent.ofResponseCreate( - ResponseCreateEvent.builder() - .eventId("event_id") - .response( - ResponseCreateEvent.Response.builder() - .conversation(ResponseCreateEvent.Response.Conversation.AUTO) - .addInput( - ConversationItemWithReference.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemWithReference.Content.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type( - ConversationItemWithReference.Content.Type - .INPUT_TEXT - ) - .build() - ) - .name("name") - .object_(ConversationItemWithReference.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItemWithReference.Role.USER) - .status(ConversationItemWithReference.Status.COMPLETED) - .type(ConversationItemWithReference.Type.MESSAGE) - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .metadata( - ResponseCreateEvent.Response.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(ResponseCreateEvent.Response.Modality.TEXT) - .outputAudioFormat(ResponseCreateEvent.Response.OutputAudioFormat.PCM16) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - ResponseCreateEvent.Response.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(ResponseCreateEvent.Response.Tool.Type.FUNCTION) - .build() - ) - .voice(ResponseCreateEvent.Response.Voice.ALLOY) - .build() - ) - .build() - ) - - val roundtrippedRealtimeClientEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeClientEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeClientEvent).isEqualTo(realtimeClientEvent) - } - - @Test - fun ofSessionUpdate() { - val sessionUpdate = - SessionUpdateEvent.builder() - .session( - SessionUpdateEvent.Session.builder() - .clientSecret( - SessionUpdateEvent.Session.ClientSecret.builder() - .expiresAfter( - SessionUpdateEvent.Session.ClientSecret.ExpiresAfter.builder() - .anchor( - SessionUpdateEvent.Session.ClientSecret.ExpiresAfter - .Anchor - .CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - .inputAudioFormat(SessionUpdateEvent.Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - SessionUpdateEvent.Session.InputAudioNoiseReduction.builder() - .type( - SessionUpdateEvent.Session.InputAudioNoiseReduction.Type - .NEAR_FIELD - ) - .build() - ) - .inputAudioTranscription( - SessionUpdateEvent.Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(SessionUpdateEvent.Session.Modality.TEXT) - .model(SessionUpdateEvent.Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(SessionUpdateEvent.Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - SessionUpdateEvent.Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(SessionUpdateEvent.Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - SessionUpdateEvent.Session.TurnDetection.builder() - .createResponse(true) - .eagerness(SessionUpdateEvent.Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(SessionUpdateEvent.Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(SessionUpdateEvent.Session.Voice.ALLOY) - .build() - ) - .eventId("event_id") - .build() - - val realtimeClientEvent = RealtimeClientEvent.ofSessionUpdate(sessionUpdate) - - assertThat(realtimeClientEvent.conversationItemCreate()).isEmpty - assertThat(realtimeClientEvent.conversationItemDelete()).isEmpty - assertThat(realtimeClientEvent.conversationItemRetrieve()).isEmpty - assertThat(realtimeClientEvent.conversationItemTruncate()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferAppend()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.outputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferCommit()).isEmpty - assertThat(realtimeClientEvent.responseCancel()).isEmpty - assertThat(realtimeClientEvent.responseCreate()).isEmpty - assertThat(realtimeClientEvent.sessionUpdate()).contains(sessionUpdate) - assertThat(realtimeClientEvent.transcriptionSessionUpdate()).isEmpty - } - - @Test - fun ofSessionUpdateRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeClientEvent = - RealtimeClientEvent.ofSessionUpdate( - SessionUpdateEvent.builder() - .session( - SessionUpdateEvent.Session.builder() - .clientSecret( - SessionUpdateEvent.Session.ClientSecret.builder() - .expiresAfter( - SessionUpdateEvent.Session.ClientSecret.ExpiresAfter - .builder() - .anchor( - SessionUpdateEvent.Session.ClientSecret.ExpiresAfter - .Anchor - .CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - .inputAudioFormat(SessionUpdateEvent.Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - SessionUpdateEvent.Session.InputAudioNoiseReduction.builder() - .type( - SessionUpdateEvent.Session.InputAudioNoiseReduction.Type - .NEAR_FIELD - ) - .build() - ) - .inputAudioTranscription( - SessionUpdateEvent.Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(SessionUpdateEvent.Session.Modality.TEXT) - .model(SessionUpdateEvent.Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(SessionUpdateEvent.Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - SessionUpdateEvent.Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(SessionUpdateEvent.Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - SessionUpdateEvent.Session.TurnDetection.builder() - .createResponse(true) - .eagerness( - SessionUpdateEvent.Session.TurnDetection.Eagerness.LOW - ) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(SessionUpdateEvent.Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(SessionUpdateEvent.Session.Voice.ALLOY) - .build() - ) - .eventId("event_id") - .build() - ) - - val roundtrippedRealtimeClientEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeClientEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeClientEvent).isEqualTo(realtimeClientEvent) - } - - @Test - fun ofTranscriptionSessionUpdate() { - val transcriptionSessionUpdate = - TranscriptionSessionUpdate.builder() - .session( - TranscriptionSessionUpdate.Session.builder() - .clientSecret( - TranscriptionSessionUpdate.Session.ClientSecret.builder() - .expiresAt( - TranscriptionSessionUpdate.Session.ClientSecret.ExpiresAt - .builder() - .anchor( - TranscriptionSessionUpdate.Session.ClientSecret - .ExpiresAt - .Anchor - .CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - .addInclude("string") - .inputAudioFormat(TranscriptionSessionUpdate.Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - TranscriptionSessionUpdate.Session.InputAudioNoiseReduction.builder() - .type( - TranscriptionSessionUpdate.Session.InputAudioNoiseReduction.Type - .NEAR_FIELD - ) - .build() - ) - .inputAudioTranscription( - TranscriptionSessionUpdate.Session.InputAudioTranscription.builder() - .language("language") - .model( - TranscriptionSessionUpdate.Session.InputAudioTranscription.Model - .GPT_4O_TRANSCRIBE - ) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSessionUpdate.Session.Modality.TEXT) - .turnDetection( - TranscriptionSessionUpdate.Session.TurnDetection.builder() - .createResponse(true) - .eagerness( - TranscriptionSessionUpdate.Session.TurnDetection.Eagerness.LOW - ) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type( - TranscriptionSessionUpdate.Session.TurnDetection.Type.SERVER_VAD - ) - .build() - ) - .build() - ) - .eventId("event_id") - .build() - - val realtimeClientEvent = - RealtimeClientEvent.ofTranscriptionSessionUpdate(transcriptionSessionUpdate) - - assertThat(realtimeClientEvent.conversationItemCreate()).isEmpty - assertThat(realtimeClientEvent.conversationItemDelete()).isEmpty - assertThat(realtimeClientEvent.conversationItemRetrieve()).isEmpty - assertThat(realtimeClientEvent.conversationItemTruncate()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferAppend()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.outputAudioBufferClear()).isEmpty - assertThat(realtimeClientEvent.inputAudioBufferCommit()).isEmpty - assertThat(realtimeClientEvent.responseCancel()).isEmpty - assertThat(realtimeClientEvent.responseCreate()).isEmpty - assertThat(realtimeClientEvent.sessionUpdate()).isEmpty - assertThat(realtimeClientEvent.transcriptionSessionUpdate()) - .contains(transcriptionSessionUpdate) - } - - @Test - fun ofTranscriptionSessionUpdateRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeClientEvent = - RealtimeClientEvent.ofTranscriptionSessionUpdate( - TranscriptionSessionUpdate.builder() - .session( - TranscriptionSessionUpdate.Session.builder() - .clientSecret( - TranscriptionSessionUpdate.Session.ClientSecret.builder() - .expiresAt( - TranscriptionSessionUpdate.Session.ClientSecret.ExpiresAt - .builder() - .anchor( - TranscriptionSessionUpdate.Session.ClientSecret - .ExpiresAt - .Anchor - .CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - .addInclude("string") - .inputAudioFormat( - TranscriptionSessionUpdate.Session.InputAudioFormat.PCM16 - ) - .inputAudioNoiseReduction( - TranscriptionSessionUpdate.Session.InputAudioNoiseReduction - .builder() - .type( - TranscriptionSessionUpdate.Session.InputAudioNoiseReduction - .Type - .NEAR_FIELD - ) - .build() - ) - .inputAudioTranscription( - TranscriptionSessionUpdate.Session.InputAudioTranscription.builder() - .language("language") - .model( - TranscriptionSessionUpdate.Session.InputAudioTranscription - .Model - .GPT_4O_TRANSCRIBE - ) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSessionUpdate.Session.Modality.TEXT) - .turnDetection( - TranscriptionSessionUpdate.Session.TurnDetection.builder() - .createResponse(true) - .eagerness( - TranscriptionSessionUpdate.Session.TurnDetection.Eagerness - .LOW - ) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type( - TranscriptionSessionUpdate.Session.TurnDetection.Type - .SERVER_VAD - ) - .build() - ) - .build() - ) - .eventId("event_id") - .build() - ) - - val roundtrippedRealtimeClientEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeClientEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeClientEvent).isEqualTo(realtimeClientEvent) - } - - enum class IncompatibleJsonShapeTestCase(val value: JsonValue) { - BOOLEAN(JsonValue.from(false)), - STRING(JsonValue.from("invalid")), - INTEGER(JsonValue.from(-1)), - FLOAT(JsonValue.from(3.14)), - ARRAY(JsonValue.from(listOf("invalid", "array"))), - } - - @ParameterizedTest - @EnumSource - fun incompatibleJsonShapeDeserializesToUnknown(testCase: IncompatibleJsonShapeTestCase) { - val realtimeClientEvent = - jsonMapper().convertValue(testCase.value, jacksonTypeRef()) - - val e = assertThrows { realtimeClientEvent.validate() } - assertThat(e).hasMessageStartingWith("Unknown ") - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeResponseStatusTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeResponseStatusTest.kt deleted file mode 100644 index dcc14378c..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeResponseStatusTest.kt +++ /dev/null @@ -1,46 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class RealtimeResponseStatusTest { - - @Test - fun create() { - val realtimeResponseStatus = - RealtimeResponseStatus.builder() - .error(RealtimeResponseStatus.Error.builder().code("code").type("type").build()) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - - assertThat(realtimeResponseStatus.error()) - .contains(RealtimeResponseStatus.Error.builder().code("code").type("type").build()) - assertThat(realtimeResponseStatus.reason()) - .contains(RealtimeResponseStatus.Reason.TURN_DETECTED) - assertThat(realtimeResponseStatus.type()).contains(RealtimeResponseStatus.Type.COMPLETED) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val realtimeResponseStatus = - RealtimeResponseStatus.builder() - .error(RealtimeResponseStatus.Error.builder().code("code").type("type").build()) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - - val roundtrippedRealtimeResponseStatus = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeResponseStatus), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeResponseStatus).isEqualTo(realtimeResponseStatus) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeResponseTest.kt deleted file mode 100644 index 5bfdf234a..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeResponseTest.kt +++ /dev/null @@ -1,237 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonValue -import com.openai.core.jsonMapper -import kotlin.jvm.optionals.getOrNull -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class RealtimeResponseTest { - - @Test - fun create() { - val realtimeResponse = - RealtimeResponse.builder() - .id("id") - .conversationId("conversation_id") - .maxOutputTokens(0L) - .metadata( - RealtimeResponse.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(RealtimeResponse.Modality.TEXT) - .object_(RealtimeResponse.Object.REALTIME_RESPONSE) - .addOutput( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputAudioFormat(RealtimeResponse.OutputAudioFormat.PCM16) - .status(RealtimeResponse.Status.COMPLETED) - .statusDetails( - RealtimeResponseStatus.builder() - .error( - RealtimeResponseStatus.Error.builder().code("code").type("type").build() - ) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - ) - .temperature(0.0) - .usage( - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - ) - .voice(RealtimeResponse.Voice.ALLOY) - .build() - - assertThat(realtimeResponse.id()).contains("id") - assertThat(realtimeResponse.conversationId()).contains("conversation_id") - assertThat(realtimeResponse.maxOutputTokens()) - .contains(RealtimeResponse.MaxOutputTokens.ofInteger(0L)) - assertThat(realtimeResponse.metadata()) - .contains( - RealtimeResponse.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - assertThat(realtimeResponse.modalities().getOrNull()) - .containsExactly(RealtimeResponse.Modality.TEXT) - assertThat(realtimeResponse.object_()).contains(RealtimeResponse.Object.REALTIME_RESPONSE) - assertThat(realtimeResponse.output().getOrNull()) - .containsExactly( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - assertThat(realtimeResponse.outputAudioFormat()) - .contains(RealtimeResponse.OutputAudioFormat.PCM16) - assertThat(realtimeResponse.status()).contains(RealtimeResponse.Status.COMPLETED) - assertThat(realtimeResponse.statusDetails()) - .contains( - RealtimeResponseStatus.builder() - .error(RealtimeResponseStatus.Error.builder().code("code").type("type").build()) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - ) - assertThat(realtimeResponse.temperature()).contains(0.0) - assertThat(realtimeResponse.usage()) - .contains( - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - ) - assertThat(realtimeResponse.voice()).contains(RealtimeResponse.Voice.ALLOY) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val realtimeResponse = - RealtimeResponse.builder() - .id("id") - .conversationId("conversation_id") - .maxOutputTokens(0L) - .metadata( - RealtimeResponse.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(RealtimeResponse.Modality.TEXT) - .object_(RealtimeResponse.Object.REALTIME_RESPONSE) - .addOutput( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputAudioFormat(RealtimeResponse.OutputAudioFormat.PCM16) - .status(RealtimeResponse.Status.COMPLETED) - .statusDetails( - RealtimeResponseStatus.builder() - .error( - RealtimeResponseStatus.Error.builder().code("code").type("type").build() - ) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - ) - .temperature(0.0) - .usage( - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - ) - .voice(RealtimeResponse.Voice.ALLOY) - .build() - - val roundtrippedRealtimeResponse = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeResponse), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeResponse).isEqualTo(realtimeResponse) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeResponseUsageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeResponseUsageTest.kt deleted file mode 100644 index 11e08f1de..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeResponseUsageTest.kt +++ /dev/null @@ -1,85 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class RealtimeResponseUsageTest { - - @Test - fun create() { - val realtimeResponseUsage = - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - - assertThat(realtimeResponseUsage.inputTokenDetails()) - .contains( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - assertThat(realtimeResponseUsage.inputTokens()).contains(0L) - assertThat(realtimeResponseUsage.outputTokenDetails()) - .contains( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - assertThat(realtimeResponseUsage.outputTokens()).contains(0L) - assertThat(realtimeResponseUsage.totalTokens()).contains(0L) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val realtimeResponseUsage = - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - - val roundtrippedRealtimeResponseUsage = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeResponseUsage), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeResponseUsage).isEqualTo(realtimeResponseUsage) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeServerEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeServerEventTest.kt deleted file mode 100644 index 3e83c896a..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/RealtimeServerEventTest.kt +++ /dev/null @@ -1,3270 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonValue -import com.openai.core.jsonMapper -import com.openai.errors.OpenAIInvalidDataException -import com.openai.models.beta.realtime.sessions.Session -import com.openai.models.beta.realtime.transcriptionsessions.TranscriptionSession -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.EnumSource - -internal class RealtimeServerEventTest { - - @Test - fun ofConversationCreated() { - val conversationCreated = - ConversationCreatedEvent.builder() - .conversation( - ConversationCreatedEvent.Conversation.builder() - .id("id") - .object_(ConversationCreatedEvent.Conversation.Object.REALTIME_CONVERSATION) - .build() - ) - .eventId("event_id") - .build() - - val realtimeServerEvent = RealtimeServerEvent.ofConversationCreated(conversationCreated) - - assertThat(realtimeServerEvent.conversationCreated()).contains(conversationCreated) - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofConversationCreatedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofConversationCreated( - ConversationCreatedEvent.builder() - .conversation( - ConversationCreatedEvent.Conversation.builder() - .id("id") - .object_( - ConversationCreatedEvent.Conversation.Object.REALTIME_CONVERSATION - ) - .build() - ) - .eventId("event_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofConversationItemCreated() { - val conversationItemCreated = - ConversationItemCreatedEvent.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .previousItemId("previous_item_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemCreated(conversationItemCreated) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).contains(conversationItemCreated) - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofConversationItemCreatedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemCreated( - ConversationItemCreatedEvent.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .previousItemId("previous_item_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofConversationItemDeleted() { - val conversationItemDeleted = - ConversationItemDeletedEvent.builder().eventId("event_id").itemId("item_id").build() - - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemDeleted(conversationItemDeleted) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).contains(conversationItemDeleted) - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofConversationItemDeletedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemDeleted( - ConversationItemDeletedEvent.builder().eventId("event_id").itemId("item_id").build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofConversationItemInputAudioTranscriptionCompleted() { - val conversationItemInputAudioTranscriptionCompleted = - ConversationItemInputAudioTranscriptionCompletedEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .transcript("transcript") - .usage( - ConversationItemInputAudioTranscriptionCompletedEvent.Usage - .TranscriptTextUsageTokens - .builder() - .inputTokens(0L) - .outputTokens(0L) - .totalTokens(0L) - .inputTokenDetails( - ConversationItemInputAudioTranscriptionCompletedEvent.Usage - .TranscriptTextUsageTokens - .InputTokenDetails - .builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .build() - ) - .addLogprob( - ConversationItemInputAudioTranscriptionCompletedEvent.Logprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .build() - ) - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemInputAudioTranscriptionCompleted( - conversationItemInputAudioTranscriptionCompleted - ) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()) - .contains(conversationItemInputAudioTranscriptionCompleted) - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofConversationItemInputAudioTranscriptionCompletedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemInputAudioTranscriptionCompleted( - ConversationItemInputAudioTranscriptionCompletedEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .transcript("transcript") - .usage( - ConversationItemInputAudioTranscriptionCompletedEvent.Usage - .TranscriptTextUsageTokens - .builder() - .inputTokens(0L) - .outputTokens(0L) - .totalTokens(0L) - .inputTokenDetails( - ConversationItemInputAudioTranscriptionCompletedEvent.Usage - .TranscriptTextUsageTokens - .InputTokenDetails - .builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .build() - ) - .addLogprob( - ConversationItemInputAudioTranscriptionCompletedEvent.Logprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .build() - ) - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofConversationItemInputAudioTranscriptionDelta() { - val conversationItemInputAudioTranscriptionDelta = - ConversationItemInputAudioTranscriptionDeltaEvent.builder() - .eventId("event_id") - .itemId("item_id") - .contentIndex(0L) - .delta("delta") - .addLogprob( - ConversationItemInputAudioTranscriptionDeltaEvent.Logprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .build() - ) - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemInputAudioTranscriptionDelta( - conversationItemInputAudioTranscriptionDelta - ) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()) - .contains(conversationItemInputAudioTranscriptionDelta) - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofConversationItemInputAudioTranscriptionDeltaRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemInputAudioTranscriptionDelta( - ConversationItemInputAudioTranscriptionDeltaEvent.builder() - .eventId("event_id") - .itemId("item_id") - .contentIndex(0L) - .delta("delta") - .addLogprob( - ConversationItemInputAudioTranscriptionDeltaEvent.Logprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .build() - ) - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofConversationItemInputAudioTranscriptionFailed() { - val conversationItemInputAudioTranscriptionFailed = - ConversationItemInputAudioTranscriptionFailedEvent.builder() - .contentIndex(0L) - .error( - ConversationItemInputAudioTranscriptionFailedEvent.Error.builder() - .code("code") - .message("message") - .param("param") - .type("type") - .build() - ) - .eventId("event_id") - .itemId("item_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemInputAudioTranscriptionFailed( - conversationItemInputAudioTranscriptionFailed - ) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()) - .contains(conversationItemInputAudioTranscriptionFailed) - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofConversationItemInputAudioTranscriptionFailedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemInputAudioTranscriptionFailed( - ConversationItemInputAudioTranscriptionFailedEvent.builder() - .contentIndex(0L) - .error( - ConversationItemInputAudioTranscriptionFailedEvent.Error.builder() - .code("code") - .message("message") - .param("param") - .type("type") - .build() - ) - .eventId("event_id") - .itemId("item_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofConversationItemRetrieved() { - val conversationItemRetrieved = - RealtimeServerEvent.ConversationItemRetrieved.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemRetrieved(conversationItemRetrieved) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()) - .contains(conversationItemRetrieved) - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofConversationItemRetrievedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemRetrieved( - RealtimeServerEvent.ConversationItemRetrieved.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofConversationItemTruncated() { - val conversationItemTruncated = - ConversationItemTruncatedEvent.builder() - .audioEndMs(0L) - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemTruncated(conversationItemTruncated) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()) - .contains(conversationItemTruncated) - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofConversationItemTruncatedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofConversationItemTruncated( - ConversationItemTruncatedEvent.builder() - .audioEndMs(0L) - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofError() { - val error = - ErrorEvent.builder() - .error( - ErrorEvent.Error.builder() - .message("message") - .type("type") - .code("code") - .eventId("event_id") - .param("param") - .build() - ) - .eventId("event_id") - .build() - - val realtimeServerEvent = RealtimeServerEvent.ofError(error) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).contains(error) - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofErrorRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofError( - ErrorEvent.builder() - .error( - ErrorEvent.Error.builder() - .message("message") - .type("type") - .code("code") - .eventId("event_id") - .param("param") - .build() - ) - .eventId("event_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofInputAudioBufferCleared() { - val inputAudioBufferCleared = - InputAudioBufferClearedEvent.builder().eventId("event_id").build() - - val realtimeServerEvent = - RealtimeServerEvent.ofInputAudioBufferCleared(inputAudioBufferCleared) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).contains(inputAudioBufferCleared) - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofInputAudioBufferClearedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofInputAudioBufferCleared( - InputAudioBufferClearedEvent.builder().eventId("event_id").build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofInputAudioBufferCommitted() { - val inputAudioBufferCommitted = - InputAudioBufferCommittedEvent.builder() - .eventId("event_id") - .itemId("item_id") - .previousItemId("previous_item_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofInputAudioBufferCommitted(inputAudioBufferCommitted) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()) - .contains(inputAudioBufferCommitted) - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofInputAudioBufferCommittedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofInputAudioBufferCommitted( - InputAudioBufferCommittedEvent.builder() - .eventId("event_id") - .itemId("item_id") - .previousItemId("previous_item_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofInputAudioBufferSpeechStarted() { - val inputAudioBufferSpeechStarted = - InputAudioBufferSpeechStartedEvent.builder() - .audioStartMs(0L) - .eventId("event_id") - .itemId("item_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofInputAudioBufferSpeechStarted(inputAudioBufferSpeechStarted) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()) - .contains(inputAudioBufferSpeechStarted) - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofInputAudioBufferSpeechStartedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofInputAudioBufferSpeechStarted( - InputAudioBufferSpeechStartedEvent.builder() - .audioStartMs(0L) - .eventId("event_id") - .itemId("item_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofInputAudioBufferSpeechStopped() { - val inputAudioBufferSpeechStopped = - InputAudioBufferSpeechStoppedEvent.builder() - .audioEndMs(0L) - .eventId("event_id") - .itemId("item_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofInputAudioBufferSpeechStopped(inputAudioBufferSpeechStopped) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()) - .contains(inputAudioBufferSpeechStopped) - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofInputAudioBufferSpeechStoppedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofInputAudioBufferSpeechStopped( - InputAudioBufferSpeechStoppedEvent.builder() - .audioEndMs(0L) - .eventId("event_id") - .itemId("item_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofRateLimitsUpdated() { - val rateLimitsUpdated = - RateLimitsUpdatedEvent.builder() - .eventId("event_id") - .addRateLimit( - RateLimitsUpdatedEvent.RateLimit.builder() - .limit(0L) - .name(RateLimitsUpdatedEvent.RateLimit.Name.REQUESTS) - .remaining(0L) - .resetSeconds(0.0) - .build() - ) - .build() - - val realtimeServerEvent = RealtimeServerEvent.ofRateLimitsUpdated(rateLimitsUpdated) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).contains(rateLimitsUpdated) - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofRateLimitsUpdatedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofRateLimitsUpdated( - RateLimitsUpdatedEvent.builder() - .eventId("event_id") - .addRateLimit( - RateLimitsUpdatedEvent.RateLimit.builder() - .limit(0L) - .name(RateLimitsUpdatedEvent.RateLimit.Name.REQUESTS) - .remaining(0L) - .resetSeconds(0.0) - .build() - ) - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseAudioDelta() { - val responseAudioDelta = - ResponseAudioDeltaEvent.builder() - .contentIndex(0L) - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - val realtimeServerEvent = RealtimeServerEvent.ofResponseAudioDelta(responseAudioDelta) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).contains(responseAudioDelta) - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseAudioDeltaRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseAudioDelta( - ResponseAudioDeltaEvent.builder() - .contentIndex(0L) - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseAudioDone() { - val responseAudioDone = - ResponseAudioDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - val realtimeServerEvent = RealtimeServerEvent.ofResponseAudioDone(responseAudioDone) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).contains(responseAudioDone) - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseAudioDoneRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseAudioDone( - ResponseAudioDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseAudioTranscriptDelta() { - val responseAudioTranscriptDelta = - ResponseAudioTranscriptDeltaEvent.builder() - .contentIndex(0L) - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofResponseAudioTranscriptDelta(responseAudioTranscriptDelta) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()) - .contains(responseAudioTranscriptDelta) - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseAudioTranscriptDeltaRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseAudioTranscriptDelta( - ResponseAudioTranscriptDeltaEvent.builder() - .contentIndex(0L) - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseAudioTranscriptDone() { - val responseAudioTranscriptDone = - ResponseAudioTranscriptDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .transcript("transcript") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofResponseAudioTranscriptDone(responseAudioTranscriptDone) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()) - .contains(responseAudioTranscriptDone) - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseAudioTranscriptDoneRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseAudioTranscriptDone( - ResponseAudioTranscriptDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .transcript("transcript") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseContentPartAdded() { - val responseContentPartAdded = - ResponseContentPartAddedEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .part( - ResponseContentPartAddedEvent.Part.builder() - .audio("audio") - .text("text") - .transcript("transcript") - .type(ResponseContentPartAddedEvent.Part.Type.TEXT) - .build() - ) - .responseId("response_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofResponseContentPartAdded(responseContentPartAdded) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()) - .contains(responseContentPartAdded) - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseContentPartAddedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseContentPartAdded( - ResponseContentPartAddedEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .part( - ResponseContentPartAddedEvent.Part.builder() - .audio("audio") - .text("text") - .transcript("transcript") - .type(ResponseContentPartAddedEvent.Part.Type.TEXT) - .build() - ) - .responseId("response_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseContentPartDone() { - val responseContentPartDone = - ResponseContentPartDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .part( - ResponseContentPartDoneEvent.Part.builder() - .audio("audio") - .text("text") - .transcript("transcript") - .type(ResponseContentPartDoneEvent.Part.Type.TEXT) - .build() - ) - .responseId("response_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofResponseContentPartDone(responseContentPartDone) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).contains(responseContentPartDone) - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseContentPartDoneRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseContentPartDone( - ResponseContentPartDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .part( - ResponseContentPartDoneEvent.Part.builder() - .audio("audio") - .text("text") - .transcript("transcript") - .type(ResponseContentPartDoneEvent.Part.Type.TEXT) - .build() - ) - .responseId("response_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseCreated() { - val responseCreated = - ResponseCreatedEvent.builder() - .eventId("event_id") - .response( - RealtimeResponse.builder() - .id("id") - .conversationId("conversation_id") - .maxOutputTokens(0L) - .metadata( - RealtimeResponse.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(RealtimeResponse.Modality.TEXT) - .object_(RealtimeResponse.Object.REALTIME_RESPONSE) - .addOutput( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputAudioFormat(RealtimeResponse.OutputAudioFormat.PCM16) - .status(RealtimeResponse.Status.COMPLETED) - .statusDetails( - RealtimeResponseStatus.builder() - .error( - RealtimeResponseStatus.Error.builder() - .code("code") - .type("type") - .build() - ) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - ) - .temperature(0.0) - .usage( - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - ) - .voice(RealtimeResponse.Voice.ALLOY) - .build() - ) - .build() - - val realtimeServerEvent = RealtimeServerEvent.ofResponseCreated(responseCreated) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).contains(responseCreated) - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseCreatedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseCreated( - ResponseCreatedEvent.builder() - .eventId("event_id") - .response( - RealtimeResponse.builder() - .id("id") - .conversationId("conversation_id") - .maxOutputTokens(0L) - .metadata( - RealtimeResponse.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(RealtimeResponse.Modality.TEXT) - .object_(RealtimeResponse.Object.REALTIME_RESPONSE) - .addOutput( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputAudioFormat(RealtimeResponse.OutputAudioFormat.PCM16) - .status(RealtimeResponse.Status.COMPLETED) - .statusDetails( - RealtimeResponseStatus.builder() - .error( - RealtimeResponseStatus.Error.builder() - .code("code") - .type("type") - .build() - ) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - ) - .temperature(0.0) - .usage( - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - ) - .voice(RealtimeResponse.Voice.ALLOY) - .build() - ) - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseDone() { - val responseDone = - ResponseDoneEvent.builder() - .eventId("event_id") - .response( - RealtimeResponse.builder() - .id("id") - .conversationId("conversation_id") - .maxOutputTokens(0L) - .metadata( - RealtimeResponse.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(RealtimeResponse.Modality.TEXT) - .object_(RealtimeResponse.Object.REALTIME_RESPONSE) - .addOutput( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputAudioFormat(RealtimeResponse.OutputAudioFormat.PCM16) - .status(RealtimeResponse.Status.COMPLETED) - .statusDetails( - RealtimeResponseStatus.builder() - .error( - RealtimeResponseStatus.Error.builder() - .code("code") - .type("type") - .build() - ) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - ) - .temperature(0.0) - .usage( - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - ) - .voice(RealtimeResponse.Voice.ALLOY) - .build() - ) - .build() - - val realtimeServerEvent = RealtimeServerEvent.ofResponseDone(responseDone) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).contains(responseDone) - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseDoneRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseDone( - ResponseDoneEvent.builder() - .eventId("event_id") - .response( - RealtimeResponse.builder() - .id("id") - .conversationId("conversation_id") - .maxOutputTokens(0L) - .metadata( - RealtimeResponse.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(RealtimeResponse.Modality.TEXT) - .object_(RealtimeResponse.Object.REALTIME_RESPONSE) - .addOutput( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputAudioFormat(RealtimeResponse.OutputAudioFormat.PCM16) - .status(RealtimeResponse.Status.COMPLETED) - .statusDetails( - RealtimeResponseStatus.builder() - .error( - RealtimeResponseStatus.Error.builder() - .code("code") - .type("type") - .build() - ) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - ) - .temperature(0.0) - .usage( - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - ) - .voice(RealtimeResponse.Voice.ALLOY) - .build() - ) - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseFunctionCallArgumentsDelta() { - val responseFunctionCallArgumentsDelta = - ResponseFunctionCallArgumentsDeltaEvent.builder() - .callId("call_id") - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofResponseFunctionCallArgumentsDelta( - responseFunctionCallArgumentsDelta - ) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()) - .contains(responseFunctionCallArgumentsDelta) - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseFunctionCallArgumentsDeltaRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseFunctionCallArgumentsDelta( - ResponseFunctionCallArgumentsDeltaEvent.builder() - .callId("call_id") - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseFunctionCallArgumentsDone() { - val responseFunctionCallArgumentsDone = - ResponseFunctionCallArgumentsDoneEvent.builder() - .arguments("arguments") - .callId("call_id") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofResponseFunctionCallArgumentsDone( - responseFunctionCallArgumentsDone - ) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()) - .contains(responseFunctionCallArgumentsDone) - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseFunctionCallArgumentsDoneRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseFunctionCallArgumentsDone( - ResponseFunctionCallArgumentsDoneEvent.builder() - .arguments("arguments") - .callId("call_id") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseOutputItemAdded() { - val responseOutputItemAdded = - ResponseOutputItemAddedEvent.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputIndex(0L) - .responseId("response_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofResponseOutputItemAdded(responseOutputItemAdded) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).contains(responseOutputItemAdded) - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseOutputItemAddedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseOutputItemAdded( - ResponseOutputItemAddedEvent.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputIndex(0L) - .responseId("response_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseOutputItemDone() { - val responseOutputItemDone = - ResponseOutputItemDoneEvent.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputIndex(0L) - .responseId("response_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofResponseOutputItemDone(responseOutputItemDone) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).contains(responseOutputItemDone) - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseOutputItemDoneRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseOutputItemDone( - ResponseOutputItemDoneEvent.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputIndex(0L) - .responseId("response_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseTextDelta() { - val responseTextDelta = - ResponseTextDeltaEvent.builder() - .contentIndex(0L) - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - val realtimeServerEvent = RealtimeServerEvent.ofResponseTextDelta(responseTextDelta) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).contains(responseTextDelta) - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseTextDeltaRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseTextDelta( - ResponseTextDeltaEvent.builder() - .contentIndex(0L) - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofResponseTextDone() { - val responseTextDone = - ResponseTextDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .text("text") - .build() - - val realtimeServerEvent = RealtimeServerEvent.ofResponseTextDone(responseTextDone) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).contains(responseTextDone) - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofResponseTextDoneRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofResponseTextDone( - ResponseTextDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .text("text") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofSessionCreated() { - val sessionCreated = - SessionCreatedEvent.builder() - .eventId("event_id") - .session( - Session.builder() - .id("id") - .inputAudioFormat(Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - Session.InputAudioNoiseReduction.builder() - .type(Session.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(Session.Modality.TEXT) - .model(Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - Session.TurnDetection.builder() - .createResponse(true) - .eagerness(Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(Session.Voice.ALLOY) - .build() - ) - .build() - - val realtimeServerEvent = RealtimeServerEvent.ofSessionCreated(sessionCreated) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).contains(sessionCreated) - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofSessionCreatedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofSessionCreated( - SessionCreatedEvent.builder() - .eventId("event_id") - .session( - Session.builder() - .id("id") - .inputAudioFormat(Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - Session.InputAudioNoiseReduction.builder() - .type(Session.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(Session.Modality.TEXT) - .model(Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - Session.TurnDetection.builder() - .createResponse(true) - .eagerness(Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(Session.Voice.ALLOY) - .build() - ) - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofSessionUpdated() { - val sessionUpdated = - SessionUpdatedEvent.builder() - .eventId("event_id") - .session( - Session.builder() - .id("id") - .inputAudioFormat(Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - Session.InputAudioNoiseReduction.builder() - .type(Session.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(Session.Modality.TEXT) - .model(Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - Session.TurnDetection.builder() - .createResponse(true) - .eagerness(Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(Session.Voice.ALLOY) - .build() - ) - .build() - - val realtimeServerEvent = RealtimeServerEvent.ofSessionUpdated(sessionUpdated) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).contains(sessionUpdated) - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofSessionUpdatedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofSessionUpdated( - SessionUpdatedEvent.builder() - .eventId("event_id") - .session( - Session.builder() - .id("id") - .inputAudioFormat(Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - Session.InputAudioNoiseReduction.builder() - .type(Session.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(Session.Modality.TEXT) - .model(Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - Session.TurnDetection.builder() - .createResponse(true) - .eagerness(Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(Session.Voice.ALLOY) - .build() - ) - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofTranscriptionSessionUpdated() { - val transcriptionSessionUpdated = - TranscriptionSessionUpdatedEvent.builder() - .eventId("event_id") - .session( - TranscriptionSession.builder() - .clientSecret( - TranscriptionSession.ClientSecret.builder() - .expiresAt(0L) - .value("value") - .build() - ) - .inputAudioFormat("input_audio_format") - .inputAudioTranscription( - TranscriptionSession.InputAudioTranscription.builder() - .language("language") - .model( - TranscriptionSession.InputAudioTranscription.Model - .GPT_4O_TRANSCRIBE - ) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSession.Modality.TEXT) - .turnDetection( - TranscriptionSession.TurnDetection.builder() - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type("type") - .build() - ) - .build() - ) - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofTranscriptionSessionUpdated(transcriptionSessionUpdated) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()) - .contains(transcriptionSessionUpdated) - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofTranscriptionSessionUpdatedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofTranscriptionSessionUpdated( - TranscriptionSessionUpdatedEvent.builder() - .eventId("event_id") - .session( - TranscriptionSession.builder() - .clientSecret( - TranscriptionSession.ClientSecret.builder() - .expiresAt(0L) - .value("value") - .build() - ) - .inputAudioFormat("input_audio_format") - .inputAudioTranscription( - TranscriptionSession.InputAudioTranscription.builder() - .language("language") - .model( - TranscriptionSession.InputAudioTranscription.Model - .GPT_4O_TRANSCRIBE - ) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSession.Modality.TEXT) - .turnDetection( - TranscriptionSession.TurnDetection.builder() - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type("type") - .build() - ) - .build() - ) - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofOutputAudioBufferStarted() { - val outputAudioBufferStarted = - RealtimeServerEvent.OutputAudioBufferStarted.builder() - .eventId("event_id") - .responseId("response_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofOutputAudioBufferStarted(outputAudioBufferStarted) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()) - .contains(outputAudioBufferStarted) - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofOutputAudioBufferStartedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofOutputAudioBufferStarted( - RealtimeServerEvent.OutputAudioBufferStarted.builder() - .eventId("event_id") - .responseId("response_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofOutputAudioBufferStopped() { - val outputAudioBufferStopped = - RealtimeServerEvent.OutputAudioBufferStopped.builder() - .eventId("event_id") - .responseId("response_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofOutputAudioBufferStopped(outputAudioBufferStopped) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()) - .contains(outputAudioBufferStopped) - assertThat(realtimeServerEvent.outputAudioBufferCleared()).isEmpty - } - - @Test - fun ofOutputAudioBufferStoppedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofOutputAudioBufferStopped( - RealtimeServerEvent.OutputAudioBufferStopped.builder() - .eventId("event_id") - .responseId("response_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - @Test - fun ofOutputAudioBufferCleared() { - val outputAudioBufferCleared = - RealtimeServerEvent.OutputAudioBufferCleared.builder() - .eventId("event_id") - .responseId("response_id") - .build() - - val realtimeServerEvent = - RealtimeServerEvent.ofOutputAudioBufferCleared(outputAudioBufferCleared) - - assertThat(realtimeServerEvent.conversationCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemCreated()).isEmpty - assertThat(realtimeServerEvent.conversationItemDeleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionCompleted()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionDelta()).isEmpty - assertThat(realtimeServerEvent.conversationItemInputAudioTranscriptionFailed()).isEmpty - assertThat(realtimeServerEvent.conversationItemRetrieved()).isEmpty - assertThat(realtimeServerEvent.conversationItemTruncated()).isEmpty - assertThat(realtimeServerEvent.error()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCleared()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferCommitted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStarted()).isEmpty - assertThat(realtimeServerEvent.inputAudioBufferSpeechStopped()).isEmpty - assertThat(realtimeServerEvent.rateLimitsUpdated()).isEmpty - assertThat(realtimeServerEvent.responseAudioDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioDone()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDelta()).isEmpty - assertThat(realtimeServerEvent.responseAudioTranscriptDone()).isEmpty - assertThat(realtimeServerEvent.responseContentPartAdded()).isEmpty - assertThat(realtimeServerEvent.responseContentPartDone()).isEmpty - assertThat(realtimeServerEvent.responseCreated()).isEmpty - assertThat(realtimeServerEvent.responseDone()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDelta()).isEmpty - assertThat(realtimeServerEvent.responseFunctionCallArgumentsDone()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemAdded()).isEmpty - assertThat(realtimeServerEvent.responseOutputItemDone()).isEmpty - assertThat(realtimeServerEvent.responseTextDelta()).isEmpty - assertThat(realtimeServerEvent.responseTextDone()).isEmpty - assertThat(realtimeServerEvent.sessionCreated()).isEmpty - assertThat(realtimeServerEvent.sessionUpdated()).isEmpty - assertThat(realtimeServerEvent.transcriptionSessionUpdated()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStarted()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferStopped()).isEmpty - assertThat(realtimeServerEvent.outputAudioBufferCleared()) - .contains(outputAudioBufferCleared) - } - - @Test - fun ofOutputAudioBufferClearedRoundtrip() { - val jsonMapper = jsonMapper() - val realtimeServerEvent = - RealtimeServerEvent.ofOutputAudioBufferCleared( - RealtimeServerEvent.OutputAudioBufferCleared.builder() - .eventId("event_id") - .responseId("response_id") - .build() - ) - - val roundtrippedRealtimeServerEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(realtimeServerEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedRealtimeServerEvent).isEqualTo(realtimeServerEvent) - } - - enum class IncompatibleJsonShapeTestCase(val value: JsonValue) { - BOOLEAN(JsonValue.from(false)), - STRING(JsonValue.from("invalid")), - INTEGER(JsonValue.from(-1)), - FLOAT(JsonValue.from(3.14)), - ARRAY(JsonValue.from(listOf("invalid", "array"))), - } - - @ParameterizedTest - @EnumSource - fun incompatibleJsonShapeDeserializesToUnknown(testCase: IncompatibleJsonShapeTestCase) { - val realtimeServerEvent = - jsonMapper().convertValue(testCase.value, jacksonTypeRef()) - - val e = assertThrows { realtimeServerEvent.validate() } - assertThat(e).hasMessageStartingWith("Unknown ") - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioDeltaEventTest.kt deleted file mode 100644 index f8571c64a..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioDeltaEventTest.kt +++ /dev/null @@ -1,53 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseAudioDeltaEventTest { - - @Test - fun create() { - val responseAudioDeltaEvent = - ResponseAudioDeltaEvent.builder() - .contentIndex(0L) - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - assertThat(responseAudioDeltaEvent.contentIndex()).isEqualTo(0L) - assertThat(responseAudioDeltaEvent.delta()).isEqualTo("delta") - assertThat(responseAudioDeltaEvent.eventId()).isEqualTo("event_id") - assertThat(responseAudioDeltaEvent.itemId()).isEqualTo("item_id") - assertThat(responseAudioDeltaEvent.outputIndex()).isEqualTo(0L) - assertThat(responseAudioDeltaEvent.responseId()).isEqualTo("response_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseAudioDeltaEvent = - ResponseAudioDeltaEvent.builder() - .contentIndex(0L) - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - val roundtrippedResponseAudioDeltaEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseAudioDeltaEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseAudioDeltaEvent).isEqualTo(responseAudioDeltaEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioDoneEventTest.kt deleted file mode 100644 index c179b3ed2..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioDoneEventTest.kt +++ /dev/null @@ -1,50 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseAudioDoneEventTest { - - @Test - fun create() { - val responseAudioDoneEvent = - ResponseAudioDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - assertThat(responseAudioDoneEvent.contentIndex()).isEqualTo(0L) - assertThat(responseAudioDoneEvent.eventId()).isEqualTo("event_id") - assertThat(responseAudioDoneEvent.itemId()).isEqualTo("item_id") - assertThat(responseAudioDoneEvent.outputIndex()).isEqualTo(0L) - assertThat(responseAudioDoneEvent.responseId()).isEqualTo("response_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseAudioDoneEvent = - ResponseAudioDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - val roundtrippedResponseAudioDoneEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseAudioDoneEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseAudioDoneEvent).isEqualTo(responseAudioDoneEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDeltaEventTest.kt deleted file mode 100644 index faf0b7acc..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDeltaEventTest.kt +++ /dev/null @@ -1,54 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseAudioTranscriptDeltaEventTest { - - @Test - fun create() { - val responseAudioTranscriptDeltaEvent = - ResponseAudioTranscriptDeltaEvent.builder() - .contentIndex(0L) - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - assertThat(responseAudioTranscriptDeltaEvent.contentIndex()).isEqualTo(0L) - assertThat(responseAudioTranscriptDeltaEvent.delta()).isEqualTo("delta") - assertThat(responseAudioTranscriptDeltaEvent.eventId()).isEqualTo("event_id") - assertThat(responseAudioTranscriptDeltaEvent.itemId()).isEqualTo("item_id") - assertThat(responseAudioTranscriptDeltaEvent.outputIndex()).isEqualTo(0L) - assertThat(responseAudioTranscriptDeltaEvent.responseId()).isEqualTo("response_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseAudioTranscriptDeltaEvent = - ResponseAudioTranscriptDeltaEvent.builder() - .contentIndex(0L) - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - val roundtrippedResponseAudioTranscriptDeltaEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseAudioTranscriptDeltaEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseAudioTranscriptDeltaEvent) - .isEqualTo(responseAudioTranscriptDeltaEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDoneEventTest.kt deleted file mode 100644 index e9ae74a0b..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseAudioTranscriptDoneEventTest.kt +++ /dev/null @@ -1,54 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseAudioTranscriptDoneEventTest { - - @Test - fun create() { - val responseAudioTranscriptDoneEvent = - ResponseAudioTranscriptDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .transcript("transcript") - .build() - - assertThat(responseAudioTranscriptDoneEvent.contentIndex()).isEqualTo(0L) - assertThat(responseAudioTranscriptDoneEvent.eventId()).isEqualTo("event_id") - assertThat(responseAudioTranscriptDoneEvent.itemId()).isEqualTo("item_id") - assertThat(responseAudioTranscriptDoneEvent.outputIndex()).isEqualTo(0L) - assertThat(responseAudioTranscriptDoneEvent.responseId()).isEqualTo("response_id") - assertThat(responseAudioTranscriptDoneEvent.transcript()).isEqualTo("transcript") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseAudioTranscriptDoneEvent = - ResponseAudioTranscriptDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .transcript("transcript") - .build() - - val roundtrippedResponseAudioTranscriptDoneEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseAudioTranscriptDoneEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseAudioTranscriptDoneEvent) - .isEqualTo(responseAudioTranscriptDoneEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseCancelEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseCancelEventTest.kt deleted file mode 100644 index 9ad463661..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseCancelEventTest.kt +++ /dev/null @@ -1,35 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseCancelEventTest { - - @Test - fun create() { - val responseCancelEvent = - ResponseCancelEvent.builder().eventId("event_id").responseId("response_id").build() - - assertThat(responseCancelEvent.eventId()).contains("event_id") - assertThat(responseCancelEvent.responseId()).contains("response_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseCancelEvent = - ResponseCancelEvent.builder().eventId("event_id").responseId("response_id").build() - - val roundtrippedResponseCancelEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseCancelEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseCancelEvent).isEqualTo(responseCancelEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseContentPartAddedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseContentPartAddedEventTest.kt deleted file mode 100644 index b10af9dac..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseContentPartAddedEventTest.kt +++ /dev/null @@ -1,76 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseContentPartAddedEventTest { - - @Test - fun create() { - val responseContentPartAddedEvent = - ResponseContentPartAddedEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .part( - ResponseContentPartAddedEvent.Part.builder() - .audio("audio") - .text("text") - .transcript("transcript") - .type(ResponseContentPartAddedEvent.Part.Type.TEXT) - .build() - ) - .responseId("response_id") - .build() - - assertThat(responseContentPartAddedEvent.contentIndex()).isEqualTo(0L) - assertThat(responseContentPartAddedEvent.eventId()).isEqualTo("event_id") - assertThat(responseContentPartAddedEvent.itemId()).isEqualTo("item_id") - assertThat(responseContentPartAddedEvent.outputIndex()).isEqualTo(0L) - assertThat(responseContentPartAddedEvent.part()) - .isEqualTo( - ResponseContentPartAddedEvent.Part.builder() - .audio("audio") - .text("text") - .transcript("transcript") - .type(ResponseContentPartAddedEvent.Part.Type.TEXT) - .build() - ) - assertThat(responseContentPartAddedEvent.responseId()).isEqualTo("response_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseContentPartAddedEvent = - ResponseContentPartAddedEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .part( - ResponseContentPartAddedEvent.Part.builder() - .audio("audio") - .text("text") - .transcript("transcript") - .type(ResponseContentPartAddedEvent.Part.Type.TEXT) - .build() - ) - .responseId("response_id") - .build() - - val roundtrippedResponseContentPartAddedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseContentPartAddedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseContentPartAddedEvent) - .isEqualTo(responseContentPartAddedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseContentPartDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseContentPartDoneEventTest.kt deleted file mode 100644 index bc6edcdde..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseContentPartDoneEventTest.kt +++ /dev/null @@ -1,75 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseContentPartDoneEventTest { - - @Test - fun create() { - val responseContentPartDoneEvent = - ResponseContentPartDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .part( - ResponseContentPartDoneEvent.Part.builder() - .audio("audio") - .text("text") - .transcript("transcript") - .type(ResponseContentPartDoneEvent.Part.Type.TEXT) - .build() - ) - .responseId("response_id") - .build() - - assertThat(responseContentPartDoneEvent.contentIndex()).isEqualTo(0L) - assertThat(responseContentPartDoneEvent.eventId()).isEqualTo("event_id") - assertThat(responseContentPartDoneEvent.itemId()).isEqualTo("item_id") - assertThat(responseContentPartDoneEvent.outputIndex()).isEqualTo(0L) - assertThat(responseContentPartDoneEvent.part()) - .isEqualTo( - ResponseContentPartDoneEvent.Part.builder() - .audio("audio") - .text("text") - .transcript("transcript") - .type(ResponseContentPartDoneEvent.Part.Type.TEXT) - .build() - ) - assertThat(responseContentPartDoneEvent.responseId()).isEqualTo("response_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseContentPartDoneEvent = - ResponseContentPartDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .part( - ResponseContentPartDoneEvent.Part.builder() - .audio("audio") - .text("text") - .transcript("transcript") - .type(ResponseContentPartDoneEvent.Part.Type.TEXT) - .build() - ) - .responseId("response_id") - .build() - - val roundtrippedResponseContentPartDoneEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseContentPartDoneEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseContentPartDoneEvent).isEqualTo(responseContentPartDoneEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseCreateEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseCreateEventTest.kt deleted file mode 100644 index 15999401f..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseCreateEventTest.kt +++ /dev/null @@ -1,181 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonValue -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseCreateEventTest { - - @Test - fun create() { - val responseCreateEvent = - ResponseCreateEvent.builder() - .eventId("event_id") - .response( - ResponseCreateEvent.Response.builder() - .conversation(ResponseCreateEvent.Response.Conversation.AUTO) - .addInput( - ConversationItemWithReference.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemWithReference.Content.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemWithReference.Content.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItemWithReference.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItemWithReference.Role.USER) - .status(ConversationItemWithReference.Status.COMPLETED) - .type(ConversationItemWithReference.Type.MESSAGE) - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .metadata( - ResponseCreateEvent.Response.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(ResponseCreateEvent.Response.Modality.TEXT) - .outputAudioFormat(ResponseCreateEvent.Response.OutputAudioFormat.PCM16) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - ResponseCreateEvent.Response.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(ResponseCreateEvent.Response.Tool.Type.FUNCTION) - .build() - ) - .voice(ResponseCreateEvent.Response.Voice.ALLOY) - .build() - ) - .build() - - assertThat(responseCreateEvent.eventId()).contains("event_id") - assertThat(responseCreateEvent.response()) - .contains( - ResponseCreateEvent.Response.builder() - .conversation(ResponseCreateEvent.Response.Conversation.AUTO) - .addInput( - ConversationItemWithReference.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemWithReference.Content.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemWithReference.Content.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItemWithReference.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItemWithReference.Role.USER) - .status(ConversationItemWithReference.Status.COMPLETED) - .type(ConversationItemWithReference.Type.MESSAGE) - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .metadata( - ResponseCreateEvent.Response.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(ResponseCreateEvent.Response.Modality.TEXT) - .outputAudioFormat(ResponseCreateEvent.Response.OutputAudioFormat.PCM16) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - ResponseCreateEvent.Response.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(ResponseCreateEvent.Response.Tool.Type.FUNCTION) - .build() - ) - .voice(ResponseCreateEvent.Response.Voice.ALLOY) - .build() - ) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseCreateEvent = - ResponseCreateEvent.builder() - .eventId("event_id") - .response( - ResponseCreateEvent.Response.builder() - .conversation(ResponseCreateEvent.Response.Conversation.AUTO) - .addInput( - ConversationItemWithReference.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemWithReference.Content.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemWithReference.Content.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItemWithReference.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItemWithReference.Role.USER) - .status(ConversationItemWithReference.Status.COMPLETED) - .type(ConversationItemWithReference.Type.MESSAGE) - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .metadata( - ResponseCreateEvent.Response.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(ResponseCreateEvent.Response.Modality.TEXT) - .outputAudioFormat(ResponseCreateEvent.Response.OutputAudioFormat.PCM16) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - ResponseCreateEvent.Response.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(ResponseCreateEvent.Response.Tool.Type.FUNCTION) - .build() - ) - .voice(ResponseCreateEvent.Response.Voice.ALLOY) - .build() - ) - .build() - - val roundtrippedResponseCreateEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseCreateEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseCreateEvent).isEqualTo(responseCreateEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseCreatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseCreatedEventTest.kt deleted file mode 100644 index 2a33a594d..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseCreatedEventTest.kt +++ /dev/null @@ -1,256 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonValue -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseCreatedEventTest { - - @Test - fun create() { - val responseCreatedEvent = - ResponseCreatedEvent.builder() - .eventId("event_id") - .response( - RealtimeResponse.builder() - .id("id") - .conversationId("conversation_id") - .maxOutputTokens(0L) - .metadata( - RealtimeResponse.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(RealtimeResponse.Modality.TEXT) - .object_(RealtimeResponse.Object.REALTIME_RESPONSE) - .addOutput( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputAudioFormat(RealtimeResponse.OutputAudioFormat.PCM16) - .status(RealtimeResponse.Status.COMPLETED) - .statusDetails( - RealtimeResponseStatus.builder() - .error( - RealtimeResponseStatus.Error.builder() - .code("code") - .type("type") - .build() - ) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - ) - .temperature(0.0) - .usage( - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - ) - .voice(RealtimeResponse.Voice.ALLOY) - .build() - ) - .build() - - assertThat(responseCreatedEvent.eventId()).isEqualTo("event_id") - assertThat(responseCreatedEvent.response()) - .isEqualTo( - RealtimeResponse.builder() - .id("id") - .conversationId("conversation_id") - .maxOutputTokens(0L) - .metadata( - RealtimeResponse.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(RealtimeResponse.Modality.TEXT) - .object_(RealtimeResponse.Object.REALTIME_RESPONSE) - .addOutput( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputAudioFormat(RealtimeResponse.OutputAudioFormat.PCM16) - .status(RealtimeResponse.Status.COMPLETED) - .statusDetails( - RealtimeResponseStatus.builder() - .error( - RealtimeResponseStatus.Error.builder() - .code("code") - .type("type") - .build() - ) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - ) - .temperature(0.0) - .usage( - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - ) - .voice(RealtimeResponse.Voice.ALLOY) - .build() - ) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseCreatedEvent = - ResponseCreatedEvent.builder() - .eventId("event_id") - .response( - RealtimeResponse.builder() - .id("id") - .conversationId("conversation_id") - .maxOutputTokens(0L) - .metadata( - RealtimeResponse.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(RealtimeResponse.Modality.TEXT) - .object_(RealtimeResponse.Object.REALTIME_RESPONSE) - .addOutput( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputAudioFormat(RealtimeResponse.OutputAudioFormat.PCM16) - .status(RealtimeResponse.Status.COMPLETED) - .statusDetails( - RealtimeResponseStatus.builder() - .error( - RealtimeResponseStatus.Error.builder() - .code("code") - .type("type") - .build() - ) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - ) - .temperature(0.0) - .usage( - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - ) - .voice(RealtimeResponse.Voice.ALLOY) - .build() - ) - .build() - - val roundtrippedResponseCreatedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseCreatedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseCreatedEvent).isEqualTo(responseCreatedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseDoneEventTest.kt deleted file mode 100644 index 3dc155ebc..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseDoneEventTest.kt +++ /dev/null @@ -1,256 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonValue -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseDoneEventTest { - - @Test - fun create() { - val responseDoneEvent = - ResponseDoneEvent.builder() - .eventId("event_id") - .response( - RealtimeResponse.builder() - .id("id") - .conversationId("conversation_id") - .maxOutputTokens(0L) - .metadata( - RealtimeResponse.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(RealtimeResponse.Modality.TEXT) - .object_(RealtimeResponse.Object.REALTIME_RESPONSE) - .addOutput( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputAudioFormat(RealtimeResponse.OutputAudioFormat.PCM16) - .status(RealtimeResponse.Status.COMPLETED) - .statusDetails( - RealtimeResponseStatus.builder() - .error( - RealtimeResponseStatus.Error.builder() - .code("code") - .type("type") - .build() - ) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - ) - .temperature(0.0) - .usage( - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - ) - .voice(RealtimeResponse.Voice.ALLOY) - .build() - ) - .build() - - assertThat(responseDoneEvent.eventId()).isEqualTo("event_id") - assertThat(responseDoneEvent.response()) - .isEqualTo( - RealtimeResponse.builder() - .id("id") - .conversationId("conversation_id") - .maxOutputTokens(0L) - .metadata( - RealtimeResponse.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(RealtimeResponse.Modality.TEXT) - .object_(RealtimeResponse.Object.REALTIME_RESPONSE) - .addOutput( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputAudioFormat(RealtimeResponse.OutputAudioFormat.PCM16) - .status(RealtimeResponse.Status.COMPLETED) - .statusDetails( - RealtimeResponseStatus.builder() - .error( - RealtimeResponseStatus.Error.builder() - .code("code") - .type("type") - .build() - ) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - ) - .temperature(0.0) - .usage( - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - ) - .voice(RealtimeResponse.Voice.ALLOY) - .build() - ) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseDoneEvent = - ResponseDoneEvent.builder() - .eventId("event_id") - .response( - RealtimeResponse.builder() - .id("id") - .conversationId("conversation_id") - .maxOutputTokens(0L) - .metadata( - RealtimeResponse.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .addModality(RealtimeResponse.Modality.TEXT) - .object_(RealtimeResponse.Object.REALTIME_RESPONSE) - .addOutput( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputAudioFormat(RealtimeResponse.OutputAudioFormat.PCM16) - .status(RealtimeResponse.Status.COMPLETED) - .statusDetails( - RealtimeResponseStatus.builder() - .error( - RealtimeResponseStatus.Error.builder() - .code("code") - .type("type") - .build() - ) - .reason(RealtimeResponseStatus.Reason.TURN_DETECTED) - .type(RealtimeResponseStatus.Type.COMPLETED) - .build() - ) - .temperature(0.0) - .usage( - RealtimeResponseUsage.builder() - .inputTokenDetails( - RealtimeResponseUsage.InputTokenDetails.builder() - .audioTokens(0L) - .cachedTokens(0L) - .textTokens(0L) - .build() - ) - .inputTokens(0L) - .outputTokenDetails( - RealtimeResponseUsage.OutputTokenDetails.builder() - .audioTokens(0L) - .textTokens(0L) - .build() - ) - .outputTokens(0L) - .totalTokens(0L) - .build() - ) - .voice(RealtimeResponse.Voice.ALLOY) - .build() - ) - .build() - - val roundtrippedResponseDoneEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseDoneEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseDoneEvent).isEqualTo(responseDoneEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDeltaEventTest.kt deleted file mode 100644 index 6b07af472..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDeltaEventTest.kt +++ /dev/null @@ -1,54 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseFunctionCallArgumentsDeltaEventTest { - - @Test - fun create() { - val responseFunctionCallArgumentsDeltaEvent = - ResponseFunctionCallArgumentsDeltaEvent.builder() - .callId("call_id") - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - assertThat(responseFunctionCallArgumentsDeltaEvent.callId()).isEqualTo("call_id") - assertThat(responseFunctionCallArgumentsDeltaEvent.delta()).isEqualTo("delta") - assertThat(responseFunctionCallArgumentsDeltaEvent.eventId()).isEqualTo("event_id") - assertThat(responseFunctionCallArgumentsDeltaEvent.itemId()).isEqualTo("item_id") - assertThat(responseFunctionCallArgumentsDeltaEvent.outputIndex()).isEqualTo(0L) - assertThat(responseFunctionCallArgumentsDeltaEvent.responseId()).isEqualTo("response_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseFunctionCallArgumentsDeltaEvent = - ResponseFunctionCallArgumentsDeltaEvent.builder() - .callId("call_id") - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - val roundtrippedResponseFunctionCallArgumentsDeltaEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseFunctionCallArgumentsDeltaEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseFunctionCallArgumentsDeltaEvent) - .isEqualTo(responseFunctionCallArgumentsDeltaEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDoneEventTest.kt deleted file mode 100644 index a7b3a1389..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseFunctionCallArgumentsDoneEventTest.kt +++ /dev/null @@ -1,54 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseFunctionCallArgumentsDoneEventTest { - - @Test - fun create() { - val responseFunctionCallArgumentsDoneEvent = - ResponseFunctionCallArgumentsDoneEvent.builder() - .arguments("arguments") - .callId("call_id") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - assertThat(responseFunctionCallArgumentsDoneEvent.arguments()).isEqualTo("arguments") - assertThat(responseFunctionCallArgumentsDoneEvent.callId()).isEqualTo("call_id") - assertThat(responseFunctionCallArgumentsDoneEvent.eventId()).isEqualTo("event_id") - assertThat(responseFunctionCallArgumentsDoneEvent.itemId()).isEqualTo("item_id") - assertThat(responseFunctionCallArgumentsDoneEvent.outputIndex()).isEqualTo(0L) - assertThat(responseFunctionCallArgumentsDoneEvent.responseId()).isEqualTo("response_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseFunctionCallArgumentsDoneEvent = - ResponseFunctionCallArgumentsDoneEvent.builder() - .arguments("arguments") - .callId("call_id") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - val roundtrippedResponseFunctionCallArgumentsDoneEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseFunctionCallArgumentsDoneEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseFunctionCallArgumentsDoneEvent) - .isEqualTo(responseFunctionCallArgumentsDoneEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseOutputItemAddedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseOutputItemAddedEventTest.kt deleted file mode 100644 index 4d4badf4a..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseOutputItemAddedEventTest.kt +++ /dev/null @@ -1,111 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseOutputItemAddedEventTest { - - @Test - fun create() { - val responseOutputItemAddedEvent = - ResponseOutputItemAddedEvent.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputIndex(0L) - .responseId("response_id") - .build() - - assertThat(responseOutputItemAddedEvent.eventId()).isEqualTo("event_id") - assertThat(responseOutputItemAddedEvent.item()) - .isEqualTo( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - assertThat(responseOutputItemAddedEvent.outputIndex()).isEqualTo(0L) - assertThat(responseOutputItemAddedEvent.responseId()).isEqualTo("response_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseOutputItemAddedEvent = - ResponseOutputItemAddedEvent.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputIndex(0L) - .responseId("response_id") - .build() - - val roundtrippedResponseOutputItemAddedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseOutputItemAddedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseOutputItemAddedEvent).isEqualTo(responseOutputItemAddedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseOutputItemDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseOutputItemDoneEventTest.kt deleted file mode 100644 index 5d8af4e07..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseOutputItemDoneEventTest.kt +++ /dev/null @@ -1,111 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseOutputItemDoneEventTest { - - @Test - fun create() { - val responseOutputItemDoneEvent = - ResponseOutputItemDoneEvent.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputIndex(0L) - .responseId("response_id") - .build() - - assertThat(responseOutputItemDoneEvent.eventId()).isEqualTo("event_id") - assertThat(responseOutputItemDoneEvent.item()) - .isEqualTo( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - assertThat(responseOutputItemDoneEvent.outputIndex()).isEqualTo(0L) - assertThat(responseOutputItemDoneEvent.responseId()).isEqualTo("response_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseOutputItemDoneEvent = - ResponseOutputItemDoneEvent.builder() - .eventId("event_id") - .item( - ConversationItem.builder() - .id("id") - .arguments("arguments") - .callId("call_id") - .addContent( - ConversationItemContent.builder() - .id("id") - .audio("audio") - .text("text") - .transcript("transcript") - .type(ConversationItemContent.Type.INPUT_TEXT) - .build() - ) - .name("name") - .object_(ConversationItem.Object.REALTIME_ITEM) - .output("output") - .role(ConversationItem.Role.USER) - .status(ConversationItem.Status.COMPLETED) - .type(ConversationItem.Type.MESSAGE) - .build() - ) - .outputIndex(0L) - .responseId("response_id") - .build() - - val roundtrippedResponseOutputItemDoneEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseOutputItemDoneEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseOutputItemDoneEvent).isEqualTo(responseOutputItemDoneEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseTextDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseTextDeltaEventTest.kt deleted file mode 100644 index b216fc8a8..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseTextDeltaEventTest.kt +++ /dev/null @@ -1,53 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseTextDeltaEventTest { - - @Test - fun create() { - val responseTextDeltaEvent = - ResponseTextDeltaEvent.builder() - .contentIndex(0L) - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - assertThat(responseTextDeltaEvent.contentIndex()).isEqualTo(0L) - assertThat(responseTextDeltaEvent.delta()).isEqualTo("delta") - assertThat(responseTextDeltaEvent.eventId()).isEqualTo("event_id") - assertThat(responseTextDeltaEvent.itemId()).isEqualTo("item_id") - assertThat(responseTextDeltaEvent.outputIndex()).isEqualTo(0L) - assertThat(responseTextDeltaEvent.responseId()).isEqualTo("response_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseTextDeltaEvent = - ResponseTextDeltaEvent.builder() - .contentIndex(0L) - .delta("delta") - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .build() - - val roundtrippedResponseTextDeltaEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseTextDeltaEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseTextDeltaEvent).isEqualTo(responseTextDeltaEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseTextDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseTextDoneEventTest.kt deleted file mode 100644 index 36ea80ea4..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/ResponseTextDoneEventTest.kt +++ /dev/null @@ -1,53 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ResponseTextDoneEventTest { - - @Test - fun create() { - val responseTextDoneEvent = - ResponseTextDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .text("text") - .build() - - assertThat(responseTextDoneEvent.contentIndex()).isEqualTo(0L) - assertThat(responseTextDoneEvent.eventId()).isEqualTo("event_id") - assertThat(responseTextDoneEvent.itemId()).isEqualTo("item_id") - assertThat(responseTextDoneEvent.outputIndex()).isEqualTo(0L) - assertThat(responseTextDoneEvent.responseId()).isEqualTo("response_id") - assertThat(responseTextDoneEvent.text()).isEqualTo("text") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val responseTextDoneEvent = - ResponseTextDoneEvent.builder() - .contentIndex(0L) - .eventId("event_id") - .itemId("item_id") - .outputIndex(0L) - .responseId("response_id") - .text("text") - .build() - - val roundtrippedResponseTextDoneEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(responseTextDoneEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedResponseTextDoneEvent).isEqualTo(responseTextDoneEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/SessionCreatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/SessionCreatedEventTest.kt deleted file mode 100644 index ca8411ae9..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/SessionCreatedEventTest.kt +++ /dev/null @@ -1,182 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonValue -import com.openai.core.jsonMapper -import com.openai.models.beta.realtime.sessions.Session -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class SessionCreatedEventTest { - - @Test - fun create() { - val sessionCreatedEvent = - SessionCreatedEvent.builder() - .eventId("event_id") - .session( - Session.builder() - .id("id") - .inputAudioFormat(Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - Session.InputAudioNoiseReduction.builder() - .type(Session.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(Session.Modality.TEXT) - .model(Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - Session.TurnDetection.builder() - .createResponse(true) - .eagerness(Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(Session.Voice.ALLOY) - .build() - ) - .build() - - assertThat(sessionCreatedEvent.eventId()).isEqualTo("event_id") - assertThat(sessionCreatedEvent.session()) - .isEqualTo( - Session.builder() - .id("id") - .inputAudioFormat(Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - Session.InputAudioNoiseReduction.builder() - .type(Session.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(Session.Modality.TEXT) - .model(Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - Session.TurnDetection.builder() - .createResponse(true) - .eagerness(Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(Session.Voice.ALLOY) - .build() - ) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val sessionCreatedEvent = - SessionCreatedEvent.builder() - .eventId("event_id") - .session( - Session.builder() - .id("id") - .inputAudioFormat(Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - Session.InputAudioNoiseReduction.builder() - .type(Session.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(Session.Modality.TEXT) - .model(Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - Session.TurnDetection.builder() - .createResponse(true) - .eagerness(Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(Session.Voice.ALLOY) - .build() - ) - .build() - - val roundtrippedSessionCreatedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(sessionCreatedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedSessionCreatedEvent).isEqualTo(sessionCreatedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/SessionUpdateEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/SessionUpdateEventTest.kt deleted file mode 100644 index ae495930f..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/SessionUpdateEventTest.kt +++ /dev/null @@ -1,227 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonValue -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class SessionUpdateEventTest { - - @Test - fun create() { - val sessionUpdateEvent = - SessionUpdateEvent.builder() - .session( - SessionUpdateEvent.Session.builder() - .clientSecret( - SessionUpdateEvent.Session.ClientSecret.builder() - .expiresAfter( - SessionUpdateEvent.Session.ClientSecret.ExpiresAfter.builder() - .anchor( - SessionUpdateEvent.Session.ClientSecret.ExpiresAfter - .Anchor - .CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - .inputAudioFormat(SessionUpdateEvent.Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - SessionUpdateEvent.Session.InputAudioNoiseReduction.builder() - .type( - SessionUpdateEvent.Session.InputAudioNoiseReduction.Type - .NEAR_FIELD - ) - .build() - ) - .inputAudioTranscription( - SessionUpdateEvent.Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(SessionUpdateEvent.Session.Modality.TEXT) - .model(SessionUpdateEvent.Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(SessionUpdateEvent.Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - SessionUpdateEvent.Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(SessionUpdateEvent.Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - SessionUpdateEvent.Session.TurnDetection.builder() - .createResponse(true) - .eagerness(SessionUpdateEvent.Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(SessionUpdateEvent.Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(SessionUpdateEvent.Session.Voice.ALLOY) - .build() - ) - .eventId("event_id") - .build() - - assertThat(sessionUpdateEvent.session()) - .isEqualTo( - SessionUpdateEvent.Session.builder() - .clientSecret( - SessionUpdateEvent.Session.ClientSecret.builder() - .expiresAfter( - SessionUpdateEvent.Session.ClientSecret.ExpiresAfter.builder() - .anchor( - SessionUpdateEvent.Session.ClientSecret.ExpiresAfter.Anchor - .CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - .inputAudioFormat(SessionUpdateEvent.Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - SessionUpdateEvent.Session.InputAudioNoiseReduction.builder() - .type( - SessionUpdateEvent.Session.InputAudioNoiseReduction.Type.NEAR_FIELD - ) - .build() - ) - .inputAudioTranscription( - SessionUpdateEvent.Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(SessionUpdateEvent.Session.Modality.TEXT) - .model(SessionUpdateEvent.Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(SessionUpdateEvent.Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - SessionUpdateEvent.Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(SessionUpdateEvent.Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - SessionUpdateEvent.Session.TurnDetection.builder() - .createResponse(true) - .eagerness(SessionUpdateEvent.Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(SessionUpdateEvent.Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(SessionUpdateEvent.Session.Voice.ALLOY) - .build() - ) - assertThat(sessionUpdateEvent.eventId()).contains("event_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val sessionUpdateEvent = - SessionUpdateEvent.builder() - .session( - SessionUpdateEvent.Session.builder() - .clientSecret( - SessionUpdateEvent.Session.ClientSecret.builder() - .expiresAfter( - SessionUpdateEvent.Session.ClientSecret.ExpiresAfter.builder() - .anchor( - SessionUpdateEvent.Session.ClientSecret.ExpiresAfter - .Anchor - .CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - .inputAudioFormat(SessionUpdateEvent.Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - SessionUpdateEvent.Session.InputAudioNoiseReduction.builder() - .type( - SessionUpdateEvent.Session.InputAudioNoiseReduction.Type - .NEAR_FIELD - ) - .build() - ) - .inputAudioTranscription( - SessionUpdateEvent.Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(SessionUpdateEvent.Session.Modality.TEXT) - .model(SessionUpdateEvent.Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(SessionUpdateEvent.Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - SessionUpdateEvent.Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(SessionUpdateEvent.Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - SessionUpdateEvent.Session.TurnDetection.builder() - .createResponse(true) - .eagerness(SessionUpdateEvent.Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(SessionUpdateEvent.Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(SessionUpdateEvent.Session.Voice.ALLOY) - .build() - ) - .eventId("event_id") - .build() - - val roundtrippedSessionUpdateEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(sessionUpdateEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedSessionUpdateEvent).isEqualTo(sessionUpdateEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/SessionUpdatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/SessionUpdatedEventTest.kt deleted file mode 100644 index edc487198..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/SessionUpdatedEventTest.kt +++ /dev/null @@ -1,182 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonValue -import com.openai.core.jsonMapper -import com.openai.models.beta.realtime.sessions.Session -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class SessionUpdatedEventTest { - - @Test - fun create() { - val sessionUpdatedEvent = - SessionUpdatedEvent.builder() - .eventId("event_id") - .session( - Session.builder() - .id("id") - .inputAudioFormat(Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - Session.InputAudioNoiseReduction.builder() - .type(Session.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(Session.Modality.TEXT) - .model(Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - Session.TurnDetection.builder() - .createResponse(true) - .eagerness(Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(Session.Voice.ALLOY) - .build() - ) - .build() - - assertThat(sessionUpdatedEvent.eventId()).isEqualTo("event_id") - assertThat(sessionUpdatedEvent.session()) - .isEqualTo( - Session.builder() - .id("id") - .inputAudioFormat(Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - Session.InputAudioNoiseReduction.builder() - .type(Session.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(Session.Modality.TEXT) - .model(Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - Session.TurnDetection.builder() - .createResponse(true) - .eagerness(Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(Session.Voice.ALLOY) - .build() - ) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val sessionUpdatedEvent = - SessionUpdatedEvent.builder() - .eventId("event_id") - .session( - Session.builder() - .id("id") - .inputAudioFormat(Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - Session.InputAudioNoiseReduction.builder() - .type(Session.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(Session.Modality.TEXT) - .model(Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - Session.TurnDetection.builder() - .createResponse(true) - .eagerness(Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(Session.Voice.ALLOY) - .build() - ) - .build() - - val roundtrippedSessionUpdatedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(sessionUpdatedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedSessionUpdatedEvent).isEqualTo(sessionUpdatedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdateTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdateTest.kt deleted file mode 100644 index 0195121ee..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdateTest.kt +++ /dev/null @@ -1,203 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class TranscriptionSessionUpdateTest { - - @Test - fun create() { - val transcriptionSessionUpdate = - TranscriptionSessionUpdate.builder() - .session( - TranscriptionSessionUpdate.Session.builder() - .clientSecret( - TranscriptionSessionUpdate.Session.ClientSecret.builder() - .expiresAt( - TranscriptionSessionUpdate.Session.ClientSecret.ExpiresAt - .builder() - .anchor( - TranscriptionSessionUpdate.Session.ClientSecret - .ExpiresAt - .Anchor - .CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - .addInclude("string") - .inputAudioFormat(TranscriptionSessionUpdate.Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - TranscriptionSessionUpdate.Session.InputAudioNoiseReduction.builder() - .type( - TranscriptionSessionUpdate.Session.InputAudioNoiseReduction.Type - .NEAR_FIELD - ) - .build() - ) - .inputAudioTranscription( - TranscriptionSessionUpdate.Session.InputAudioTranscription.builder() - .language("language") - .model( - TranscriptionSessionUpdate.Session.InputAudioTranscription.Model - .GPT_4O_TRANSCRIBE - ) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSessionUpdate.Session.Modality.TEXT) - .turnDetection( - TranscriptionSessionUpdate.Session.TurnDetection.builder() - .createResponse(true) - .eagerness( - TranscriptionSessionUpdate.Session.TurnDetection.Eagerness.LOW - ) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type( - TranscriptionSessionUpdate.Session.TurnDetection.Type.SERVER_VAD - ) - .build() - ) - .build() - ) - .eventId("event_id") - .build() - - assertThat(transcriptionSessionUpdate.session()) - .isEqualTo( - TranscriptionSessionUpdate.Session.builder() - .clientSecret( - TranscriptionSessionUpdate.Session.ClientSecret.builder() - .expiresAt( - TranscriptionSessionUpdate.Session.ClientSecret.ExpiresAt.builder() - .anchor( - TranscriptionSessionUpdate.Session.ClientSecret.ExpiresAt - .Anchor - .CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - .addInclude("string") - .inputAudioFormat(TranscriptionSessionUpdate.Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - TranscriptionSessionUpdate.Session.InputAudioNoiseReduction.builder() - .type( - TranscriptionSessionUpdate.Session.InputAudioNoiseReduction.Type - .NEAR_FIELD - ) - .build() - ) - .inputAudioTranscription( - TranscriptionSessionUpdate.Session.InputAudioTranscription.builder() - .language("language") - .model( - TranscriptionSessionUpdate.Session.InputAudioTranscription.Model - .GPT_4O_TRANSCRIBE - ) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSessionUpdate.Session.Modality.TEXT) - .turnDetection( - TranscriptionSessionUpdate.Session.TurnDetection.builder() - .createResponse(true) - .eagerness( - TranscriptionSessionUpdate.Session.TurnDetection.Eagerness.LOW - ) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(TranscriptionSessionUpdate.Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .build() - ) - assertThat(transcriptionSessionUpdate.eventId()).contains("event_id") - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val transcriptionSessionUpdate = - TranscriptionSessionUpdate.builder() - .session( - TranscriptionSessionUpdate.Session.builder() - .clientSecret( - TranscriptionSessionUpdate.Session.ClientSecret.builder() - .expiresAt( - TranscriptionSessionUpdate.Session.ClientSecret.ExpiresAt - .builder() - .anchor( - TranscriptionSessionUpdate.Session.ClientSecret - .ExpiresAt - .Anchor - .CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - .addInclude("string") - .inputAudioFormat(TranscriptionSessionUpdate.Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - TranscriptionSessionUpdate.Session.InputAudioNoiseReduction.builder() - .type( - TranscriptionSessionUpdate.Session.InputAudioNoiseReduction.Type - .NEAR_FIELD - ) - .build() - ) - .inputAudioTranscription( - TranscriptionSessionUpdate.Session.InputAudioTranscription.builder() - .language("language") - .model( - TranscriptionSessionUpdate.Session.InputAudioTranscription.Model - .GPT_4O_TRANSCRIBE - ) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSessionUpdate.Session.Modality.TEXT) - .turnDetection( - TranscriptionSessionUpdate.Session.TurnDetection.builder() - .createResponse(true) - .eagerness( - TranscriptionSessionUpdate.Session.TurnDetection.Eagerness.LOW - ) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type( - TranscriptionSessionUpdate.Session.TurnDetection.Type.SERVER_VAD - ) - .build() - ) - .build() - ) - .eventId("event_id") - .build() - - val roundtrippedTranscriptionSessionUpdate = - jsonMapper.readValue( - jsonMapper.writeValueAsString(transcriptionSessionUpdate), - jacksonTypeRef(), - ) - - assertThat(roundtrippedTranscriptionSessionUpdate).isEqualTo(transcriptionSessionUpdate) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdatedEventTest.kt deleted file mode 100644 index 50db8478a..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/TranscriptionSessionUpdatedEventTest.kt +++ /dev/null @@ -1,130 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import com.openai.models.beta.realtime.transcriptionsessions.TranscriptionSession -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class TranscriptionSessionUpdatedEventTest { - - @Test - fun create() { - val transcriptionSessionUpdatedEvent = - TranscriptionSessionUpdatedEvent.builder() - .eventId("event_id") - .session( - TranscriptionSession.builder() - .clientSecret( - TranscriptionSession.ClientSecret.builder() - .expiresAt(0L) - .value("value") - .build() - ) - .inputAudioFormat("input_audio_format") - .inputAudioTranscription( - TranscriptionSession.InputAudioTranscription.builder() - .language("language") - .model( - TranscriptionSession.InputAudioTranscription.Model - .GPT_4O_TRANSCRIBE - ) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSession.Modality.TEXT) - .turnDetection( - TranscriptionSession.TurnDetection.builder() - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type("type") - .build() - ) - .build() - ) - .build() - - assertThat(transcriptionSessionUpdatedEvent.eventId()).isEqualTo("event_id") - assertThat(transcriptionSessionUpdatedEvent.session()) - .isEqualTo( - TranscriptionSession.builder() - .clientSecret( - TranscriptionSession.ClientSecret.builder() - .expiresAt(0L) - .value("value") - .build() - ) - .inputAudioFormat("input_audio_format") - .inputAudioTranscription( - TranscriptionSession.InputAudioTranscription.builder() - .language("language") - .model( - TranscriptionSession.InputAudioTranscription.Model.GPT_4O_TRANSCRIBE - ) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSession.Modality.TEXT) - .turnDetection( - TranscriptionSession.TurnDetection.builder() - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type("type") - .build() - ) - .build() - ) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val transcriptionSessionUpdatedEvent = - TranscriptionSessionUpdatedEvent.builder() - .eventId("event_id") - .session( - TranscriptionSession.builder() - .clientSecret( - TranscriptionSession.ClientSecret.builder() - .expiresAt(0L) - .value("value") - .build() - ) - .inputAudioFormat("input_audio_format") - .inputAudioTranscription( - TranscriptionSession.InputAudioTranscription.builder() - .language("language") - .model( - TranscriptionSession.InputAudioTranscription.Model - .GPT_4O_TRANSCRIBE - ) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSession.Modality.TEXT) - .turnDetection( - TranscriptionSession.TurnDetection.builder() - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type("type") - .build() - ) - .build() - ) - .build() - - val roundtrippedTranscriptionSessionUpdatedEvent = - jsonMapper.readValue( - jsonMapper.writeValueAsString(transcriptionSessionUpdatedEvent), - jacksonTypeRef(), - ) - - assertThat(roundtrippedTranscriptionSessionUpdatedEvent) - .isEqualTo(transcriptionSessionUpdatedEvent) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateParamsTest.kt deleted file mode 100644 index b930fc188..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateParamsTest.kt +++ /dev/null @@ -1,198 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime.sessions - -import com.openai.core.JsonValue -import kotlin.jvm.optionals.getOrNull -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class SessionCreateParamsTest { - - @Test - fun create() { - SessionCreateParams.builder() - .clientSecret( - SessionCreateParams.ClientSecret.builder() - .expiresAfter( - SessionCreateParams.ClientSecret.ExpiresAfter.builder() - .anchor(SessionCreateParams.ClientSecret.ExpiresAfter.Anchor.CREATED_AT) - .seconds(0L) - .build() - ) - .build() - ) - .inputAudioFormat(SessionCreateParams.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - SessionCreateParams.InputAudioNoiseReduction.builder() - .type(SessionCreateParams.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - SessionCreateParams.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(SessionCreateParams.Modality.TEXT) - .model(SessionCreateParams.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(SessionCreateParams.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - SessionCreateParams.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(SessionCreateParams.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - SessionCreateParams.TurnDetection.builder() - .createResponse(true) - .eagerness(SessionCreateParams.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(SessionCreateParams.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(SessionCreateParams.Voice.ALLOY) - .build() - } - - @Test - fun body() { - val params = - SessionCreateParams.builder() - .clientSecret( - SessionCreateParams.ClientSecret.builder() - .expiresAfter( - SessionCreateParams.ClientSecret.ExpiresAfter.builder() - .anchor( - SessionCreateParams.ClientSecret.ExpiresAfter.Anchor.CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - .inputAudioFormat(SessionCreateParams.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - SessionCreateParams.InputAudioNoiseReduction.builder() - .type(SessionCreateParams.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - SessionCreateParams.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(SessionCreateParams.Modality.TEXT) - .model(SessionCreateParams.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(SessionCreateParams.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - SessionCreateParams.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(SessionCreateParams.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - SessionCreateParams.TurnDetection.builder() - .createResponse(true) - .eagerness(SessionCreateParams.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(SessionCreateParams.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(SessionCreateParams.Voice.ALLOY) - .build() - - val body = params._body() - - assertThat(body.clientSecret()) - .contains( - SessionCreateParams.ClientSecret.builder() - .expiresAfter( - SessionCreateParams.ClientSecret.ExpiresAfter.builder() - .anchor(SessionCreateParams.ClientSecret.ExpiresAfter.Anchor.CREATED_AT) - .seconds(0L) - .build() - ) - .build() - ) - assertThat(body.inputAudioFormat()).contains(SessionCreateParams.InputAudioFormat.PCM16) - assertThat(body.inputAudioNoiseReduction()) - .contains( - SessionCreateParams.InputAudioNoiseReduction.builder() - .type(SessionCreateParams.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - assertThat(body.inputAudioTranscription()) - .contains( - SessionCreateParams.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - assertThat(body.instructions()).contains("instructions") - assertThat(body.maxResponseOutputTokens()) - .contains(SessionCreateParams.MaxResponseOutputTokens.ofInteger(0L)) - assertThat(body.modalities().getOrNull()).containsExactly(SessionCreateParams.Modality.TEXT) - assertThat(body.model()).contains(SessionCreateParams.Model.GPT_4O_REALTIME_PREVIEW) - assertThat(body.outputAudioFormat()).contains(SessionCreateParams.OutputAudioFormat.PCM16) - assertThat(body.speed()).contains(0.25) - assertThat(body.temperature()).contains(0.0) - assertThat(body.toolChoice()).contains("tool_choice") - assertThat(body.tools().getOrNull()) - .containsExactly( - SessionCreateParams.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(SessionCreateParams.Tool.Type.FUNCTION) - .build() - ) - assertThat(body.tracing()).contains(SessionCreateParams.Tracing.ofAuto()) - assertThat(body.turnDetection()) - .contains( - SessionCreateParams.TurnDetection.builder() - .createResponse(true) - .eagerness(SessionCreateParams.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(SessionCreateParams.TurnDetection.Type.SERVER_VAD) - .build() - ) - assertThat(body.voice()).contains(SessionCreateParams.Voice.ALLOY) - } - - @Test - fun bodyWithoutOptionalFields() { - val params = SessionCreateParams.builder().build() - - val body = params._body() - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateResponseTest.kt deleted file mode 100644 index f34f74e71..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/sessions/SessionCreateResponseTest.kt +++ /dev/null @@ -1,145 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime.sessions - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonValue -import com.openai.core.jsonMapper -import kotlin.jvm.optionals.getOrNull -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class SessionCreateResponseTest { - - @Test - fun create() { - val sessionCreateResponse = - SessionCreateResponse.builder() - .clientSecret( - SessionCreateResponse.ClientSecret.builder() - .expiresAt(0L) - .value("value") - .build() - ) - .inputAudioFormat("input_audio_format") - .inputAudioTranscription( - SessionCreateResponse.InputAudioTranscription.builder().model("model").build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(SessionCreateResponse.Modality.TEXT) - .outputAudioFormat("output_audio_format") - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - SessionCreateResponse.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(SessionCreateResponse.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - SessionCreateResponse.TurnDetection.builder() - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type("type") - .build() - ) - .voice(SessionCreateResponse.Voice.ALLOY) - .build() - - assertThat(sessionCreateResponse.clientSecret()) - .isEqualTo( - SessionCreateResponse.ClientSecret.builder().expiresAt(0L).value("value").build() - ) - assertThat(sessionCreateResponse.inputAudioFormat()).contains("input_audio_format") - assertThat(sessionCreateResponse.inputAudioTranscription()) - .contains( - SessionCreateResponse.InputAudioTranscription.builder().model("model").build() - ) - assertThat(sessionCreateResponse.instructions()).contains("instructions") - assertThat(sessionCreateResponse.maxResponseOutputTokens()) - .contains(SessionCreateResponse.MaxResponseOutputTokens.ofInteger(0L)) - assertThat(sessionCreateResponse.modalities().getOrNull()) - .containsExactly(SessionCreateResponse.Modality.TEXT) - assertThat(sessionCreateResponse.outputAudioFormat()).contains("output_audio_format") - assertThat(sessionCreateResponse.speed()).contains(0.25) - assertThat(sessionCreateResponse.temperature()).contains(0.0) - assertThat(sessionCreateResponse.toolChoice()).contains("tool_choice") - assertThat(sessionCreateResponse.tools().getOrNull()) - .containsExactly( - SessionCreateResponse.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(SessionCreateResponse.Tool.Type.FUNCTION) - .build() - ) - assertThat(sessionCreateResponse.tracing()).contains(SessionCreateResponse.Tracing.ofAuto()) - assertThat(sessionCreateResponse.turnDetection()) - .contains( - SessionCreateResponse.TurnDetection.builder() - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type("type") - .build() - ) - assertThat(sessionCreateResponse.voice()).contains(SessionCreateResponse.Voice.ALLOY) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val sessionCreateResponse = - SessionCreateResponse.builder() - .clientSecret( - SessionCreateResponse.ClientSecret.builder() - .expiresAt(0L) - .value("value") - .build() - ) - .inputAudioFormat("input_audio_format") - .inputAudioTranscription( - SessionCreateResponse.InputAudioTranscription.builder().model("model").build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(SessionCreateResponse.Modality.TEXT) - .outputAudioFormat("output_audio_format") - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - SessionCreateResponse.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(SessionCreateResponse.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - SessionCreateResponse.TurnDetection.builder() - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type("type") - .build() - ) - .voice(SessionCreateResponse.Voice.ALLOY) - .build() - - val roundtrippedSessionCreateResponse = - jsonMapper.readValue( - jsonMapper.writeValueAsString(sessionCreateResponse), - jacksonTypeRef(), - ) - - assertThat(roundtrippedSessionCreateResponse).isEqualTo(sessionCreateResponse) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/sessions/SessionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/sessions/SessionTest.kt deleted file mode 100644 index 03e4466e4..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/sessions/SessionTest.kt +++ /dev/null @@ -1,168 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime.sessions - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.JsonValue -import com.openai.core.jsonMapper -import kotlin.jvm.optionals.getOrNull -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class SessionTest { - - @Test - fun create() { - val session = - Session.builder() - .id("id") - .inputAudioFormat(Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - Session.InputAudioNoiseReduction.builder() - .type(Session.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(Session.Modality.TEXT) - .model(Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - Session.TurnDetection.builder() - .createResponse(true) - .eagerness(Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(Session.Voice.ALLOY) - .build() - - assertThat(session.id()).contains("id") - assertThat(session.inputAudioFormat()).contains(Session.InputAudioFormat.PCM16) - assertThat(session.inputAudioNoiseReduction()) - .contains( - Session.InputAudioNoiseReduction.builder() - .type(Session.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - assertThat(session.inputAudioTranscription()) - .contains( - Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - assertThat(session.instructions()).contains("instructions") - assertThat(session.maxResponseOutputTokens()) - .contains(Session.MaxResponseOutputTokens.ofInteger(0L)) - assertThat(session.modalities().getOrNull()).containsExactly(Session.Modality.TEXT) - assertThat(session.model()).contains(Session.Model.GPT_4O_REALTIME_PREVIEW) - assertThat(session.outputAudioFormat()).contains(Session.OutputAudioFormat.PCM16) - assertThat(session.speed()).contains(0.25) - assertThat(session.temperature()).contains(0.0) - assertThat(session.toolChoice()).contains("tool_choice") - assertThat(session.tools().getOrNull()) - .containsExactly( - Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(Session.Tool.Type.FUNCTION) - .build() - ) - assertThat(session.tracing()).contains(Session.Tracing.ofAuto()) - assertThat(session.turnDetection()) - .contains( - Session.TurnDetection.builder() - .createResponse(true) - .eagerness(Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - assertThat(session.voice()).contains(Session.Voice.ALLOY) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val session = - Session.builder() - .id("id") - .inputAudioFormat(Session.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - Session.InputAudioNoiseReduction.builder() - .type(Session.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - Session.InputAudioTranscription.builder() - .language("language") - .model("model") - .prompt("prompt") - .build() - ) - .instructions("instructions") - .maxResponseOutputTokens(0L) - .addModality(Session.Modality.TEXT) - .model(Session.Model.GPT_4O_REALTIME_PREVIEW) - .outputAudioFormat(Session.OutputAudioFormat.PCM16) - .speed(0.25) - .temperature(0.0) - .toolChoice("tool_choice") - .addTool( - Session.Tool.builder() - .description("description") - .name("name") - .parameters(JsonValue.from(mapOf())) - .type(Session.Tool.Type.FUNCTION) - .build() - ) - .tracingAuto() - .turnDetection( - Session.TurnDetection.builder() - .createResponse(true) - .eagerness(Session.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(Session.TurnDetection.Type.SERVER_VAD) - .build() - ) - .voice(Session.Voice.ALLOY) - .build() - - val roundtrippedSession = - jsonMapper.readValue(jsonMapper.writeValueAsString(session), jacksonTypeRef()) - - assertThat(roundtrippedSession).isEqualTo(session) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSessionCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSessionCreateParamsTest.kt deleted file mode 100644 index 2217e03fb..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSessionCreateParamsTest.kt +++ /dev/null @@ -1,168 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime.transcriptionsessions - -import kotlin.jvm.optionals.getOrNull -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class TranscriptionSessionCreateParamsTest { - - @Test - fun create() { - TranscriptionSessionCreateParams.builder() - .clientSecret( - TranscriptionSessionCreateParams.ClientSecret.builder() - .expiresAt( - TranscriptionSessionCreateParams.ClientSecret.ExpiresAt.builder() - .anchor( - TranscriptionSessionCreateParams.ClientSecret.ExpiresAt.Anchor - .CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - .addInclude("string") - .inputAudioFormat(TranscriptionSessionCreateParams.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - TranscriptionSessionCreateParams.InputAudioNoiseReduction.builder() - .type(TranscriptionSessionCreateParams.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - .inputAudioTranscription( - TranscriptionSessionCreateParams.InputAudioTranscription.builder() - .language("language") - .model( - TranscriptionSessionCreateParams.InputAudioTranscription.Model - .GPT_4O_TRANSCRIBE - ) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSessionCreateParams.Modality.TEXT) - .turnDetection( - TranscriptionSessionCreateParams.TurnDetection.builder() - .createResponse(true) - .eagerness(TranscriptionSessionCreateParams.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(TranscriptionSessionCreateParams.TurnDetection.Type.SERVER_VAD) - .build() - ) - .build() - } - - @Test - fun body() { - val params = - TranscriptionSessionCreateParams.builder() - .clientSecret( - TranscriptionSessionCreateParams.ClientSecret.builder() - .expiresAt( - TranscriptionSessionCreateParams.ClientSecret.ExpiresAt.builder() - .anchor( - TranscriptionSessionCreateParams.ClientSecret.ExpiresAt.Anchor - .CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - .addInclude("string") - .inputAudioFormat(TranscriptionSessionCreateParams.InputAudioFormat.PCM16) - .inputAudioNoiseReduction( - TranscriptionSessionCreateParams.InputAudioNoiseReduction.builder() - .type( - TranscriptionSessionCreateParams.InputAudioNoiseReduction.Type - .NEAR_FIELD - ) - .build() - ) - .inputAudioTranscription( - TranscriptionSessionCreateParams.InputAudioTranscription.builder() - .language("language") - .model( - TranscriptionSessionCreateParams.InputAudioTranscription.Model - .GPT_4O_TRANSCRIBE - ) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSessionCreateParams.Modality.TEXT) - .turnDetection( - TranscriptionSessionCreateParams.TurnDetection.builder() - .createResponse(true) - .eagerness(TranscriptionSessionCreateParams.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(TranscriptionSessionCreateParams.TurnDetection.Type.SERVER_VAD) - .build() - ) - .build() - - val body = params._body() - - assertThat(body.clientSecret()) - .contains( - TranscriptionSessionCreateParams.ClientSecret.builder() - .expiresAt( - TranscriptionSessionCreateParams.ClientSecret.ExpiresAt.builder() - .anchor( - TranscriptionSessionCreateParams.ClientSecret.ExpiresAt.Anchor - .CREATED_AT - ) - .seconds(0L) - .build() - ) - .build() - ) - assertThat(body.include().getOrNull()).containsExactly("string") - assertThat(body.inputAudioFormat()) - .contains(TranscriptionSessionCreateParams.InputAudioFormat.PCM16) - assertThat(body.inputAudioNoiseReduction()) - .contains( - TranscriptionSessionCreateParams.InputAudioNoiseReduction.builder() - .type(TranscriptionSessionCreateParams.InputAudioNoiseReduction.Type.NEAR_FIELD) - .build() - ) - assertThat(body.inputAudioTranscription()) - .contains( - TranscriptionSessionCreateParams.InputAudioTranscription.builder() - .language("language") - .model( - TranscriptionSessionCreateParams.InputAudioTranscription.Model - .GPT_4O_TRANSCRIBE - ) - .prompt("prompt") - .build() - ) - assertThat(body.modalities().getOrNull()) - .containsExactly(TranscriptionSessionCreateParams.Modality.TEXT) - assertThat(body.turnDetection()) - .contains( - TranscriptionSessionCreateParams.TurnDetection.builder() - .createResponse(true) - .eagerness(TranscriptionSessionCreateParams.TurnDetection.Eagerness.LOW) - .interruptResponse(true) - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type(TranscriptionSessionCreateParams.TurnDetection.Type.SERVER_VAD) - .build() - ) - } - - @Test - fun bodyWithoutOptionalFields() { - val params = TranscriptionSessionCreateParams.builder().build() - - val body = params._body() - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSessionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSessionTest.kt deleted file mode 100644 index b2b9a2a91..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/realtime/transcriptionsessions/TranscriptionSessionTest.kt +++ /dev/null @@ -1,100 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.models.beta.realtime.transcriptionsessions - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.core.jsonMapper -import kotlin.jvm.optionals.getOrNull -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class TranscriptionSessionTest { - - @Test - fun create() { - val transcriptionSession = - TranscriptionSession.builder() - .clientSecret( - TranscriptionSession.ClientSecret.builder().expiresAt(0L).value("value").build() - ) - .inputAudioFormat("input_audio_format") - .inputAudioTranscription( - TranscriptionSession.InputAudioTranscription.builder() - .language("language") - .model(TranscriptionSession.InputAudioTranscription.Model.GPT_4O_TRANSCRIBE) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSession.Modality.TEXT) - .turnDetection( - TranscriptionSession.TurnDetection.builder() - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type("type") - .build() - ) - .build() - - assertThat(transcriptionSession.clientSecret()) - .isEqualTo( - TranscriptionSession.ClientSecret.builder().expiresAt(0L).value("value").build() - ) - assertThat(transcriptionSession.inputAudioFormat()).contains("input_audio_format") - assertThat(transcriptionSession.inputAudioTranscription()) - .contains( - TranscriptionSession.InputAudioTranscription.builder() - .language("language") - .model(TranscriptionSession.InputAudioTranscription.Model.GPT_4O_TRANSCRIBE) - .prompt("prompt") - .build() - ) - assertThat(transcriptionSession.modalities().getOrNull()) - .containsExactly(TranscriptionSession.Modality.TEXT) - assertThat(transcriptionSession.turnDetection()) - .contains( - TranscriptionSession.TurnDetection.builder() - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type("type") - .build() - ) - } - - @Test - fun roundtrip() { - val jsonMapper = jsonMapper() - val transcriptionSession = - TranscriptionSession.builder() - .clientSecret( - TranscriptionSession.ClientSecret.builder().expiresAt(0L).value("value").build() - ) - .inputAudioFormat("input_audio_format") - .inputAudioTranscription( - TranscriptionSession.InputAudioTranscription.builder() - .language("language") - .model(TranscriptionSession.InputAudioTranscription.Model.GPT_4O_TRANSCRIBE) - .prompt("prompt") - .build() - ) - .addModality(TranscriptionSession.Modality.TEXT) - .turnDetection( - TranscriptionSession.TurnDetection.builder() - .prefixPaddingMs(0L) - .silenceDurationMs(0L) - .threshold(0.0) - .type("type") - .build() - ) - .build() - - val roundtrippedTranscriptionSession = - jsonMapper.readValue( - jsonMapper.writeValueAsString(transcriptionSession), - jacksonTypeRef(), - ) - - assertThat(roundtrippedTranscriptionSession).isEqualTo(transcriptionSession) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParamsTest.kt index d65292619..17e739223 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParamsTest.kt @@ -464,36 +464,4 @@ internal class ChatCompletionCreateParamsTest { ) assertThat(body.model()).isEqualTo(ChatModel.GPT_5_4) } - - @Test - fun structuredOutputsBuilder() { - class X(val s: String) - - // Only interested in a few things: - // - Does the `Builder` type change when `responseFormat(Class)` is called? - // - Are values already set on the "old" `Builder` preserved in the change-over? - // - Can new values be set on the "new" `Builder` alongside the "old" values? - val params = - ChatCompletionCreateParams.builder() - .addDeveloperMessage("dev message") - .model(ChatModel.GPT_4_1) - .responseFormat(X::class.java) // Creates and return a new builder. - .addSystemMessage("sys message") - .build() - - val body = params.rawParams._body() - - assertThat(params).isInstanceOf(StructuredChatCompletionCreateParams::class.java) - assertThat(params.responseType).isEqualTo(X::class.java) - assertThat(body.messages()) - .containsExactly( - ChatCompletionMessageParam.ofDeveloper( - ChatCompletionDeveloperMessageParam.builder().content("dev message").build() - ), - ChatCompletionMessageParam.ofSystem( - ChatCompletionSystemMessageParam.builder().content("sys message").build() - ), - ) - assertThat(body.model()).isEqualTo(ChatModel.GPT_4_1) - } } diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionCreateParamsTest.kt deleted file mode 100644 index 3be034a80..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionCreateParamsTest.kt +++ /dev/null @@ -1,394 +0,0 @@ -package com.openai.models.chat.completions - -import com.openai.core.BOOLEAN -import com.openai.core.CLASS -import com.openai.core.DOUBLE -import com.openai.core.DelegationWriteTestCase -import com.openai.core.JSON_FIELD -import com.openai.core.JSON_VALUE -import com.openai.core.JsonField -import com.openai.core.JsonSchemaLocalValidation -import com.openai.core.LIST -import com.openai.core.LONG -import com.openai.core.MAP -import com.openai.core.NULLABLE -import com.openai.core.NULLABLE_BOOLEAN -import com.openai.core.NULLABLE_DOUBLE -import com.openai.core.NULLABLE_LONG -import com.openai.core.OPTIONAL -import com.openai.core.SET -import com.openai.core.STRING -import com.openai.core.X -import com.openai.core.checkAllDelegation -import com.openai.core.checkAllDelegatorWriteFunctionsAreTested -import com.openai.core.checkOneDelegationWrite -import com.openai.core.findDelegationMethod -import com.openai.core.http.Headers -import com.openai.core.http.QueryParams -import com.openai.core.responseFormatFromClass -import com.openai.models.ChatModel -import com.openai.models.FunctionDefinition -import com.openai.models.ResponseFormatJsonSchema -import java.util.Optional -import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.MethodSource -import org.mockito.Mockito.mock -import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.kotlin.times -import org.mockito.kotlin.verify - -/** - * Unit tests for the [StructuredChatCompletionCreateParams] class (delegator) and its delegation of - * most functions to a wrapped [ChatCompletionCreateParams] (delegate). It is the `Builder` class of - * each main class that is involved in the delegation. The tests include confirmation of the - * following: - * - All functions in the delegator correspond to a function in the delegate and _vice versa_. - * - All functions in the delegator call their corresponding function in the delegate and only that - * function. - * - A unit test exists for all functions. - * - * There are some exceptions to the above that are handled differently. - */ -internal class StructuredChatCompletionCreateParamsTest { - companion object { - private val CHAT_MODEL = ChatModel.GPT_4 - - private val MESSAGE = - ChatCompletionMessage.builder().content(STRING).refusal(STRING).build() - - private val USER_MESSAGE_PARAM = - ChatCompletionUserMessageParam.builder().content(STRING).build() - private val DEV_MESSAGE_PARAM = - ChatCompletionDeveloperMessageParam.builder().content(STRING).build() - private val SYS_MESSAGE_PARAM = - ChatCompletionSystemMessageParam.builder().content(STRING).build() - private val ASSIST_MESSAGE_PARAM = - ChatCompletionAssistantMessageParam.builder().content(STRING).build() - private val TOOL_MESSAGE_PARAM = - ChatCompletionToolMessageParam.builder().content(STRING).toolCallId(STRING).build() - private val FUNC_MESSAGE_PARAM = - ChatCompletionFunctionMessageParam.builder().content(STRING).name(STRING).build() - private val MESSAGE_PARAM = ChatCompletionMessageParam.ofUser(USER_MESSAGE_PARAM) - - private val ASSISTANT_MESSAGE_PARAM_CONTENT = - ChatCompletionAssistantMessageParam.Content.ofText(STRING) - - private val DEV_MESSAGE_PARAM_CONTENT = - ChatCompletionDeveloperMessageParam.Content.ofText(STRING) - private val SYS_MESSAGE_PARAM_CONTENT = - ChatCompletionSystemMessageParam.Content.ofText(STRING) - private val USER_MESSAGE_PARAM_CONTENT = - ChatCompletionUserMessageParam.Content.ofText(STRING) - - private val PROMPT_CACHE_RETENTION = - ChatCompletionCreateParams.PromptCacheRetention.IN_MEMORY - private val PROMPT_CACHE_OPTIONS = - ChatCompletionCreateParams.PromptCacheOptions.builder().build() - private val PROMPT_CACHE_RETENTION_OPTIONAL = Optional.of(PROMPT_CACHE_RETENTION) - private val PROMPT_CACHE_RETENTION_JSON_FIELD = JsonField.of(PROMPT_CACHE_RETENTION) - - private val PARAMS_BODY = - ChatCompletionCreateParams.Body.builder() - .messages(listOf(MESSAGE_PARAM)) - .model(CHAT_MODEL) - .build() - private val WEB_SEARCH_OPTIONS = - ChatCompletionCreateParams.WebSearchOptions.builder().build() - - private val FUNCTION_CALL_MODE = - ChatCompletionCreateParams.FunctionCall.FunctionCallMode.AUTO - private val FUNCTION_CALL_OPTION = - ChatCompletionFunctionCallOption.builder().name(STRING).build() - private val FUNCTION_CALL = - ChatCompletionCreateParams.FunctionCall.ofFunctionCallOption(FUNCTION_CALL_OPTION) - - private val FUNCTION = ChatCompletionCreateParams.Function.builder().name(STRING).build() - private val METADATA = ChatCompletionCreateParams.Metadata.builder().build() - private val MODERATION = - ChatCompletionCreateParams.Moderation.builder().model(STRING).build() - private val MODALITY = ChatCompletionCreateParams.Modality.TEXT - private val FUNCTION_DEFINITION = FunctionDefinition.builder().name(STRING).build() - private val TOOL = - ChatCompletionTool.ofFunction( - ChatCompletionFunctionTool.builder().function(FUNCTION_DEFINITION).build() - ) - - private val NAMED_TOOL_CHOICE_FUNCTION = - ChatCompletionNamedToolChoice.Function.builder().name(STRING).build() - private val NAMED_TOOL_CHOICE = - ChatCompletionNamedToolChoice.builder().function(NAMED_TOOL_CHOICE_FUNCTION).build() - private val TOOL_CHOICE_OPTION_AUTO = ChatCompletionToolChoiceOption.Auto.AUTO - private val TOOL_CHOICE_OPTION = - ChatCompletionToolChoiceOption.ofAuto(TOOL_CHOICE_OPTION_AUTO) - - private val CUSTOM_TOOL = - ChatCompletionCustomTool.builder() - .custom(ChatCompletionCustomTool.Custom.builder().name(STRING).build()) - .build() - private val CUSTOM_TOOL_CUSTOM = - ChatCompletionCustomTool.Custom.builder().name(STRING).build() - private val FUNCTION_TOOL = - ChatCompletionFunctionTool.builder().function(FUNCTION_DEFINITION).build() - private val RESPONSE_FORMAT_JSON_SCHEMA = - ResponseFormatJsonSchema.JsonSchema.builder().name("json_schema").build() - private val ALLOWED_TOOL_CHOICE = - ChatCompletionAllowedToolChoice.builder() - .allowedTools( - ChatCompletionAllowedTools.builder() - .mode(ChatCompletionAllowedTools.Mode.AUTO) - .tools(listOf()) - .build() - ) - .build() - private val NAMED_TOOL_CHOICE_CUSTOM = - ChatCompletionNamedToolChoiceCustom.builder() - .custom(ChatCompletionNamedToolChoiceCustom.Custom.builder().name(STRING).build()) - .build() - private val VERBOSITY = ChatCompletionCreateParams.Verbosity.HIGH - - private val HEADERS = Headers.builder().build() - private val QUERY_PARAMS = QueryParams.builder().build() - - private val VALIDATION = JsonSchemaLocalValidation.NO - - // The list order follows the declaration order in `ChatCompletionCreateParams.Builder` for - // easier maintenance. - @JvmStatic - private fun builderDelegationTestCases() = - listOf( - DelegationWriteTestCase("body", PARAMS_BODY), - DelegationWriteTestCase("messages", LIST), - DelegationWriteTestCase("messages", JSON_FIELD), - DelegationWriteTestCase("addMessage", MESSAGE_PARAM), - DelegationWriteTestCase("addMessage", DEV_MESSAGE_PARAM), - DelegationWriteTestCase("addAssistantMessage", ASSISTANT_MESSAGE_PARAM_CONTENT), - DelegationWriteTestCase("addAssistantMessage", OPTIONAL), - DelegationWriteTestCase("addAssistantMessage", STRING), - DelegationWriteTestCase("addAssistantMessageOfArrayOfContentParts", LIST), - DelegationWriteTestCase("addDeveloperMessage", DEV_MESSAGE_PARAM_CONTENT), - DelegationWriteTestCase("addDeveloperMessage", STRING), - DelegationWriteTestCase("addDeveloperMessageOfArrayOfContentParts", LIST), - DelegationWriteTestCase("addMessage", SYS_MESSAGE_PARAM), - DelegationWriteTestCase("addSystemMessage", SYS_MESSAGE_PARAM_CONTENT), - DelegationWriteTestCase("addSystemMessage", STRING), - DelegationWriteTestCase("addSystemMessageOfArrayOfContentParts", LIST), - DelegationWriteTestCase("addMessage", USER_MESSAGE_PARAM), - DelegationWriteTestCase("addUserMessage", USER_MESSAGE_PARAM_CONTENT), - DelegationWriteTestCase("addUserMessage", STRING), - DelegationWriteTestCase("addUserMessageOfArrayOfContentParts", LIST), - DelegationWriteTestCase("addMessage", ASSIST_MESSAGE_PARAM), - DelegationWriteTestCase("addMessage", MESSAGE), - DelegationWriteTestCase("addMessage", TOOL_MESSAGE_PARAM), - DelegationWriteTestCase("addMessage", FUNC_MESSAGE_PARAM), - DelegationWriteTestCase("model", CHAT_MODEL), - DelegationWriteTestCase("model", JSON_FIELD), - DelegationWriteTestCase("model", STRING), - DelegationWriteTestCase("audio", NULLABLE), - DelegationWriteTestCase("audio", OPTIONAL), - DelegationWriteTestCase("audio", JSON_FIELD), - DelegationWriteTestCase("frequencyPenalty", NULLABLE_DOUBLE), - DelegationWriteTestCase("frequencyPenalty", DOUBLE), - DelegationWriteTestCase("frequencyPenalty", OPTIONAL), - DelegationWriteTestCase("frequencyPenalty", JSON_FIELD), - DelegationWriteTestCase("functionCall", FUNCTION_CALL), - DelegationWriteTestCase("functionCall", JSON_FIELD), - DelegationWriteTestCase("functionCall", FUNCTION_CALL_MODE), - DelegationWriteTestCase("functionCall", FUNCTION_CALL_OPTION), - DelegationWriteTestCase("functions", LIST), - DelegationWriteTestCase("functions", JSON_FIELD), - DelegationWriteTestCase("addFunction", FUNCTION), - DelegationWriteTestCase("logitBias", NULLABLE), - DelegationWriteTestCase("logitBias", OPTIONAL), - DelegationWriteTestCase("logitBias", JSON_FIELD), - DelegationWriteTestCase("logprobs", NULLABLE_BOOLEAN), - DelegationWriteTestCase("logprobs", BOOLEAN), - DelegationWriteTestCase("logprobs", OPTIONAL), - DelegationWriteTestCase("logprobs", JSON_FIELD), - DelegationWriteTestCase("maxCompletionTokens", NULLABLE_LONG), - DelegationWriteTestCase("maxCompletionTokens", LONG), - DelegationWriteTestCase("maxCompletionTokens", OPTIONAL), - DelegationWriteTestCase("maxCompletionTokens", JSON_FIELD), - DelegationWriteTestCase("maxTokens", NULLABLE_LONG), - DelegationWriteTestCase("maxTokens", LONG), - DelegationWriteTestCase("maxTokens", OPTIONAL), - DelegationWriteTestCase("maxTokens", JSON_FIELD), - DelegationWriteTestCase("metadata", METADATA), - DelegationWriteTestCase("metadata", OPTIONAL), - DelegationWriteTestCase("metadata", JSON_FIELD), - DelegationWriteTestCase("moderation", MODERATION), - DelegationWriteTestCase("moderation", OPTIONAL), - DelegationWriteTestCase("moderation", JSON_FIELD), - DelegationWriteTestCase("modalities", LIST), - DelegationWriteTestCase("modalities", OPTIONAL), - DelegationWriteTestCase("modalities", JSON_FIELD), - DelegationWriteTestCase("addModality", MODALITY), - DelegationWriteTestCase("n", NULLABLE_LONG), - DelegationWriteTestCase("n", LONG), - DelegationWriteTestCase("n", OPTIONAL), - DelegationWriteTestCase("n", JSON_FIELD), - DelegationWriteTestCase("parallelToolCalls", BOOLEAN), - DelegationWriteTestCase("parallelToolCalls", JSON_FIELD), - DelegationWriteTestCase("prediction", NULLABLE), - DelegationWriteTestCase("prediction", OPTIONAL), - DelegationWriteTestCase("prediction", JSON_FIELD), - DelegationWriteTestCase("promptCacheKey", STRING), - DelegationWriteTestCase("promptCacheKey", OPTIONAL), - DelegationWriteTestCase("promptCacheKey", JSON_FIELD), - DelegationWriteTestCase("promptCacheOptions", PROMPT_CACHE_OPTIONS), - DelegationWriteTestCase("promptCacheOptions", JSON_FIELD), - DelegationWriteTestCase("promptCacheRetention", PROMPT_CACHE_RETENTION), - DelegationWriteTestCase("promptCacheRetention", PROMPT_CACHE_RETENTION_OPTIONAL), - DelegationWriteTestCase("promptCacheRetention", PROMPT_CACHE_RETENTION_JSON_FIELD), - DelegationWriteTestCase("presencePenalty", NULLABLE_DOUBLE), - DelegationWriteTestCase("presencePenalty", DOUBLE), - DelegationWriteTestCase("presencePenalty", OPTIONAL), - DelegationWriteTestCase("presencePenalty", JSON_FIELD), - DelegationWriteTestCase("reasoningEffort", NULLABLE), - DelegationWriteTestCase("reasoningEffort", OPTIONAL), - DelegationWriteTestCase("reasoningEffort", JSON_FIELD), - DelegationWriteTestCase("jsonSchemaResponseFormat", RESPONSE_FORMAT_JSON_SCHEMA), - // `responseFormat()` is a special case and has its own unit test. - DelegationWriteTestCase("safetyIdentifier", STRING), - DelegationWriteTestCase("safetyIdentifier", OPTIONAL), - DelegationWriteTestCase("safetyIdentifier", JSON_FIELD), - DelegationWriteTestCase("seed", NULLABLE_LONG), - DelegationWriteTestCase("seed", LONG), - DelegationWriteTestCase("seed", OPTIONAL), - DelegationWriteTestCase("seed", JSON_FIELD), - DelegationWriteTestCase("serviceTier", NULLABLE), - DelegationWriteTestCase("serviceTier", OPTIONAL), - DelegationWriteTestCase("serviceTier", JSON_FIELD), - DelegationWriteTestCase("stop", NULLABLE), - DelegationWriteTestCase("stop", OPTIONAL), - DelegationWriteTestCase("stop", JSON_FIELD), - DelegationWriteTestCase("stop", STRING), - DelegationWriteTestCase("stopOfStrings", LIST), - DelegationWriteTestCase("store", NULLABLE_BOOLEAN), - DelegationWriteTestCase("store", BOOLEAN), - DelegationWriteTestCase("store", OPTIONAL), - DelegationWriteTestCase("store", JSON_FIELD), - DelegationWriteTestCase("streamOptions", NULLABLE), - DelegationWriteTestCase("streamOptions", OPTIONAL), - DelegationWriteTestCase("streamOptions", JSON_FIELD), - DelegationWriteTestCase("temperature", NULLABLE_DOUBLE), - DelegationWriteTestCase("temperature", DOUBLE), - DelegationWriteTestCase("temperature", OPTIONAL), - DelegationWriteTestCase("temperature", JSON_FIELD), - DelegationWriteTestCase("toolChoice", TOOL_CHOICE_OPTION), - DelegationWriteTestCase("toolChoice", JSON_FIELD), - DelegationWriteTestCase("toolChoice", TOOL_CHOICE_OPTION_AUTO), - DelegationWriteTestCase("toolChoice", NAMED_TOOL_CHOICE), - DelegationWriteTestCase("tools", LIST), - DelegationWriteTestCase("tools", JSON_FIELD), - DelegationWriteTestCase("addTool", TOOL), - DelegationWriteTestCase("addTool", CLASS, VALIDATION), - DelegationWriteTestCase("addTool", FUNCTION_TOOL), - DelegationWriteTestCase("addTool", CUSTOM_TOOL), - DelegationWriteTestCase("addFunctionTool", FUNCTION_DEFINITION), - DelegationWriteTestCase("addCustomTool", CUSTOM_TOOL_CUSTOM), - DelegationWriteTestCase("toolChoice", ALLOWED_TOOL_CHOICE), - DelegationWriteTestCase("toolChoice", NAMED_TOOL_CHOICE_CUSTOM), - DelegationWriteTestCase("verbosity", NULLABLE), - DelegationWriteTestCase("verbosity", VERBOSITY), - DelegationWriteTestCase("verbosity", OPTIONAL), - DelegationWriteTestCase("topLogprobs", NULLABLE_LONG), - DelegationWriteTestCase("topLogprobs", LONG), - DelegationWriteTestCase("topLogprobs", OPTIONAL), - DelegationWriteTestCase("topLogprobs", JSON_FIELD), - DelegationWriteTestCase("topP", NULLABLE_DOUBLE), - DelegationWriteTestCase("topP", DOUBLE), - DelegationWriteTestCase("topP", OPTIONAL), - DelegationWriteTestCase("topP", JSON_FIELD), - DelegationWriteTestCase("user", STRING), - DelegationWriteTestCase("user", JSON_FIELD), - DelegationWriteTestCase("webSearchOptions", WEB_SEARCH_OPTIONS), - DelegationWriteTestCase("webSearchOptions", JSON_FIELD), - DelegationWriteTestCase("additionalBodyProperties", MAP), - DelegationWriteTestCase("putAdditionalBodyProperty", STRING, JSON_VALUE), - DelegationWriteTestCase("putAllAdditionalBodyProperties", MAP), - DelegationWriteTestCase("removeAdditionalBodyProperty", STRING), - DelegationWriteTestCase("removeAllAdditionalBodyProperties", SET), - DelegationWriteTestCase("additionalHeaders", HEADERS), - DelegationWriteTestCase("additionalHeaders", MAP), - DelegationWriteTestCase("putAdditionalHeader", STRING, STRING), - DelegationWriteTestCase("putAdditionalHeaders", STRING, LIST), - DelegationWriteTestCase("putAllAdditionalHeaders", HEADERS), - DelegationWriteTestCase("putAllAdditionalHeaders", MAP), - DelegationWriteTestCase("replaceAdditionalHeaders", STRING, STRING), - DelegationWriteTestCase("replaceAdditionalHeaders", STRING, LIST), - DelegationWriteTestCase("replaceAllAdditionalHeaders", HEADERS), - DelegationWriteTestCase("replaceAllAdditionalHeaders", MAP), - DelegationWriteTestCase("removeAdditionalHeaders", STRING), - DelegationWriteTestCase("removeAllAdditionalHeaders", SET), - DelegationWriteTestCase("additionalQueryParams", QUERY_PARAMS), - DelegationWriteTestCase("additionalQueryParams", MAP), - DelegationWriteTestCase("putAdditionalQueryParam", STRING, STRING), - DelegationWriteTestCase("putAdditionalQueryParams", STRING, LIST), - DelegationWriteTestCase("putAllAdditionalQueryParams", QUERY_PARAMS), - DelegationWriteTestCase("putAllAdditionalQueryParams", MAP), - DelegationWriteTestCase("replaceAdditionalQueryParams", STRING, STRING), - DelegationWriteTestCase("replaceAdditionalQueryParams", STRING, LIST), - DelegationWriteTestCase("replaceAllAdditionalQueryParams", QUERY_PARAMS), - DelegationWriteTestCase("replaceAllAdditionalQueryParams", MAP), - DelegationWriteTestCase("removeAdditionalQueryParams", STRING), - DelegationWriteTestCase("removeAllAdditionalQueryParams", SET), - ) - } - - // New instances of the `mockBuilderDelegate` and `builderDelegator` are required for each test - // case (each test case runs in its own instance of the test class). - private val mockBuilderDelegate: ChatCompletionCreateParams.Builder = - mock(ChatCompletionCreateParams.Builder::class.java) - private val builderDelegator = - StructuredChatCompletionCreateParams.builder().inject(mockBuilderDelegate) - - @Test - fun allBuilderDelegateFunctionsExistInDelegator() { - // The delegator class does not implement the various `responseFormat` functions of the - // delegate class. - checkAllDelegation(mockBuilderDelegate::class, builderDelegator::class, "responseFormat") - } - - @Test - fun allBuilderDelegatorFunctionsExistInDelegate() { - // The delegator implements a different `responseFormat` function from those overloads in - // the delegate class. - checkAllDelegation(builderDelegator::class, mockBuilderDelegate::class, "responseFormat") - } - - @Test - fun allBuilderDelegatorFunctionsAreTested() { - checkAllDelegatorWriteFunctionsAreTested( - builderDelegator::class, - builderDelegationTestCases(), - exceptionalTestedFns = listOf("responseFormat"), - nonDelegatingFns = setOf("build", "wrap", "inject"), - ) - } - - @ParameterizedTest - @MethodSource("builderDelegationTestCases") - fun `delegation of Builder write functions`(testCase: DelegationWriteTestCase) { - checkOneDelegationWrite(builderDelegator, mockBuilderDelegate, testCase) - } - - @Test - fun `delegation of responseFormat`() { - // Special unit test case as the delegator method signature does not match that of the - // delegate method. - val delegatorTestCase = DelegationWriteTestCase("responseFormat", X::class.java) - val delegatorMethod = findDelegationMethod(builderDelegator, delegatorTestCase) - val mockDelegateTestCase = - DelegationWriteTestCase("responseFormat", responseFormatFromClass(X::class.java)) - val mockDelegateMethod = findDelegationMethod(mockBuilderDelegate, mockDelegateTestCase) - - delegatorMethod.invoke(builderDelegator, delegatorTestCase.inputValues[0]) - - // Verify that the corresponding method on the mock delegate was called exactly once. - verify(mockBuilderDelegate, times(1)).apply { - mockDelegateMethod.invoke(mockBuilderDelegate, mockDelegateTestCase.inputValues[0]) - } - verifyNoMoreInteractions(mockBuilderDelegate) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionMessageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionMessageTest.kt deleted file mode 100644 index 939f9a538..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionMessageTest.kt +++ /dev/null @@ -1,129 +0,0 @@ -package com.openai.models.chat.completions - -import com.openai.core.DelegationReadTestCase -import com.openai.core.JSON_FIELD -import com.openai.core.JSON_VALUE -import com.openai.core.JsonField -import com.openai.core.OPTIONAL -import com.openai.core.STRING -import com.openai.core.X -import com.openai.core.checkAllDelegation -import com.openai.core.checkAllDelegatorReadFunctionsAreTested -import com.openai.core.checkOneDelegationRead -import java.util.Optional -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.MethodSource -import org.mockito.Mockito.mock -import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.`when` -import org.mockito.kotlin.times -import org.mockito.kotlin.verify - -/** - * Unit tests for the [StructuredChatCompletionMessage] class (delegator) and its delegation of most - * functions to a wrapped [ChatCompletionMessage] (delegate). The tests include confirmation of the - * following: - * - All functions in the delegator correspond to a function in the delegate and _vice versa_. - * - All functions in the delegator call their corresponding function in the delegate and only that - * function. - * - A unit test exists for all functions. - * - * There are some exceptions to the above that are handled differently. - */ -internal class StructuredChatCompletionMessageTest { - companion object { - private val MESSAGE = - ChatCompletionMessage.builder().content(STRING).refusal(STRING).build() - - // The list order follows the declaration order in `ChatCompletionMessage` for easier - // maintenance. - @JvmStatic - private fun delegationTestCases() = - listOf( - // `content()` is a special case and has its own test function. - DelegationReadTestCase("refusal", OPTIONAL), - DelegationReadTestCase("_role", JSON_VALUE), - DelegationReadTestCase("annotations", OPTIONAL), - DelegationReadTestCase("audio", OPTIONAL), - DelegationReadTestCase("functionCall", OPTIONAL), - DelegationReadTestCase("toolCalls", OPTIONAL), - // `_content()` is a special case and has its own test function. - DelegationReadTestCase("_refusal", JSON_FIELD), - DelegationReadTestCase("_annotations", JSON_FIELD), - DelegationReadTestCase("_audio", JSON_FIELD), - DelegationReadTestCase("_functionCall", JSON_FIELD), - DelegationReadTestCase("_toolCalls", JSON_FIELD), - DelegationReadTestCase("_additionalProperties", mapOf("key" to JSON_VALUE)), - DelegationReadTestCase("validate", MESSAGE), - // For this boolean function, call with both possible values to ensure that any - // hard-coding or default value will not result in a false positive test. - DelegationReadTestCase("isValid", true), - DelegationReadTestCase("isValid", false), - ) - } - - // New instances of the `mockDelegate` and `delegator` are required for each test case (each - // test case runs in its own instance of the test class). - private val mockDelegate: ChatCompletionMessage = mock(ChatCompletionMessage::class.java) - private val delegator = StructuredChatCompletionMessage(X::class.java, mockDelegate) - - @Test - fun allDelegateFunctionsExistInDelegator() { - checkAllDelegation(mockDelegate::class, delegator::class, "toBuilder", "toParam") - } - - @Test - fun allDelegatorFunctionsExistInDelegate() { - checkAllDelegation(delegator::class, mockDelegate::class) - } - - @Test - fun allDelegatorFunctionsAreTested() { - // There are exceptional test cases for some functions. Most other functions are part of the - // list of those using the parameterized test. A few delegator functions do not delegate, so - // no test function is necessary. - checkAllDelegatorReadFunctionsAreTested( - delegator::class, - delegationTestCases(), - exceptionalTestedFns = setOf("content", "_content"), - nonDelegatingFns = setOf("equals", "hashCode", "toString"), - ) - } - - @ParameterizedTest - @MethodSource("delegationTestCases") - fun `delegation of functions in general`(testCase: DelegationReadTestCase) { - checkOneDelegationRead(delegator, mockDelegate, testCase) - } - - @Test - fun `delegation of content`() { - // Input and output are different types, so this test is an exceptional case. - // `content()` (without an underscore) delegates to `_content()` (with an underscore) - // indirectly via the `content` field initializer. - val input = JsonField.of("{\"s\" : \"hello\"}") - `when`(mockDelegate._content()).thenReturn(input) - val output = delegator.content() // Without an underscore. - - verify(mockDelegate, times(1))._content() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output).isEqualTo(Optional.of(X("hello"))) - } - - @Test - fun `delegation of _content`() { - // Input and output are different types, so this test is an exceptional case. - // `_content()` delegates to `_content()` indirectly via the `content` field initializer. - val input = JsonField.of("{\"s\" : \"hello\"}") - `when`(mockDelegate._content()).thenReturn(input) - val output = delegator._content() // With an underscore. - - verify(mockDelegate, times(1))._content() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output).isEqualTo(JsonField.of(X("hello"))) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionTest.kt deleted file mode 100644 index df6bf8c5c..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/StructuredChatCompletionTest.kt +++ /dev/null @@ -1,309 +0,0 @@ -package com.openai.models.chat.completions - -import com.openai.core.DelegationReadTestCase -import com.openai.core.JSON_FIELD -import com.openai.core.JSON_VALUE -import com.openai.core.JsonField -import com.openai.core.LONG -import com.openai.core.OPTIONAL -import com.openai.core.STRING -import com.openai.core.X -import com.openai.core.checkAllDelegation -import com.openai.core.checkAllDelegatorReadFunctionsAreTested -import com.openai.core.checkOneDelegationRead -import com.openai.errors.OpenAIInvalidDataException -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.MethodSource -import org.mockito.Mockito.mock -import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.`when` -import org.mockito.kotlin.times -import org.mockito.kotlin.verify - -/** - * Unit tests for the [StructuredChatCompletion] class (delegator) and its delegation of most - * functions to a wrapped [ChatCompletion] (delegate). The tests include confirmation of the - * following: - * - All functions in the delegator correspond to a function in the delegate and _vice versa_. - * - All functions in the delegator call their corresponding function in the delegate and only that - * function. - * - A unit test exists for all functions. - * - * There are some exceptions to the above that are handled differently. - */ -internal class StructuredChatCompletionTest { - companion object { - private val MESSAGE = - ChatCompletionMessage.builder().content(STRING).refusal(STRING).build() - private val FINISH_REASON = ChatCompletion.Choice.FinishReason.STOP - private val CHOICE = - ChatCompletion.Choice.builder() - .message(MESSAGE) - .index(0L) - .finishReason(FINISH_REASON) - .logprobs( - ChatCompletion.Choice.Logprobs.builder().content(null).refusal(null).build() - ) - .build() - - // The list order follows the declaration order in `ChatCompletion` for easier maintenance. - @JvmStatic - private fun delegationTestCases() = - listOf( - DelegationReadTestCase("id", STRING), - // `choices()` is a special case and has its own test function. - DelegationReadTestCase("created", LONG), - DelegationReadTestCase("model", STRING), - DelegationReadTestCase("moderation", OPTIONAL), - DelegationReadTestCase("_object_", JSON_VALUE), - DelegationReadTestCase("serviceTier", OPTIONAL), - DelegationReadTestCase("systemFingerprint", OPTIONAL), - DelegationReadTestCase("usage", OPTIONAL), - DelegationReadTestCase("_id", JSON_FIELD), - // `_choices()` is a special case and has its own test function. - DelegationReadTestCase("_created", JSON_FIELD), - DelegationReadTestCase("_model", JSON_FIELD), - DelegationReadTestCase("_moderation", JSON_FIELD), - DelegationReadTestCase("_serviceTier", JSON_FIELD), - DelegationReadTestCase("_systemFingerprint", JSON_FIELD), - DelegationReadTestCase("_usage", JSON_FIELD), - DelegationReadTestCase("_additionalProperties", mapOf("key" to JSON_VALUE)), - // `validate()` and `isValid()` (which calls `validate()`) are tested separately, - // as they require special handling. - ) - - @JvmStatic - private fun choiceDelegationTestCases() = - listOf( - DelegationReadTestCase("finishReason", FINISH_REASON), - DelegationReadTestCase("index", LONG), - DelegationReadTestCase("logprobs", OPTIONAL), - DelegationReadTestCase("_finishReason", JSON_FIELD), - // `message()` is a special case and has its own test function. - DelegationReadTestCase("_index", JSON_FIELD), - DelegationReadTestCase("_logprobs", JSON_FIELD), - // `_message()` is a special case and has its own test function. - DelegationReadTestCase("_additionalProperties", mapOf("key" to JSON_VALUE)), - // `validate()` and `isValid()` (which calls `validate()`) are tested separately, - // as they require special handling. - ) - } - - // New instances of the `mockDelegate` and `delegator` are required for each test case (each - // test case runs in its own instance of the test class). - private val mockDelegate: ChatCompletion = mock(ChatCompletion::class.java) - private val delegator = StructuredChatCompletion(X::class.java, mockDelegate) - - private val mockChoiceDelegate: ChatCompletion.Choice = mock(ChatCompletion.Choice::class.java) - private val choiceDelegator = - StructuredChatCompletion.Choice(X::class.java, mockChoiceDelegate) - - @Test - fun allChatCompletionDelegateFunctionsExistInDelegator() { - checkAllDelegation(mockDelegate::class, delegator::class, "toBuilder") - } - - @Test - fun allChatCompletionDelegatorFunctionsExistInDelegate() { - checkAllDelegation(delegator::class, mockDelegate::class) - } - - @Test - fun allChoiceDelegateFunctionsExistInDelegator() { - checkAllDelegation(mockChoiceDelegate::class, choiceDelegator::class, "toBuilder") - } - - @Test - fun allChoiceDelegatorFunctionsExistInDelegate() { - checkAllDelegation(choiceDelegator::class, mockChoiceDelegate::class) - } - - @Test - fun allDelegatorFunctionsAreTested() { - // There are exceptional test cases for some functions. Most other functions are part of the - // list of those using the parameterized test. A few delegator functions do not delegate, so - // no test function is necessary. - checkAllDelegatorReadFunctionsAreTested( - delegator::class, - delegationTestCases(), - exceptionalTestedFns = setOf("choices", "_choices", "validate", "isValid"), - nonDelegatingFns = setOf("equals", "hashCode", "toString"), - ) - } - - @Test - fun allChoiceDelegatorFunctionsAreTested() { - checkAllDelegatorReadFunctionsAreTested( - choiceDelegator::class, - choiceDelegationTestCases(), - exceptionalTestedFns = setOf("message", "_message", "validate", "isValid"), - nonDelegatingFns = setOf("equals", "hashCode", "toString"), - ) - } - - @ParameterizedTest - @MethodSource("delegationTestCases") - fun `delegation of functions in general`(testCase: DelegationReadTestCase) { - checkOneDelegationRead(delegator, mockDelegate, testCase) - } - - @ParameterizedTest - @MethodSource("choiceDelegationTestCases") - fun `delegation of Choice functions in general`(testCase: DelegationReadTestCase) { - checkOneDelegationRead(choiceDelegator, mockChoiceDelegate, testCase) - } - - @Test - fun `delegation of choices`() { - // Input and output are different types, so this test is an exceptional case. - // `choices()` (without an underscore) delegates to `_choices()` (with an underscore) - // indirectly via the `choices` field initializer. - val input = JsonField.of(listOf(CHOICE)) - `when`(mockDelegate._choices()).thenReturn(input) - val output = delegator.choices() // Without an underscore. - - verify(mockDelegate, times(1))._choices() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output[0].rawChoice).isEqualTo(CHOICE) - } - - @Test - fun `delegation of _choices`() { - // Input and output are different types, so this test is an exceptional case. - // `_choices()` delegates to `_choices()` indirectly via the `choices` field initializer. - val input = JsonField.of(listOf(CHOICE)) - `when`(mockDelegate._choices()).thenReturn(input) - val output = delegator._choices() // With an underscore. - - verify(mockDelegate, times(1))._choices() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output.getRequired("_choices")[0].rawChoice).isEqualTo(CHOICE) - } - - @Test - fun `delegation of validate`() { - val input = JsonField.of(listOf(CHOICE)) - `when`(mockDelegate._choices()).thenReturn(input) - val output = delegator.validate() - - // `validate()` calls `choices()` on the delegator which triggers the lazy initializer which - // calls `_choices()` on the delegate before `validate()` also calls `validate()` on the - // delegate. - verify(mockDelegate, times(1))._choices() - verify(mockDelegate, times(1)).validate() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output).isSameAs(delegator) - } - - @Test - fun `delegation of isValid when true`() { - val input = JsonField.of(listOf(CHOICE)) - `when`(mockDelegate._choices()).thenReturn(input) - val output = delegator.isValid() - - // `isValid()` calls `validate()`, which has side effects explained in its test function. - verify(mockDelegate, times(1))._choices() - verify(mockDelegate, times(1)).validate() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output).isTrue - } - - @Test - fun `delegation of isValid when false`() { - // Try with a `false` value to make sure `isValid()` is not just hard-coded to `true`. Do - // this by making `validate()` on the delegate throw an exception. - val input = JsonField.of(listOf(CHOICE)) - `when`(mockDelegate._choices()).thenReturn(input) - `when`(mockDelegate.validate()).thenThrow(OpenAIInvalidDataException("test")) - val output = delegator.isValid() - - // `isValid()` calls `validate()`, which has side effects explained in its test function. - verify(mockDelegate, times(1))._choices() - verify(mockDelegate, times(1)).validate() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output).isFalse - } - - @Test - fun `delegation of Choice-message`() { - // Input and output are different types, so this test is an exceptional case. - // `message()` (without an underscore) delegates to `_message()` (with an underscore) - // indirectly via the `message` field initializer. - val input = JsonField.of(MESSAGE) - `when`(mockChoiceDelegate._message()).thenReturn(input) - val output = choiceDelegator.message() // Without an underscore. - - verify(mockChoiceDelegate, times(1))._message() - verifyNoMoreInteractions(mockChoiceDelegate) - - assertThat(output.rawMessage).isEqualTo(MESSAGE) - } - - @Test - fun `delegation of Choice-_message`() { - // Input and output are different types, so this test is an exceptional case. - // `_message()` delegates to `_message()` indirectly via the `message` field initializer. - val input = JsonField.of(MESSAGE) - `when`(mockChoiceDelegate._message()).thenReturn(input) - val output = choiceDelegator._message() // With an underscore. - - verify(mockChoiceDelegate, times(1))._message() - verifyNoMoreInteractions(mockChoiceDelegate) - - assertThat(output.getRequired("_message").rawMessage).isEqualTo(MESSAGE) - } - - @Test - fun `delegation of Choice-validate`() { - val input = JsonField.of(MESSAGE) - `when`(mockChoiceDelegate._message()).thenReturn(input) - val output = choiceDelegator.validate() - - // `validate()` calls `message()` on the delegator which triggers the lazy initializer which - // calls `_message()` on the delegate before `validate()` also calls `validate()` on the - // delegate. - verify(mockChoiceDelegate, times(1))._message() - verify(mockChoiceDelegate, times(1)).validate() - verifyNoMoreInteractions(mockChoiceDelegate) - - assertThat(output).isSameAs(choiceDelegator) - } - - @Test - fun `delegation of Choice-isValid when true`() { - val input = JsonField.of(MESSAGE) - `when`(mockChoiceDelegate._message()).thenReturn(input) - val output = choiceDelegator.isValid() - - // `isValid()` calls `validate()`, which has side effects explained in its test function. - verify(mockChoiceDelegate, times(1))._message() - verify(mockChoiceDelegate, times(1)).validate() - verifyNoMoreInteractions(mockChoiceDelegate) - - assertThat(output).isTrue - } - - @Test - fun `delegation of Choice-isValid when false`() { - // Try with a `false` value to make sure `isValid()` is not just hard-coded to `true`. Do - // this by making `validate()` on the delegate throw an exception. - val input = JsonField.of(MESSAGE) - `when`(mockChoiceDelegate._message()).thenReturn(input) - `when`(mockChoiceDelegate.validate()).thenThrow(OpenAIInvalidDataException("test")) - val output = choiceDelegator.isValid() - - // `isValid()` calls `validate()`, which has side effects explained in its test function. - verify(mockChoiceDelegate, times(1))._message() - verify(mockChoiceDelegate, times(1)).validate() - verifyNoMoreInteractions(mockChoiceDelegate) - - assertThat(output).isFalse - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingTest.kt index 57311de18..393c05cd4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingTest.kt @@ -17,32 +17,6 @@ internal class EmbeddingTest { assertThat(embedding.index()).isEqualTo(0L) } - @Test - fun create_setThenAdd() { - val embedding = - Embedding.builder() - .embedding(EmbeddingValue.ofFloats(listOf(1.0f, 2.0f))) - .addEmbedding(3.0f) - .index(0L) - .build() - - assertThat(embedding.embedding()).containsExactly(1.0f, 2.0f, 3.0f) - assertThat(embedding.index()).isEqualTo(0L) - } - - @Test - fun create_addThenSet() { - val embedding = - Embedding.builder() - .addEmbedding(3.0f) - .embedding(EmbeddingValue.ofFloats(listOf(1.0f, 2.0f))) - .index(0L) - .build() - - assertThat(embedding.embedding()).containsExactly(1.0f, 2.0f) - assertThat(embedding.index()).isEqualTo(0L) - } - @Test fun roundtrip() { val jsonMapper = jsonMapper() diff --git a/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingValueTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingValueTest.kt deleted file mode 100644 index 663237712..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingValueTest.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.openai.models.embeddings - -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class EmbeddingValueTest { - - @Test - fun ofFloats() { - val floats = listOf(1.0f, 2.0f, 3.0f, 4.0f) - - val embeddingValue = EmbeddingValue.ofFloats(floats) - - assertThat(embeddingValue.isFloats()).isTrue() - assertThat(embeddingValue.isBase64()).isFalse() - assertThat(embeddingValue.floats()).hasValue(floats) - assertThat(embeddingValue.base64()).isEmpty - assertThat(embeddingValue.asFloats()).isEqualTo(floats) - assertThat(embeddingValue.asBase64()).isEqualTo("AACAPwAAAEAAAEBAAACAQA==") - } - - @Test - fun ofBase64() { - val base64 = "AACAPwAAAEAAAEBAAACAQA==" - - val embeddingValue = EmbeddingValue.ofBase64(base64) - - assertThat(embeddingValue.isFloats()).isFalse() - assertThat(embeddingValue.isBase64()).isTrue() - assertThat(embeddingValue.floats()).isEmpty - assertThat(embeddingValue.base64()).hasValue(base64) - assertThat(embeddingValue.asFloats()).containsExactly(1.0f, 2.0f, 3.0f, 4.0f) - assertThat(embeddingValue.asBase64()).isEqualTo(base64) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseCreateParamsTest.kt deleted file mode 100644 index 970d86337..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseCreateParamsTest.kt +++ /dev/null @@ -1,394 +0,0 @@ -package com.openai.models.responses - -import com.openai.core.BOOLEAN -import com.openai.core.CLASS -import com.openai.core.DOUBLE -import com.openai.core.DelegationWriteTestCase -import com.openai.core.JSON_FIELD -import com.openai.core.JSON_VALUE -import com.openai.core.JsonField -import com.openai.core.JsonSchemaLocalValidation -import com.openai.core.LIST -import com.openai.core.LONG -import com.openai.core.MAP -import com.openai.core.NULLABLE -import com.openai.core.NULLABLE_BOOLEAN -import com.openai.core.NULLABLE_DOUBLE -import com.openai.core.NULLABLE_LONG -import com.openai.core.NULLABLE_STRING -import com.openai.core.OPTIONAL -import com.openai.core.SET -import com.openai.core.STRING -import com.openai.core.X -import com.openai.core.checkAllDelegation -import com.openai.core.checkAllDelegatorWriteFunctionsAreTested -import com.openai.core.checkOneDelegationWrite -import com.openai.core.findDelegationMethod -import com.openai.core.http.Headers -import com.openai.core.http.QueryParams -import com.openai.core.textConfigFromClass -import com.openai.models.ChatModel -import com.openai.models.Reasoning -import com.openai.models.ResponsesModel -import java.util.Optional -import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.MethodSource -import org.mockito.Mockito.mock -import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.kotlin.times -import org.mockito.kotlin.verify - -/** - * Unit tests for the [StructuredResponseCreateParams] class (delegator) and its delegation of most - * functions to a wrapped [ResponseCreateParams] (delegate). The tests include confirmation of the - * following: - * - All functions in the delegator correspond to a function in the delegate and _vice versa_. - * - All functions in the delegator call their corresponding function in the delegate and only that - * function. - * - A unit test exists for all functions. - * - * There are some exceptions to the above that are handled differently. - */ -internal class StructuredResponseCreateParamsTest { - companion object { - private val CHAT_MODEL = ChatModel.GPT_4O - private val RESPONSES_MODEL = ResponsesModel.ofChat(CHAT_MODEL) - private val RESPONSES_ONLY_MODEL = ResponsesModel.ResponsesOnlyModel.O1_PRO - private val PARAMS_INPUT = ResponseCreateParams.Input.ofText(STRING) - - private val INCLUDABLE = ResponseIncludable.of(STRING) - private val METADATA = ResponseCreateParams.Metadata.builder().build() - private val MODERATION = ResponseCreateParams.Moderation.builder().model(STRING).build() - private val SERVICE_TIER = ResponseCreateParams.ServiceTier.AUTO - private val REASONING = Reasoning.builder().build() - private val PROMPT = ResponsePrompt.builder().id("test-prompt-id").build() - private val PROMPT_CACHE_OPTIONS = ResponseCreateParams.PromptCacheOptions.builder().build() - private val RESPONSE_CONVERSATION_PARAM = - ResponseConversationParam.builder().id(STRING).build() - private val CONVERSATION = ResponseCreateParams.Conversation.ofId(STRING) - private val CONTEXT_MANAGEMENT = - ResponseCreateParams.ContextManagement.builder().type(STRING).build() - private val PROMPT_CACHE_RETENTION = ResponseCreateParams.PromptCacheRetention.IN_MEMORY - private val PROMPT_CACHE_RETENTION_OPTIONAL = Optional.of(PROMPT_CACHE_RETENTION) - private val PROMPT_CACHE_RETENTION_JSON_FIELD = JsonField.of(PROMPT_CACHE_RETENTION) - - private val TOOL_CHOICE_TYPE = ToolChoiceTypes.Type.FILE_SEARCH - private val TOOL_CHOICE_TYPES = ToolChoiceTypes.builder().type(TOOL_CHOICE_TYPE).build() - private val TOOL_CHOICE = ResponseCreateParams.ToolChoice.ofTypes(TOOL_CHOICE_TYPES) - private val TOOL_CHOICE_OPTIONS = ToolChoiceOptions.AUTO - private val TOOL_CHOICE_FUNCTION = ToolChoiceFunction.builder().name(STRING).build() - private val TOOL_CHOICE_MCP = - ToolChoiceMcp.builder().name(STRING).serverLabel(STRING).build() - private val TOOL_CHOICE_APPLY_PATCH = ToolChoiceApplyPatch.builder().build() - private val TOOL_CHOICE_SHELL = ToolChoiceShell.builder().build() - - private val FUNCTION_TOOL = - FunctionTool.builder().name(STRING).parameters(NULLABLE).strict(BOOLEAN).build() - private val NAMESPACE_TOOL = - NamespaceTool.builder().description(STRING).name(STRING).tools(listOf()).build() - private val TOOL_SEARCH_TOOL = ToolSearchTool.builder().build() - private val FILE_SEARCH_TOOL = FileSearchTool.builder().vectorStoreIds(LIST).build() - private val WEB_SEARCH_TOOL = - WebSearchTool.builder().type(WebSearchTool.Type.WEB_SEARCH).build() - private val WEB_SEARCH_PREVIEW_TOOL = - WebSearchPreviewTool.builder() - .type(WebSearchPreviewTool.Type.WEB_SEARCH_PREVIEW) - .build() - private val COMPUTER_TOOL = ComputerTool.builder().build() - private val COMPUTER_USE_PREVIEW_TOOL = - ComputerUsePreviewTool.builder() - .displayWidth(LONG) - .displayHeight(LONG) - .environment(ComputerUsePreviewTool.Environment.LINUX) - .build() - private val TOOL = Tool.ofFunction(FUNCTION_TOOL) - private val MCP_TOOL = Tool.Mcp.builder().serverLabel(STRING).serverUrl(STRING).build() - private val CODE_INTERPRETER_TOOL_AUTO = - Tool.CodeInterpreter.Container.CodeInterpreterToolAuto.builder().build() - private val CODE_INTERPRETER_CONTAINER = - Tool.CodeInterpreter.Container.ofCodeInterpreterToolAuto(CODE_INTERPRETER_TOOL_AUTO) - private val CODE_INTERPRETER_TOOL = - Tool.CodeInterpreter.builder().container(CODE_INTERPRETER_CONTAINER).build() - private val IMAGE_GENERATION_TOOL = Tool.ImageGeneration.builder().build() - private val FUNCTION_SHELL_TOOL = FunctionShellTool.builder().build() - private val APPLY_PATCH_TOOL = ApplyPatchTool.builder().build() - - private val CUSTOM_TOOL = CustomTool.builder().name(STRING).build() - private val STREAM_OPTIONS = ResponseCreateParams.StreamOptions.builder().build() - private val TOOL_CHOICE_ALLOWED = - ToolChoiceAllowed.builder().mode(ToolChoiceAllowed.Mode.AUTO).tools(listOf()).build() - private val TOOL_CHOICE_CUSTOM = ToolChoiceCustom.builder().name(STRING).build() - - private val HEADERS = Headers.builder().build() - private val QUERY_PARAMS = QueryParams.builder().build() - - private val VALIDATION = JsonSchemaLocalValidation.NO - - // The list order follows the declaration order in `ResponseCreateParams.Builder` for - // easier maintenance. - @JvmStatic - private fun builderDelegationTestCases() = - listOf( - // The `body(...)` function is deliberately not supported: too messy. - DelegationWriteTestCase("input", PARAMS_INPUT), - DelegationWriteTestCase("input", JSON_FIELD), - DelegationWriteTestCase("input", STRING), - DelegationWriteTestCase("inputOfResponse", LIST), - DelegationWriteTestCase("model", RESPONSES_MODEL), - DelegationWriteTestCase("model", JSON_FIELD), - DelegationWriteTestCase("model", STRING), - DelegationWriteTestCase("model", CHAT_MODEL), - DelegationWriteTestCase("model", RESPONSES_ONLY_MODEL), - DelegationWriteTestCase("background", NULLABLE_BOOLEAN), - DelegationWriteTestCase("background", BOOLEAN), - DelegationWriteTestCase("background", OPTIONAL), - DelegationWriteTestCase("background", JSON_FIELD), - DelegationWriteTestCase("contextManagement", LIST), - DelegationWriteTestCase("contextManagement", OPTIONAL), - DelegationWriteTestCase("contextManagement", JSON_FIELD), - DelegationWriteTestCase("addContextManagement", CONTEXT_MANAGEMENT), - DelegationWriteTestCase("conversation", CONVERSATION), - DelegationWriteTestCase("conversation", OPTIONAL), - DelegationWriteTestCase("conversation", JSON_FIELD), - DelegationWriteTestCase("conversation", STRING), - DelegationWriteTestCase("conversation", RESPONSE_CONVERSATION_PARAM), - DelegationWriteTestCase("include", LIST), - DelegationWriteTestCase("include", OPTIONAL), - DelegationWriteTestCase("include", JSON_FIELD), - DelegationWriteTestCase("addInclude", INCLUDABLE), - DelegationWriteTestCase("instructions", NULLABLE_STRING), - DelegationWriteTestCase("instructions", OPTIONAL), - DelegationWriteTestCase("instructions", JSON_FIELD), - DelegationWriteTestCase("maxOutputTokens", NULLABLE_LONG), - DelegationWriteTestCase("maxOutputTokens", LONG), - DelegationWriteTestCase("maxOutputTokens", OPTIONAL), - DelegationWriteTestCase("maxOutputTokens", JSON_FIELD), - DelegationWriteTestCase("maxToolCalls", NULLABLE_LONG), - DelegationWriteTestCase("maxToolCalls", LONG), - DelegationWriteTestCase("maxToolCalls", OPTIONAL), - DelegationWriteTestCase("maxToolCalls", JSON_FIELD), - DelegationWriteTestCase("metadata", METADATA), - DelegationWriteTestCase("metadata", OPTIONAL), - DelegationWriteTestCase("metadata", JSON_FIELD), - DelegationWriteTestCase("moderation", MODERATION), - DelegationWriteTestCase("moderation", OPTIONAL), - DelegationWriteTestCase("moderation", JSON_FIELD), - DelegationWriteTestCase("parallelToolCalls", NULLABLE_BOOLEAN), - DelegationWriteTestCase("parallelToolCalls", BOOLEAN), - DelegationWriteTestCase("parallelToolCalls", OPTIONAL), - DelegationWriteTestCase("parallelToolCalls", JSON_FIELD), - DelegationWriteTestCase("previousResponseId", NULLABLE_STRING), - DelegationWriteTestCase("previousResponseId", OPTIONAL), - DelegationWriteTestCase("previousResponseId", JSON_FIELD), - DelegationWriteTestCase("prompt", PROMPT), - DelegationWriteTestCase("prompt", OPTIONAL), - DelegationWriteTestCase("prompt", JSON_FIELD), - DelegationWriteTestCase("promptCacheKey", STRING), - DelegationWriteTestCase("promptCacheKey", OPTIONAL), - DelegationWriteTestCase("promptCacheKey", JSON_FIELD), - DelegationWriteTestCase("promptCacheOptions", PROMPT_CACHE_OPTIONS), - DelegationWriteTestCase("promptCacheOptions", JSON_FIELD), - DelegationWriteTestCase("promptCacheRetention", PROMPT_CACHE_RETENTION), - DelegationWriteTestCase("promptCacheRetention", PROMPT_CACHE_RETENTION_OPTIONAL), - DelegationWriteTestCase("promptCacheRetention", PROMPT_CACHE_RETENTION_JSON_FIELD), - DelegationWriteTestCase("reasoning", REASONING), - DelegationWriteTestCase("reasoning", OPTIONAL), - DelegationWriteTestCase("reasoning", JSON_FIELD), - DelegationWriteTestCase("safetyIdentifier", STRING), - DelegationWriteTestCase("safetyIdentifier", OPTIONAL), - DelegationWriteTestCase("safetyIdentifier", JSON_FIELD), - DelegationWriteTestCase("serviceTier", SERVICE_TIER), - DelegationWriteTestCase("serviceTier", OPTIONAL), - DelegationWriteTestCase("serviceTier", JSON_FIELD), - DelegationWriteTestCase("store", NULLABLE_BOOLEAN), - DelegationWriteTestCase("store", BOOLEAN), - DelegationWriteTestCase("store", OPTIONAL), - DelegationWriteTestCase("store", JSON_FIELD), - DelegationWriteTestCase("streamOptions", NULLABLE), - DelegationWriteTestCase("streamOptions", STREAM_OPTIONS), - DelegationWriteTestCase("streamOptions", OPTIONAL), - DelegationWriteTestCase("temperature", NULLABLE_DOUBLE), - DelegationWriteTestCase("temperature", DOUBLE), - DelegationWriteTestCase("temperature", OPTIONAL), - DelegationWriteTestCase("temperature", JSON_FIELD), - // `text()` is a special case and has its own unit tests. - DelegationWriteTestCase("toolChoice", TOOL_CHOICE), - DelegationWriteTestCase("toolChoice", JSON_FIELD), - DelegationWriteTestCase("toolChoice", TOOL_CHOICE_OPTIONS), - DelegationWriteTestCase("toolChoice", TOOL_CHOICE_TYPES), - DelegationWriteTestCase("toolChoice", TOOL_CHOICE_FUNCTION), - DelegationWriteTestCase("toolChoice", TOOL_CHOICE_MCP), - DelegationWriteTestCase("toolChoice", TOOL_CHOICE_ALLOWED), - DelegationWriteTestCase("toolChoice", TOOL_CHOICE_CUSTOM), - DelegationWriteTestCase("toolChoice", TOOL_CHOICE_APPLY_PATCH), - DelegationWriteTestCase("toolChoice", TOOL_CHOICE_SHELL), - DelegationWriteTestCase("toolChoiceSpecificProgrammaticToolCallingParam"), - DelegationWriteTestCase("tools", LIST), - DelegationWriteTestCase("tools", JSON_FIELD), - DelegationWriteTestCase("addTool", TOOL), - DelegationWriteTestCase("addTool", FUNCTION_TOOL), - DelegationWriteTestCase("addTool", NAMESPACE_TOOL), - DelegationWriteTestCase("addTool", TOOL_SEARCH_TOOL), - DelegationWriteTestCase("addTool", CLASS, VALIDATION), - DelegationWriteTestCase("addTool", FILE_SEARCH_TOOL), - DelegationWriteTestCase("addFileSearchTool", LIST), - DelegationWriteTestCase("addTool", COMPUTER_TOOL), - DelegationWriteTestCase("addTool", WEB_SEARCH_TOOL), - DelegationWriteTestCase("addTool", WEB_SEARCH_PREVIEW_TOOL), - DelegationWriteTestCase("addTool", APPLY_PATCH_TOOL), - DelegationWriteTestCase("addTool", COMPUTER_USE_PREVIEW_TOOL), - DelegationWriteTestCase("addTool", MCP_TOOL), - DelegationWriteTestCase("addMcpTool", STRING), - DelegationWriteTestCase("addTool", CODE_INTERPRETER_TOOL), - DelegationWriteTestCase("addCodeInterpreterTool", CODE_INTERPRETER_CONTAINER), - DelegationWriteTestCase("addCodeInterpreterTool", STRING), - DelegationWriteTestCase("addCodeInterpreterTool", CODE_INTERPRETER_TOOL_AUTO), - DelegationWriteTestCase("addTool", IMAGE_GENERATION_TOOL), - DelegationWriteTestCase("addToolLocalShell"), - DelegationWriteTestCase("addToolProgrammaticToolCalling"), - DelegationWriteTestCase("addTool", FUNCTION_SHELL_TOOL), - DelegationWriteTestCase("addTool", CUSTOM_TOOL), - DelegationWriteTestCase("addCustomTool", STRING), - DelegationWriteTestCase("topP", NULLABLE_DOUBLE), - DelegationWriteTestCase("topP", DOUBLE), - DelegationWriteTestCase("topP", OPTIONAL), - DelegationWriteTestCase("topP", JSON_FIELD), - DelegationWriteTestCase("topLogprobs", NULLABLE_LONG), - DelegationWriteTestCase("topLogprobs", LONG), - DelegationWriteTestCase("topLogprobs", OPTIONAL), - DelegationWriteTestCase("topLogprobs", JSON_FIELD), - DelegationWriteTestCase("truncation", NULLABLE), - DelegationWriteTestCase("truncation", OPTIONAL), - DelegationWriteTestCase("truncation", JSON_FIELD), - DelegationWriteTestCase("user", STRING), - DelegationWriteTestCase("user", JSON_FIELD), - DelegationWriteTestCase("additionalBodyProperties", MAP), - DelegationWriteTestCase("putAdditionalBodyProperty", STRING, JSON_VALUE), - DelegationWriteTestCase("putAllAdditionalBodyProperties", MAP), - DelegationWriteTestCase("removeAdditionalBodyProperty", STRING), - DelegationWriteTestCase("removeAllAdditionalBodyProperties", SET), - DelegationWriteTestCase("additionalHeaders", HEADERS), - DelegationWriteTestCase("additionalHeaders", MAP), - DelegationWriteTestCase("putAdditionalHeader", STRING, STRING), - DelegationWriteTestCase("putAdditionalHeaders", STRING, LIST), - DelegationWriteTestCase("putAllAdditionalHeaders", HEADERS), - DelegationWriteTestCase("putAllAdditionalHeaders", MAP), - DelegationWriteTestCase("replaceAdditionalHeaders", STRING, STRING), - DelegationWriteTestCase("replaceAdditionalHeaders", STRING, LIST), - DelegationWriteTestCase("replaceAllAdditionalHeaders", HEADERS), - DelegationWriteTestCase("replaceAllAdditionalHeaders", MAP), - DelegationWriteTestCase("removeAdditionalHeaders", STRING), - DelegationWriteTestCase("removeAllAdditionalHeaders", SET), - DelegationWriteTestCase("additionalQueryParams", QUERY_PARAMS), - DelegationWriteTestCase("additionalQueryParams", MAP), - DelegationWriteTestCase("putAdditionalQueryParam", STRING, STRING), - DelegationWriteTestCase("putAdditionalQueryParams", STRING, LIST), - DelegationWriteTestCase("putAllAdditionalQueryParams", QUERY_PARAMS), - DelegationWriteTestCase("putAllAdditionalQueryParams", MAP), - DelegationWriteTestCase("replaceAdditionalQueryParams", STRING, STRING), - DelegationWriteTestCase("replaceAdditionalQueryParams", STRING, LIST), - DelegationWriteTestCase("replaceAllAdditionalQueryParams", QUERY_PARAMS), - DelegationWriteTestCase("replaceAllAdditionalQueryParams", MAP), - DelegationWriteTestCase("removeAdditionalQueryParams", STRING), - DelegationWriteTestCase("removeAllAdditionalQueryParams", SET), - ) - } - - // New instances of the `mockBuilderDelegate` and `builderDelegator` are required for each test - // case (each test case runs in its own instance of the test class). - private val mockBuilderDelegate: ResponseCreateParams.Builder = - mock(ResponseCreateParams.Builder::class.java) - private val builderDelegator = - StructuredResponseCreateParams.builder().inject(mockBuilderDelegate) - - @Test - fun allBuilderDelegateFunctionsExistInDelegator() { - checkAllDelegation( - mockBuilderDelegate::class, - builderDelegator::class, - // ************************************************************************************ - // NOTE: THIS TEST EXISTS TO ENSURE THAT WHEN NEW FUNCTIONS ARE ADDED MANUALLY OR VIA - // CODE GEN TO `ResponseCreateParams.Builder`, THAT THOSE FUNCTIONS ARE _ALSO_ ADDED - // _MANUALLY_ TO `StructuredResponseCreateParams.Builder`. FAILURE TO ADD THOSE - // FUNCTIONS RESULTS IN _MISSING_ FUNCTIONALITY WHEN USING STRUCTURED OUTPUTS. - // EXCEPTIONS ADDED TO THIS LIST ARE PRESENT BY DESIGN, NOT BECAUSE THE FUNCTIONS ARE - // SIMPLY NOT YET IMPLEMENTED IN THE DELEGATOR CLASS. - // - // DO NOT ADD EXCEPTIONS TO THIS LIST SIMPLY BECAUSE TESTS ARE FAILING. THE TESTS ARE - // SUPPOSED TO FAIL. ADD THE NEW FUNCTIONS TO `StructuredResponseCreateParams.Builder` - // AND ADD A PARAMETERIZED TEST TO `builderDelegationTestCases` (above) TO ENSURE - // CORRECT DELEGATION BEHAVIOR. - // ************************************************************************************ - - // For Structured Outputs, setting `body` would overwrite the previously set `text` - // property, which would break the Structured Outputs behavior. - "body", - // For Structured Outputs, new type-safe generic `text` functions replace all existing - // `text` functions, as they are mutually incompatible. These functions have their own - // dedicated unit tests. - "text", - ) - } - - @Test - fun allBuilderDelegatorFunctionsExistInDelegate() { - // The delegator implements a different `text` function from those overloads in the delegate - // class. - checkAllDelegation(builderDelegator::class, mockBuilderDelegate::class, "text") - } - - @Test - fun allBuilderDelegatorFunctionsAreTested() { - checkAllDelegatorWriteFunctionsAreTested( - builderDelegator::class, - builderDelegationTestCases(), - exceptionalTestedFns = listOf("text", "text"), // Two overloads. Two custom tests below. - nonDelegatingFns = setOf("build", "wrap", "inject"), - ) - } - - @ParameterizedTest - @MethodSource("builderDelegationTestCases") - fun `delegation of Builder write functions`(testCase: DelegationWriteTestCase) { - checkOneDelegationWrite(builderDelegator, mockBuilderDelegate, testCase) - } - - @Test - fun `delegation of text with class`() { - // Special unit test case as the delegator method signature does not match that of the - // delegate method. - val delegatorTestCase = DelegationWriteTestCase("text", X::class.java) - val delegatorMethod = findDelegationMethod(builderDelegator, delegatorTestCase) - val mockDelegateTestCase = - DelegationWriteTestCase("text", textConfigFromClass(X::class.java)) - val mockDelegateMethod = findDelegationMethod(mockBuilderDelegate, mockDelegateTestCase) - - delegatorMethod.invoke(builderDelegator, delegatorTestCase.inputValues[0]) - - // Verify that the corresponding method on the mock delegate was called exactly once. - verify(mockBuilderDelegate, times(1)).apply { - mockDelegateMethod.invoke(mockBuilderDelegate, mockDelegateTestCase.inputValues[0]) - } - verifyNoMoreInteractions(mockBuilderDelegate) - } - - @Test - fun `delegation of text with text config`() { - // Special unit test case as the delegator method signature does not match that of the - // delegate method. - val textConfig = StructuredResponseTextConfig.builder().format(X::class.java).build() - val delegatorTestCase = DelegationWriteTestCase("text", textConfig) - val delegatorMethod = findDelegationMethod(builderDelegator, delegatorTestCase) - val mockDelegateTestCase = DelegationWriteTestCase("text", textConfig.rawConfig) - val mockDelegateMethod = findDelegationMethod(mockBuilderDelegate, mockDelegateTestCase) - - delegatorMethod.invoke(builderDelegator, delegatorTestCase.inputValues[0]) - - // Verify that the corresponding method on the mock delegate was called exactly once. - verify(mockBuilderDelegate, times(1)).apply { - mockDelegateMethod.invoke(mockBuilderDelegate, mockDelegateTestCase.inputValues[0]) - } - verifyNoMoreInteractions(mockBuilderDelegate) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseOutputItemTest.kt deleted file mode 100644 index 7f850b69a..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseOutputItemTest.kt +++ /dev/null @@ -1,559 +0,0 @@ -package com.openai.models.responses - -import com.openai.core.DelegationReadTestCase -import com.openai.core.JsonValue -import com.openai.core.LIST -import com.openai.core.OPTIONAL -import com.openai.core.STRING -import com.openai.core.X -import com.openai.core.checkAllDelegation -import com.openai.core.checkAllDelegatorReadFunctionsAreTested -import com.openai.core.checkOneDelegationRead -import java.util.Optional -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.MethodSource -import org.mockito.Mockito.mock -import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.`when` -import org.mockito.kotlin.times -import org.mockito.kotlin.verify - -/** - * Unit tests for the [StructuredResponseOutputItem] class (delegator) and its delegation of most - * functions to a wrapped [ResponseOutputItem] (delegate). The tests include confirmation of the - * following: - * - All functions in the delegator correspond to a function in the delegate and _vice versa_. - * - All functions in the delegator call their corresponding function in the delegate and only that - * function. - * - A unit test exists for all functions. - * - * There are some exceptions to the above that are handled differently. - */ -internal class StructuredResponseOutputItemTest { - companion object { - private val FILE_SEARCH_TOOL_CALL = - ResponseFileSearchToolCall.builder() - .id(STRING) - .queries(LIST) - .status(ResponseFileSearchToolCall.Status.COMPLETED) - .build() - private val FUNCTION_TOOL_CALL = - ResponseFunctionToolCall.builder().arguments(STRING).callId(STRING).name(STRING).build() - private val FUNCTION_TOOL_CALL_OUTPUT = - ResponseFunctionToolCallOutputItem.builder() - .id(STRING) - .callId(STRING) - .output(STRING) - .status(ResponseFunctionToolCallOutputItem.Status.IN_PROGRESS) - .createdBy(STRING) - .build() - private val TOOL_SEARCH_CALL = - ResponseToolSearchCall.builder() - .id(STRING) - .arguments(JsonValue.from(mapOf())) - .callId(STRING) - .execution(ResponseToolSearchCall.Execution.SERVER) - .status(ResponseToolSearchCall.Status.COMPLETED) - .build() - private val TOOL_SEARCH_OUTPUT = - ResponseToolSearchOutputItem.builder() - .id(STRING) - .callId(STRING) - .execution(ResponseToolSearchOutputItem.Execution.SERVER) - .status(ResponseToolSearchOutputItem.Status.COMPLETED) - .addTool( - FunctionTool.builder() - .name(STRING) - .parameters(FunctionTool.Parameters.builder().build()) - .strict(false) - .build() - ) - .build() - private val ADDITIONAL_TOOLS = - ResponseOutputItem.AdditionalTools.builder() - .id(STRING) - .role(ResponseOutputItem.AdditionalTools.Role.DEVELOPER) - .tools(listOf()) - .build() - private val FUNCTION_WEB_SEARCH = - ResponseFunctionWebSearch.builder() - .id(STRING) - .status(ResponseFunctionWebSearch.Status.COMPLETED) - .action( - ResponseFunctionWebSearch.Action.ofSearch( - ResponseFunctionWebSearch.Action.Search.builder().query("query").build() - ) - ) - .build() - private val COMPUTER_TOOL_CALL = - ResponseComputerToolCall.builder() - .id(STRING) - .action(ResponseComputerToolCall.Action.ofWait()) - .callId(STRING) - .pendingSafetyChecks(listOf()) - .status(ResponseComputerToolCall.Status.COMPLETED) - .type(ResponseComputerToolCall.Type.COMPUTER_CALL) - .build() - private val COMPUTER_TOOL_CALL_OUTPUT = - ResponseComputerToolCallOutputItem.builder() - .id(STRING) - .callId(STRING) - .output( - ResponseComputerToolCallOutputScreenshot.builder() - .fileId(STRING) - .imageUrl(STRING) - .build() - ) - .status(ResponseComputerToolCallOutputItem.Status.COMPLETED) - .addAcknowledgedSafetyCheck( - ResponseComputerToolCallOutputItem.AcknowledgedSafetyCheck.builder() - .id(STRING) - .code(STRING) - .message(STRING) - .build() - ) - .createdBy(STRING) - .build() - private val REASONING_ITEM = - ResponseReasoningItem.builder().id(STRING).summary(listOf()).build() - private val PROGRAM = - ResponseOutputItem.Program.builder() - .id(STRING) - .callId(STRING) - .code(STRING) - .fingerprint(STRING) - .build() - private val PROGRAM_OUTPUT = - ResponseOutputItem.ProgramOutput.builder() - .id(STRING) - .callId(STRING) - .result(STRING) - .status(ResponseOutputItem.ProgramOutput.Status.COMPLETED) - .build() - private val COMPACTION_ITEM = - ResponseCompactionItem.builder().id(STRING).encryptedContent(STRING).build() - private val CODE_INTERPRETER_CALL = - ResponseCodeInterpreterToolCall.builder() - .id(STRING) - .code(STRING) - .containerId(STRING) - .outputs(listOf()) - .status(ResponseCodeInterpreterToolCall.Status.COMPLETED) - .build() - private val IMAGE_GENERATION_CALL = - ResponseOutputItem.ImageGenerationCall.builder() - .id(STRING) - .result(STRING) - .status(ResponseOutputItem.ImageGenerationCall.Status.COMPLETED) - .build() - private val LOCAL_SHELL_CALL = - ResponseOutputItem.LocalShellCall.builder() - .id(STRING) - .callId(STRING) - .action( - ResponseOutputItem.LocalShellCall.Action.builder() - .command(listOf("echo", "hello")) - .env(ResponseOutputItem.LocalShellCall.Action.Env.builder().build()) - .build() - ) - .status(ResponseOutputItem.LocalShellCall.Status.COMPLETED) - .build() - private val LOCAL_SHELL_CALL_OUTPUT = - ResponseOutputItem.LocalShellCallOutput.builder() - .id(STRING) - .output(STRING) - .status(ResponseOutputItem.LocalShellCallOutput.Status.IN_PROGRESS) - .build() - private val SHELL_TOOL_CALL = - ResponseFunctionShellToolCall.builder() - .id(STRING) - .callId(STRING) - .environment(ResponseLocalEnvironment.builder().build()) - .status(ResponseFunctionShellToolCall.Status.COMPLETED) - .action( - ResponseFunctionShellToolCall.Action.builder() - .commands(listOf("echo hello")) - .maxOutputLength(1024L) - .timeoutMs(1000L) - .build() - ) - .build() - private val SHELL_TOOL_CALL_OUTPUT = - ResponseFunctionShellToolCallOutput.builder() - .id(STRING) - .callId(STRING) - .maxOutputLength(1024L) - .output( - listOf( - ResponseFunctionShellToolCallOutput.Output.builder() - .exitOutcome(0L) - .stderr(STRING) - .stdout(STRING) - .build() - ) - ) - .status(ResponseFunctionShellToolCallOutput.Status.COMPLETED) - .build() - private val APPLY_PATCH_TOOL_CALL = - ResponseApplyPatchToolCall.builder() - .id(STRING) - .callId(STRING) - .operation( - ResponseApplyPatchToolCall.Operation.CreateFile.builder() - .diff(STRING) - .path(STRING) - .build() - ) - .status(ResponseApplyPatchToolCall.Status.COMPLETED) - .build() - private val APPLY_PATCH_TOOL_CALL_OUTPUT = - ResponseApplyPatchToolCallOutput.builder() - .id(STRING) - .callId(STRING) - .output(STRING) - .status(ResponseApplyPatchToolCallOutput.Status.COMPLETED) - .build() - private val MCP_APPROVAL_REQUEST = - ResponseOutputItem.McpApprovalRequest.builder() - .id(STRING) - .arguments(STRING) - .name(STRING) - .serverLabel(STRING) - .build() - private val MCP_APPROVAL_RESPONSE = - ResponseOutputItem.McpApprovalResponse.builder() - .id(STRING) - .approvalRequestId(STRING) - .approve(true) - .reason(STRING) - .build() - private val MCP_CALL = - ResponseOutputItem.McpCall.builder() - .id(STRING) - .arguments(STRING) - .name(STRING) - .serverLabel(STRING) - .output(STRING) - .build() - private val MCP_LIST_TOOLS = - ResponseOutputItem.McpListTools.builder() - .id(STRING) - .serverLabel(STRING) - .tools(listOf()) - .build() - private val CUSTOM_TOOL_CALL = - ResponseCustomToolCall.builder().callId(STRING).input(STRING).name(STRING).build() - private val CUSTOM_TOOL_CALL_OUTPUT = - ResponseCustomToolCallOutputItem.builder() - .callId(STRING) - .output(STRING) - .id(STRING) - .status(ResponseCustomToolCallOutputItem.Status.IN_PROGRESS) - .createdBy(STRING) - .build() - private val MESSAGE = - ResponseOutputMessage.builder() - .id(STRING) - .content(listOf()) - .status(ResponseOutputMessage.Status.COMPLETED) - .build() - - // The list order follows the declaration order in `ResponseOutputItem` for easier - // maintenance. - @JvmStatic - private fun delegationTestCases() = - listOf( - // `message()` is a special case and has its own test function. - DelegationReadTestCase("fileSearchCall", OPTIONAL), - DelegationReadTestCase("functionCall", OPTIONAL), - DelegationReadTestCase("functionCallOutput", OPTIONAL), - DelegationReadTestCase("toolSearchCall", OPTIONAL), - DelegationReadTestCase("toolSearchOutput", OPTIONAL), - DelegationReadTestCase("additionalTools", OPTIONAL), - DelegationReadTestCase("webSearchCall", OPTIONAL), - DelegationReadTestCase("computerCall", OPTIONAL), - DelegationReadTestCase("computerCallOutput", OPTIONAL), - DelegationReadTestCase("reasoning", OPTIONAL), - DelegationReadTestCase("program", OPTIONAL), - DelegationReadTestCase("programOutput", OPTIONAL), - DelegationReadTestCase("compaction", OPTIONAL), - DelegationReadTestCase("localShellCall", OPTIONAL), - DelegationReadTestCase("localShellCallOutput", OPTIONAL), - DelegationReadTestCase("shellCall", OPTIONAL), - DelegationReadTestCase("shellCallOutput", OPTIONAL), - DelegationReadTestCase("applyPatchCall", OPTIONAL), - DelegationReadTestCase("applyPatchCallOutput", OPTIONAL), - DelegationReadTestCase("mcpApprovalRequest", OPTIONAL), - DelegationReadTestCase("mcpApprovalResponse", OPTIONAL), - DelegationReadTestCase("mcpCall", OPTIONAL), - DelegationReadTestCase("mcpListTools", OPTIONAL), - DelegationReadTestCase("customToolCall", OPTIONAL), - DelegationReadTestCase("customToolCallOutput", OPTIONAL), - // `isMessage()` is a special case and has its own test function. - // For the Boolean functions, call each in turn with both `true` and `false` to - // ensure that a return value is not hard-coded. - DelegationReadTestCase("isFileSearchCall", true), - DelegationReadTestCase("isFileSearchCall", false), - DelegationReadTestCase("isFunctionCall", true), - DelegationReadTestCase("isFunctionCall", false), - DelegationReadTestCase("isFunctionCallOutput", true), - DelegationReadTestCase("isFunctionCallOutput", false), - DelegationReadTestCase("isToolSearchCall", true), - DelegationReadTestCase("isToolSearchCall", false), - DelegationReadTestCase("isToolSearchOutput", true), - DelegationReadTestCase("isToolSearchOutput", false), - DelegationReadTestCase("isAdditionalTools", true), - DelegationReadTestCase("isAdditionalTools", false), - DelegationReadTestCase("isWebSearchCall", true), - DelegationReadTestCase("isWebSearchCall", false), - DelegationReadTestCase("isComputerCall", true), - DelegationReadTestCase("isComputerCall", false), - DelegationReadTestCase("isComputerCallOutput", true), - DelegationReadTestCase("isComputerCallOutput", false), - DelegationReadTestCase("isReasoning", true), - DelegationReadTestCase("isReasoning", false), - DelegationReadTestCase("isProgram", true), - DelegationReadTestCase("isProgram", false), - DelegationReadTestCase("isProgramOutput", true), - DelegationReadTestCase("isProgramOutput", false), - DelegationReadTestCase("isCompaction", true), - DelegationReadTestCase("isCompaction", false), - DelegationReadTestCase("isLocalShellCall", true), - DelegationReadTestCase("isLocalShellCall", false), - DelegationReadTestCase("isLocalShellCallOutput", true), - DelegationReadTestCase("isLocalShellCallOutput", false), - DelegationReadTestCase("isShellCall", true), - DelegationReadTestCase("isShellCall", false), - DelegationReadTestCase("isShellCallOutput", true), - DelegationReadTestCase("isShellCallOutput", false), - DelegationReadTestCase("isApplyPatchCall", true), - DelegationReadTestCase("isApplyPatchCall", false), - DelegationReadTestCase("isApplyPatchCallOutput", true), - DelegationReadTestCase("isApplyPatchCallOutput", false), - DelegationReadTestCase("isMcpApprovalRequest", true), - DelegationReadTestCase("isMcpApprovalRequest", false), - DelegationReadTestCase("isMcpApprovalResponse", true), - DelegationReadTestCase("isMcpApprovalResponse", false), - DelegationReadTestCase("isMcpCall", true), - DelegationReadTestCase("isMcpCall", false), - DelegationReadTestCase("isMcpListTools", true), - DelegationReadTestCase("isMcpListTools", false), - DelegationReadTestCase("isCustomToolCall", true), - DelegationReadTestCase("isCustomToolCall", false), - DelegationReadTestCase("isCustomToolCallOutput", true), - DelegationReadTestCase("isCustomToolCallOutput", false), - // `asMessage()` is a special case and has its own test function. - DelegationReadTestCase("asFileSearchCall", FILE_SEARCH_TOOL_CALL), - DelegationReadTestCase("asFunctionCall", FUNCTION_TOOL_CALL), - DelegationReadTestCase("asFunctionCallOutput", FUNCTION_TOOL_CALL_OUTPUT), - DelegationReadTestCase("asToolSearchCall", TOOL_SEARCH_CALL), - DelegationReadTestCase("asToolSearchOutput", TOOL_SEARCH_OUTPUT), - DelegationReadTestCase("asAdditionalTools", ADDITIONAL_TOOLS), - DelegationReadTestCase("asWebSearchCall", FUNCTION_WEB_SEARCH), - DelegationReadTestCase("asComputerCall", COMPUTER_TOOL_CALL), - DelegationReadTestCase("asComputerCallOutput", COMPUTER_TOOL_CALL_OUTPUT), - DelegationReadTestCase("asReasoning", REASONING_ITEM), - DelegationReadTestCase("asProgram", PROGRAM), - DelegationReadTestCase("asProgramOutput", PROGRAM_OUTPUT), - DelegationReadTestCase("asCompaction", COMPACTION_ITEM), - DelegationReadTestCase("asCodeInterpreterCall", CODE_INTERPRETER_CALL), - DelegationReadTestCase("asImageGenerationCall", IMAGE_GENERATION_CALL), - DelegationReadTestCase("asLocalShellCall", LOCAL_SHELL_CALL), - DelegationReadTestCase("asLocalShellCallOutput", LOCAL_SHELL_CALL_OUTPUT), - DelegationReadTestCase("asShellCall", SHELL_TOOL_CALL), - DelegationReadTestCase("asShellCallOutput", SHELL_TOOL_CALL_OUTPUT), - DelegationReadTestCase("asApplyPatchCall", APPLY_PATCH_TOOL_CALL), - DelegationReadTestCase("asApplyPatchCallOutput", APPLY_PATCH_TOOL_CALL_OUTPUT), - DelegationReadTestCase("asMcpApprovalRequest", MCP_APPROVAL_REQUEST), - DelegationReadTestCase("asMcpApprovalResponse", MCP_APPROVAL_RESPONSE), - DelegationReadTestCase("asMcpCall", MCP_CALL), - DelegationReadTestCase("asMcpListTools", MCP_LIST_TOOLS), - DelegationReadTestCase("asCustomToolCall", CUSTOM_TOOL_CALL), - DelegationReadTestCase("asCustomToolCallOutput", CUSTOM_TOOL_CALL_OUTPUT), - DelegationReadTestCase("_json", OPTIONAL), - ) - } - - // New instances of the `mockDelegate` and `delegator` are required for each test case (each - // test case runs in its own instance of the test class). - private val mockDelegate: ResponseOutputItem = mock(ResponseOutputItem::class.java) - private val delegator = StructuredResponseOutputItem(X::class.java, mockDelegate) - - @Test - fun allDelegateFunctionsExistInDelegator() { - // `toBuilder()` is deliberately not implemented. `accept()` has a different signature. - // A few methods remain excluded because they have bespoke tests or visitor behavior. - checkAllDelegation( - mockDelegate::class, - delegator::class, - "toBuilder", - "accept", - "asCodeInterpreterCall", - "asImageGenerationCall", - "asLocalShellCall", - "asMcpApprovalRequest", - "asMcpCall", - "asMcpListTools", - "asToolSearchCall", - "asToolSearchOutput", - "codeInterpreterCall", - "imageGenerationCall", - "localShellCall", - "mcpApprovalRequest", - "mcpCall", - "mcpListTools", - "toolSearchCall", - "toolSearchOutput", - "isCodeInterpreterCall", - "isImageGenerationCall", - "isLocalShellCall", - "isMcpApprovalRequest", - "isMcpCall", - "isMcpListTools", - "isToolSearchCall", - "isToolSearchOutput", - ) - } - - @Test - fun allDelegatorFunctionsExistInDelegate() { - // `accept()` has a different signature. - checkAllDelegation(delegator::class, mockDelegate::class, "accept") - } - - @Test - fun allDelegatorFunctionsAreTested() { - // There are exceptional test cases for some functions. Most other functions are part of the - // list of those using the parameterized test. A few delegator functions do not delegate, so - // no test function is necessary. - checkAllDelegatorReadFunctionsAreTested( - delegator::class, - delegationTestCases(), - exceptionalTestedFns = - setOf( - "message", - "asMessage", - "isMessage", - "validate", - "isValid", - "accept", - "visitCodeInterpreterCall", - "visitImageGenerationCall", - "visitCompaction", - "visitProgram", - "visitProgramOutput", - "visitFunctionCallOutput", - "visitComputerCallOutput", - "visitMcpApprovalRequest", - "visitMcpApprovalResponse", - "visitMcpCall", - "visitMcpListTools", - "visitLocalShellCall", - "visitLocalShellCallOutput", - "visitToolSearchCall", - "visitToolSearchOutput", - "visitCustomToolCall", - "visitCustomToolCallOutput", - // All the functions added for new tools: - "asCodeInterpreterCall", - "asImageGenerationCall", - "asMcpApprovalRequest", - "asMcpCall", - "asMcpListTools", - "asToolSearchCall", - "asToolSearchOutput", - "codeInterpreterCall", - "imageGenerationCall", - "mcpApprovalRequest", - "mcpCall", - "mcpListTools", - "toolSearchCall", - "toolSearchOutput", - "isCodeInterpreterCall", - "isImageGenerationCall", - "isMcpApprovalRequest", - "isMcpCall", - "isMcpListTools", - "isToolSearchCall", - "isToolSearchOutput", - ), - nonDelegatingFns = setOf("equals", "hashCode", "toString"), - ) - } - - @ParameterizedTest - @MethodSource("delegationTestCases") - fun `delegation of functions in general`(testCase: DelegationReadTestCase) { - checkOneDelegationRead(delegator, mockDelegate, testCase) - } - - @Test - fun `delegation of message`() { - // Input and output are different types, so this test is an exceptional case. - // The delegator's `message()` delegates to the delegate's `message()` indirectly via the - // delegator's `message` field initializer. - val input = Optional.of(MESSAGE) - `when`(mockDelegate.message()).thenReturn(input) - val output = delegator.message() - - verify(mockDelegate, times(1)).message() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output.get().rawMessage).isEqualTo(MESSAGE) - } - - @Test - fun `delegation of asMessage`() { - // Delegation function names do not match, so this test is an exceptional case. - // The delegator's `asMessage()` delegates to the delegate's `message()` (without the "as") - // indirectly via the delegator's `message` field initializer. - val input = Optional.of(MESSAGE) - `when`(mockDelegate.message()).thenReturn(input) - val output = delegator.asMessage() - - verify(mockDelegate, times(1)).message() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output.rawMessage).isEqualTo(MESSAGE) - } - - @Test - fun `delegation of isMessage`() { - // Delegation function names do not match, so this test is an exceptional case. - // The delegator's `isMessage()` delegates to the delegate's `message()` (without the "is") - // indirectly via the delegator's `message` field initializer. - val input = Optional.of(MESSAGE) - `when`(mockDelegate.message()).thenReturn(input) - val output = delegator.isMessage() - - verify(mockDelegate, times(1)).message() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output).isTrue - } - - @Test - fun `delegation of validate`() { - `when`(mockDelegate.message()).thenReturn(Optional.of(MESSAGE)) - - delegator.validate() - - // Delegator's `validate()` does not call delegate's `validate()`. `message()` is called - // indirectly via the `message` field initializer. - verify(mockDelegate, times(1)).message() - verifyNoMoreInteractions(mockDelegate) - } - - @Test - fun `delegation of isValid`() { - // `isValid` calls `validate()`, so the test is similar to that for `validate()`. - `when`(mockDelegate.message()).thenReturn(Optional.of(MESSAGE)) - - delegator.isValid() - - verify(mockDelegate, times(1)).message() - verifyNoMoreInteractions(mockDelegate) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseOutputMessageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseOutputMessageTest.kt deleted file mode 100644 index b0331eb45..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseOutputMessageTest.kt +++ /dev/null @@ -1,294 +0,0 @@ -package com.openai.models.responses - -import com.openai.core.DelegationReadTestCase -import com.openai.core.JSON_FIELD -import com.openai.core.JSON_VALUE -import com.openai.core.JsonField -import com.openai.core.MAP -import com.openai.core.OPTIONAL -import com.openai.core.STRING -import com.openai.core.X -import com.openai.core.checkAllDelegation -import com.openai.core.checkAllDelegatorReadFunctionsAreTested -import com.openai.core.checkOneDelegationRead -import com.openai.errors.OpenAIInvalidDataException -import java.util.Optional -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.assertThatThrownBy -import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.MethodSource -import org.mockito.Mockito.mock -import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.`when` -import org.mockito.kotlin.times -import org.mockito.kotlin.verify - -/** - * Unit tests for the [StructuredResponseOutputMessage] class (delegator) and its delegation of most - * functions to a wrapped [ResponseOutputMessage] (delegate). The tests include confirmation of the - * following: - * - All functions in the delegator correspond to a function in the delegate and _vice versa_. - * - All functions in the delegator call their corresponding function in the delegate and only that - * function. - * - A unit test exists for all functions. - * - * There are some exceptions to the above that are handled differently. - */ -internal class StructuredResponseOutputMessageTest { - companion object { - private val MESSAGE_PHASE = ResponseOutputMessage.Phase.COMMENTARY - private val MESSAGE_STATUS = ResponseOutputMessage.Status.COMPLETED - private val OUTPUT_TEXT = - ResponseOutputText.builder() - .annotations(listOf()) - .logprobs(listOf()) - .text(STRING) - .build() - private val OUTPUT_REFUSAL = ResponseOutputRefusal.builder().refusal(STRING).build() - private val CONTENT = ResponseOutputMessage.Content.ofOutputText(OUTPUT_TEXT) - - // The list order follows the declaration order in `ResponseOutputMessage` for easier - // maintenance. - @JvmStatic - private fun delegationTestCases() = - listOf( - DelegationReadTestCase("id", STRING), - // `content()` is a special case and has its own test function. - DelegationReadTestCase("_role", JSON_VALUE), - DelegationReadTestCase("phase", Optional.of(MESSAGE_PHASE)), - DelegationReadTestCase("status", MESSAGE_STATUS), - DelegationReadTestCase("_type", JSON_VALUE), - DelegationReadTestCase("_id", JSON_FIELD), - // `_content()` is a special case and has its own test function. - DelegationReadTestCase("_phase", JsonField.of(MESSAGE_PHASE)), - DelegationReadTestCase("_status", JSON_FIELD), - DelegationReadTestCase("_additionalProperties", MAP), - ) - - // The list order follows the declaration order in `ResponseOutputMessage.Content` for - // easier maintenance. - @JvmStatic - private fun contentDelegationTestCases() = - listOf( - // `outputText()` is a special case and has its own test function. - DelegationReadTestCase("refusal", OPTIONAL), - // For the Boolean functions, pass both `true` and `false` to ensure that one value - // is not hard-coded. - DelegationReadTestCase("isOutputText", true), - DelegationReadTestCase("isOutputText", false), - DelegationReadTestCase("isRefusal", true), - DelegationReadTestCase("isRefusal", false), - // `asOutputText()` is a special case and has its own test function. - DelegationReadTestCase("asRefusal", OUTPUT_REFUSAL), - DelegationReadTestCase("_json", OPTIONAL), - ) - } - - // New instances of the `mockDelegate` and `delegator` are required for each test case (each - // test case runs in its own instance of the test class). - private val mockDelegate: ResponseOutputMessage = mock(ResponseOutputMessage::class.java) - private val delegator = StructuredResponseOutputMessage(X::class.java, mockDelegate) - - private val contentMockDelegate: ResponseOutputMessage.Content = - mock(ResponseOutputMessage.Content::class.java) - private val contentDelegator = - StructuredResponseOutputMessage.Content(X::class.java, contentMockDelegate) - - @Test - fun allDelegateFunctionsExistInDelegator() { - checkAllDelegation(mockDelegate::class, delegator::class, "toBuilder") - } - - @Test - fun allDelegatorFunctionsExistInDelegate() { - checkAllDelegation(delegator::class, mockDelegate::class) - } - - @Test - fun allContentDelegateFunctionsExistInDelegator() { - // The `Content.accept()` function in the delegator takes a different type than that in the - // delegate, so there is no delegation from the former to the latter. `Content.toBuilder` is - // deliberately not implemented. - checkAllDelegation( - contentMockDelegate::class, - contentDelegator::class, - "toBuilder", - "accept", - ) - } - - @Test - fun allContentDelegatorFunctionsExistInDelegate() { - // The `Content.accept()` function in the delegator takes a different type than that in the - // delegate, so there is no delegation from the former to the latter. - checkAllDelegation(contentDelegator::class, contentMockDelegate::class, "accept") - } - - @Test - fun allDelegatorFunctionsAreTested() { - // There are exceptional test cases for some functions. Most other functions are part of the - // list of those using the parameterized test. A few delegator functions do not delegate, so - // no test function is necessary. - checkAllDelegatorReadFunctionsAreTested( - delegator::class, - delegationTestCases(), - exceptionalTestedFns = setOf("content", "_content", "validate", "isValid"), - nonDelegatingFns = setOf("equals", "hashCode", "toString"), - ) - } - - @Test - fun allContentDelegatorFunctionsAreTested() { - checkAllDelegatorReadFunctionsAreTested( - contentDelegator::class, - contentDelegationTestCases(), - exceptionalTestedFns = - setOf("outputText", "asOutputText", "validate", "isValid", "accept"), - nonDelegatingFns = setOf("equals", "hashCode", "toString"), - ) - } - - @ParameterizedTest - @MethodSource("delegationTestCases") - fun `delegation of functions in general`(testCase: DelegationReadTestCase) { - checkOneDelegationRead(delegator, mockDelegate, testCase) - } - - @ParameterizedTest - @MethodSource("contentDelegationTestCases") - fun `delegation of Content functions in general`(testCase: DelegationReadTestCase) { - checkOneDelegationRead(contentDelegator, contentMockDelegate, testCase) - } - - @Test - fun `delegation of content`() { - // Input and output are different types, so this test is an exceptional case. - // `content()` (without an underscore) delegates to `_content()` (with an underscore) - // indirectly via the `content` field initializer. - val input = JsonField.of(listOf(CONTENT)) - `when`(mockDelegate._content()).thenReturn(input) - val output = delegator.content() // Without an underscore. - - verify(mockDelegate, times(1))._content() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output[0].rawContent).isEqualTo(CONTENT) - } - - @Test - fun `delegation of _content`() { - // Input and output are different types, so this test is an exceptional case. - // `_content()` (with an underscore) delegates to `_content()` (with an underscore) - // indirectly via the `content` field initializer. - val input = JsonField.of(listOf(CONTENT)) - `when`(mockDelegate._content()).thenReturn(input) - val output = delegator._content() // With an underscore. - - verify(mockDelegate, times(1))._content() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output.getRequired("content")[0].rawContent).isEqualTo(CONTENT) - } - - @Test - fun `delegation of validate`() { - `when`(mockDelegate._content()).thenReturn(JsonField.of(listOf(CONTENT))) - - delegator.validate() - - // Delegator's `validate()` calls delegate's `validate()`. `_content` is called indirectly - // via the `content` field initializer. - verify(mockDelegate, times(1))._content() - verify(mockDelegate, times(1)).validate() - verifyNoMoreInteractions(mockDelegate) - } - - @Test - fun `delegation of isValid`() { - // `isValid` calls `validate()`, so the test is similar to that for `validate()`. - `when`(mockDelegate._content()).thenReturn(JsonField.of(listOf(CONTENT))) - - delegator.isValid() - - verify(mockDelegate, times(1))._content() - verify(mockDelegate, times(1)).validate() - verifyNoMoreInteractions(mockDelegate) - } - - @Test - fun `delegation of Content outputText`() { - // Input and output are different types, so this test is an exceptional case. The - // delegator's `outputText()` delegates to the delegate's `outputText()` indirectly via the - // `outputText` field initializer. - val input = - Optional.of( - ResponseOutputText.builder() - .annotations(listOf()) - .logprobs(listOf()) - .text("{\"s\" : \"hello\"}") - .build() - ) - `when`(contentMockDelegate.outputText()).thenReturn(input) - val output = contentDelegator.outputText() - - verify(contentMockDelegate, times(1)).outputText() - verifyNoMoreInteractions(contentMockDelegate) - - assertThat(output).isEqualTo(Optional.of(X("hello"))) - } - - @Test - fun `delegation of Content asOutputText`() { - // Input and output are different types, so this test is an exceptional case. The - // delegator's `asOutputText()` delegates to the delegate's `outputText()` indirectly via - // the - // `outputText` field initializer. - val input = - Optional.of( - ResponseOutputText.builder() - .annotations(listOf()) - .logprobs(listOf()) - .text("{\"s\" : \"hello\"}") - .build() - ) - `when`(contentMockDelegate.outputText()).thenReturn(input) - val output = contentDelegator.asOutputText() - - verify(contentMockDelegate, times(1)).outputText() - verifyNoMoreInteractions(contentMockDelegate) - - assertThat(output).isEqualTo(X("hello")) - } - - @Test - fun `delegation of Content asOutputText missing`() { - val input = Optional.ofNullable(null) - `when`(contentMockDelegate.outputText()).thenReturn(input) - - assertThatThrownBy { contentDelegator.asOutputText() } - .isInstanceOf(OpenAIInvalidDataException::class.java) - .hasMessage("`outputText` is not present") - - verify(contentMockDelegate, times(1)).outputText() - verifyNoMoreInteractions(contentMockDelegate) - } - - @Test - fun `delegation of Content validate`() { - // No values or passed and only `this` is returned. - contentDelegator.validate() - - verify(contentMockDelegate, times(1)).validate() - verifyNoMoreInteractions(contentMockDelegate) - } - - @Test - fun `delegation of Content isValid`() { - contentDelegator.isValid() - - // `isValid()` calls `validate`, which then calls the mock delegate. - verify(contentMockDelegate, times(1)).validate() - verifyNoMoreInteractions(contentMockDelegate) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseTest.kt deleted file mode 100644 index 84c744171..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseTest.kt +++ /dev/null @@ -1,219 +0,0 @@ -package com.openai.models.responses - -import com.openai.core.BOOLEAN -import com.openai.core.DOUBLE -import com.openai.core.DelegationReadTestCase -import com.openai.core.JSON_FIELD -import com.openai.core.JSON_VALUE -import com.openai.core.JsonField -import com.openai.core.LIST -import com.openai.core.MAP -import com.openai.core.OPTIONAL -import com.openai.core.STRING -import com.openai.core.X -import com.openai.core.checkAllDelegation -import com.openai.core.checkAllDelegatorReadFunctionsAreTested -import com.openai.core.checkOneDelegationRead -import com.openai.models.ChatModel -import com.openai.models.ResponsesModel -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.MethodSource -import org.mockito.Mockito.mock -import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.Mockito.`when` -import org.mockito.kotlin.times -import org.mockito.kotlin.verify - -/** - * Unit tests for the [StructuredResponse] class (delegator) and its delegation of most functions to - * a wrapped [Response] (delegate). The tests include confirmation of the following: - * - All functions in the delegator correspond to a function in the delegate and _vice versa_. - * - All functions in the delegator call their corresponding function in the delegate and only that - * function. - * - A unit test exists for all functions. - * - * There are some exceptions to the above that are handled differently. - */ -internal class StructuredResponseTest { - companion object { - private val RESPONSES_MODEL = ResponsesModel.ofChat(ChatModel.GPT_4O) - - private val TOOL_CHOICE = - Response.ToolChoice.ofFunction(ToolChoiceFunction.builder().name(STRING).build()) - // A reasoning item is probably the simplest one to create. - private val OUTPUT_ITEM = - ResponseOutputItem.ofReasoning( - ResponseReasoningItem.builder() - .id(STRING) - .summary(listOf(ResponseReasoningItem.Summary.builder().text(STRING).build())) - .build() - ) - - // The list order follows the declaration order in `Response` for easier maintenance. - @JvmStatic - private fun delegationTestCases() = - listOf( - DelegationReadTestCase("id", STRING), - DelegationReadTestCase("createdAt", DOUBLE), - DelegationReadTestCase("error", OPTIONAL), - DelegationReadTestCase("incompleteDetails", OPTIONAL), - DelegationReadTestCase("instructions", OPTIONAL), - DelegationReadTestCase("metadata", OPTIONAL), - DelegationReadTestCase("model", RESPONSES_MODEL), - DelegationReadTestCase("moderation", OPTIONAL), - DelegationReadTestCase("_object_", JSON_VALUE), - // `output()` is a special case and has its own test function. - DelegationReadTestCase("parallelToolCalls", BOOLEAN), - DelegationReadTestCase("temperature", OPTIONAL), - DelegationReadTestCase("toolChoice", TOOL_CHOICE), - DelegationReadTestCase("tools", LIST), - DelegationReadTestCase("topP", OPTIONAL), - DelegationReadTestCase("maxToolCalls", OPTIONAL), - DelegationReadTestCase("topLogprobs", OPTIONAL), - DelegationReadTestCase("maxOutputTokens", OPTIONAL), - DelegationReadTestCase("previousResponseId", OPTIONAL), - DelegationReadTestCase("prompt", OPTIONAL), - DelegationReadTestCase("promptCacheKey", OPTIONAL), - DelegationReadTestCase("promptCacheOptions", OPTIONAL), - DelegationReadTestCase("promptCacheRetention", OPTIONAL), - DelegationReadTestCase("reasoning", OPTIONAL), - DelegationReadTestCase("safetyIdentifier", OPTIONAL), - DelegationReadTestCase("serviceTier", OPTIONAL), - DelegationReadTestCase("status", OPTIONAL), - DelegationReadTestCase("text", OPTIONAL), - DelegationReadTestCase("truncation", OPTIONAL), - DelegationReadTestCase("usage", OPTIONAL), - DelegationReadTestCase("user", OPTIONAL), - DelegationReadTestCase("_id", JSON_FIELD), - DelegationReadTestCase("_createdAt", JSON_FIELD), - DelegationReadTestCase("_error", JSON_FIELD), - DelegationReadTestCase("_incompleteDetails", JSON_FIELD), - DelegationReadTestCase("_instructions", JSON_FIELD), - DelegationReadTestCase("_metadata", JSON_FIELD), - DelegationReadTestCase("_model", JSON_FIELD), - DelegationReadTestCase("_moderation", JSON_FIELD), - // `_output()` is a special case and has its own test function. - DelegationReadTestCase("_parallelToolCalls", JSON_FIELD), - DelegationReadTestCase("_temperature", JSON_FIELD), - DelegationReadTestCase("_toolChoice", JSON_FIELD), - DelegationReadTestCase("_tools", JSON_FIELD), - DelegationReadTestCase("_topP", JSON_FIELD), - DelegationReadTestCase("_maxToolCalls", JSON_FIELD), - DelegationReadTestCase("_topLogprobs", JSON_FIELD), - DelegationReadTestCase("_maxOutputTokens", JSON_FIELD), - DelegationReadTestCase("_previousResponseId", JSON_FIELD), - DelegationReadTestCase("_prompt", JSON_FIELD), - DelegationReadTestCase("_promptCacheKey", JSON_FIELD), - DelegationReadTestCase("_promptCacheOptions", JSON_FIELD), - DelegationReadTestCase("_promptCacheRetention", JSON_FIELD), - DelegationReadTestCase("_reasoning", JSON_FIELD), - DelegationReadTestCase("_safetyIdentifier", JSON_FIELD), - DelegationReadTestCase("_serviceTier", JSON_FIELD), - DelegationReadTestCase("_status", JSON_FIELD), - DelegationReadTestCase("_text", JSON_FIELD), - DelegationReadTestCase("_truncation", JSON_FIELD), - DelegationReadTestCase("_usage", JSON_FIELD), - DelegationReadTestCase("_user", JSON_FIELD), - DelegationReadTestCase("background", OPTIONAL), - DelegationReadTestCase("_background", JSON_FIELD), - DelegationReadTestCase("completedAt", OPTIONAL), - DelegationReadTestCase("_completedAt", JSON_FIELD), - DelegationReadTestCase("conversation", OPTIONAL), - DelegationReadTestCase("_conversation", JSON_FIELD), - DelegationReadTestCase("_additionalProperties", MAP), - // `validate()` and `isValid()` (which calls `validate()`) are tested separately, - // as they require special handling. - ) - } - - // New instances of the `mockDelegate` and `delegator` are required for each test case (each - // test case runs in its own instance of the test class). - private val mockDelegate: Response = mock(Response::class.java) - private val delegator = StructuredResponse(X::class.java, mockDelegate) - - @Test - fun allDelegateFunctionsExistInDelegator() { - checkAllDelegation(mockDelegate::class, delegator::class, "toBuilder") - } - - @Test - fun allDelegatorFunctionsExistInDelegate() { - checkAllDelegation(delegator::class, mockDelegate::class) - } - - @Test - fun allDelegatorFunctionsAreTested() { - // There are exceptional test cases for some functions. Most other functions are part of the - // list of those using the parameterized test. A few delegator functions do not delegate, so - // no test function is necessary. - checkAllDelegatorReadFunctionsAreTested( - delegator::class, - delegationTestCases(), - exceptionalTestedFns = setOf("output", "_output", "validate", "isValid"), - nonDelegatingFns = setOf("equals", "hashCode", "toString"), - ) - } - - @ParameterizedTest - @MethodSource("delegationTestCases") - fun `delegation of functions in general`(testCase: DelegationReadTestCase) { - checkOneDelegationRead(delegator, mockDelegate, testCase) - } - - @Test - fun `delegation of output`() { - // Input and output are different types, so this test is an exceptional case. - // `output()` (without an underscore) delegates to `_output()` (with an underscore) - // indirectly via the `output` field initializer. - val input = JsonField.of(listOf(OUTPUT_ITEM)) - `when`(mockDelegate._output()).thenReturn(input) - val output = delegator.output() // Without an underscore. - - verify(mockDelegate, times(1))._output() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output[0].rawOutputItem).isEqualTo(OUTPUT_ITEM) - } - - @Test - fun `delegation of _output`() { - // Input and output are different types, so this test is an exceptional case. - // `_output()` delegates to `_output()` indirectly via the `output` field initializer. - val input = JsonField.of(listOf(OUTPUT_ITEM)) - `when`(mockDelegate._output()).thenReturn(input) - val output = delegator._output() // With an underscore. - - verify(mockDelegate, times(1))._output() - verifyNoMoreInteractions(mockDelegate) - - assertThat(output.getRequired("_output")[0].rawOutputItem).isEqualTo(OUTPUT_ITEM) - } - - @Test - fun `delegation of validate`() { - `when`(mockDelegate._output()).thenReturn(JsonField.of(listOf(OUTPUT_ITEM))) - - delegator.validate() - - // Delegator's `validate()` calls the delegate's `validate()`. Delegate's `_output()` is - // called indirectly via the `output` field initializer. - verify(mockDelegate, times(1))._output() // Indirect - verify(mockDelegate, times(1)).validate() - verifyNoMoreInteractions(mockDelegate) - } - - @Test - fun `delegation of isValid`() { - // `isValid()` calls `validate()` which delegates to `validate()`, so the test is - // more-or-less the same as for `validate()`. - `when`(mockDelegate._output()).thenReturn(JsonField.of(listOf(OUTPUT_ITEM))) - - delegator.isValid() - - verify(mockDelegate, times(1))._output() // Indirect - verify(mockDelegate, times(1)).validate() - verifyNoMoreInteractions(mockDelegate) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseTextConfigTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseTextConfigTest.kt deleted file mode 100644 index f4f348fbb..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/StructuredResponseTextConfigTest.kt +++ /dev/null @@ -1,130 +0,0 @@ -package com.openai.models.responses - -import com.openai.core.DelegationWriteTestCase -import com.openai.core.JSON_FIELD -import com.openai.core.JSON_VALUE -import com.openai.core.MAP -import com.openai.core.OPTIONAL -import com.openai.core.SET -import com.openai.core.STRING -import com.openai.core.X -import com.openai.core.checkAllDelegation -import com.openai.core.checkAllDelegatorWriteFunctionsAreTested -import com.openai.core.checkOneDelegationWrite -import com.openai.core.findDelegationMethod -import com.openai.core.jsonSchemaFromClass -import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.MethodSource -import org.mockito.Mockito.mock -import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.kotlin.times -import org.mockito.kotlin.verify - -/** - * Unit tests for the [StructuredResponseTextConfig] class (delegator) and its delegation of most - * functions to a wrapped [ResponseTextConfig] (delegate). The tests include confirmation of the - * following: - * - All functions in the delegator correspond to a function in the delegate and _vice versa_. - * - All functions in the delegator call their corresponding function in the delegate and only that - * function. - * - A unit test exists for all functions. - * - * There are some exceptions to the above that are handled differently. - */ -internal class StructuredResponseTextConfigTest { - companion object { - private val VERBOSITY = ResponseTextConfig.Verbosity.HIGH - - // The list order follows the declaration order in `ResponseTextConfig.Builder` for easier - // maintenance. - @JvmStatic - private fun builderDelegationTestCases() = - listOf( - // The `format` function is a special case and is handled separately. - DelegationWriteTestCase("verbosity", VERBOSITY), - DelegationWriteTestCase("verbosity", OPTIONAL), - DelegationWriteTestCase("verbosity", JSON_FIELD), - DelegationWriteTestCase("additionalProperties", MAP), - DelegationWriteTestCase("putAdditionalProperty", STRING, JSON_VALUE), - DelegationWriteTestCase("putAllAdditionalProperties", MAP), - DelegationWriteTestCase("removeAdditionalProperty", STRING), - DelegationWriteTestCase("removeAllAdditionalProperties", SET), - ) - } - - // New instances of the `mockBuilderDelegate` and `builderDelegator` are required for each test - // case (each test case runs in its own instance of the test class). - private val mockBuilderDelegate: ResponseTextConfig.Builder = - mock(ResponseTextConfig.Builder::class.java) - private val builderDelegator = - StructuredResponseTextConfig.builder().inject(mockBuilderDelegate) - - @Test - fun allBuilderDelegateFunctionsExistInDelegator() { - checkAllDelegation( - mockBuilderDelegate::class, - builderDelegator::class, - // ************************************************************************************ - // NOTE: THIS TEST EXISTS TO ENSURE THAT WHEN NEW FUNCTIONS ARE ADDED MANUALLY OR VIA - // CODE GEN TO `ResponseTextConfig.Builder`, THAT THOSE FUNCTIONS ARE _ALSO_ ADDED - // _MANUALLY_ TO `StructuredResponseTextConfig.Builder`. FAILURE TO ADD THOSE FUNCTIONS - // RESULTS IN _MISSING_ FUNCTIONALITY WHEN USING STRUCTURED OUTPUTS. EXCEPTIONS ADDED TO - // THIS LIST ARE PRESENT BY DESIGN, NOT BECAUSE THE FUNCTIONS ARE SIMPLY NOT YET - // IMPLEMENTED IN THE DELEGATOR CLASS. - // - // DO NOT ADD EXCEPTIONS TO THIS LIST SIMPLY BECAUSE TESTS ARE FAILING. THE TESTS ARE - // SUPPOSED TO FAIL. ADD THE NEW FUNCTIONS TO `StructuredResponseTextConfig.Builder` - // AND ADD A PARAMETERIZED TEST TO `builderDelegationTestCases` (above) TO ENSURE - // CORRECT DELEGATION BEHAVIOR. - // ************************************************************************************ - - // For Structured Outputs, a new type-safe generic `format` function replaces all - // existing `format` functions, as they are mutually incompatible. This function has its - // own dedicated unit tests. - "format", - ) - } - - @Test - fun allBuilderDelegatorFunctionsExistInDelegate() { - // The delegator implements a different `text` function from those overloads in the delegate - // class. - checkAllDelegation(builderDelegator::class, mockBuilderDelegate::class, "text") - } - - @Test - fun allBuilderDelegatorFunctionsAreTested() { - checkAllDelegatorWriteFunctionsAreTested( - builderDelegator::class, - builderDelegationTestCases(), - exceptionalTestedFns = listOf("format"), - nonDelegatingFns = setOf("build", "wrap", "inject"), - ) - } - - @ParameterizedTest - @MethodSource("builderDelegationTestCases") - fun `delegation of Builder write functions`(testCase: DelegationWriteTestCase) { - checkOneDelegationWrite(builderDelegator, mockBuilderDelegate, testCase) - } - - @Test - fun `delegation of format from class`() { - // Special unit test case as the delegator method signature does not match that of the - // delegate method. - val delegatorTestCase = DelegationWriteTestCase("format", X::class.java) - val delegatorMethod = findDelegationMethod(builderDelegator, delegatorTestCase) - val mockDelegateTestCase = - DelegationWriteTestCase("format", jsonSchemaFromClass(X::class.java)) - val mockDelegateMethod = findDelegationMethod(mockBuilderDelegate, mockDelegateTestCase) - - delegatorMethod.invoke(builderDelegator, delegatorTestCase.inputValues[0]) - - // Verify that the corresponding method on the mock delegate was called exactly once. - verify(mockBuilderDelegate, times(1)).apply { - mockDelegateMethod.invoke(mockBuilderDelegate, mockDelegateTestCase.inputValues[0]) - } - verifyNoMoreInteractions(mockBuilderDelegate) - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/services/ErrorHandlingTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/ErrorHandlingTest.kt deleted file mode 100644 index 5889e9db4..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/services/ErrorHandlingTest.kt +++ /dev/null @@ -1,2042 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.services - -import com.github.tomakehurst.wiremock.client.WireMock.anyUrl -import com.github.tomakehurst.wiremock.client.WireMock.post -import com.github.tomakehurst.wiremock.client.WireMock.status -import com.github.tomakehurst.wiremock.client.WireMock.stubFor -import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo -import com.github.tomakehurst.wiremock.junit5.WireMockTest -import com.openai.client.OpenAIClient -import com.openai.client.okhttp.OpenAIOkHttpClient -import com.openai.core.JsonValue -import com.openai.core.http.Headers -import com.openai.core.jsonMapper -import com.openai.errors.BadRequestException -import com.openai.errors.InternalServerException -import com.openai.errors.NotFoundException -import com.openai.errors.OpenAIException -import com.openai.errors.PermissionDeniedException -import com.openai.errors.RateLimitException -import com.openai.errors.UnauthorizedException -import com.openai.errors.UnexpectedStatusCodeException -import com.openai.errors.UnprocessableEntityException -import com.openai.models.finetuning.jobs.JobCreateParams -import com.openai.models.finetuning.methods.DpoHyperparameters -import com.openai.models.finetuning.methods.DpoMethod -import com.openai.models.finetuning.methods.ReinforcementHyperparameters -import com.openai.models.finetuning.methods.ReinforcementMethod -import com.openai.models.finetuning.methods.SupervisedHyperparameters -import com.openai.models.finetuning.methods.SupervisedMethod -import com.openai.models.graders.gradermodels.StringCheckGrader -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.entry -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import org.junit.jupiter.api.parallel.ResourceLock - -@WireMockTest -@ResourceLock("https://github.com/wiremock/wiremock/issues/169") -internal class ErrorHandlingTest { - - companion object { - - private val ERROR_JSON: JsonValue = - JsonValue.from( - mapOf( - "error" to - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - - private val ERROR_JSON_BYTES: ByteArray = jsonMapper().writeValueAsBytes(ERROR_JSON) - - private const val HEADER_NAME: String = "Error-Header" - - private const val HEADER_VALUE: String = "42" - - private const val NOT_JSON: String = "Not JSON" - } - - private lateinit var client: OpenAIClient - - @BeforeEach - fun beforeEach(wmRuntimeInfo: WireMockRuntimeInfo) { - client = - OpenAIOkHttpClient.builder() - .baseUrl(wmRuntimeInfo.httpBaseUrl) - .apiKey("My API Key") - .adminApiKey("My Admin API Key") - .build() - } - - @Test - fun jobsCreate400() { - val jobService = client.fineTuning().jobs() - stubFor( - post(anyUrl()) - .willReturn( - status(400).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(400) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate400WithRawResponse() { - val jobService = client.fineTuning().jobs().withRawResponse() - stubFor( - post(anyUrl()) - .willReturn( - status(400).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(400) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate401() { - val jobService = client.fineTuning().jobs() - stubFor( - post(anyUrl()) - .willReturn( - status(401).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(401) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate401WithRawResponse() { - val jobService = client.fineTuning().jobs().withRawResponse() - stubFor( - post(anyUrl()) - .willReturn( - status(401).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(401) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate403() { - val jobService = client.fineTuning().jobs() - stubFor( - post(anyUrl()) - .willReturn( - status(403).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(403) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate403WithRawResponse() { - val jobService = client.fineTuning().jobs().withRawResponse() - stubFor( - post(anyUrl()) - .willReturn( - status(403).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(403) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate404() { - val jobService = client.fineTuning().jobs() - stubFor( - post(anyUrl()) - .willReturn( - status(404).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(404) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate404WithRawResponse() { - val jobService = client.fineTuning().jobs().withRawResponse() - stubFor( - post(anyUrl()) - .willReturn( - status(404).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(404) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate422() { - val jobService = client.fineTuning().jobs() - stubFor( - post(anyUrl()) - .willReturn( - status(422).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(422) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate422WithRawResponse() { - val jobService = client.fineTuning().jobs().withRawResponse() - stubFor( - post(anyUrl()) - .willReturn( - status(422).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(422) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate429() { - val jobService = client.fineTuning().jobs() - stubFor( - post(anyUrl()) - .willReturn( - status(429).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(429) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate429WithRawResponse() { - val jobService = client.fineTuning().jobs().withRawResponse() - stubFor( - post(anyUrl()) - .willReturn( - status(429).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(429) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate500() { - val jobService = client.fineTuning().jobs() - stubFor( - post(anyUrl()) - .willReturn( - status(500).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(500) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate500WithRawResponse() { - val jobService = client.fineTuning().jobs().withRawResponse() - stubFor( - post(anyUrl()) - .willReturn( - status(500).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(500) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate999() { - val jobService = client.fineTuning().jobs() - stubFor( - post(anyUrl()) - .willReturn( - status(999).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(999) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreate999WithRawResponse() { - val jobService = client.fineTuning().jobs().withRawResponse() - stubFor( - post(anyUrl()) - .willReturn( - status(999).withHeader(HEADER_NAME, HEADER_VALUE).withBody(ERROR_JSON_BYTES) - ) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e.statusCode()).isEqualTo(999) - assertThat(e.headers().toMap()).contains(entry(HEADER_NAME, listOf(HEADER_VALUE))) - assertThat(e.body()) - .isEqualTo( - JsonValue.from( - mapOf( - "code" to "code", - "message" to "message", - "param" to "param", - "type" to "type", - ) - ) - ) - } - - @Test - fun jobsCreateInvalidJsonBody() { - val jobService = client.fineTuning().jobs() - stubFor( - post(anyUrl()) - .willReturn(status(200).withHeader(HEADER_NAME, HEADER_VALUE).withBody(NOT_JSON)) - ) - - val e = - assertThrows { - jobService.create( - JobCreateParams.builder() - .model(JobCreateParams.Model.GPT_4O_MINI) - .trainingFile("file-abc123") - .hyperparameters( - JobCreateParams.Hyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .addIntegration( - JobCreateParams.Integration.builder() - .wandb( - JobCreateParams.Integration.Wandb.builder() - .project("my-wandb-project") - .entity("entity") - .name("name") - .addTag("custom-tag") - .build() - ) - .build() - ) - .metadata( - JobCreateParams.Metadata.builder() - .putAdditionalProperty("foo", JsonValue.from("string")) - .build() - ) - .method( - JobCreateParams.Method.builder() - .type(JobCreateParams.Method.Type.SUPERVISED) - .dpo( - DpoMethod.builder() - .hyperparameters( - DpoHyperparameters.builder() - .batchSizeAuto() - .betaAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .reinforcement( - ReinforcementMethod.builder() - .grader( - StringCheckGrader.builder() - .input("input") - .name("name") - .operation(StringCheckGrader.Operation.EQ) - .reference("reference") - .build() - ) - .hyperparameters( - ReinforcementHyperparameters.builder() - .batchSizeAuto() - .computeMultiplierAuto() - .evalIntervalAuto() - .evalSamplesAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .reasoningEffort( - ReinforcementHyperparameters.ReasoningEffort - .DEFAULT - ) - .build() - ) - .build() - ) - .supervised( - SupervisedMethod.builder() - .hyperparameters( - SupervisedHyperparameters.builder() - .batchSizeAuto() - .learningRateMultiplierAuto() - .nEpochsAuto() - .build() - ) - .build() - ) - .build() - ) - .seed(42L) - .suffix("x") - .validationFile("file-abc123") - .build() - ) - } - - assertThat(e).hasMessage("Error reading response") - } - - private fun Headers.toMap(): Map> = - mutableMapOf>().also { map -> - names().forEach { map[it] = values(it) } - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/services/ResponseStreamEventValidationTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/ResponseStreamEventValidationTest.kt deleted file mode 100644 index cc0edae2d..000000000 --- a/openai-java-core/src/test/kotlin/com/openai/services/ResponseStreamEventValidationTest.kt +++ /dev/null @@ -1,180 +0,0 @@ -package com.openai.services - -import com.openai.core.ClientOptions -import com.openai.core.RequestOptions -import com.openai.core.http.Headers -import com.openai.core.http.HttpClient -import com.openai.core.http.HttpRequest -import com.openai.core.http.HttpResponse -import com.openai.errors.OpenAIInvalidDataException -import com.openai.models.ChatModel -import com.openai.models.responses.ResponseCreateParams -import com.openai.models.responses.ResponseStreamEvent -import com.openai.services.async.ResponseServiceAsyncImpl -import com.openai.services.blocking.ResponseServiceImpl -import java.io.InputStream -import java.util.concurrent.CompletableFuture -import java.util.concurrent.CompletionException -import java.util.concurrent.Executor -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.EnumSource - -internal class ResponseStreamEventValidationTest { - - @ParameterizedTest - @EnumSource(StreamingCall::class) - fun keepaliveDoesNotBreakValidatedStreams(streamingCall: StreamingCall) { - val result = consume(streamingCall, responseValidation = true, middleType = "keepalive") - - assertThat(result.error).isNull() - assertThat(result.events.map(::eventType)) - .containsExactly( - "response.output_text.delta", - "keepalive", - "response.output_text.delta", - ) - assertThat(result.outputTextDeltas()).containsExactly("before", "after") - } - - @ParameterizedTest - @EnumSource(StreamingCall::class) - fun otherUnknownEventsStillFailValidation(streamingCall: StreamingCall) { - val result = consume(streamingCall, responseValidation = true, middleType = "future.event") - - assertThat(result.error) - .isInstanceOf(OpenAIInvalidDataException::class.java) - .hasMessageContaining("Unknown ResponseStreamEvent") - .hasMessageContaining("type=future.event") - assertThat(result.events.map(::eventType)).containsExactly("response.output_text.delta") - assertThat(result.outputTextDeltas()).containsExactly("before") - } - - @Test - fun validationDisabledRetainsExistingUnknownEventBehavior() { - val result = - consume( - StreamingCall.ASYNC_CREATE, - responseValidation = false, - middleType = "future.event", - ) - - assertThat(result.error).isNull() - assertThat(result.events.map(::eventType)) - .containsExactly( - "response.output_text.delta", - "future.event", - "response.output_text.delta", - ) - assertThat(result.outputTextDeltas()).containsExactly("before", "after") - } - - private fun consume( - streamingCall: StreamingCall, - responseValidation: Boolean, - middleType: String, - ): ConsumeResult { - val clientOptions = - ClientOptions.builder() - .httpClient(FakeSseHttpClient(sseBody(middleType))) - .apiKey("test-api-key") - .responseValidation(responseValidation) - .streamHandlerExecutor(Executor(Runnable::run)) - .build() - val events = mutableListOf() - var error: Throwable? = null - - try { - when (streamingCall) { - StreamingCall.BLOCKING_CREATE -> - ResponseServiceImpl(clientOptions).createStreaming(CREATE_PARAMS).use { - it.stream().forEach(events::add) - } - StreamingCall.BLOCKING_RETRIEVE -> - ResponseServiceImpl(clientOptions).retrieveStreaming("response_id").use { - it.stream().forEach(events::add) - } - StreamingCall.ASYNC_CREATE -> { - val stream = - ResponseServiceAsyncImpl(clientOptions).createStreaming(CREATE_PARAMS) - stream.subscribe(events::add) - stream.onCompleteFuture().join() - } - StreamingCall.ASYNC_RETRIEVE -> { - val stream = - ResponseServiceAsyncImpl(clientOptions).retrieveStreaming("response_id") - stream.subscribe(events::add) - stream.onCompleteFuture().join() - } - } - } catch (throwable: Throwable) { - error = throwable.unwrapCompletionException() - } finally { - clientOptions.close() - } - - return ConsumeResult(events, error) - } - - private class FakeSseHttpClient(private val body: String) : HttpClient { - - override fun execute(request: HttpRequest, requestOptions: RequestOptions): HttpResponse = - response() - - override fun executeAsync( - request: HttpRequest, - requestOptions: RequestOptions, - ): CompletableFuture = CompletableFuture.completedFuture(response()) - - override fun close() {} - - private fun response(): HttpResponse = - object : HttpResponse { - override fun statusCode(): Int = 200 - - override fun headers(): Headers = - Headers.builder().put("Content-Type", "text/event-stream").build() - - override fun body(): InputStream = body.byteInputStream() - - override fun close() {} - } - } - - private data class ConsumeResult(val events: List, val error: Throwable?) { - fun outputTextDeltas(): List = - events.filter { it.isOutputTextDelta() }.map { it.asOutputTextDelta().delta() } - } - - internal enum class StreamingCall { - BLOCKING_CREATE, - BLOCKING_RETRIEVE, - ASYNC_CREATE, - ASYNC_RETRIEVE, - } - - private companion object { - val CREATE_PARAMS = - ResponseCreateParams.builder().input("test").model(ChatModel.GPT_4O_MINI).build() - - fun eventType(event: ResponseStreamEvent): String = - event._json().get().asObject().get().getValue("type").asString().get() - - fun Throwable.unwrapCompletionException(): Throwable = - if (this is CompletionException && cause != null) cause!! else this - - fun sseBody(middleType: String): String = - """ - data: {"type":"response.output_text.delta","content_index":0,"delta":"before","item_id":"item_1","logprobs":[],"output_index":0,"sequence_number":1} - - data: {"type":"$middleType","sequence_number":2} - - data: {"type":"response.output_text.delta","content_index":0,"delta":"after","item_id":"item_1","logprobs":[],"output_index":0,"sequence_number":3} - - data: [DONE] - - """ - .trimIndent() - } -} diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/CompletionServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/CompletionServiceAsyncTest.kt index ecba3cb57..4d17c2efe 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/CompletionServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/CompletionServiceAsyncTest.kt @@ -7,7 +7,6 @@ import com.openai.client.okhttp.OpenAIOkHttpClientAsync import com.openai.core.JsonValue import com.openai.models.chat.completions.ChatCompletionStreamOptions import com.openai.models.completions.CompletionCreateParams -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -60,7 +59,6 @@ internal class CompletionServiceAsyncTest { completion.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun createStreaming() { val client = diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/ImageServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/ImageServiceAsyncTest.kt index ec667e75a..a26647da5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/ImageServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/ImageServiceAsyncTest.kt @@ -8,7 +8,6 @@ import com.openai.models.images.ImageCreateVariationParams import com.openai.models.images.ImageEditParams import com.openai.models.images.ImageGenerateParams import com.openai.models.images.ImageModel -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -75,7 +74,6 @@ internal class ImageServiceAsyncTest { imagesResponse.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun editStreaming() { val client = @@ -146,7 +144,6 @@ internal class ImageServiceAsyncTest { imagesResponse.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun generateStreaming() { val client = diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/ResponseServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/ResponseServiceAsyncTest.kt index 50ec0c7d0..ccd7aa286 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/ResponseServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/ResponseServiceAsyncTest.kt @@ -17,7 +17,6 @@ import com.openai.models.responses.ResponsePrompt import com.openai.models.responses.ResponseRetrieveParams import com.openai.models.responses.ResponseTextConfig import com.openai.models.responses.ToolChoiceOptions -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -157,7 +156,6 @@ internal class ResponseServiceAsyncTest { response.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun createStreaming() { val client = @@ -316,7 +314,6 @@ internal class ResponseServiceAsyncTest { response.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun retrieveStreaming() { val client = diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/WebhookServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/WebhookServiceAsyncTest.kt index f696091f0..aca67e9ac 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/WebhookServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/WebhookServiceAsyncTest.kt @@ -5,60 +5,14 @@ package com.openai.services.async import com.openai.TestServerExtension import com.openai.client.okhttp.OpenAIOkHttpClientAsync import com.openai.core.http.Headers -import com.openai.models.webhooks.WebhookVerificationParams -import java.time.Clock -import java.time.Instant -import java.time.ZoneOffset -import kotlin.test.assertTrue import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows import org.junit.jupiter.api.extension.ExtendWith @ExtendWith(TestServerExtension::class) internal class WebhookServiceAsyncTest { - private val testPayload = - """{"id": "evt_685c059ae3a481909bdc86819b066fb6", "object": "event", "created_at": 1750861210, "type": "response.completed", "data": {"id": "resp_123"}}""" - private val testSecret = "whsec_RdvaYFYUXuIFuEbvZHwMfYFhUf7aMYjYcmM24+Aj40c=" - private val fixedTimestamp = "1750861210" - private val webhookId = "wh_685c059ae39c8190af8c71ed1022a24d" - private val validSignatureForSecret = "v1,gUAg4R2hWouRZqRQG4uJypNS8YK885G838+EHb4nKBY=" - private val fixedClock = - Clock.fixed(Instant.ofEpochSecond(fixedTimestamp.toLong()), ZoneOffset.UTC) - - @Test - fun unwrapWithValidSignatureAndSecret() { - val client = - OpenAIOkHttpClientAsync.builder() - .baseUrl(TestServerExtension.BASE_URL) - .apiKey("My API Key") - .clock(fixedClock) - .build() - val webhookServiceAsync = client.webhooks() - - val headers = - Headers.builder() - .put("webhook-signature", validSignatureForSecret) - .put("webhook-timestamp", fixedTimestamp) - .put("webhook-id", webhookId) - .build() - - val event = - webhookServiceAsync - .unwrap( - WebhookVerificationParams.builder() - .payload(testPayload) - .headers(headers) - .secret(testSecret) - .build() - ) - .validate() - - assertTrue(event.isResponseCompleted()) - } - @Test - fun unwrapWithoutSecretShouldThrow() { + fun unwrap() { val client = OpenAIOkHttpClientAsync.builder() .apiKey("My API Key") @@ -66,17 +20,11 @@ internal class WebhookServiceAsyncTest { .build() val webhookServiceAsync = client.webhooks() - val headers = - Headers.builder() - .put("webhook-signature", validSignatureForSecret) - .put("webhook-timestamp", fixedTimestamp) - .put("webhook-id", webhookId) - .build() + val payload = + "{\"id\":\"id\",\"created_at\":0,\"data\":{\"id\":\"id\"},\"type\":\"batch.cancelled\",\"object\":\"event\"}" + val webhookSecret = "whsec_c2VjcmV0Cg==" + val headers = Headers.builder().build() - assertThrows { - webhookServiceAsync.unwrap( - WebhookVerificationParams.builder().payload(testPayload).headers(headers).build() - ) - } + webhookServiceAsync.unwrap(payload).validate() } } diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncTest.kt index f432a4626..f97da51cf 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncTest.kt @@ -8,7 +8,6 @@ import com.openai.models.audio.AudioModel import com.openai.models.audio.AudioResponseFormat import com.openai.models.audio.transcriptions.TranscriptionCreateParams import com.openai.models.audio.transcriptions.TranscriptionInclude -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -48,7 +47,6 @@ internal class TranscriptionServiceAsyncTest { transcription.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun createStreaming() { val client = diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ResponseServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ResponseServiceAsyncTest.kt index 3817d8406..fe6fcdd94 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ResponseServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ResponseServiceAsyncTest.kt @@ -297,7 +297,10 @@ internal class ResponseServiceAsyncTest { .build() ) - val onCompleteFuture = betaResponseStreamResponse.subscribe {}.onCompleteFuture() + val onCompleteFuture = + betaResponseStreamResponse + .subscribe { betaResponse -> betaResponse.validate() } + .onCompleteFuture() onCompleteFuture.get() } diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ThreadServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ThreadServiceAsyncTest.kt index 20ff76611..979920fe1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ThreadServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ThreadServiceAsyncTest.kt @@ -11,7 +11,6 @@ import com.openai.models.beta.threads.AssistantToolChoiceOption import com.openai.models.beta.threads.ThreadCreateAndRunParams import com.openai.models.beta.threads.ThreadCreateParams import com.openai.models.beta.threads.ThreadUpdateParams -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -285,7 +284,6 @@ internal class ThreadServiceAsyncTest { run.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun createAndRunStreaming() { val client = diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/RunServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/RunServiceAsyncTest.kt index a88151547..979807d1b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/RunServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/RunServiceAsyncTest.kt @@ -15,7 +15,6 @@ import com.openai.models.beta.threads.runs.RunRetrieveParams import com.openai.models.beta.threads.runs.RunSubmitToolOutputsParams import com.openai.models.beta.threads.runs.RunUpdateParams import com.openai.models.beta.threads.runs.steps.RunStepInclude -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -85,7 +84,6 @@ internal class RunServiceAsyncTest { run.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun createStreaming() { val client = @@ -259,7 +257,6 @@ internal class RunServiceAsyncTest { run.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun submitToolOutputsStreaming() { val client = diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsyncTest.kt index 3b159b2a9..8caa8bc12 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsyncTest.kt @@ -17,7 +17,6 @@ import com.openai.models.chat.completions.ChatCompletionPredictionContent import com.openai.models.chat.completions.ChatCompletionStreamOptions import com.openai.models.chat.completions.ChatCompletionToolChoiceOption import com.openai.models.chat.completions.ChatCompletionUpdateParams -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -176,7 +175,6 @@ internal class ChatCompletionServiceAsyncTest { chatCompletion.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun createStreaming() { val client = diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/CompletionServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/CompletionServiceTest.kt index d814b5f1c..48511deda 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/CompletionServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/CompletionServiceTest.kt @@ -7,7 +7,6 @@ import com.openai.client.okhttp.OpenAIOkHttpClient import com.openai.core.JsonValue import com.openai.models.chat.completions.ChatCompletionStreamOptions import com.openai.models.completions.CompletionCreateParams -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -59,7 +58,6 @@ internal class CompletionServiceTest { completion.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun createStreaming() { val client = diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ImageServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ImageServiceTest.kt index e697709f8..5b60e40b1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ImageServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ImageServiceTest.kt @@ -8,7 +8,6 @@ import com.openai.models.images.ImageCreateVariationParams import com.openai.models.images.ImageEditParams import com.openai.models.images.ImageGenerateParams import com.openai.models.images.ImageModel -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -73,7 +72,6 @@ internal class ImageServiceTest { imagesResponse.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun editStreaming() { val client = @@ -143,7 +141,6 @@ internal class ImageServiceTest { imagesResponse.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun generateStreaming() { val client = diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ResponseServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ResponseServiceTest.kt index bc4457c38..ecadfd57d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ResponseServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ResponseServiceTest.kt @@ -17,7 +17,6 @@ import com.openai.models.responses.ResponsePrompt import com.openai.models.responses.ResponseRetrieveParams import com.openai.models.responses.ResponseTextConfig import com.openai.models.responses.ToolChoiceOptions -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -156,7 +155,6 @@ internal class ResponseServiceTest { response.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun createStreaming() { val client = @@ -314,7 +312,6 @@ internal class ResponseServiceTest { response.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun retrieveStreaming() { val client = diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/WebhookServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/WebhookServiceTest.kt index 66fe79485..9985d161a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/WebhookServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/WebhookServiceTest.kt @@ -3,75 +3,16 @@ package com.openai.services.blocking import com.openai.TestServerExtension -import com.openai.client.OpenAIClient import com.openai.client.okhttp.OpenAIOkHttpClient import com.openai.core.http.Headers -import com.openai.errors.InvalidWebhookSignatureException -import com.openai.models.webhooks.WebhookVerificationParams -import java.time.Clock -import java.time.Duration -import java.time.Instant -import java.time.ZoneOffset -import kotlin.test.assertTrue import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows import org.junit.jupiter.api.extension.ExtendWith @ExtendWith(TestServerExtension::class) internal class WebhookServiceTest { - // Standardized test data (matches TypeScript implementation) - private val testPayload = - """{"id": "evt_685c059ae3a481909bdc86819b066fb6", "object": "event", "created_at": 1750861210, "type": "response.completed", "data": {"id": "resp_123"}}""" - private val testSecret = "whsec_RdvaYFYUXuIFuEbvZHwMfYFhUf7aMYjYcmM24+Aj40c=" - - // Use a fixed timestamp for consistent testing (matches the created_at in payload) - private val fixedTimestamp = "1750861210" - private val webhookId = "wh_685c059ae39c8190af8c71ed1022a24d" - - // Pre-computed valid signatures for consistent testing - private val validSignatureForSecret = "v1,gUAg4R2hWouRZqRQG4uJypNS8YK885G838+EHb4nKBY=" - - // Fixed clock for deterministic testing - private val fixedClock = - Clock.fixed(Instant.ofEpochSecond(fixedTimestamp.toLong()), ZoneOffset.UTC) - - private fun createClientWithFixedClock(): OpenAIClient { - return OpenAIOkHttpClient.builder() - .baseUrl(TestServerExtension.BASE_URL) - .apiKey("My API Key") - .clock(fixedClock) - .build() - } - @Test - fun unwrapWithValidSignatureAndSecret() { - val client = createClientWithFixedClock() - val webhookService = client.webhooks() - - val headers = - Headers.builder() - .put("webhook-signature", validSignatureForSecret) - .put("webhook-timestamp", fixedTimestamp) - .put("webhook-id", webhookId) - .build() - - val event = - webhookService - .unwrap( - WebhookVerificationParams.builder() - .payload(testPayload) - .headers(headers) - .secret(testSecret) - .build() - ) - .validate() - - assertTrue(event.isResponseCompleted()) - } - - @Test - fun unwrapWithoutSecretShouldThrow() { + fun unwrap() { val client = OpenAIOkHttpClient.builder() .apiKey("My API Key") @@ -79,199 +20,11 @@ internal class WebhookServiceTest { .build() val webhookService = client.webhooks() - val exception = - assertThrows { - webhookService.unwrap( - WebhookVerificationParams.builder() - .payload(testPayload) - .headers(Headers.builder().build()) - // No secret provided, should throw error - .build() - ) - } - - assertTrue(exception.message!!.contains("The webhook secret must either be set")) - } - - @Test - fun verifySignatureWithInvalidSecret() { - val client = - OpenAIOkHttpClient.builder() - .baseUrl(TestServerExtension.BASE_URL) - .apiKey("My API Key") - .build() - val webhookService = client.webhooks() - - val headers = - Headers.builder() - .put("webhook-signature", "v1,invalid_signature") - .put("webhook-timestamp", fixedTimestamp) - .put("webhook-id", webhookId) - .build() - - assertThrows { - webhookService.verifySignature( - WebhookVerificationParams.builder() - .payload(testPayload) - .headers(headers) - .secret("invalid_secret") - .build() - ) - } - } - - @Test - fun verifySignatureWithOldTimestamp() { - val client = - OpenAIOkHttpClient.builder() - .baseUrl(TestServerExtension.BASE_URL) - .apiKey("My API Key") - .build() - val webhookService = client.webhooks() - - // Use a timestamp that's older than 5 minutes (300 seconds) - val oldTimestamp = (1643723400 - 400).toString() - val headers = - Headers.builder() - .put("webhook-signature", "v1,signature") - .put("webhook-timestamp", oldTimestamp) - .put("webhook-id", webhookId) - .build() - - assertThrows { - webhookService.verifySignature( - WebhookVerificationParams.builder() - .payload(testPayload) - .headers(headers) - .secret(testSecret) - .build() - ) - } - } - - @Test - fun verifySignatureWithInvalidTimestampFormat() { - val client = createClientWithFixedClock() - val webhookService = client.webhooks() - - val headers = - Headers.builder() - .put("webhook-signature", "v1,invalid_signature") - .put("webhook-timestamp", "not_a_number") - .put("webhook-id", webhookId) - .build() - - assertThrows { - webhookService.verifySignature( - WebhookVerificationParams.builder() - .payload(testPayload) - .headers(headers) - .secret(testSecret) - .build() - ) - } - } - - @Test - fun verifySignatureWithValidSignature() { - val client = createClientWithFixedClock() - val webhookService = client.webhooks() - - val headers = - Headers.builder() - .put("webhook-signature", validSignatureForSecret) - .put("webhook-timestamp", fixedTimestamp) - .put("webhook-id", webhookId) - .build() - - // Should not throw any exception when using correct signature - webhookService.verifySignature( - WebhookVerificationParams.builder() - .payload(testPayload) - .headers(headers) - .secret(testSecret) - .build() - ) - } - - @Test - fun verifySignatureWithCustomTolerance() { - val client = createClientWithFixedClock() - val webhookService = client.webhooks() - - // Use a timestamp that's very old (should fail with default tolerance) - val oldTimestamp = (1750861210 - 400).toString() // 400 seconds before our payload timestamp - - val headers = - Headers.builder() - .put( - "webhook-signature", - validSignatureForSecret, - ) // This won't match old timestamp but we're testing time validation - .put("webhook-timestamp", oldTimestamp) - .put("webhook-id", webhookId) - .build() - - // Should fail due to old timestamp - assertThrows { - webhookService.verifySignature( - WebhookVerificationParams.builder() - .payload(testPayload) - .headers(headers) - .secret(testSecret) - .tolerance(Duration.ofMinutes(5)) - .build() - ) - } - } - - @Test - fun verifySignatureWithMultipleSignatures() { - val client = createClientWithFixedClock() - val webhookService = client.webhooks() - - // Create a signature header with multiple signatures: one valid, one invalid - val multipleSignatures = "v1,invalid_signature $validSignatureForSecret" - val headers = - Headers.builder() - .put("webhook-signature", multipleSignatures) - .put("webhook-timestamp", fixedTimestamp) - .put("webhook-id", webhookId) - .build() - - // Should not throw any exception when at least one signature is correct - webhookService.verifySignature( - WebhookVerificationParams.builder() - .payload(testPayload) - .headers(headers) - .secret(testSecret) - .build() - ) - } - - @Test - fun verifySignatureWithAllInvalidMultipleSignatures() { - val client = createClientWithFixedClock() - val webhookService = client.webhooks() - - // Create a signature header with multiple invalid signatures - val multipleInvalidSignatures = "v1,invalid_signature1 v1,invalid_signature2" - val headers = - Headers.builder() - .put("webhook-signature", multipleInvalidSignatures) - .put("webhook-timestamp", fixedTimestamp) - .put("webhook-id", webhookId) - .build() + val payload = + "{\"id\":\"id\",\"created_at\":0,\"data\":{\"id\":\"id\"},\"type\":\"batch.cancelled\",\"object\":\"event\"}" + val webhookSecret = "whsec_c2VjcmV0Cg==" + val headers = Headers.builder().build() - // Should throw exception when all signatures are invalid - assertThrows { - webhookService.verifySignature( - WebhookVerificationParams.builder() - .payload(testPayload) - .headers(headers) - .secret(testSecret) - .build() - ) - } + webhookService.unwrap(payload).validate() } } diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/TranscriptionServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/TranscriptionServiceTest.kt index 9abf0d6b6..0e1c796f4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/TranscriptionServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/TranscriptionServiceTest.kt @@ -8,7 +8,6 @@ import com.openai.models.audio.AudioModel import com.openai.models.audio.AudioResponseFormat import com.openai.models.audio.transcriptions.TranscriptionCreateParams import com.openai.models.audio.transcriptions.TranscriptionInclude -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -47,7 +46,6 @@ internal class TranscriptionServiceTest { transcription.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun createStreaming() { val client = diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ResponseServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ResponseServiceTest.kt index 172a277f8..100013e41 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ResponseServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ResponseServiceTest.kt @@ -296,7 +296,9 @@ internal class ResponseServiceTest { .build() ) - betaResponseStreamResponse.use { check(betaResponseStreamResponse.stream().count() > 0) } + betaResponseStreamResponse.use { + betaResponseStreamResponse.stream().forEach { betaResponse -> betaResponse.validate() } + } } @Test diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ThreadServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ThreadServiceTest.kt index c6a012e25..4b49e9df8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ThreadServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ThreadServiceTest.kt @@ -11,7 +11,6 @@ import com.openai.models.beta.threads.AssistantToolChoiceOption import com.openai.models.beta.threads.ThreadCreateAndRunParams import com.openai.models.beta.threads.ThreadCreateParams import com.openai.models.beta.threads.ThreadUpdateParams -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -280,7 +279,6 @@ internal class ThreadServiceTest { run.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun createAndRunStreaming() { val client = diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/RunServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/RunServiceTest.kt index 60c4d000b..df826d484 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/RunServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/RunServiceTest.kt @@ -15,7 +15,6 @@ import com.openai.models.beta.threads.runs.RunRetrieveParams import com.openai.models.beta.threads.runs.RunSubmitToolOutputsParams import com.openai.models.beta.threads.runs.RunUpdateParams import com.openai.models.beta.threads.runs.steps.RunStepInclude -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -84,7 +83,6 @@ internal class RunServiceTest { run.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun createStreaming() { val client = @@ -251,7 +249,6 @@ internal class RunServiceTest { run.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun submitToolOutputsStreaming() { val client = diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/chat/ChatCompletionServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/chat/ChatCompletionServiceTest.kt index fb613e361..ce98d3b6e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/chat/ChatCompletionServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/chat/ChatCompletionServiceTest.kt @@ -17,7 +17,6 @@ import com.openai.models.chat.completions.ChatCompletionPredictionContent import com.openai.models.chat.completions.ChatCompletionStreamOptions import com.openai.models.chat.completions.ChatCompletionToolChoiceOption import com.openai.models.chat.completions.ChatCompletionUpdateParams -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -175,7 +174,6 @@ internal class ChatCompletionServiceTest { chatCompletion.validate() } - @Disabled("Prism does not support SSE streaming mock responses") @Test fun createStreaming() { val client = diff --git a/openai-java-example/build.gradle.kts b/openai-java-example/build.gradle.kts deleted file mode 100644 index 4644b2f91..000000000 --- a/openai-java-example/build.gradle.kts +++ /dev/null @@ -1,32 +0,0 @@ -plugins { - id("openai.java") - application -} - -repositories { - mavenCentral() -} - -dependencies { - implementation(project(":openai-java")) - implementation(project(":openai-java-bedrock")) - // Keep Azure Identity's Netty runtime aligned on a secure release. - implementation(platform("io.netty:netty-bom:4.1.136.Final")) - implementation("com.azure:azure-identity:1.18.4") -} - -tasks.withType().configureEach { - // Allow using more modern APIs, like `List.of` and `Map.of`, in examples. - options.release.set(11) -} - -application { - // Use `./gradlew :openai-java-example:run` to run `Main` - // Use `./gradlew :openai-java-example:run -Pexample=Something` to run `SomethingExample` - mainClass = "com.openai.example.${ - if (project.hasProperty("example")) - "${project.property("example")}Example" - else - "Main" - }" -} diff --git a/openai-java-example/src/main/java/com/openai/example/AudioTranscriptionsAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/AudioTranscriptionsAsyncExample.java deleted file mode 100644 index 86dfaa1c5..000000000 --- a/openai-java-example/src/main/java/com/openai/example/AudioTranscriptionsAsyncExample.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.models.audio.AudioModel; -import com.openai.models.audio.transcriptions.TranscriptionCreateParams; -import java.nio.file.Path; -import java.nio.file.Paths; - -public final class AudioTranscriptionsAsyncExample { - private AudioTranscriptionsAsyncExample() {} - - public static void main(String[] args) throws Exception { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - ClassLoader classloader = Thread.currentThread().getContextClassLoader(); - Path path = Paths.get(classloader.getResource("sports.wav").toURI()); - - TranscriptionCreateParams createParams = TranscriptionCreateParams.builder() - .file(path) - .model(AudioModel.WHISPER_1) - .build(); - - client.audio() - .transcriptions() - .create(createParams) - .thenAccept(response -> - System.out.println(response.asTranscription().text())) - .join(); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/AudioTranscriptionsExample.java b/openai-java-example/src/main/java/com/openai/example/AudioTranscriptionsExample.java deleted file mode 100644 index 7a7476b0f..000000000 --- a/openai-java-example/src/main/java/com/openai/example/AudioTranscriptionsExample.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.audio.AudioModel; -import com.openai.models.audio.transcriptions.Transcription; -import com.openai.models.audio.transcriptions.TranscriptionCreateParams; -import java.nio.file.Path; -import java.nio.file.Paths; - -public final class AudioTranscriptionsExample { - private AudioTranscriptionsExample() {} - - public static void main(String[] args) throws Exception { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ClassLoader classloader = Thread.currentThread().getContextClassLoader(); - Path path = Paths.get(classloader.getResource("sports.wav").toURI()); - - TranscriptionCreateParams createParams = TranscriptionCreateParams.builder() - .file(path) - .model(AudioModel.WHISPER_1) - .build(); - - Transcription transcription = - client.audio().transcriptions().create(createParams).asTranscription(); - System.out.println(transcription.text()); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/AudioTranscriptionsVttExample.java b/openai-java-example/src/main/java/com/openai/example/AudioTranscriptionsVttExample.java deleted file mode 100644 index 2d6357091..000000000 --- a/openai-java-example/src/main/java/com/openai/example/AudioTranscriptionsVttExample.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.audio.AudioModel; -import com.openai.models.audio.AudioResponseFormat; -import com.openai.models.audio.transcriptions.Transcription; -import com.openai.models.audio.transcriptions.TranscriptionCreateParams; -import java.nio.file.Path; -import java.nio.file.Paths; - -public final class AudioTranscriptionsVttExample { - private AudioTranscriptionsVttExample() {} - - public static void main(String[] args) throws Exception { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ClassLoader classloader = Thread.currentThread().getContextClassLoader(); - Path path = Paths.get(classloader.getResource("sports.wav").toURI()); - - TranscriptionCreateParams createParams = TranscriptionCreateParams.builder() - .file(path) - .model(AudioModel.WHISPER_1) - .responseFormat(AudioResponseFormat.VTT) - .build(); - - Transcription transcription = - client.audio().transcriptions().create(createParams).asTranscription(); - System.out.println(transcription.text()); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/AzureEntraIdExample.java b/openai-java-example/src/main/java/com/openai/example/AzureEntraIdExample.java deleted file mode 100644 index e273aa259..000000000 --- a/openai-java-example/src/main/java/com/openai/example/AzureEntraIdExample.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.openai.example; - -import com.azure.identity.AuthenticationUtil; -import com.azure.identity.DefaultAzureCredentialBuilder; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.credential.BearerTokenCredential; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -public final class AzureEntraIdExample { - private AzureEntraIdExample() {} - - public static void main(String[] args) { - OpenAIClient client = OpenAIOkHttpClient.builder() - // Gets the API key from the `AZURE_OPENAI_KEY` environment variable - .fromEnv() - // Set the Azure Entra ID - .credential(BearerTokenCredential.create(AuthenticationUtil.getBearerTokenSupplier( - new DefaultAzureCredentialBuilder().build(), "https://cognitiveservices.azure.com/.default"))) - .build(); - - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_4_1106_PREVIEW) - .maxCompletionTokens(2048) - .addDeveloperMessage("Make sure you mention Stainless!") - .addUserMessage("Tell me a story about building the best SDK!") - .build(); - - client.chat().completions().create(createParams).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/AzureKeyCredentialExample.java b/openai-java-example/src/main/java/com/openai/example/AzureKeyCredentialExample.java deleted file mode 100644 index b8a4550c2..000000000 --- a/openai-java-example/src/main/java/com/openai/example/AzureKeyCredentialExample.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.openai.example; - -import com.openai.azure.credential.AzureApiKeyCredential; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -public class AzureKeyCredentialExample { - private AzureKeyCredentialExample() {} - - public static void main(String[] args) { - OpenAIClient client = OpenAIOkHttpClient.builder() - .baseUrl("{your-azure-openai-endpoint}") - .credential(AzureApiKeyCredential.create("{your-azure-openai-key}")) - .build(); - - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_4_1106_PREVIEW) - .maxCompletionTokens(2048) - .addSystemMessage("Make sure you mention Stainless!") - .addUserMessage("Tell me a story about building the best SDK!") - .build(); - - client.chat().completions().create(createParams).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/AzureLegacyPathsEnabledExample.java b/openai-java-example/src/main/java/com/openai/example/AzureLegacyPathsEnabledExample.java deleted file mode 100644 index 7cef6c50d..000000000 --- a/openai-java-example/src/main/java/com/openai/example/AzureLegacyPathsEnabledExample.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.openai.example; - -import com.openai.azure.AzureOpenAIServiceVersion; -import com.openai.azure.AzureUrlPathMode; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -public final class AzureLegacyPathsEnabledExample { - private AzureLegacyPathsEnabledExample() {} - - public static void main(String[] args) { - OpenAIClient client = OpenAIOkHttpClient.builder() - // Gets the API key from the `AZURE_OPENAI_KEY` environment variable - .fromEnv() - .azureServiceVersion(AzureOpenAIServiceVersion.getV2024_05_01_PREVIEW()) - // Enabling Azure legacy paths will result in the deployment name being passed as a path parameter - .azureUrlPathMode(AzureUrlPathMode.LEGACY) - .build(); - - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_4_1106_PREVIEW) - .maxCompletionTokens(2048) - .addSystemMessage("Make sure you mention Stainless!") // Developer doesn't work - .addUserMessage("Tell me a story about building the best SDK!") - .build(); - - client.chat().completions().create(createParams).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/AzureUnifiedEndpointExample.java b/openai-java-example/src/main/java/com/openai/example/AzureUnifiedEndpointExample.java deleted file mode 100644 index c4f71c0c5..000000000 --- a/openai-java-example/src/main/java/com/openai/example/AzureUnifiedEndpointExample.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -public final class AzureUnifiedEndpointExample { - private AzureUnifiedEndpointExample() {} - - public static void main(String[] args) { - OpenAIClient client = OpenAIOkHttpClient.builder() - // Gets the API key from the `AZURE_OPENAI_KEY` environment variable - .fromEnv() - .build(); - - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_4_1106_PREVIEW) - .maxCompletionTokens(2048) - .addSystemMessage("Make sure you mention Stainless!") // Developer doesn't work - .addUserMessage("Tell me a story about building the best SDK!") - .build(); - - client.chat().completions().create(createParams).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/BatchProcessingAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/BatchProcessingAsyncExample.java deleted file mode 100644 index cd398194d..000000000 --- a/openai-java-example/src/main/java/com/openai/example/BatchProcessingAsyncExample.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.models.batches.Batch; -import com.openai.models.batches.BatchCreateParams; -import com.openai.models.batches.BatchCreateParams.CompletionWindow; -import com.openai.models.batches.BatchCreateParams.Endpoint; -import com.openai.models.files.FileCreateParams; -import com.openai.models.files.FileObject; -import com.openai.models.files.FilePurpose; -import java.io.IOException; -import java.io.UncheckedIOException; -import java.net.URISyntaxException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; - -public final class BatchProcessingAsyncExample { - private BatchProcessingAsyncExample() {} - - public static void main(String[] args) throws URISyntaxException { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - ClassLoader classloader = Thread.currentThread().getContextClassLoader(); - Path requestsPath = Paths.get(classloader.getResource("requests.jsonl").toURI()); - - FileCreateParams fileParams = FileCreateParams.builder() - .purpose(FilePurpose.BATCH) - .file(requestsPath) - .build(); - CompletableFuture fileFuture = client.files().create(fileParams); - - CompletableFuture batchFuture = fileFuture.thenComposeAsync(file -> { - BatchCreateParams batchParams = BatchCreateParams.builder() - .inputFileId(file.id()) - .endpoint(Endpoint.V1_CHAT_COMPLETIONS) - .completionWindow(CompletionWindow._24H) - .build(); - return client.batches().create(batchParams); - }); - - Executor delayedExecutor = CompletableFuture.delayedExecutor(1, TimeUnit.MINUTES); - batchFuture = pollBatch(client, batchFuture, delayedExecutor); - - batchFuture - .thenCompose( - batch -> client.files().content(batch.outputFileId().orElseThrow())) - .thenAccept(response -> { - try (response) { - response.body().transferTo(System.out); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - }) - .join(); - } - - private static CompletableFuture pollBatch( - OpenAIClientAsync client, CompletableFuture batchFuture, Executor delayedExecutor) { - return batchFuture.thenComposeAsync(batch -> { - if (batch.outputFileId().isPresent()) { - return CompletableFuture.completedFuture(batch); - } - - System.out.println("Polling..."); - return pollBatch( - client, - CompletableFuture.supplyAsync(() -> null, delayedExecutor) - .thenComposeAsync((unused) -> client.batches().retrieve(batch.id())), - delayedExecutor); - }); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/BatchProcessingExample.java b/openai-java-example/src/main/java/com/openai/example/BatchProcessingExample.java deleted file mode 100644 index 6a6906c6c..000000000 --- a/openai-java-example/src/main/java/com/openai/example/BatchProcessingExample.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.http.HttpResponse; -import com.openai.models.batches.Batch; -import com.openai.models.batches.BatchCreateParams; -import com.openai.models.batches.BatchCreateParams.CompletionWindow; -import com.openai.models.batches.BatchCreateParams.Endpoint; -import com.openai.models.files.FileCreateParams; -import com.openai.models.files.FileObject; -import com.openai.models.files.FilePurpose; -import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.file.Path; -import java.nio.file.Paths; - -public final class BatchProcessingExample { - private BatchProcessingExample() {} - - public static void main(String[] args) throws URISyntaxException, InterruptedException, IOException { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ClassLoader classloader = Thread.currentThread().getContextClassLoader(); - Path requestsPath = Paths.get(classloader.getResource("requests.jsonl").toURI()); - - FileCreateParams fileParams = FileCreateParams.builder() - .purpose(FilePurpose.BATCH) - .file(requestsPath) - .build(); - FileObject file = client.files().create(fileParams); - - BatchCreateParams batchParams = BatchCreateParams.builder() - .inputFileId(file.id()) - .endpoint(Endpoint.V1_CHAT_COMPLETIONS) - .completionWindow(CompletionWindow._24H) - .build(); - Batch batch = client.batches().create(batchParams); - - while (batch.outputFileId().isEmpty()) { - System.out.println("Polling..."); - Thread.sleep(60_000); - batch = client.batches().retrieve(batch.id()); - } - - try (HttpResponse response = client.files().content(batch.outputFileId().orElseThrow())) { - response.body().transferTo(System.out); - } - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/BedrockResponsesExample.java b/openai-java-example/src/main/java/com/openai/example/BedrockResponsesExample.java deleted file mode 100644 index 318521cf2..000000000 --- a/openai-java-example/src/main/java/com/openai/example/BedrockResponsesExample.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.BedrockOpenAIOkHttpClient; -import com.openai.models.responses.ResponseCreateParams; - -public final class BedrockResponsesExample { - private BedrockResponsesExample() {} - - public static void main(String[] args) { - // Uses the standard AWS credential chain, including ~/.aws/credentials and AWS_PROFILE. - OpenAIClient client = - BedrockOpenAIOkHttpClient.builder().awsRegion("us-east-1").build(); - - ResponseCreateParams params = ResponseCreateParams.builder() - .input("Say hello from OpenAI on Bedrock") - .model("openai.gpt-5.5") - .build(); - - client.responses().create(params).output().stream() - .flatMap(item -> item.message().stream()) - .flatMap(message -> message.content().stream()) - .flatMap(content -> content.outputText().stream()) - .forEach(outputText -> System.out.println(outputText.text())); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/BedrockResponsesStreamingAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/BedrockResponsesStreamingAsyncExample.java deleted file mode 100644 index cb2492571..000000000 --- a/openai-java-example/src/main/java/com/openai/example/BedrockResponsesStreamingAsyncExample.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.BedrockOpenAIOkHttpClient; -import com.openai.models.responses.ResponseCreateParams; - -public final class BedrockResponsesStreamingAsyncExample { - private BedrockResponsesStreamingAsyncExample() {} - - public static void main(String[] args) { - OpenAIClientAsync client = BedrockOpenAIOkHttpClient.builder() - .awsRegion("us-east-1") - .build() - .async(); - - ResponseCreateParams params = ResponseCreateParams.builder() - .input("Count to five") - .model("openai.gpt-5.5") - .build(); - - client.responses() - .createStreaming(params) - .subscribe(event -> event.outputTextDelta().ifPresent(delta -> System.out.print(delta.delta()))) - .onCompleteFuture() - .join(); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/CompletionsAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/CompletionsAsyncExample.java deleted file mode 100644 index 751e94fa9..000000000 --- a/openai-java-example/src/main/java/com/openai/example/CompletionsAsyncExample.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -public final class CompletionsAsyncExample { - private CompletionsAsyncExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .maxCompletionTokens(2048) - .addDeveloperMessage("Make sure you mention Stainless!") - .addUserMessage("Tell me a story about building the best SDK!") - .build(); - - client.chat() - .completions() - .create(createParams) - .thenAccept(completion -> completion.choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println)) - .join(); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/CompletionsConversationAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/CompletionsConversationAsyncExample.java deleted file mode 100644 index 6acc3160b..000000000 --- a/openai-java-example/src/main/java/com/openai/example/CompletionsConversationAsyncExample.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.openai.example; - -import static java.util.stream.Collectors.toList; - -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletion; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import com.openai.models.chat.completions.ChatCompletionMessage; -import java.util.List; -import java.util.concurrent.CompletableFuture; - -public final class CompletionsConversationAsyncExample { - private CompletionsConversationAsyncExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - // Use a builder so that we can append more messages to it below. - // Each time we call .build()` we get an immutable object that's unaffected by future mutations of the builder. - ChatCompletionCreateParams.Builder createParamsBuilder = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .maxCompletionTokens(2048) - .addDeveloperMessage("Make sure you mention Stainless!") - .addUserMessage("Tell me a story about building the best SDK!"); - - CompletableFuture future = CompletableFuture.completedFuture(null); - for (int i = 0; i < 4; i++) { - final int index = i; - future = future.thenComposeAsync( - unused -> client.chat().completions().create(createParamsBuilder.build())) - .thenAccept(completion -> { - List messages = completion.choices().stream() - .map(ChatCompletion.Choice::message) - .collect(toList()); - - messages.stream() - .flatMap(message -> message.content().stream()) - .forEach(System.out::println); - - System.out.println("\n-----------------------------------\n"); - - messages.forEach(createParamsBuilder::addMessage); - createParamsBuilder - .addDeveloperMessage("Be as snarky as possible when replying!" + "!".repeat(index)) - .addUserMessage("But why?" + "?".repeat(index)); - }); - } - - future.join(); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/CompletionsConversationExample.java b/openai-java-example/src/main/java/com/openai/example/CompletionsConversationExample.java deleted file mode 100644 index d8331bc77..000000000 --- a/openai-java-example/src/main/java/com/openai/example/CompletionsConversationExample.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.openai.example; - -import static java.util.stream.Collectors.toList; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletion; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import com.openai.models.chat.completions.ChatCompletionMessage; -import java.util.List; - -public final class CompletionsConversationExample { - private CompletionsConversationExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - // Use a builder so that we can append more messages to it below. - // Each time we call .build()` we get an immutable object that's unaffected by future mutations of the builder. - ChatCompletionCreateParams.Builder createParamsBuilder = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .maxCompletionTokens(2048) - .addDeveloperMessage("Make sure you mention Stainless!") - .addUserMessage("Tell me a story about building the best SDK!"); - - for (int i = 0; i < 4; i++) { - List messages = - client.chat().completions().create(createParamsBuilder.build()).choices().stream() - .map(ChatCompletion.Choice::message) - .collect(toList()); - - messages.stream().flatMap(message -> message.content().stream()).forEach(System.out::println); - - System.out.println("\n-----------------------------------\n"); - - messages.forEach(createParamsBuilder::addMessage); - createParamsBuilder - .addDeveloperMessage("Be as snarky as possible when replying!" + "!".repeat(i)) - .addUserMessage("But why?" + "?".repeat(i)); - } - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/CompletionsExample.java b/openai-java-example/src/main/java/com/openai/example/CompletionsExample.java deleted file mode 100644 index b93a23ea1..000000000 --- a/openai-java-example/src/main/java/com/openai/example/CompletionsExample.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -public final class CompletionsExample { - private CompletionsExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .maxCompletionTokens(2048) - .addDeveloperMessage("Make sure you mention Stainless!") - .addUserMessage("Tell me a story about building the best SDK!") - .build(); - - client.chat().completions().create(createParams).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/CompletionsFileExample.java b/openai-java-example/src/main/java/com/openai/example/CompletionsFileExample.java deleted file mode 100644 index 7ec50c523..000000000 --- a/openai-java-example/src/main/java/com/openai/example/CompletionsFileExample.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionContentPart; -import com.openai.models.chat.completions.ChatCompletionContentPartText; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import com.openai.models.files.FileCreateParams; -import com.openai.models.files.FileObject; -import com.openai.models.files.FilePurpose; -import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; - -public final class CompletionsFileExample { - private CompletionsFileExample() {} - - public static void main(String[] args) throws URISyntaxException, InterruptedException, IOException { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ClassLoader classloader = Thread.currentThread().getContextClassLoader(); - Path pdfPath = Paths.get(classloader.getResource("pdflatex-image.pdf").toURI()); - - FileObject logoFileObject = client.files() - .create(FileCreateParams.builder() - .file(pdfPath) - .purpose(FilePurpose.USER_DATA) - .build()); - - ChatCompletionContentPart.File logoFile = ChatCompletionContentPart.File.builder() - .file(ChatCompletionContentPart.File.FileObject.builder() - .fileId(logoFileObject.id()) - .build()) - .build(); - ChatCompletionContentPart logoContentPart = ChatCompletionContentPart.ofFile(logoFile); - - ChatCompletionContentPart questionContentPart = - ChatCompletionContentPart.ofText(ChatCompletionContentPartText.builder() - .text("Describe this image.") - .build()); - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_4O_MINI) - .maxCompletionTokens(2048) - .addUserMessageOfArrayOfContentParts(List.of(questionContentPart, logoContentPart)) - .build(); - - client.chat().completions().create(createParams).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/CompletionsImageUrlExample.java b/openai-java-example/src/main/java/com/openai/example/CompletionsImageUrlExample.java deleted file mode 100644 index 89fa5490c..000000000 --- a/openai-java-example/src/main/java/com/openai/example/CompletionsImageUrlExample.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionContentPart; -import com.openai.models.chat.completions.ChatCompletionContentPartImage; -import com.openai.models.chat.completions.ChatCompletionContentPartText; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import java.io.IOException; -import java.net.URISyntaxException; -import java.util.Base64; -import java.util.List; - -public final class CompletionsImageUrlExample { - private CompletionsImageUrlExample() {} - - public static void main(String[] args) throws URISyntaxException, InterruptedException, IOException { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ClassLoader classloader = Thread.currentThread().getContextClassLoader(); - byte[] logoBytes = classloader.getResourceAsStream("logo.png").readAllBytes(); - String logoBase64Url = "data:image/jpeg;base64," + Base64.getEncoder().encodeToString(logoBytes); - - ChatCompletionContentPart logoContentPart = - ChatCompletionContentPart.ofImageUrl(ChatCompletionContentPartImage.builder() - .imageUrl(ChatCompletionContentPartImage.ImageUrl.builder() - .url(logoBase64Url) - .build()) - .build()); - ChatCompletionContentPart questionContentPart = - ChatCompletionContentPart.ofText(ChatCompletionContentPartText.builder() - .text("Describe this image.") - .build()); - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_4O_MINI) - .maxCompletionTokens(2048) - .addUserMessageOfArrayOfContentParts(List.of(questionContentPart, logoContentPart)) - .build(); - - client.chat().completions().create(createParams).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/CompletionsStreamingAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/CompletionsStreamingAsyncExample.java deleted file mode 100644 index 63bbbfd77..000000000 --- a/openai-java-example/src/main/java/com/openai/example/CompletionsStreamingAsyncExample.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -public final class CompletionsStreamingAsyncExample { - private CompletionsStreamingAsyncExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .maxCompletionTokens(2048) - .addDeveloperMessage("Make sure you mention Stainless!") - .addUserMessage("Tell me a story about building the best SDK!") - .build(); - - client.chat() - .completions() - .createStreaming(createParams) - .subscribe(completion -> completion.choices().stream() - .flatMap(choice -> choice.delta().content().stream()) - .forEach(System.out::print)) - .onCompleteFuture() - .join(); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/CompletionsStreamingCancellationAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/CompletionsStreamingCancellationAsyncExample.java deleted file mode 100644 index 95235676b..000000000 --- a/openai-java-example/src/main/java/com/openai/example/CompletionsStreamingCancellationAsyncExample.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.core.http.AsyncStreamResponse; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionChunk; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -public final class CompletionsStreamingCancellationAsyncExample { - private CompletionsStreamingCancellationAsyncExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .maxCompletionTokens(2048) - .addDeveloperMessage("Make sure you mention Stainless!") - .addUserMessage("Tell me a story about building the best SDK!") - .build(); - - AsyncStreamResponse streamResponse = - client.chat().completions().createStreaming(createParams); - streamResponse - .subscribe(completion -> completion.choices().stream() - .flatMap(choice -> choice.delta().content().stream()) - .forEach(text -> { - System.out.print(text); - if (text.contains("SDK")) { - // Close the stream early. - streamResponse.close(); - } - })) - .onCompleteFuture() - .join(); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/CompletionsStreamingCancellationExample.java b/openai-java-example/src/main/java/com/openai/example/CompletionsStreamingCancellationExample.java deleted file mode 100644 index b25260b70..000000000 --- a/openai-java-example/src/main/java/com/openai/example/CompletionsStreamingCancellationExample.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.http.StreamResponse; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionChunk; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -public final class CompletionsStreamingCancellationExample { - private CompletionsStreamingCancellationExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .maxCompletionTokens(2048) - .addDeveloperMessage("Make sure you mention Stainless!") - .addUserMessage("Tell me a story about building the best SDK!") - .build(); - - try (StreamResponse streamResponse = - client.chat().completions().createStreaming(createParams)) { - streamResponse.stream() - .flatMap(completion -> completion.choices().stream()) - .flatMap(choice -> choice.delta().content().stream()) - .forEach(text -> { - System.out.print(text); - if (text.contains("SDK")) { - // Close the stream early. - streamResponse.close(); - } - }); - } - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/CompletionsStreamingExample.java b/openai-java-example/src/main/java/com/openai/example/CompletionsStreamingExample.java deleted file mode 100644 index c28cba515..000000000 --- a/openai-java-example/src/main/java/com/openai/example/CompletionsStreamingExample.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.http.StreamResponse; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionChunk; -import com.openai.models.chat.completions.ChatCompletionCreateParams; - -public final class CompletionsStreamingExample { - private CompletionsStreamingExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .maxCompletionTokens(2048) - .addDeveloperMessage("Make sure you mention Stainless!") - .addUserMessage("Tell me a story about building the best SDK!") - .build(); - - try (StreamResponse streamResponse = - client.chat().completions().createStreaming(createParams)) { - streamResponse.stream() - .flatMap(completion -> completion.choices().stream()) - .flatMap(choice -> choice.delta().content().stream()) - .forEach(System.out::print); - } - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/EmbeddingsAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/EmbeddingsAsyncExample.java deleted file mode 100644 index 443673463..000000000 --- a/openai-java-example/src/main/java/com/openai/example/EmbeddingsAsyncExample.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.models.embeddings.EmbeddingCreateParams; -import com.openai.models.embeddings.EmbeddingModel; - -public final class EmbeddingsAsyncExample { - private EmbeddingsAsyncExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - EmbeddingCreateParams createParams = EmbeddingCreateParams.builder() - .input("The quick brown fox jumped over the lazy dog") - .model(EmbeddingModel.TEXT_EMBEDDING_3_SMALL) - .build(); - - client.embeddings().create(createParams).thenAccept(System.out::println).join(); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/EmbeddingsExample.java b/openai-java-example/src/main/java/com/openai/example/EmbeddingsExample.java deleted file mode 100644 index 63df18d77..000000000 --- a/openai-java-example/src/main/java/com/openai/example/EmbeddingsExample.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.embeddings.EmbeddingCreateParams; -import com.openai.models.embeddings.EmbeddingModel; - -public final class EmbeddingsExample { - private EmbeddingsExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - EmbeddingCreateParams createParams = EmbeddingCreateParams.builder() - .input("The quick brown fox jumped over the lazy dog") - .model(EmbeddingModel.TEXT_EMBEDDING_3_SMALL) - .build(); - - System.out.println(client.embeddings().create(createParams)); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/FunctionCallingAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/FunctionCallingAsyncExample.java deleted file mode 100644 index 394a12d8d..000000000 --- a/openai-java-example/src/main/java/com/openai/example/FunctionCallingAsyncExample.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.openai.example; - -import static com.openai.core.ObjectMappers.jsonMapper; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.core.JsonObject; -import com.openai.core.JsonValue; -import com.openai.models.ChatModel; -import com.openai.models.FunctionDefinition; -import com.openai.models.FunctionParameters; -import com.openai.models.chat.completions.*; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -public final class FunctionCallingAsyncExample { - private FunctionCallingAsyncExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - ChatCompletionCreateParams.Builder createParamsBuilder = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .maxCompletionTokens(2048) - .addTool(ChatCompletionFunctionTool.builder() - .function(FunctionDefinition.builder() - .name("get-sdk-quality") - .description("Gets the quality of the given SDK.") - .parameters(FunctionParameters.builder() - .putAdditionalProperty("type", JsonValue.from("object")) - .putAdditionalProperty( - "properties", JsonValue.from(Map.of("name", Map.of("type", "string")))) - .putAdditionalProperty("required", JsonValue.from(List.of("name"))) - .putAdditionalProperty("additionalProperties", JsonValue.from(false)) - .build()) - .build()) - .build()) - .addUserMessage("How good are the following SDKs: OpenAI Java SDK, Unknown Company SDK"); - - client.chat() - .completions() - .create(createParamsBuilder.build()) - .thenComposeAsync(completion -> { - completion.choices().stream() - .map(ChatCompletion.Choice::message) - // Add each assistant message onto the builder so that we keep track of the conversation for - // asking a - // follow-up question later. - .peek(createParamsBuilder::addMessage) - .flatMap(message -> { - message.content().ifPresent(System.out::println); - return message.toolCalls().stream().flatMap(Collection::stream); - }) - .forEach(toolCall -> { - String content = - callFunction(toolCall.asFunction().function()); - // Add the tool call result to the conversation. - createParamsBuilder.addMessage(ChatCompletionToolMessageParam.builder() - .toolCallId(toolCall.asFunction().id()) - .content(content) - .build()); - System.out.println(content); - }); - System.out.println(); - - // Ask a follow-up question about the function call result. - createParamsBuilder.addUserMessage("Why do you say that?"); - return client.chat().completions().create(createParamsBuilder.build()); - }) - .thenAccept(completion -> completion.choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println)) - .join(); - } - - private static String callFunction(ChatCompletionMessageFunctionToolCall.Function function) { - if (!function.name().equals("get-sdk-quality")) { - throw new IllegalArgumentException("Unknown function: " + function.name()); - } - - JsonValue arguments; - try { - arguments = JsonValue.from(jsonMapper().readTree(function.arguments())); - } catch (JsonProcessingException e) { - throw new IllegalArgumentException("Bad function arguments", e); - } - - String sdkName = ((JsonObject) arguments).values().get("name").asStringOrThrow(); - if (sdkName.contains("OpenAI")) { - return sdkName + ": It's robust and polished!"; - } - - return sdkName + ": *shrug*"; - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/FunctionCallingExample.java b/openai-java-example/src/main/java/com/openai/example/FunctionCallingExample.java deleted file mode 100644 index 79d4442e2..000000000 --- a/openai-java-example/src/main/java/com/openai/example/FunctionCallingExample.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.openai.example; - -import com.fasterxml.jackson.annotation.JsonClassDescription; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.*; -import java.util.Collection; - -public final class FunctionCallingExample { - private FunctionCallingExample() {} - - @JsonClassDescription("Gets the quality of the given SDK.") - static class GetSdkQuality { - @JsonPropertyDescription("The name of the SDK.") - public String name; - - public SdkQuality execute() { - return new SdkQuality(name, name.contains("OpenAI") ? "It's robust and polished!" : "*shrug*"); - } - } - - static class SdkQuality { - public String quality; - - public SdkQuality(String name, String evaluation) { - quality = name + ": " + evaluation; - } - } - - @JsonClassDescription("Gets the review score (out of 10) for the named SDK.") - static class GetSdkScore { - public String name; - - public int execute() { - return name.contains("OpenAI") ? 10 : 3; - } - } - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - // Use a `Builder` so that more messages can be appended below. When `build()` is called, it - // creates an immutable object that is unaffected by future mutations of the builder. - ChatCompletionCreateParams.Builder createParamsBuilder = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .maxCompletionTokens(2048) - .addTool(GetSdkQuality.class) - .addTool(GetSdkScore.class) - .addUserMessage("How good are the following SDKs and what do reviewers say: " - + "OpenAI Java SDK, Unknown Company SDK."); - - client.chat().completions().create(createParamsBuilder.build()).choices().stream() - .map(ChatCompletion.Choice::message) - // Add each assistant message onto the builder so that we keep track of the - // conversation for asking a follow-up question later. - .peek(createParamsBuilder::addMessage) - .flatMap(message -> { - message.content().ifPresent(System.out::println); - return message.toolCalls().stream().flatMap(Collection::stream); - }) - .forEach(toolCall -> { - Object result = callFunction(toolCall.asFunction().function()); - // Add the tool call result to the conversation. - createParamsBuilder.addMessage(ChatCompletionToolMessageParam.builder() - .toolCallId(toolCall.asFunction().id()) - .contentAsJson(result) - .build()); - }); - - // Ask a follow-up question about the function call result. - createParamsBuilder.addUserMessage("Why do you say that?"); - client.chat().completions().create(createParamsBuilder.build()).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println); - } - - private static Object callFunction(ChatCompletionMessageFunctionToolCall.Function function) { - switch (function.name()) { - case "GetSdkQuality": - return function.arguments(GetSdkQuality.class).execute(); - case "GetSdkScore": - return function.arguments(GetSdkScore.class).execute(); - default: - throw new IllegalArgumentException("Unknown function: " + function.name()); - } - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/FunctionCallingRawExample.java b/openai-java-example/src/main/java/com/openai/example/FunctionCallingRawExample.java deleted file mode 100644 index 29b2b0490..000000000 --- a/openai-java-example/src/main/java/com/openai/example/FunctionCallingRawExample.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.openai.example; - -import static com.openai.core.ObjectMappers.jsonMapper; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.JsonObject; -import com.openai.core.JsonValue; -import com.openai.models.ChatModel; -import com.openai.models.FunctionDefinition; -import com.openai.models.FunctionParameters; -import com.openai.models.chat.completions.*; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -public final class FunctionCallingRawExample { - private FunctionCallingRawExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - // Use a builder so that we can append more messages to it below. - // Each time we call .build()` we get an immutable object that's unaffected by future mutations of the builder. - ChatCompletionCreateParams.Builder createParamsBuilder = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .maxCompletionTokens(2048) - .addTool(ChatCompletionFunctionTool.builder() - .function(FunctionDefinition.builder() - .name("get-sdk-quality") - .description("Gets the quality of the given SDK.") - .parameters(FunctionParameters.builder() - .putAdditionalProperty("type", JsonValue.from("object")) - .putAdditionalProperty( - "properties", JsonValue.from(Map.of("name", Map.of("type", "string")))) - .putAdditionalProperty("required", JsonValue.from(List.of("name"))) - .putAdditionalProperty("additionalProperties", JsonValue.from(false)) - .build()) - .build()) - .build()) - .addUserMessage("How good are the following SDKs: OpenAI Java SDK, Unknown Company SDK"); - - client.chat().completions().create(createParamsBuilder.build()).choices().stream() - .map(ChatCompletion.Choice::message) - // Add each assistant message onto the builder so that we keep track of the conversation for asking a - // follow-up question later. - .peek(createParamsBuilder::addMessage) - .flatMap(message -> { - message.content().ifPresent(System.out::println); - return message.toolCalls().stream().flatMap(Collection::stream); - }) - .forEach(toolCall -> { - String result = callFunction(toolCall.asFunction().function()); - // Add the tool call result to the conversation. - createParamsBuilder.addMessage(ChatCompletionToolMessageParam.builder() - .toolCallId(toolCall.asFunction().id()) - .content(result) - .build()); - System.out.println(result); - }); - System.out.println(); - - // Ask a follow-up question about the function call result. - createParamsBuilder.addUserMessage("Why do you say that?"); - client.chat().completions().create(createParamsBuilder.build()).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println); - } - - private static String callFunction(ChatCompletionMessageFunctionToolCall.Function function) { - if (!function.name().equals("get-sdk-quality")) { - throw new IllegalArgumentException("Unknown function: " + function.name()); - } - - JsonValue arguments; - try { - arguments = JsonValue.from(jsonMapper().readTree(function.arguments())); - } catch (JsonProcessingException e) { - throw new IllegalArgumentException("Bad function arguments", e); - } - - String sdkName = ((JsonObject) arguments).values().get("name").asStringOrThrow(); - if (sdkName.contains("OpenAI")) { - return sdkName + ": It's robust and polished!"; - } - - return sdkName + ": *shrug*"; - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ImageEditingExample.java b/openai-java-example/src/main/java/com/openai/example/ImageEditingExample.java deleted file mode 100644 index 8625fa022..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ImageEditingExample.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.MultipartField; -import com.openai.models.images.ImageEditParams; -import com.openai.models.images.ImageEditParams.Image; -import com.openai.models.images.ImageModel; -import java.io.InputStream; - -public final class ImageEditingExample { - private ImageEditingExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The OPENAI_API_KEY environment variable - // - The OPENAI_BASE_URL and AZURE_OPENAI_KEY environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ClassLoader classloader = Thread.currentThread().getContextClassLoader(); - String alohaFilename = "aloha.png"; - InputStream alohaStream = classloader.getResourceAsStream(alohaFilename); - String maskFilename = "aloha-mask.png"; - InputStream maskStream = classloader.getResourceAsStream(maskFilename); - - ImageEditParams editParams = ImageEditParams.builder() - .responseFormat(ImageEditParams.ResponseFormat.URL) - .image(MultipartField.builder() - .value( - // Or use `Image.ofInputStreams` and pass a `List` to edit multiple images. - Image.ofInputStream(alohaStream)) - .contentType("image/png") - .filename(alohaFilename) - .build()) - .mask(MultipartField.builder() - .value(maskStream) - .contentType("image/png") - .filename(maskFilename) - .build()) - .prompt("Fill the mask area with sand.") - .model(ImageModel.DALL_E_2) - .n(1) - .build(); - - client.images().edit(editParams).data().orElseThrow().stream() - .flatMap(image -> image.url().stream()) - .forEach(System.out::println); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ImageGenerationExample.java b/openai-java-example/src/main/java/com/openai/example/ImageGenerationExample.java deleted file mode 100644 index bb9369b99..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ImageGenerationExample.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.images.ImageGenerateParams; -import com.openai.models.images.ImageModel; -import java.io.IOException; - -public final class ImageGenerationExample { - private ImageGenerationExample() {} - - public static void main(String[] args) throws IOException { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ImageGenerateParams imageGenerateParams = ImageGenerateParams.builder() - .responseFormat(ImageGenerateParams.ResponseFormat.URL) - .prompt("Two cats playing ping-pong") - .model(ImageModel.DALL_E_2) - .size(ImageGenerateParams.Size._512X512) - .n(1) - .build(); - - client.images().generate(imageGenerateParams).data().orElseThrow().stream() - .flatMap(image -> image.url().stream()) - .forEach(System.out::println); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ImageStreamingExample.java b/openai-java-example/src/main/java/com/openai/example/ImageStreamingExample.java deleted file mode 100644 index 8110fe10b..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ImageStreamingExample.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.http.StreamResponse; -import com.openai.models.images.*; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Base64; - -public final class ImageStreamingExample { - private ImageStreamingExample() {} - - public static void main(String[] args) throws IOException { - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - System.out.println("Starting image streaming example..."); - - ImageGenerateParams params = ImageGenerateParams.builder() - .model(ImageModel.GPT_IMAGE_1) - .prompt("A cute baby sea otter") - .n(1L) - .size(ImageGenerateParams.Size._1024X1024) - .partialImages(3L) - .build(); - - StreamResponse stream = client.images().generateStreaming(params); - - stream.stream().forEach(event -> { - try { - if (event.isGenerationPartialImage()) { - ImageGenPartialImageEvent partialEvent = event.asGenerationPartialImage(); - System.out.printf(" Partial image %d/3 received%n", partialEvent.partialImageIndex() + 1); - System.out.printf( - " Size: %d characters (base64)%n", - partialEvent.b64Json().length()); - - // Save partial image to file - String filename = String.format("partial_%d.png", partialEvent.partialImageIndex() + 1); - saveBase64Image(partialEvent.b64Json(), filename); - Path absolutePath = Paths.get(filename).toAbsolutePath(); - System.out.printf(" 💾 Saved to: %s%n", absolutePath); - - } else if (event.isGenerationCompleted()) { - ImageGenCompletedEvent completedEvent = event.asGenerationCompleted(); - System.out.println("\n✅ Final image completed!"); - System.out.printf( - " Size: %d characters (base64)%n", - completedEvent.b64Json().length()); - - // Save final image to file - String filename = "final_image.png"; - saveBase64Image(completedEvent.b64Json(), filename); - Path absolutePath = Paths.get(filename).toAbsolutePath(); - System.out.printf(" 💾 Saved to: %s%n", absolutePath); - - } else { - System.out.println("❓ Unknown event received"); - } - } catch (IOException e) { - System.err.println("Error saving image: " + e.getMessage()); - } - }); - - System.out.println("Image streaming completed!"); - } - - private static void saveBase64Image(String b64Data, String filename) throws IOException { - byte[] imageData = Base64.getDecoder().decode(b64Data); - Files.write(Paths.get(filename), imageData); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/Main.java b/openai-java-example/src/main/java/com/openai/example/Main.java deleted file mode 100644 index c2bb9f0e5..000000000 --- a/openai-java-example/src/main/java/com/openai/example/Main.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.openai.example; - -public final class Main { - private Main() {} - - public static void main(String[] args) throws Exception { - CompletionsExample.main(args); - CompletionsStreamingExample.main(args); - AudioTranscriptionsExample.main(args); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ModelListAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/ModelListAsyncExample.java deleted file mode 100644 index 3233ef08c..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ModelListAsyncExample.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.models.models.ModelListPageAsync; -import java.util.concurrent.CompletableFuture; - -public final class ModelListAsyncExample { - private ModelListAsyncExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - CompletableFuture pageFuture = client.models().list(); - pageFuture - .thenComposeAsync(page -> page.autoPager() - .subscribe(model -> System.out.println(model.id())) - .onCompleteFuture()) - .join(); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ModelListExample.java b/openai-java-example/src/main/java/com/openai/example/ModelListExample.java deleted file mode 100644 index 5c382e30b..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ModelListExample.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; - -public final class ModelListExample { - private ModelListExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - client.models().list().autoPager().forEach(model -> System.out.println(model.id())); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ModerationsAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/ModerationsAsyncExample.java deleted file mode 100644 index 382d66361..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ModerationsAsyncExample.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.models.moderations.ModerationCreateParams; -import com.openai.models.moderations.ModerationModel; - -public final class ModerationsAsyncExample { - private ModerationsAsyncExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - ModerationCreateParams createParams = ModerationCreateParams.builder() - .input("I want to kill them.") - .model(ModerationModel.OMNI_MODERATION_LATEST) - .build(); - - client.moderations() - .create(createParams) - .thenAccept(System.out::println) - .join(); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ModerationsExample.java b/openai-java-example/src/main/java/com/openai/example/ModerationsExample.java deleted file mode 100644 index a87e183bb..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ModerationsExample.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.moderations.ModerationCreateParams; -import com.openai.models.moderations.ModerationModel; - -public final class ModerationsExample { - private ModerationsExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ModerationCreateParams createParams = ModerationCreateParams.builder() - .input("I want to kill them.") - .model(ModerationModel.OMNI_MODERATION_LATEST) - .build(); - - System.out.println(client.moderations().create(createParams)); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/MutualTlsExample.java b/openai-java-example/src/main/java/com/openai/example/MutualTlsExample.java deleted file mode 100644 index c6dc38aa9..000000000 --- a/openai-java-example/src/main/java/com/openai/example/MutualTlsExample.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import java.io.InputStream; -import java.net.URI; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.security.KeyStore; -import java.util.Arrays; -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; -import javax.net.ssl.TrustManagerFactory; -import javax.net.ssl.X509TrustManager; - -/** - * Configures mTLS through Java's native JSSE APIs and the SDK's existing OkHttp TLS hooks. - * - *

The PKCS#12 key store must contain the client private key and its certificate chain, ordered - * leaf first followed by any intermediate certificates. The OpenAI API key is still required. - * OpenAI certificate-chain verification requires separate enablement; without it, the leaf must be - * directly signed by an active CA certificate uploaded to OpenAI. - */ -public final class MutualTlsExample { - private static final String DEFAULT_MTLS_BASE_URL = "https://mtls.api.openai.com/v1"; - - private MutualTlsExample() {} - - public static void main(String[] args) throws Exception { - String apiKey = requireConfiguredValue("openai.apiKey", "OPENAI_API_KEY"); - String baseUrl = configuredValue("openai.baseUrl", "OPENAI_BASE_URL"); - if (baseUrl == null) { - baseUrl = DEFAULT_MTLS_BASE_URL; - } else if (baseUrl.isEmpty()) { - throw new IllegalStateException("openai.baseUrl or OPENAI_BASE_URL must not be empty for OpenAI mTLS"); - } - requireHttpsBaseUrl(baseUrl); - String organization = configuredValue("openai.orgId", "OPENAI_ORG_ID"); - String project = configuredValue("openai.projectId", "OPENAI_PROJECT_ID"); - Path keyStorePath = Paths.get(requireEnv("OPENAI_MTLS_KEYSTORE")); - char[] password = requireEnv("OPENAI_MTLS_KEYSTORE_PASSWORD").toCharArray(); - - KeyStore clientKeyStore = KeyStore.getInstance("PKCS12"); - KeyManagerFactory keyManagers = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); - try { - try (InputStream input = Files.newInputStream(keyStorePath)) { - clientKeyStore.load(input, password); - } - keyManagers.init(clientKeyStore, password); - } finally { - Arrays.fill(password, '\0'); - } - - OpenAIClient client = null; - try { - // Client identity and server trust are separate. A null KeyStore retains the JVM's - // normal server-trust configuration. - TrustManagerFactory trustManagers = - TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); - trustManagers.init((KeyStore) null); - X509TrustManager trustManager = findX509TrustManager(trustManagers); - - SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(keyManagers.getKeyManagers(), new TrustManager[] {trustManager}, null); - - client = OpenAIOkHttpClient.builder() - // Select an OpenAI bearer credential explicitly; do not fall back to Azure. - .apiKey(apiKey) - // Retain the organization and project scope from normal SDK configuration. - .organization(organization) - .project(project) - // An explicit system property or environment variable preserves EU/custom routing. - .baseUrl(baseUrl) - // Avoid presenting the client identity to a redirect target. - .followRedirects(false) - .sslSocketFactory(sslContext.getSocketFactory()) - .trustManager(trustManager) - .build(); - - client.files().list(); - } finally { - if (client != null) { - client.close(); - } - } - } - - private static X509TrustManager findX509TrustManager(TrustManagerFactory trustManagerFactory) { - return Arrays.stream(trustManagerFactory.getTrustManagers()) - .filter(X509TrustManager.class::isInstance) - .map(X509TrustManager.class::cast) - .findFirst() - .orElseThrow(() -> new IllegalStateException( - "The default TrustManagerFactory did not provide an X509TrustManager")); - } - - private static String requireConfiguredValue(String propertyName, String environmentVariable) { - String value = configuredValue(propertyName, environmentVariable); - if (value == null || value.isEmpty()) { - throw new IllegalStateException( - propertyName + " or " + environmentVariable + " must be set for OpenAI mTLS"); - } - return value; - } - - private static String configuredValue(String propertyName, String environmentVariable) { - String value = System.getProperty(propertyName); - return value != null ? value : System.getenv(environmentVariable); - } - - private static void requireHttpsBaseUrl(String baseUrl) { - URI baseUri; - try { - baseUri = URI.create(baseUrl); - } catch (IllegalArgumentException ignored) { - // URI parse exceptions include the rejected value, which may contain credentials. - throw new IllegalStateException("OpenAI mTLS requires a valid HTTPS base URL"); - } - if (!"https".equalsIgnoreCase(baseUri.getScheme()) || baseUri.getRawAuthority() == null) { - throw new IllegalStateException("OpenAI mTLS requires a valid HTTPS base URL"); - } - } - - private static String requireEnv(String name) { - String value = System.getenv(name); - if (value == null || value.isEmpty()) { - throw new IllegalStateException(name + " must be set"); - } - return value; - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesAsyncExample.java deleted file mode 100644 index 9c44b7c8d..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesAsyncExample.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.models.ChatModel; -import com.openai.models.responses.ResponseCreateParams; - -public final class ResponsesAsyncExample { - private ResponsesAsyncExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - ResponseCreateParams createParams = ResponseCreateParams.builder() - .input("Tell me a story about building the best SDK!") - .model(ChatModel.GPT_4O) - .build(); - - client.responses() - .create(createParams) - .thenAccept(response -> response.output().stream() - .flatMap(item -> item.message().stream()) - .flatMap(message -> message.content().stream()) - .flatMap(content -> content.outputText().stream()) - .forEach(outputText -> System.out.println(outputText.text()))) - .join(); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesConversationExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesConversationExample.java deleted file mode 100644 index 35bab96c1..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesConversationExample.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.openai.example; - -import static java.util.stream.Collectors.toList; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.responses.EasyInputMessage; -import com.openai.models.responses.ResponseCreateParams; -import com.openai.models.responses.ResponseInputItem; -import com.openai.models.responses.ResponseOutputMessage; -import java.util.ArrayList; -import java.util.List; - -public final class ResponsesConversationExample { - private ResponsesConversationExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - List inputItems = new ArrayList<>(); - inputItems.add(ResponseInputItem.ofEasyInputMessage(EasyInputMessage.builder() - .role(EasyInputMessage.Role.USER) - .content("Tell me a story about building the best SDK!") - .build())); - - ResponseCreateParams createParams = ResponseCreateParams.builder() - .inputOfResponse(inputItems) - .model(ChatModel.GPT_4O) - .build(); - - for (int i = 0; i < 4; i++) { - List messages = client.responses().create(createParams).output().stream() - .flatMap(item -> item.message().stream()) - .collect(toList()); - - messages.stream() - .flatMap(message -> message.content().stream()) - .flatMap(content -> content.outputText().stream()) - .forEach(outputText -> System.out.println(outputText.text())); - - System.out.println("\n-----------------------------------\n"); - - messages.forEach(message -> inputItems.add(ResponseInputItem.ofResponseOutputMessage(message))); - inputItems.add(ResponseInputItem.ofEasyInputMessage(EasyInputMessage.builder() - .role(EasyInputMessage.Role.USER) - .content("But why?" + "?".repeat(i)) - .build())); - createParams = createParams.toBuilder().inputOfResponse(inputItems).build(); - } - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesExample.java deleted file mode 100644 index 8ea419201..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesExample.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.responses.ResponseCreateParams; - -public final class ResponsesExample { - private ResponsesExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ResponseCreateParams createParams = ResponseCreateParams.builder() - .input("Tell me a story about building the best SDK!") - .model(ChatModel.GPT_4O) - .build(); - - client.responses().create(createParams).output().stream() - .flatMap(item -> item.message().stream()) - .flatMap(message -> message.content().stream()) - .flatMap(content -> content.outputText().stream()) - .forEach(outputText -> System.out.println(outputText.text())); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesFunctionCallingExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesFunctionCallingExample.java deleted file mode 100644 index 2e52e417d..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesFunctionCallingExample.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.openai.example; - -import com.fasterxml.jackson.annotation.JsonClassDescription; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.responses.ResponseCreateParams; -import com.openai.models.responses.ResponseFunctionToolCall; -import com.openai.models.responses.ResponseInputItem; -import java.util.ArrayList; -import java.util.List; - -public final class ResponsesFunctionCallingExample { - private ResponsesFunctionCallingExample() {} - - @JsonClassDescription("Gets the quality of the given SDK.") - static class GetSdkQuality { - @JsonPropertyDescription("The name of the SDK.") - public String name; - - public SdkQuality execute() { - return new SdkQuality(name, name.contains("OpenAI") ? "It's robust and polished!" : "*shrug*"); - } - } - - static class SdkQuality { - public String quality; - - public SdkQuality(String name, String evaluation) { - quality = name + ": " + evaluation; - } - } - - @JsonClassDescription("Gets the review score (out of 10) for the given SDK.") - static class GetSdkScore { - public String name; - - public int execute() { - return name.contains("OpenAI") ? 10 : 3; - } - } - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - List inputs = new ArrayList<>(); - - inputs.add(ResponseInputItem.ofMessage(ResponseInputItem.Message.builder() - .addInputTextContent("What is the quality of the following SDKs and what do reviewers say: " - + "OpenAI Java SDK, Unknown Company SDK.") - .role(ResponseInputItem.Message.Role.USER) - .build())); - - // Use a `Builder` so that more messages can be appended below. When `build()` is called, it - // creates an immutable object that is unaffected by future mutations of the builder. - ResponseCreateParams.Builder createParamsBuilder = ResponseCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .addTool(GetSdkQuality.class) - .addTool(GetSdkScore.class) - .maxOutputTokens(2048) - .input(ResponseCreateParams.Input.ofResponse(inputs)); - - client.responses().create(createParamsBuilder.build()).output().forEach(item -> { - if (item.isFunctionCall()) { - ResponseFunctionToolCall functionCall = item.asFunctionCall(); - - inputs.add(ResponseInputItem.ofFunctionCall(functionCall)); - inputs.add(ResponseInputItem.ofFunctionCallOutput(ResponseInputItem.FunctionCallOutput.builder() - .callId(functionCall.callId()) - .outputAsJson(callFunction(functionCall)) - .build())); - } - }); - - // Pass the function call results back to the model to complete the process. - createParamsBuilder.input(ResponseCreateParams.Input.ofResponse(inputs)); - - client.responses().create(createParamsBuilder.build()).output().stream() - .flatMap(item -> item.message().stream()) - .flatMap(message -> message.content().stream()) - .flatMap(content -> content.outputText().stream()) - .forEach(outputText -> System.out.println(outputText.text())); - } - - private static Object callFunction(ResponseFunctionToolCall function) { - switch (function.name()) { - case "GetSdkQuality": - return function.arguments(GetSdkQuality.class).execute(); - case "GetSdkScore": - return function.arguments(GetSdkScore.class).execute(); - default: - throw new IllegalArgumentException("Unknown function: " + function.name()); - } - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesFunctionCallingRawExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesFunctionCallingRawExample.java deleted file mode 100644 index 57a712a3b..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesFunctionCallingRawExample.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.openai.example; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.JsonObject; -import com.openai.core.JsonValue; -import com.openai.models.ChatModel; -import com.openai.models.responses.FunctionTool; -import com.openai.models.responses.ResponseCreateParams; -import com.openai.models.responses.ResponseFunctionToolCall; -import com.openai.models.responses.ResponseInputItem; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public final class ResponsesFunctionCallingRawExample { - private ResponsesFunctionCallingRawExample() {} - - static class SdkQuality { - public String quality; - - public SdkQuality(String name, String evaluation) { - quality = name + ": " + evaluation; - } - } - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - List inputs = new ArrayList<>(); - - inputs.add(ResponseInputItem.ofMessage(ResponseInputItem.Message.builder() - .addInputTextContent("What is the quality of the following SDKs and what do reviewers say: " - + "OpenAI Java SDK, Unknown Company SDK.") - .role(ResponseInputItem.Message.Role.USER) - .build())); - - // Use a `Builder` so that more messages can be appended below. When `build()` is called, it - // creates an immutable object that is unaffected by future mutations of the builder. - ResponseCreateParams.Builder createParamsBuilder = ResponseCreateParams.builder() - .model(ChatModel.GPT_3_5_TURBO) - .addTool(FunctionTool.builder() - .name("get-sdk-quality") - .description("Gets the quality of the given SDK.") - .parameters(FunctionTool.Parameters.builder() - .putAdditionalProperty("type", JsonValue.from("object")) - .putAdditionalProperty( - "properties", - JsonValue.from(Map.of( - "name", - Map.of("type", "string", "description", "The name of the SDK.")))) - .putAdditionalProperty("required", JsonValue.from(List.of("name"))) - .putAdditionalProperty("additionalProperties", JsonValue.from(false)) - .build()) - .strict(true) - .build()) - .addTool(FunctionTool.builder() - .name("get-sdk-score") - .description("Gets the review score (out of 10) for the given SDK.") - .parameters(FunctionTool.Parameters.builder() - .putAdditionalProperty("type", JsonValue.from("object")) - .putAdditionalProperty( - "properties", JsonValue.from(Map.of("name", Map.of("type", "string")))) - .putAdditionalProperty("required", JsonValue.from(List.of("name"))) - .putAdditionalProperty("additionalProperties", JsonValue.from(false)) - .build()) - .strict(true) - .build()) - .maxOutputTokens(2048) - .input(ResponseCreateParams.Input.ofResponse(inputs)); - - client.responses().create(createParamsBuilder.build()).output().forEach(item -> { - if (item.isFunctionCall()) { - ResponseFunctionToolCall functionCall = item.asFunctionCall(); - - inputs.add(ResponseInputItem.ofFunctionCall(functionCall)); - inputs.add(ResponseInputItem.ofFunctionCallOutput(ResponseInputItem.FunctionCallOutput.builder() - .callId(functionCall.callId()) - .output(callFunction(functionCall)) - .build())); - } - }); - - // Pass the function call results back to the model to complete the process. - createParamsBuilder.input(ResponseCreateParams.Input.ofResponse(inputs)); - - client.responses().create(createParamsBuilder.build()).output().stream() - .flatMap(item -> item.message().stream()) - .flatMap(message -> message.content().stream()) - .flatMap(content -> content.outputText().stream()) - .forEach(outputText -> System.out.println(outputText.text())); - } - - private static String callFunction(ResponseFunctionToolCall function) { - ObjectMapper mapper = new ObjectMapper(); - JsonValue arguments; - - try { - arguments = JsonValue.from(mapper.readTree(function.arguments())); - } catch (JsonProcessingException e) { - throw new IllegalArgumentException("Bad function arguments", e); - } - - String sdkName = ((JsonObject) arguments).values().get("name").asStringOrThrow(); - Object result; - - switch (function.name()) { - case "get-sdk-quality": - result = new SdkQuality(sdkName, sdkName.contains("OpenAI") ? "It's robust and polished!" : "*shrug*"); - break; - - case "get-sdk-score": - result = sdkName.contains("OpenAI") ? 10 : 3; - break; - - default: - throw new IllegalArgumentException("Unknown function: " + function.name()); - } - - try { - return mapper.writeValueAsString(result); - } catch (JsonProcessingException e) { - throw new IllegalArgumentException("Bad function result", e); - } - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesImageUrlExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesImageUrlExample.java deleted file mode 100644 index 1027bf337..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesImageUrlExample.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.responses.ResponseCreateParams; -import com.openai.models.responses.ResponseInputImage; -import com.openai.models.responses.ResponseInputItem; -import java.io.IOException; -import java.util.Base64; -import java.util.List; - -public final class ResponsesImageUrlExample { - private ResponsesImageUrlExample() {} - - public static void main(String[] args) throws IOException { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ClassLoader classloader = Thread.currentThread().getContextClassLoader(); - byte[] logoBytes = classloader.getResourceAsStream("logo.png").readAllBytes(); - String logoBase64Url = "data:image/jpeg;base64," + Base64.getEncoder().encodeToString(logoBytes); - - ResponseInputImage logoInputImage = ResponseInputImage.builder() - .detail(ResponseInputImage.Detail.AUTO) - .imageUrl(logoBase64Url) - .build(); - ResponseInputItem messageInputItem = ResponseInputItem.ofMessage(ResponseInputItem.Message.builder() - .role(ResponseInputItem.Message.Role.USER) - .addInputTextContent("Describe this image.") - .addContent(logoInputImage) - .build()); - ResponseCreateParams createParams = ResponseCreateParams.builder() - .inputOfResponse(List.of(messageInputItem)) - .model(ChatModel.GPT_4O) - .build(); - - client.responses().create(createParams).output().stream() - .flatMap(item -> item.message().stream()) - .flatMap(message -> message.content().stream()) - .flatMap(content -> content.outputText().stream()) - .forEach(outputText -> System.out.println(outputText.text())); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesInputFileExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesInputFileExample.java deleted file mode 100644 index adcd0cf73..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesInputFileExample.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.responses.ResponseCreateParams; -import com.openai.models.responses.ResponseInputFile; -import com.openai.models.responses.ResponseInputItem; -import java.io.IOException; -import java.util.Base64; -import java.util.List; - -public final class ResponsesInputFileExample { - - private ResponsesInputFileExample() {} - - public static void main(String[] args) throws IOException { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ClassLoader classloader = Thread.currentThread().getContextClassLoader(); - String filename = "pdflatex-image.pdf"; - byte[] pdfBytes = classloader.getResourceAsStream(filename).readAllBytes(); - String pdfBase64Url = - "data:application/pdf;base64," + Base64.getEncoder().encodeToString(pdfBytes); - - ResponseInputFile inputFile = ResponseInputFile.builder() - .filename(filename) - .fileData(pdfBase64Url) - .build(); - ResponseInputItem messageInputItem = ResponseInputItem.ofMessage(ResponseInputItem.Message.builder() - .role(ResponseInputItem.Message.Role.USER) - .addInputTextContent("Describe this file.") - .addContent(inputFile) - .build()); - ResponseCreateParams createParams = ResponseCreateParams.builder() - .inputOfResponse(List.of(messageInputItem)) - .model(ChatModel.GPT_4O) - .build(); - - client.responses().create(createParams).output().stream() - .flatMap(item -> item.message().stream()) - .flatMap(message -> message.content().stream()) - .flatMap(content -> content.outputText().stream()) - .forEach(outputText -> System.out.println(outputText.text())); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesStreamingAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesStreamingAsyncExample.java deleted file mode 100644 index 344a1017b..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesStreamingAsyncExample.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.models.ChatModel; -import com.openai.models.responses.ResponseCreateParams; - -public final class ResponsesStreamingAsyncExample { - private ResponsesStreamingAsyncExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - ResponseCreateParams createParams = ResponseCreateParams.builder() - .input("Tell me a story about building the best SDK!") - .model(ChatModel.GPT_4O) - .build(); - - client.responses() - .createStreaming(createParams) - .subscribe(event -> event.outputTextDelta().ifPresent(textEvent -> System.out.print(textEvent.delta()))) - .onCompleteFuture() - .join(); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesStreamingExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesStreamingExample.java deleted file mode 100644 index 3623146f8..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesStreamingExample.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.http.StreamResponse; -import com.openai.models.ChatModel; -import com.openai.models.responses.ResponseCreateParams; -import com.openai.models.responses.ResponseStreamEvent; - -public final class ResponsesStreamingExample { - private ResponsesStreamingExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - ResponseCreateParams createParams = ResponseCreateParams.builder() - .input("Tell me a story about building the best SDK!") - .model(ChatModel.GPT_4O) - .build(); - - try (StreamResponse streamResponse = - client.responses().createStreaming(createParams)) { - streamResponse.stream() - .flatMap(event -> event.outputTextDelta().stream()) - .forEach(textEvent -> System.out.print(textEvent.delta())); - } - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsExample.java deleted file mode 100644 index 9ef891831..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsExample.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.openai.example; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.responses.ResponseCreateParams; -import com.openai.models.responses.StructuredResponseCreateParams; -import java.util.List; - -public final class ResponsesStructuredOutputsExample { - - public static class Person { - @JsonPropertyDescription("The first name and surname of the person.") - public String name; - - public int birthYear; - - @JsonPropertyDescription("The year the person died, or 'present' if the person is living.") - public String deathYear; - - @Override - public String toString() { - return name + " (" + birthYear + '-' + deathYear + ')'; - } - } - - public static class Book { - public String title; - - public Person author; - - @JsonPropertyDescription("The year in which the book was first published.") - public int publicationYear; - - public String genre; - - @JsonIgnore - public String isbn; - - @Override - public String toString() { - return '"' + title + "\" (" + publicationYear + ") [" + genre + "] by " + author; - } - } - - public static class BookList { - public List books; - } - - private ResponsesStructuredOutputsExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - StructuredResponseCreateParams createParams = ResponseCreateParams.builder() - .input("List some famous late twentieth century novels.") - .text(BookList.class) - .model(ChatModel.GPT_4O) - .build(); - - client.responses().create(createParams).output().stream() - .flatMap(item -> item.message().stream()) - .flatMap(message -> message.content().stream()) - .flatMap(content -> content.outputText().stream()) - .flatMap(bookList -> bookList.books.stream()) - .forEach(book -> System.out.println(" - " + book)); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsRawExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsRawExample.java deleted file mode 100644 index 8e199fdcb..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsRawExample.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.openai.example; - -import static com.openai.models.responses.ResponseFormatTextJsonSchemaConfig.Schema; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.JsonValue; -import com.openai.models.ChatModel; -import com.openai.models.responses.ResponseCreateParams; -import com.openai.models.responses.ResponseFormatTextJsonSchemaConfig; -import com.openai.models.responses.ResponseTextConfig; -import java.util.List; -import java.util.Map; - -public final class ResponsesStructuredOutputsRawExample { - private ResponsesStructuredOutputsRawExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - Schema schema = Schema.builder() - .putAdditionalProperty("type", JsonValue.from("object")) - .putAdditionalProperty( - "properties", - JsonValue.from(Map.of("employees", Map.of("type", "array", "items", Map.of("type", "string"))))) - .putAdditionalProperty("required", JsonValue.from(List.of("employees"))) - .putAdditionalProperty("additionalProperties", JsonValue.from(false)) - .build(); - ResponseTextConfig textConfig = ResponseTextConfig.builder() - .format(ResponseFormatTextJsonSchemaConfig.builder() - .name("employees") - .schema(schema) - .strict(true) - .build()) - .build(); - - ResponseCreateParams createParams = ResponseCreateParams.builder() - .input("Who works at OpenAI?") - .text(textConfig) - .model(ChatModel.GPT_4O) - .build(); - - client.responses().create(createParams).output().stream() - .flatMap(item -> item.message().stream()) - .flatMap(message -> message.content().stream()) - .flatMap(content -> content.outputText().stream()) - .forEach(outputText -> System.out.println(outputText.text())); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsStreamingAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsStreamingAsyncExample.java deleted file mode 100644 index 05c0f7039..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsStreamingAsyncExample.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.openai.example; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.helpers.ResponseAccumulator; -import com.openai.models.ChatModel; -import com.openai.models.responses.ResponseCreateParams; -import com.openai.models.responses.StructuredResponseCreateParams; -import java.util.List; - -public final class ResponsesStructuredOutputsStreamingAsyncExample { - - public static class Person { - @JsonPropertyDescription("The first name and surname of the person.") - public String name; - - public int birthYear; - - @JsonPropertyDescription("The year the person died, or 'present' if the person is living.") - public String deathYear; - - @Override - public String toString() { - return name + " (" + birthYear + '-' + deathYear + ')'; - } - } - - public static class Book { - public String title; - - public Person author; - - @JsonPropertyDescription("The year in which the book was first published.") - public int publicationYear; - - public String genre; - - @JsonIgnore - public String isbn; - - @Override - public String toString() { - return '"' + title + "\" (" + publicationYear + ") [" + genre + "] by " + author; - } - } - - public static class BookList { - public List books; - } - - private ResponsesStructuredOutputsStreamingAsyncExample() {} - - public static void main(String[] args) { - // Configure using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - StructuredResponseCreateParams createParams = ResponseCreateParams.builder() - .input("List some famous late twentieth century novels.") - .text(BookList.class) - .model(ChatModel.GPT_4O) - .build(); - - ResponseAccumulator accumulator = ResponseAccumulator.create(); - - client.responses() - .createStreaming(createParams) - .subscribe(event -> accumulator - .accumulate(event) - .outputTextDelta() - .ifPresent(textEvent -> System.out.print(textEvent.delta()))) - .onCompleteFuture() - .join(); - System.out.println(); - - accumulator.response(BookList.class).output().stream() - .flatMap(item -> item.message().stream()) - .flatMap(message -> message.content().stream()) - .flatMap(content -> content.outputText().stream()) - .flatMap(bookList -> bookList.books.stream()) - .forEach(book -> System.out.println(" - " + book)); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsStreamingExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsStreamingExample.java deleted file mode 100644 index 337e23d41..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsStreamingExample.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.openai.example; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.http.StreamResponse; -import com.openai.helpers.ResponseAccumulator; -import com.openai.models.ChatModel; -import com.openai.models.responses.ResponseCreateParams; -import com.openai.models.responses.ResponseStreamEvent; -import com.openai.models.responses.StructuredResponseCreateParams; -import java.util.List; - -public final class ResponsesStructuredOutputsStreamingExample { - - public static class Person { - @JsonPropertyDescription("The first name and surname of the person.") - public String name; - - public int birthYear; - - @JsonPropertyDescription("The year the person died, or 'present' if the person is living.") - public String deathYear; - - @Override - public String toString() { - return name + " (" + birthYear + '-' + deathYear + ')'; - } - } - - public static class Book { - public String title; - - public Person author; - - @JsonPropertyDescription("The year in which the book was first published.") - public int publicationYear; - - public String genre; - - @JsonIgnore - public String isbn; - - @Override - public String toString() { - return '"' + title + "\" (" + publicationYear + ") [" + genre + "] by " + author; - } - } - - public static class BookList { - public List books; - } - - private ResponsesStructuredOutputsStreamingExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - StructuredResponseCreateParams createParams = ResponseCreateParams.builder() - .input("List some famous late twentieth century novels.") - .text(BookList.class) - .model(ChatModel.GPT_4O) - .build(); - - ResponseAccumulator accumulator = ResponseAccumulator.create(); - - try (StreamResponse streamResponse = - client.responses().createStreaming(createParams)) { - streamResponse.stream() - .peek(accumulator::accumulate) - .flatMap(event -> event.outputTextDelta().stream()) - .forEach(textEvent -> System.out.print(textEvent.delta())); - System.out.println(); - } - - accumulator.response(BookList.class).output().stream() - .flatMap(item -> item.message().stream()) - .flatMap(message -> message.content().stream()) - .flatMap(content -> content.outputText().stream()) - .flatMap(bookList -> bookList.books.stream()) - .forEach(book -> System.out.println(" - " + book)); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsVerbosityExample.java b/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsVerbosityExample.java deleted file mode 100644 index 5bdb33282..000000000 --- a/openai-java-example/src/main/java/com/openai/example/ResponsesStructuredOutputsVerbosityExample.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.openai.example; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.responses.ResponseCreateParams; -import com.openai.models.responses.ResponseTextConfig; -import com.openai.models.responses.StructuredResponseCreateParams; -import java.util.List; - -public final class ResponsesStructuredOutputsVerbosityExample { - - public static class Person { - @JsonPropertyDescription("The first name and surname of the person.") - public String name; - - public int birthYear; - - @JsonPropertyDescription("The year the person died, or 'present' if the person is living.") - public String deathYear; - - @Override - public String toString() { - return name + " (" + birthYear + '-' + deathYear + ')'; - } - } - - public static class Book { - public String title; - - public Person author; - - @JsonPropertyDescription("The year in which the book was first published.") - public int publicationYear; - - public String genre; - - @JsonIgnore - public String isbn; - - @Override - public String toString() { - return '"' + title + "\" (" + publicationYear + ") [" + genre + "] by " + author; - } - } - - public static class BookList { - public List books; - } - - private ResponsesStructuredOutputsVerbosityExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - StructuredResponseCreateParams createParams = ResponseCreateParams.builder() - .input("List some famous late twentieth century novels.") - .text(ResponseTextConfig.builder() - .verbosity(ResponseTextConfig.Verbosity.HIGH) - .format(BookList.class) - .build()) - .model(ChatModel.GPT_5) - .build(); - - client.responses().create(createParams).output().stream() - .flatMap(item -> item.message().stream()) - .flatMap(message -> message.content().stream()) - .flatMap(content -> content.outputText().stream()) - .flatMap(bookList -> bookList.books.stream()) - .forEach(book -> System.out.println(" - " + book)); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/StructuredOutputsAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/StructuredOutputsAsyncExample.java deleted file mode 100644 index 2768fc761..000000000 --- a/openai-java-example/src/main/java/com/openai/example/StructuredOutputsAsyncExample.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.openai.example; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import com.openai.models.chat.completions.StructuredChatCompletionCreateParams; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Schema; -import java.util.List; - -public final class StructuredOutputsAsyncExample { - - public static class Person { - @JsonPropertyDescription("The first name and surname of the person.") - public String name; - - public int birthYear; - - @JsonPropertyDescription("The year the person died, or 'present' if the person is living.") - public String deathYear; - - @Override - public String toString() { - return name + " (" + birthYear + '-' + deathYear + ')'; - } - } - - public static class Book { - public String title; - - public Person author; - - @JsonPropertyDescription("The year in which the book was first published.") - @Schema(minimum = "1500") - public int publicationYear; - - public String genre; - - @JsonIgnore - public String isbn; - - @Override - public String toString() { - return '"' + title + "\" (" + publicationYear + ") [" + genre + "] by " + author; - } - } - - public static class BookList { - @ArraySchema(maxItems = 100) - public List books; - } - - private StructuredOutputsAsyncExample() {} - - public static void main(String[] args) { - // Configure using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - StructuredChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_4O_MINI) - .maxCompletionTokens(2048) - .responseFormat(BookList.class) - .addUserMessage("List some famous late twentieth century novels.") - .build(); - - client.chat() - .completions() - .create(createParams) - .thenAccept(completion -> completion.choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .flatMap(bookList -> bookList.books.stream()) - .forEach(book -> System.out.println(" - " + book))) - .join(); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/StructuredOutputsExample.java b/openai-java-example/src/main/java/com/openai/example/StructuredOutputsExample.java deleted file mode 100644 index 9f241ffc4..000000000 --- a/openai-java-example/src/main/java/com/openai/example/StructuredOutputsExample.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.openai.example; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import com.openai.models.chat.completions.StructuredChatCompletionCreateParams; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Schema; -import java.util.List; - -public final class StructuredOutputsExample { - - public static class Person { - @JsonPropertyDescription("The first name and surname of the person.") - public String name; - - public int birthYear; - - @JsonPropertyDescription("The year the person died, or 'present' if the person is living.") - public String deathYear; - - @Override - public String toString() { - return name + " (" + birthYear + '-' + deathYear + ')'; - } - } - - public static class Book { - public String title; - - public Person author; - - @JsonPropertyDescription("The year in which the book was first published.") - @Schema(minimum = "1500") - public int publicationYear; - - public String genre; - - @JsonIgnore - public String isbn; - - @Override - public String toString() { - return '"' + title + "\" (" + publicationYear + ") [" + genre + "] by " + author; - } - } - - public static class BookList { - @ArraySchema(maxItems = 100) - public List books; - } - - private StructuredOutputsExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - StructuredChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_4O_MINI) - .maxCompletionTokens(2048) - .responseFormat(BookList.class) - .addUserMessage("List some famous late twentieth century novels.") - .build(); - - client.chat().completions().create(createParams).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .flatMap(bookList -> bookList.books.stream()) - .forEach(book -> System.out.println(" - " + book)); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/StructuredOutputsRawAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/StructuredOutputsRawAsyncExample.java deleted file mode 100644 index f726e0cfe..000000000 --- a/openai-java-example/src/main/java/com/openai/example/StructuredOutputsRawAsyncExample.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClientAsync; -import com.openai.client.okhttp.OpenAIOkHttpClientAsync; -import com.openai.core.JsonValue; -import com.openai.models.ChatModel; -import com.openai.models.ResponseFormatJsonSchema; -import com.openai.models.ResponseFormatJsonSchema.JsonSchema; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import java.util.Map; - -public final class StructuredOutputsRawAsyncExample { - private StructuredOutputsRawAsyncExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); - - JsonSchema.Schema schema = JsonSchema.Schema.builder() - .putAdditionalProperty("type", JsonValue.from("object")) - .putAdditionalProperty( - "properties", JsonValue.from(Map.of("employees", Map.of("items", Map.of("type", "string"))))) - .build(); - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_4O_MINI) - .maxCompletionTokens(2048) - .responseFormat(ResponseFormatJsonSchema.builder() - .jsonSchema(JsonSchema.builder() - .name("employee-list") - .schema(schema) - .build()) - .build()) - .addUserMessage("Who works at OpenAI?") - .build(); - - client.chat() - .completions() - .create(createParams) - .thenAccept(completion -> completion.choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println)) - .join(); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/StructuredOutputsRawExample.java b/openai-java-example/src/main/java/com/openai/example/StructuredOutputsRawExample.java deleted file mode 100644 index 3b9ff03ac..000000000 --- a/openai-java-example/src/main/java/com/openai/example/StructuredOutputsRawExample.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.JsonValue; -import com.openai.models.ChatModel; -import com.openai.models.ResponseFormatJsonSchema; -import com.openai.models.ResponseFormatJsonSchema.JsonSchema; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import java.util.Map; - -public final class StructuredOutputsRawExample { - private StructuredOutputsRawExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - JsonSchema.Schema schema = JsonSchema.Schema.builder() - .putAdditionalProperty("type", JsonValue.from("object")) - .putAdditionalProperty( - "properties", JsonValue.from(Map.of("employees", Map.of("items", Map.of("type", "string"))))) - .build(); - ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_4O_MINI) - .maxCompletionTokens(2048) - .responseFormat(ResponseFormatJsonSchema.builder() - .jsonSchema(JsonSchema.builder() - .name("employee-list") - .schema(schema) - .build()) - .build()) - .addUserMessage("Who works at OpenAI?") - .build(); - - client.chat().completions().create(createParams).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .forEach(System.out::println); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/StructuredOutputsStreamingExample.java b/openai-java-example/src/main/java/com/openai/example/StructuredOutputsStreamingExample.java deleted file mode 100644 index cd529d3c4..000000000 --- a/openai-java-example/src/main/java/com/openai/example/StructuredOutputsStreamingExample.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.openai.example; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.core.http.StreamResponse; -import com.openai.helpers.ChatCompletionAccumulator; -import com.openai.models.ChatModel; -import com.openai.models.chat.completions.ChatCompletionChunk; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import com.openai.models.chat.completions.StructuredChatCompletionCreateParams; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Schema; -import java.util.List; - -public final class StructuredOutputsStreamingExample { - - public static class Person { - @JsonPropertyDescription("The first name and surname of the person.") - public String name; - - public int birthYear; - - @JsonPropertyDescription("The year the person died, or 'present' if the person is living.") - public String deathYear; - - @Override - public String toString() { - return name + " (" + birthYear + '-' + deathYear + ')'; - } - } - - public static class Book { - public String title; - - public Person author; - - @JsonPropertyDescription("The year in which the book was first published.") - @Schema(minimum = "1500") - public int publicationYear; - - public String genre; - - @JsonIgnore - public String isbn; - - @Override - public String toString() { - return '"' + title + "\" (" + publicationYear + ") [" + genre + "] by " + author; - } - } - - public static class BookList { - @ArraySchema(maxItems = 100) - public List books; - } - - private StructuredOutputsStreamingExample() {} - - public static void main(String[] args) { - // Configures using one of: - // - The `OPENAI_API_KEY` environment variable - // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - StructuredChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() - .model(ChatModel.GPT_4O_MINI) - .maxCompletionTokens(2048) - .responseFormat(BookList.class) - .addUserMessage("List some famous late twentieth century novels.") - .build(); - - ChatCompletionAccumulator accumulator = ChatCompletionAccumulator.create(); - - try (StreamResponse streamResponse = - client.chat().completions().createStreaming(createParams)) { - streamResponse.stream() - .peek(accumulator::accumulate) - .flatMap(completion -> completion.choices().stream()) - .flatMap(choice -> choice.delta().content().stream()) - .forEach(System.out::print); - System.out.println(); - } - - accumulator.chatCompletion(BookList.class).choices().stream() - .flatMap(choice -> choice.message().content().stream()) - .flatMap(bookList -> bookList.books.stream()) - .forEach(book -> System.out.println(" - " + book)); - } -} diff --git a/openai-java-example/src/main/java/com/openai/example/VideoGenerationExample.java b/openai-java-example/src/main/java/com/openai/example/VideoGenerationExample.java deleted file mode 100644 index eff51b048..000000000 --- a/openai-java-example/src/main/java/com/openai/example/VideoGenerationExample.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.openai.example; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; -import com.openai.models.videos.Video; -import com.openai.models.videos.VideoCreateParams; -import com.openai.models.videos.VideoModel; - -public final class VideoGenerationExample { - private VideoGenerationExample() {} - - public static void main(String[] args) throws InterruptedException { - OpenAIClient client = OpenAIOkHttpClient.fromEnv(); - - VideoCreateParams params = VideoCreateParams.builder() - .model(VideoModel.SORA_2) - .prompt("A video of the words 'Thank you' in sparkling letters") - .build(); - - Video video = client.videos().create(params); - - // Poll until video is completed or failed - while (video.status() != Video.Status.COMPLETED && video.status() != Video.Status.FAILED) { - System.out.println("Polling... Progress: " + video.progress() + "%"); - Thread.sleep(10_000); // Poll every 10 seconds - video = client.videos().retrieve(video.id()); - } - - if (video.status() == Video.Status.COMPLETED) { - System.out.println("Video successfully completed!"); - System.out.println("Video ID: " + video.id()); - } else { - System.out.println("Video creation did not complete. Status: " + video.status()); - video.error().ifPresent(error -> { - System.out.println("Error: " + error); - }); - } - } -} diff --git a/openai-java-example/src/main/resources/aloha-mask.png b/openai-java-example/src/main/resources/aloha-mask.png deleted file mode 100644 index 15eb81164f14364f4d7a17714f65b5b3228d1e4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413483 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 h8Xtn+4Gx-D8UC)kC3m-34SXF4L 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 diff --git a/openai-java-example/src/main/resources/aloha.png b/openai-java-example/src/main/resources/aloha.png deleted file mode 100644 index e429779bfae27b6f78ab20bb3c66da4bf7882f9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446038 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

!?u5)agI+xf-3Z?yO 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μvv*E9WP@_( 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 UDj4mG%>V!Z07*qoM6N<$f@EKD4*&oF diff --git a/openai-java-example/src/main/resources/logo.png b/openai-java-example/src/main/resources/logo.png deleted file mode 100644 index f3d57fad3e0fe4b410fde9209ab7872f455aa544..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359514 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�)iq9y^$Kow-Su|U%0fYO~9u>bnK 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 z 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

!!xY6JLWj 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Ǐ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 F{{RldaBctq diff --git a/openai-java-example/src/main/resources/requests.jsonl b/openai-java-example/src/main/resources/requests.jsonl deleted file mode 100644 index 2897ceed9..000000000 --- a/openai-java-example/src/main/resources/requests.jsonl +++ /dev/null @@ -1,2 +0,0 @@ -{"model": "gpt-4", "messages": [{"role": "user", "content": "Hello"}]} -{"model": "gpt-4", "messages": [{"role": "user", "content": "World"}]} \ No newline at end of file diff --git a/openai-java-example/src/main/resources/sports.wav b/openai-java-example/src/main/resources/sports.wav deleted file mode 100644 index b0a3abd1ff651f3638ab92c65cbc0ba47075b61b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 478124 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

@*jj&}`n+_crRI?K?qeWk~ssaPrf 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 jTrH8^3&cf-FTc09Rm5k=6WYb}IFn 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

raVI$?l&V*6nu9zw~03G9R?Z4q4 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 z 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

p=sw^f5 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 diff --git a/openai-java-lib/.keep b/openai-java-lib/.keep deleted file mode 100644 index 5e2c99fdb..000000000 --- a/openai-java-lib/.keep +++ /dev/null @@ -1,4 +0,0 @@ -File generated from our OpenAPI spec by Stainless. - -This directory can be used to store custom files to expand the SDK. -It is ignored by Stainless code generation and its content (other than this keep file) won't be touched. \ No newline at end of file diff --git a/openai-java-proguard-test/build.gradle.kts b/openai-java-proguard-test/build.gradle.kts deleted file mode 100644 index cf5342408..000000000 --- a/openai-java-proguard-test/build.gradle.kts +++ /dev/null @@ -1,113 +0,0 @@ -plugins { - id("openai.kotlin") - id("com.gradleup.shadow") version "8.3.8" -} - -buildscript { - repositories { - google() - } - - dependencies { - classpath("com.guardsquare:proguard-gradle:7.9.1") - classpath("com.android.tools:r8:8.3.37") - - constraints { - classpath("org.codehaus.plexus:plexus-utils:4.0.3") { - because("4.0.3 fixes CVE-2025-67030 in Shadow's build-time dependency") - } - classpath("org.apache.logging.log4j:log4j-api:2.25.5") { - because("avoid vulnerable Log4j versions on the build classpath") - } - classpath("org.apache.logging.log4j:log4j-core:2.25.5") { - because("avoid vulnerable Log4j versions on the build classpath") - } - } - } -} - -dependencies { - testImplementation(project(":openai-java")) - testImplementation(kotlin("test")) - testImplementation("org.junit.jupiter:junit-jupiter-api:5.9.3") - testImplementation("org.assertj:assertj-core:3.27.7") - testImplementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.14.0") -} - -tasks.shadowJar { - from(sourceSets.test.get().output) - configurations = listOf(project.configurations.testRuntimeClasspath.get()) -} - -val proguardJarPath = "${layout.buildDirectory.get()}/libs/${project.name}-${project.version}-proguard.jar" -val proguardJar by tasks.registering(proguard.gradle.ProGuardTask::class) { - group = "verification" - dependsOn(tasks.shadowJar) - notCompatibleWithConfigurationCache("ProGuard") - - injars(tasks.shadowJar) - outjars(proguardJarPath) - printmapping("${layout.buildDirectory.get()}/proguard-mapping.txt") - - val javaHome = System.getProperty("java.home") - if (System.getProperty("java.version").startsWith("1.")) { - // Before Java 9, the runtime classes were packaged in a single jar file. - libraryjars("$javaHome/lib/rt.jar") - } else { - // As of Java 9, the runtime classes are packaged in modular jmod files. - libraryjars( - // Filters must be specified first, as a map. - mapOf("jarfilter" to "!**.jar", "filter" to "!module-info.class"), - "$javaHome/jmods/java.base.jmod" - ) - } - - configuration("./test.pro") - configuration("../openai-java-core/src/main/resources/META-INF/proguard/openai-java-core.pro") -} - -val testProGuard by tasks.registering(JavaExec::class) { - group = "verification" - dependsOn(proguardJar) - notCompatibleWithConfigurationCache("ProGuard") - - mainClass.set("com.openai.proguard.ProGuardCompatibilityTest") - classpath = files(proguardJarPath) -} - -val r8JarPath = "${layout.buildDirectory.get()}/libs/${project.name}-${project.version}-r8.jar" -val r8Jar by tasks.registering(JavaExec::class) { - group = "verification" - dependsOn(tasks.shadowJar) - notCompatibleWithConfigurationCache("R8") - - mainClass.set("com.android.tools.r8.R8") - classpath = buildscript.configurations["classpath"] - - args = listOf( - "--release", - "--classfile", - "--output", r8JarPath, - "--lib", System.getProperty("java.home"), - "--pg-conf", "./test.pro", - "--pg-conf", "../openai-java-core/src/main/resources/META-INF/proguard/openai-java-core.pro", - "--pg-map-output", "${layout.buildDirectory.get()}/r8-mapping.txt", - tasks.shadowJar.get().archiveFile.get().asFile.absolutePath, - ) -} - -val testR8 by tasks.registering(JavaExec::class) { - group = "verification" - dependsOn(r8Jar) - notCompatibleWithConfigurationCache("R8") - - mainClass.set("com.openai.proguard.ProGuardCompatibilityTest") - classpath = files(r8JarPath) -} - -tasks.test { - dependsOn(testProGuard) - dependsOn(testR8) - // We defer to the tests run via the ProGuard JAR. - enabled = false -} diff --git a/openai-java-proguard-test/src/test/kotlin/com/openai/proguard/ProGuardCompatibilityTest.kt b/openai-java-proguard-test/src/test/kotlin/com/openai/proguard/ProGuardCompatibilityTest.kt deleted file mode 100644 index a704fa7df..000000000 --- a/openai-java-proguard-test/src/test/kotlin/com/openai/proguard/ProGuardCompatibilityTest.kt +++ /dev/null @@ -1,327 +0,0 @@ -// File generated from our OpenAPI spec by Stainless. - -package com.openai.proguard - -import com.fasterxml.jackson.module.kotlin.jacksonTypeRef -import com.openai.client.okhttp.OpenAIOkHttpClient -import com.openai.core.JsonValue -import com.openai.core.jsonMapper -import com.openai.models.chat.completions.ChatCompletion -import com.openai.models.chat.completions.ChatCompletionAudio -import com.openai.models.chat.completions.ChatCompletionContentPart -import com.openai.models.chat.completions.ChatCompletionContentPartText -import com.openai.models.chat.completions.ChatCompletionMessage -import com.openai.models.chat.completions.ChatCompletionMessageFunctionToolCall -import com.openai.models.chat.completions.ChatCompletionModality -import com.openai.models.chat.completions.ChatCompletionTokenLogprob -import com.openai.models.completions.CompletionUsage -import kotlin.reflect.full.memberFunctions -import kotlin.reflect.jvm.javaMethod -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class ProGuardCompatibilityTest { - - companion object { - - @JvmStatic - fun main(args: Array) { - // To debug that we're using the right JAR. - val jarPath = this::class.java.getProtectionDomain().codeSource.location - println("JAR being used: $jarPath") - - // We have to manually run the test methods instead of using the JUnit runner because it - // seems impossible to get working with R8. - val test = ProGuardCompatibilityTest() - test::class - .memberFunctions - .asSequence() - .filter { function -> - function.javaMethod?.isAnnotationPresent(Test::class.java) == true - } - .forEach { it.call(test) } - } - } - - @Test - fun proguardRules() { - val rulesFile = - javaClass.classLoader.getResourceAsStream("META-INF/proguard/openai-java-core.pro") - - assertThat(rulesFile).isNotNull() - } - - @Test - fun client() { - val client = - OpenAIOkHttpClient.builder() - .apiKey("My API Key") - .adminApiKey("My Admin API Key") - .build() - - assertThat(client).isNotNull() - assertThat(client.completions()).isNotNull() - assertThat(client.chat()).isNotNull() - assertThat(client.embeddings()).isNotNull() - assertThat(client.files()).isNotNull() - assertThat(client.images()).isNotNull() - assertThat(client.contentProvenanceChecks()).isNotNull() - assertThat(client.audio()).isNotNull() - assertThat(client.moderations()).isNotNull() - assertThat(client.models()).isNotNull() - assertThat(client.fineTuning()).isNotNull() - assertThat(client.graders()).isNotNull() - assertThat(client.vectorStores()).isNotNull() - assertThat(client.webhooks()).isNotNull() - assertThat(client.beta()).isNotNull() - assertThat(client.batches()).isNotNull() - assertThat(client.uploads()).isNotNull() - assertThat(client.admin()).isNotNull() - assertThat(client.responses()).isNotNull() - assertThat(client.realtime()).isNotNull() - assertThat(client.conversations()).isNotNull() - assertThat(client.evals()).isNotNull() - assertThat(client.containers()).isNotNull() - assertThat(client.skills()).isNotNull() - assertThat(client.videos()).isNotNull() - } - - @Test - fun chatCompletionRoundtrip() { - val jsonMapper = jsonMapper() - val chatCompletion = - ChatCompletion.builder() - .id("id") - .addChoice( - ChatCompletion.Choice.builder() - .finishReason(ChatCompletion.Choice.FinishReason.STOP) - .index(0L) - .logprobs( - ChatCompletion.Choice.Logprobs.builder() - .addContent( - ChatCompletionTokenLogprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .addTopLogprob( - ChatCompletionTokenLogprob.TopLogprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .build() - ) - .build() - ) - .addRefusal( - ChatCompletionTokenLogprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .addTopLogprob( - ChatCompletionTokenLogprob.TopLogprob.builder() - .token("token") - .addByte(0L) - .logprob(0.0) - .build() - ) - .build() - ) - .build() - ) - .message( - ChatCompletionMessage.builder() - .content("content") - .refusal("refusal") - .addAnnotation( - ChatCompletionMessage.Annotation.builder() - .urlCitation( - ChatCompletionMessage.Annotation.UrlCitation.builder() - .endIndex(0L) - .startIndex(0L) - .title("title") - .url("https://example.com") - .build() - ) - .build() - ) - .audio( - ChatCompletionAudio.builder() - .id("id") - .data("data") - .expiresAt(0L) - .transcript("transcript") - .build() - ) - .functionCall( - ChatCompletionMessage.FunctionCall.builder() - .arguments("arguments") - .name("name") - .build() - ) - .addToolCall( - ChatCompletionMessageFunctionToolCall.builder() - .id("id") - .function( - ChatCompletionMessageFunctionToolCall.Function.builder() - .arguments("arguments") - .name("name") - .build() - ) - .build() - ) - .build() - ) - .build() - ) - .created(0L) - .model("model") - .moderation( - ChatCompletion.Moderation.builder() - .input( - ChatCompletion.Moderation.Input.ModerationResults.builder() - .model("model") - .addResult( - ChatCompletion.Moderation.Input.ModerationResults.Result - .builder() - .categories( - ChatCompletion.Moderation.Input.ModerationResults.Result - .Categories - .builder() - .putAdditionalProperty("foo", JsonValue.from(true)) - .build() - ) - .categoryAppliedInputTypes( - ChatCompletion.Moderation.Input.ModerationResults.Result - .CategoryAppliedInputTypes - .builder() - .putAdditionalProperty( - "foo", - JsonValue.from(listOf("text")), - ) - .build() - ) - .categoryScores( - ChatCompletion.Moderation.Input.ModerationResults.Result - .CategoryScores - .builder() - .putAdditionalProperty("foo", JsonValue.from(0)) - .build() - ) - .flagged(true) - .model("model") - .build() - ) - .build() - ) - .output( - ChatCompletion.Moderation.Output.ModerationResults.builder() - .model("model") - .addResult( - ChatCompletion.Moderation.Output.ModerationResults.Result - .builder() - .categories( - ChatCompletion.Moderation.Output.ModerationResults - .Result - .Categories - .builder() - .putAdditionalProperty("foo", JsonValue.from(true)) - .build() - ) - .categoryAppliedInputTypes( - ChatCompletion.Moderation.Output.ModerationResults - .Result - .CategoryAppliedInputTypes - .builder() - .putAdditionalProperty( - "foo", - JsonValue.from(listOf("text")), - ) - .build() - ) - .categoryScores( - ChatCompletion.Moderation.Output.ModerationResults - .Result - .CategoryScores - .builder() - .putAdditionalProperty("foo", JsonValue.from(0)) - .build() - ) - .flagged(true) - .model("model") - .build() - ) - .build() - ) - .build() - ) - .serviceTier(ChatCompletion.ServiceTier.AUTO) - .systemFingerprint("system_fingerprint") - .usage( - CompletionUsage.builder() - .completionTokens(0L) - .promptTokens(0L) - .totalTokens(0L) - .completionTokensDetails( - CompletionUsage.CompletionTokensDetails.builder() - .acceptedPredictionTokens(0L) - .audioTokens(0L) - .reasoningTokens(0L) - .rejectedPredictionTokens(0L) - .build() - ) - .promptTokensDetails( - CompletionUsage.PromptTokensDetails.builder() - .audioTokens(0L) - .cacheWriteTokens(0L) - .cachedTokens(0L) - .build() - ) - .build() - ) - .build() - - val roundtrippedChatCompletion = - jsonMapper.readValue( - jsonMapper.writeValueAsString(chatCompletion), - jacksonTypeRef(), - ) - - assertThat(roundtrippedChatCompletion).isEqualTo(chatCompletion) - } - - @Test - fun chatCompletionContentPartRoundtrip() { - val jsonMapper = jsonMapper() - val chatCompletionContentPart = - ChatCompletionContentPart.ofText( - ChatCompletionContentPartText.builder() - .text("text") - .promptCacheBreakpoint( - ChatCompletionContentPartText.PromptCacheBreakpoint.builder().build() - ) - .build() - ) - - val roundtrippedChatCompletionContentPart = - jsonMapper.readValue( - jsonMapper.writeValueAsString(chatCompletionContentPart), - jacksonTypeRef(), - ) - - assertThat(roundtrippedChatCompletionContentPart).isEqualTo(chatCompletionContentPart) - } - - @Test - fun chatCompletionModalityRoundtrip() { - val jsonMapper = jsonMapper() - val chatCompletionModality = ChatCompletionModality.TEXT - - val roundtrippedChatCompletionModality = - jsonMapper.readValue( - jsonMapper.writeValueAsString(chatCompletionModality), - jacksonTypeRef(), - ) - - assertThat(roundtrippedChatCompletionModality).isEqualTo(chatCompletionModality) - } -} diff --git a/openai-java-proguard-test/test.pro b/openai-java-proguard-test/test.pro deleted file mode 100644 index 026465fb0..000000000 --- a/openai-java-proguard-test/test.pro +++ /dev/null @@ -1,9 +0,0 @@ -# Specify the entrypoint where ProGuard starts to determine what's reachable. --keep class com.openai.proguard.** { *; } - -# For the testing framework. --keep class org.junit.** { *; } - -# Many warnings don't apply for our testing purposes. --dontnote --dontwarn \ No newline at end of file diff --git a/openai-java-runtime-compatibility/build.gradle.kts b/openai-java-runtime-compatibility/build.gradle.kts deleted file mode 100644 index 60adf7099..000000000 --- a/openai-java-runtime-compatibility/build.gradle.kts +++ /dev/null @@ -1,100 +0,0 @@ -import com.openai.gradle.VersionSupportPolicy -import org.gradle.api.attributes.Bundling -import org.gradle.api.attributes.Category -import org.gradle.api.attributes.LibraryElements -import org.gradle.api.attributes.Usage -import org.gradle.api.attributes.java.TargetJvmVersion - -plugins { - id("openai.java") -} - -val versionSupportPolicy = - VersionSupportPolicy.load(rootProject.file("gradle/version-support.properties")) -val runtimeProbes = - mapOf( - "openai-java-core" to "com.openai.compatibility.CoreRuntimeProbe", - "openai-java-client-okhttp" to "com.openai.compatibility.OkHttpRuntimeProbe", - "openai-java" to "com.openai.compatibility.OkHttpRuntimeProbe", - "openai-java-bedrock" to "com.openai.compatibility.BedrockRuntimeProbe", - ) -val supportedArtifacts = - versionSupportPolicy.artifacts.filterValues { it.lifecycle.isSupported }.keys - -check(runtimeProbes.keys == supportedArtifacts) { - "Runtime probes must exactly cover supported artifacts. " + - "Missing: ${supportedArtifacts - runtimeProbes.keys}; " + - "unexpected: ${runtimeProbes.keys - supportedArtifacts}" -} - -dependencies { - runtimeProbes.keys.forEach { compileOnly(project(":$it")) } -} - -tasks.withType().configureEach { - // This fixture intentionally compiles at the SDK's minimum consumer level. - options.compilerArgs.add("-Xlint:-options") -} - -val runtimeJavaVersion = - providers - .gradleProperty("runtimeJavaVersion") - .map(String::toInt) - .orElse(versionSupportPolicy.minimumSupportedRuntime) -val runtimeLauncher = - javaToolchains.launcherFor { - languageVersion.set(runtimeJavaVersion.map(JavaLanguageVersion::of)) - } - -fun String.toTaskSegment(): String = - split('-').joinToString("") { segment -> - segment.replaceFirstChar { firstCharacter -> firstCharacter.uppercase() } - } - -val artifactProbeTasks = - runtimeProbes.mapValues { (artifactName, probeMainClass) -> - val artifactSupport = versionSupportPolicy.artifacts.getValue(artifactName) - val runtimeClasspath = - configurations.create("${artifactName.toTaskSegment()}RuntimeCompatibilityClasspath") { - isCanBeConsumed = false - isCanBeResolved = true - attributes { - attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.EXTERNAL)) - attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.LIBRARY)) - attribute( - LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, - objects.named(LibraryElements.JAR), - ) - attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) - attribute( - TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, - artifactSupport.runtime, - ) - } - } - dependencies.add(runtimeClasspath.name, project(":$artifactName")) - - tasks.register("run${artifactName.toTaskSegment()}RuntimeCompatibility") { - group = "verification" - description = - "Exercises $artifactName on its isolated consumer runtime classpath." - - classpath = sourceSets.main.get().output + runtimeClasspath - mainClass.set(probeMainClass) - javaLauncher.set(runtimeLauncher) - } - } - -tasks.register("runRuntimeCompatibility") { - group = "verification" - description = "Exercises every supported artifact compatible with the requested consumer JVM." - - dependsOn( - artifactProbeTasks - .filterKeys { artifactName -> - versionSupportPolicy.artifacts.getValue(artifactName).runtime <= - runtimeJavaVersion.get() - } - .values - ) -} diff --git a/openai-java-runtime-compatibility/src/main/java/com/openai/compatibility/BedrockRuntimeProbe.java b/openai-java-runtime-compatibility/src/main/java/com/openai/compatibility/BedrockRuntimeProbe.java deleted file mode 100644 index 18428f799..000000000 --- a/openai-java-runtime-compatibility/src/main/java/com/openai/compatibility/BedrockRuntimeProbe.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.openai.compatibility; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.BedrockOpenAIOkHttpClient; - -public final class BedrockRuntimeProbe { - private static final String[] RUNTIME_PROVIDER_CLASSES = { - "software.amazon.awssdk.services.sts.StsClient", - "software.amazon.awssdk.services.sso.SsoClient", - "software.amazon.awssdk.services.ssooidc.SsoOidcClient", - "software.amazon.awssdk.services.signin.SigninClient", - "software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient", - }; - - private BedrockRuntimeProbe() {} - - public static void main(String[] args) throws ClassNotFoundException { - for (String providerClass : RUNTIME_PROVIDER_CLASSES) { - Class.forName(providerClass); - } - - OpenAIClient client = BedrockOpenAIOkHttpClient.builder() - .awsRegion("us-east-1") - .baseUrl("https://example.com/openai/v1") - .skipAuth(true) - .build(); - try { - if (client.models() == null) { - throw new IllegalStateException("Bedrock client did not create its model service"); - } - } finally { - client.close(); - } - - System.out.printf( - "Exercised openai-java-bedrock and %d runtime providers on Java %s.%n", - RUNTIME_PROVIDER_CLASSES.length, System.getProperty("java.version")); - } -} diff --git a/openai-java-runtime-compatibility/src/main/java/com/openai/compatibility/CoreRuntimeProbe.java b/openai-java-runtime-compatibility/src/main/java/com/openai/compatibility/CoreRuntimeProbe.java deleted file mode 100644 index 99c74d920..000000000 --- a/openai-java-runtime-compatibility/src/main/java/com/openai/compatibility/CoreRuntimeProbe.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.openai.compatibility; - -import com.openai.core.JsonValue; -import com.openai.models.chat.completions.ChatCompletionCreateParams; -import com.openai.models.chat.completions.StructuredChatCompletionCreateParams; -import java.util.Collections; -import java.util.Map; - -public final class CoreRuntimeProbe { - private CoreRuntimeProbe() {} - - public static void main(String[] args) { - Map input = Collections.singletonMap("probe", "runtime"); - Map converted = JsonValue.from(input).convert(Map.class); - - if (converted == null || !"runtime".equals(converted.get("probe"))) { - throw new IllegalStateException("Core JSON round trip failed"); - } - - StructuredChatCompletionCreateParams params = ChatCompletionCreateParams.builder() - .addUserMessage("runtime probe") - .model("runtime-probe") - .responseFormat(RuntimeResponse.class) - .build(); - if (!params.rawParams().responseFormat().isPresent()) { - throw new IllegalStateException("Core structured-output schema generation failed"); - } - - System.out.printf("Exercised openai-java-core on Java %s.%n", System.getProperty("java.version")); - } - - public static final class RuntimeResponse { - public String value; - } -} diff --git a/openai-java-runtime-compatibility/src/main/java/com/openai/compatibility/OkHttpRuntimeProbe.java b/openai-java-runtime-compatibility/src/main/java/com/openai/compatibility/OkHttpRuntimeProbe.java deleted file mode 100644 index a586a6347..000000000 --- a/openai-java-runtime-compatibility/src/main/java/com/openai/compatibility/OkHttpRuntimeProbe.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.openai.compatibility; - -import com.openai.client.OpenAIClient; -import com.openai.client.okhttp.OpenAIOkHttpClient; - -public final class OkHttpRuntimeProbe { - private OkHttpRuntimeProbe() {} - - public static void main(String[] args) { - OpenAIClient client = - OpenAIOkHttpClient.builder().apiKey("runtime-probe").build(); - try { - if (client.models() == null) { - throw new IllegalStateException("OkHttp client did not create its model service"); - } - } finally { - client.close(); - } - - System.out.printf("Exercised an OkHttp SDK client on Java %s.%n", System.getProperty("java.version")); - } -} diff --git a/openai-java/build.gradle.kts b/openai-java/build.gradle.kts deleted file mode 100644 index 005ddf86f..000000000 --- a/openai-java/build.gradle.kts +++ /dev/null @@ -1,29 +0,0 @@ -plugins { - id("openai.kotlin") - id("openai.publish") -} - -dependencies { - api(project(":openai-java-client-okhttp")) -} - -// Redefine `dokkaJavadoc` to: -// - Depend on the root project's task for merging the docs of all the projects -// - Forward that task's output to this task's output -tasks.named("dokkaJavadoc").configure { - actions.clear() - - val dokkaJavadocCollector = rootProject.tasks["dokkaJavadocCollector"] - dependsOn(dokkaJavadocCollector) - - val outputDirectory = project.layout.buildDirectory.dir("dokka/javadoc") - doLast { - copy { - from(dokkaJavadocCollector.outputs.files) - into(outputDirectory) - duplicatesStrategy = DuplicatesStrategy.INCLUDE - } - } - - outputs.dir(outputDirectory) -} diff --git a/release-please-config.json b/release-please-config.json deleted file mode 100644 index 49224ae00..000000000 --- a/release-please-config.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "packages": { - ".": {} - }, - "$schema": "https://raw.githubusercontent.com/stainless-api/release-please/main/schemas/config.json", - "include-v-in-tag": true, - "include-component-in-tag": false, - "versioning": "prerelease", - "prerelease": true, - "bump-minor-pre-major": true, - "bump-patch-for-minor-pre-major": false, - "pull-request-header": "Automated Release PR", - "pull-request-title-pattern": "release: ${version}", - "changelog-sections": [ - { - "type": "feat", - "section": "Features" - }, - { - "type": "fix", - "section": "Bug Fixes" - }, - { - "type": "perf", - "section": "Performance Improvements" - }, - { - "type": "revert", - "section": "Reverts" - }, - { - "type": "chore", - "section": "Chores" - }, - { - "type": "docs", - "section": "Documentation" - }, - { - "type": "style", - "section": "Styles" - }, - { - "type": "refactor", - "section": "Refactors" - }, - { - "type": "test", - "section": "Tests", - "hidden": true - }, - { - "type": "build", - "section": "Build System" - }, - { - "type": "ci", - "section": "Continuous Integration", - "hidden": true - } - ], - "release-type": "simple", - "extra-files": [ - "README.md", - "bedrock.md", - "build.gradle.kts" - ] -} diff --git a/scripts/build b/scripts/build deleted file mode 100755 index edb4c1b68..000000000 --- a/scripts/build +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(dirname "$0")/.." - -echo "==> Testing build logic" -./scripts/gradle :buildSrc:test "$@" - -echo "==> Building classes" -./scripts/gradle build testClasses verifyVersionSupportPolicy "$@" -x test diff --git a/scripts/detect-breaking-changes b/scripts/detect-breaking-changes deleted file mode 100755 index db524948e..000000000 --- a/scripts/detect-breaking-changes +++ /dev/null @@ -1,418 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -cd "$(dirname "$0")/.." - -echo "==> Detecting breaking changes" - -if [ "$#" -ne 1 ]; then - echo "Usage: $0 " >&2 - exit 2 -fi - -BASE_COMMIT="$1" - -git cat-file -e "${BASE_COMMIT}^{commit}" - -TEST_PATHS=( - openai-java-core/src/test/kotlin/com/openai/models - openai-java-core/src/test/kotlin/com/openai/services -) - -SUPPORT_PATHS=( - openai-java-core/src/test/kotlin/com/openai/TestServerExtension.kt - openai-java-core/src/test/kotlin/com/openai/core/StructuredOutputsTestUtils.kt -) - -COMPATIBILITY_ROOT="openai-java-core/build/api-compatibility-source" -PROPOSED_COMPATIBILITY_ROOT="${COMPATIBILITY_ROOT}/proposed" -POLICY_PATH="openai-java-core/src/apiCompatibility" -POLICY_ROOT="${COMPATIBILITY_ROOT}/${POLICY_PATH}" -BASELINE_EXCLUSIONS_PATH="${POLICY_ROOT}/excluded-generated-tests.txt" -BASELINE_DEPENDENCIES_PATH="${POLICY_ROOT}/dependencies.txt" -BASELINE_PUBLIC_API_PATH="${POLICY_ROOT}/structured-output-public-api.txt" -BASELINE_FIXTURE_PATH="${POLICY_ROOT}/kotlin" -PROPOSED_EXCLUSIONS_PATH="${POLICY_PATH}/excluded-generated-tests.txt" -PROPOSED_DEPENDENCIES_PATH="${POLICY_PATH}/dependencies.txt" -PROPOSED_PUBLIC_API_PATH="${POLICY_PATH}/structured-output-public-api.txt" -PROPOSED_FIXTURE_PATH="${POLICY_PATH}/kotlin" -MULTIPART_INTERNAL_EXPRESSION='field.map { (it as? ByteArray)?.inputStream() ?: it }' - -rm -rf "${COMPATIBILITY_ROOT}" -mkdir -p "${COMPATIBILITY_ROOT}" - -RESTORED_TEST_PATHS=0 -for PATHSPEC in "${TEST_PATHS[@]}"; do - if ! git cat-file -e "${BASE_COMMIT}:${PATHSPEC}" 2>/dev/null; then - echo "Skipping test path absent from base commit: ${PATHSPEC}" - continue - fi - - # Extract the previous tests into an isolated source tree. This avoids collisions with renamed - # current tests and keeps the working tree untouched. - git archive "${BASE_COMMIT}" -- "${PATHSPEC}" | tar -x -C "${COMPATIBILITY_ROOT}" - RESTORED_TEST_PATHS=$((RESTORED_TEST_PATHS + 1)) -done - -if [ "${RESTORED_TEST_PATHS}" -eq 0 ]; then - echo "No baseline test paths were found in ${BASE_COMMIT}" >&2 - exit 1 -fi - -PROPOSED_TEST_PATHS=0 -for PATHSPEC in "${TEST_PATHS[@]}"; do - if [ ! -d "${PATHSPEC}" ]; then - echo "Skipping proposed test path absent from working tree: ${PATHSPEC}" - continue - fi - - mkdir -p "${PROPOSED_COMPATIBILITY_ROOT}/$(dirname "${PATHSPEC}")" - cp -R "${PATHSPEC}" "${PROPOSED_COMPATIBILITY_ROOT}/$(dirname "${PATHSPEC}")/" - PROPOSED_TEST_PATHS=$((PROPOSED_TEST_PATHS + 1)) -done - -if [ "${PROPOSED_TEST_PATHS}" -eq 0 ]; then - echo "No proposed test paths were found in the working tree" >&2 - exit 1 -fi - -for PATHSPEC in "${SUPPORT_PATHS[@]}"; do - if ! git cat-file -e "${BASE_COMMIT}:${PATHSPEC}" 2>/dev/null; then - echo "Skipping support path absent from base commit: ${PATHSPEC}" - else - git archive "${BASE_COMMIT}" -- "${PATHSPEC}" | tar -x -C "${COMPATIBILITY_ROOT}" - fi - - if [ ! -f "${PATHSPEC}" ]; then - echo "Skipping proposed support path absent from working tree: ${PATHSPEC}" - else - mkdir -p "${PROPOSED_COMPATIBILITY_ROOT}/$(dirname "${PATHSPEC}")" - cp "${PATHSPEC}" "${PROPOSED_COMPATIBILITY_ROOT}/${PATHSPEC}" - fi -done - -# Compatibility exceptions are policy, not transformations of generated source. Always use the -# policy from the base commit so a proposed SDK change cannot weaken its own compatibility gate. -# The fallback bootstraps the policy on the first commit that introduces it. -if git cat-file -e "${BASE_COMMIT}:${POLICY_PATH}" 2>/dev/null; then - git archive "${BASE_COMMIT}" -- "${POLICY_PATH}" | tar -x -C "${COMPATIBILITY_ROOT}" -else - echo "Baseline has no API compatibility policy; using the proposed policy for bootstrap" - mkdir -p "${POLICY_ROOT}" - cp -R "${POLICY_PATH}/." "${POLICY_ROOT}/" -fi - -validate_exclusions() { - local exclusions_path="$1" - local source_root="$2" - local policy_name="$3" - local remove_exclusions="$4" - - if [ ! -f "${exclusions_path}" ]; then - echo "Missing ${policy_name} compatibility exclusions: ${exclusions_path}" >&2 - exit 1 - fi - - while IFS= read -r PATHSPEC || [ -n "${PATHSPEC}" ]; do - case "${PATHSPEC}" in - ''|\#*) continue ;; - esac - - case "${PATHSPEC}" in - *..*|/*) - echo "Unsafe ${policy_name} compatibility exclusion: ${PATHSPEC}" >&2 - exit 1 - ;; - esac - - IS_RESTORED_TEST=false - for TEST_ROOT in "${TEST_PATHS[@]}"; do - if [[ "${PATHSPEC}" == "${TEST_ROOT}/"* && "${PATHSPEC}" == *.kt ]]; then - IS_RESTORED_TEST=true - break - fi - done - - if [ "${IS_RESTORED_TEST}" != true ]; then - echo "${policy_name} compatibility exclusion is outside the test roots: ${PATHSPEC}" >&2 - exit 1 - fi - - if [ ! -f "${source_root}/${PATHSPEC}" ]; then - echo "${policy_name} compatibility exclusion does not exist: ${PATHSPEC}" >&2 - exit 1 - fi - - if [ "${remove_exclusions}" = true ]; then - rm "${source_root:?}/${PATHSPEC}" - fi - done < "${exclusions_path}" -} - -validate_policy_files() { - local dependencies_path="$1" - local fixture_path="$2" - local public_api_path="$3" - local policy_name="$4" - - if [ ! -s "${dependencies_path}" ]; then - echo "No ${policy_name} compatibility dependencies found in ${dependencies_path}" >&2 - exit 1 - fi - - if ! find "${fixture_path}" -type f -name '*.kt' -print -quit | grep -q .; then - echo "No ${policy_name} public compatibility fixtures found in ${fixture_path}" >&2 - exit 1 - fi - - if [ ! -s "${public_api_path}" ]; then - echo "No ${policy_name} structured-output API signatures found in ${public_api_path}" >&2 - exit 1 - fi -} - -# Generated multipart assertions call the Kotlin-internal MultipartField.map helper. Rewrite only -# the isolated compatibility copies so their public builders and factories remain covered. -normalize_multipart_assertions() { - local source_root="$1" - local policy_name="$2" - local rewritten_files=0 - local file_path - local grep_status - - while IFS= read -r -d '' file_path; do - if grep -Fq "${MULTIPART_INTERNAL_EXPRESSION}" "${file_path}"; then - INTERNAL_SOURCE="${MULTIPART_INTERNAL_EXPRESSION}" PUBLIC_SOURCE='field' \ - perl -0pi -e 's/\Q$ENV{INTERNAL_SOURCE}\E/$ENV{PUBLIC_SOURCE}/g' "${file_path}" - rewritten_files=$((rewritten_files + 1)) - else - grep_status=$? - if [ "${grep_status}" -ne 1 ]; then - echo "Failed to inspect ${policy_name} compatibility fixture: ${file_path}" >&2 - return "${grep_status}" - fi - fi - done < <(find "${source_root}" -type f -name '*.kt' -print0) - - echo "Normalized ${rewritten_files} ${policy_name} multipart compatibility fixture(s)." -} - -validate_exclusions \ - "${BASELINE_EXCLUSIONS_PATH}" \ - "${COMPATIBILITY_ROOT}" \ - baseline \ - true -validate_exclusions \ - "${PROPOSED_EXCLUSIONS_PATH}" \ - "${PROPOSED_COMPATIBILITY_ROOT}" \ - proposed \ - true -validate_policy_files \ - "${BASELINE_DEPENDENCIES_PATH}" \ - "${BASELINE_FIXTURE_PATH}" \ - "${BASELINE_PUBLIC_API_PATH}" \ - baseline -validate_policy_files \ - "${PROPOSED_DEPENDENCIES_PATH}" \ - "${PROPOSED_FIXTURE_PATH}" \ - "${PROPOSED_PUBLIC_API_PATH}" \ - proposed -normalize_multipart_assertions \ - "${COMPATIBILITY_ROOT}/openai-java-core/src/test/kotlin" \ - baseline -normalize_multipart_assertions \ - "${PROPOSED_COMPATIBILITY_ROOT}/openai-java-core/src/test/kotlin" \ - proposed - -# Keep the compatibility compilation policy in this detector rather than in the proposed build -# file. CI also runs the detector from the base commit, so a PR cannot bypass that baseline policy -# by weakening a source set or task in openai-java-core/build.gradle.kts. -GENERATED_TEST_SOURCE_ROOT="$(pwd)/${COMPATIBILITY_ROOT}/openai-java-core/src/test/kotlin" -PROPOSED_GENERATED_TEST_SOURCE_ROOT="$(pwd)/${PROPOSED_COMPATIBILITY_ROOT}/openai-java-core/src/test/kotlin" -BASELINE_FIXTURE_SOURCE_ROOT="$(pwd)/${BASELINE_FIXTURE_PATH}" -BASELINE_DEPENDENCIES_FILE="$(pwd)/${BASELINE_DEPENDENCIES_PATH}" -PROPOSED_FIXTURE_SOURCE_ROOT="$(pwd)/${PROPOSED_FIXTURE_PATH}" -PROPOSED_DEPENDENCIES_FILE="$(pwd)/${PROPOSED_DEPENDENCIES_PATH}" -COMPATIBILITY_INIT_SCRIPT="$(mktemp)" -trap 'rm -f "${COMPATIBILITY_INIT_SCRIPT}"' EXIT - -cat > "${COMPATIBILITY_INIT_SCRIPT}" <<'GRADLE' -import org.gradle.api.attributes.java.TargetJvmVersion - -gradle.beforeProject { project -> - if (project.path == ":openai-java-core") { - project.pluginManager.withPlugin("org.jetbrains.kotlin.jvm") { - def sourceSets = project.extensions.getByName("sourceSets") - def main = sourceSets.getByName("main") - - def configureCompatibility = { - name, - generatedTestRoot, - fixtureRoot, - dependenciesFile -> - def compatibility = sourceSets.create(name) - if (generatedTestRoot) { - compatibility.kotlin.srcDir(generatedTestRoot) - } - compatibility.kotlin.srcDir(fixtureRoot) - compatibility.compileClasspath += main.output + main.compileClasspath - - def implementation = - project.configurations.getByName( - compatibility.implementationConfigurationName - ) - new File(dependenciesFile).readLines().each { dependency -> - dependency = dependency.trim() - if (dependency && !dependency.startsWith("#")) { - project.dependencies.add(implementation.name, dependency) - } - } - project.dependencies.add( - implementation.name, - project.dependencies.project([path: ":openai-java-client-okhttp"]) - ) - - project.configurations - .getByName(compatibility.compileClasspathConfigurationName) - .attributes - .attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 17) - } - - configureCompatibility( - "externalApiCompatibility", - System.getenv("GENERATED_TEST_SOURCE_ROOT"), - System.getenv("BASELINE_FIXTURE_SOURCE_ROOT"), - System.getenv("BASELINE_DEPENDENCIES_FILE") - ) - configureCompatibility( - "proposedApiCompatibility", - System.getenv("PROPOSED_GENERATED_TEST_SOURCE_ROOT"), - System.getenv("PROPOSED_FIXTURE_SOURCE_ROOT"), - System.getenv("PROPOSED_DEPENDENCIES_FILE") - ) - } - } -} -GRADLE - -GENERATED_TEST_SOURCE_ROOT="${GENERATED_TEST_SOURCE_ROOT}" \ - PROPOSED_GENERATED_TEST_SOURCE_ROOT="${PROPOSED_GENERATED_TEST_SOURCE_ROOT}" \ - BASELINE_FIXTURE_SOURCE_ROOT="${BASELINE_FIXTURE_SOURCE_ROOT}" \ - BASELINE_DEPENDENCIES_FILE="${BASELINE_DEPENDENCIES_FILE}" \ - PROPOSED_FIXTURE_SOURCE_ROOT="${PROPOSED_FIXTURE_SOURCE_ROOT}" \ - PROPOSED_DEPENDENCIES_FILE="${PROPOSED_DEPENDENCIES_FILE}" \ - ./scripts/gradle \ - --init-script "${COMPATIBILITY_INIT_SCRIPT}" \ - :openai-java-core:compileExternalApiCompatibilityKotlin \ - :openai-java-core:compileProposedApiCompatibilityKotlin \ - --no-build-cache - -validate_public_api_signatures() { - local manifest_path="$1" - local policy_name="$2" - local require_exact_match="$3" - local classes_root - local actual_signatures - local classes - local expected_signatures - local missing_signatures - local unexpected_signatures - local expected - local class_and_method - local descriptor - local class_name - local method_name - local extra - - classes_root="$(pwd)/openai-java-core/build/classes/kotlin/main" - actual_signatures="$(mktemp)" - classes="$(mktemp)" - expected_signatures="$(mktemp)" - missing_signatures="$(mktemp)" - unexpected_signatures="$(mktemp)" - - while IFS= read -r expected || [ -n "${expected}" ]; do - case "${expected}" in - ''|\#*) continue ;; - esac - - read -r class_and_method descriptor extra <<< "${expected}" - class_name="${class_and_method%#*}" - method_name="${class_and_method##*#}" - - if [ -n "${extra:-}" ] || - [[ ! "${class_name}" =~ ^[A-Za-z0-9_.\$]+$ ]] || - [[ ! "${method_name}" =~ ^[A-Za-z0-9_]+$ ]] || - [[ ! "${descriptor}" =~ ^\([^[:space:]]*\)[^[:space:]]+$ ]]; then - echo "Invalid ${policy_name} public API signature: ${expected}" >&2 - exit 1 - fi - - printf '%s\n' "${class_name}" >> "${classes}" - printf '%s\n' "${expected}" >> "${expected_signatures}" - done < "${manifest_path}" - - if [ ! -s "${classes}" ]; then - echo "No ${policy_name} public API classes found in ${manifest_path}" >&2 - exit 1 - fi - - LC_ALL=C sort -u "${classes}" -o "${classes}" - if [ "$(LC_ALL=C sort "${expected_signatures}" | uniq -d | wc -l)" -ne 0 ]; then - echo "${policy_name} public API manifest contains duplicate signatures" >&2 - LC_ALL=C sort "${expected_signatures}" | uniq -d >&2 - exit 1 - fi - LC_ALL=C sort -o "${expected_signatures}" "${expected_signatures}" - - while IFS= read -r class_name; do - if ! javap -classpath "${classes_root}" -public -s "${class_name}" | - awk -v class_name="${class_name}" ' - /^ public/ && /\(/ { - declaration = $0 - sub(/\(.*/, "", declaration) - count = split(declaration, fields, /[[:space:]]+/) - method_name = fields[count] - next - } - /descriptor:/ && method_name != "" { - if (method_name !~ /\$/ && method_name !~ /^com\.openai\./ && method_name != "equals" && method_name != "hashCode" && method_name != "toString") { - print class_name "#" method_name " " $2 - } - method_name = "" - } - ' >> "${actual_signatures}"; then - echo "${policy_name} public API class is missing: ${class_name}" >&2 - exit 1 - fi - done < "${classes}" - - LC_ALL=C sort -u -o "${actual_signatures}" "${actual_signatures}" - comm -23 "${expected_signatures}" "${actual_signatures}" > "${missing_signatures}" - if [ -s "${missing_signatures}" ]; then - echo "${policy_name} structured-output API is missing:" >&2 - sed 's/^/ /' "${missing_signatures}" >&2 - exit 1 - fi - - if [ "${require_exact_match}" = true ]; then - comm -13 "${expected_signatures}" "${actual_signatures}" > "${unexpected_signatures}" - if [ -s "${unexpected_signatures}" ]; then - echo "${policy_name} structured-output API manifest is incomplete:" >&2 - sed 's/^/ /' "${unexpected_signatures}" >&2 - exit 1 - fi - fi - - rm -f \ - "${actual_signatures}" \ - "${classes}" \ - "${expected_signatures}" \ - "${missing_signatures}" \ - "${unexpected_signatures}" - echo "${policy_name} structured-output public API is compatible." -} - -validate_public_api_signatures "${BASELINE_PUBLIC_API_PATH}" baseline false -validate_public_api_signatures "${PROPOSED_PUBLIC_API_PATH}" proposed true diff --git a/scripts/fast-format b/scripts/fast-format deleted file mode 100755 index 35a1dee25..000000000 --- a/scripts/fast-format +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -echo "Script started with $# arguments" -echo "Arguments: $*" -echo "Script location: $(dirname "$0")" - -cd "$(dirname "$0")/.." -echo "Changed to directory: $(pwd)" - -if [ $# -eq 0 ]; then - echo "Usage: $0 [additional-formatter-args...]" - echo "The file should contain one file path per line" - exit 1 -fi - -FILE_LIST="$1" - -echo "Looking for file: $FILE_LIST" - -if [ ! -f "$FILE_LIST" ]; then - echo "Error: File '$FILE_LIST' not found" - exit 1 -fi - -if ! command -v ktfmt &> /dev/null; then - echo "Error: ktfmt not found" - exit 1 -fi - -# Process Kotlin files -echo "==> Looking for Kotlin files" -kt_files=$(grep -E '\.kt$' "$FILE_LIST" | grep -v './buildSrc/build/' || true) -echo "==> Done looking for Kotlin files" - -if [[ -n "$kt_files" ]]; then - echo "==> will format Kotlin files" - echo "$kt_files" | tr '\n' '\0' | xargs -0 ktfmt --kotlinlang-style "$@" -else - echo "No Kotlin files to format -- expected outcome during incremental formatting" -fi - -# TODO(mbudayr): support palantir-java-format -# Process Java files -# grep -E '\.java$' "$FILE_LIST" | grep -v './buildSrc/build/' | tr '\n' '\0' | xargs -0 -r palantir-java-format --palantir --replace "$@" diff --git a/scripts/format b/scripts/format deleted file mode 100755 index 7464ccf4b..000000000 --- a/scripts/format +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(dirname "$0")/.." - -if command -v ktfmt &> /dev/null; then - echo "==> Running ktfmt" - ./scripts/kotlin-format -else - echo "==> Running gradlew formatKotlin" - ./scripts/gradle formatKotlin -fi - -if command -v palantir-java-format &> /dev/null; then - echo "==> Running palantir-java-format" - ./scripts/java-format -else - echo "==> Running gradlew formatJava" - ./scripts/gradle formatJava -fi diff --git a/scripts/gradle b/scripts/gradle deleted file mode 100755 index 4f7e63939..000000000 --- a/scripts/gradle +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(dirname "$0")/.." - -gradle_args=() - -if [ "${CI:-}" != "true" ] && [ "${OPENAI_JAVA_GRADLE_LOCAL:-true}" != "false" ]; then - gradle_args+=(--daemon) -fi - -./gradlew "${gradle_args[@]}" "$@" diff --git a/scripts/java-format b/scripts/java-format deleted file mode 100755 index ad5febce9..000000000 --- a/scripts/java-format +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(dirname "$0")/.." - -find . -name "*.java" -not -path "./buildSrc/build/*" -print0 | xargs -0 -r palantir-java-format --palantir --replace "$@" diff --git a/scripts/kotlin-format b/scripts/kotlin-format deleted file mode 100755 index 3b8be9ea9..000000000 --- a/scripts/kotlin-format +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(dirname "$0")/.." - -find . -name "*.kt" -not -path "./buildSrc/build/*" -print0 | xargs -0 -r ktfmt --kotlinlang-style "$@" diff --git a/scripts/lint b/scripts/lint deleted file mode 100755 index 0b3e06645..000000000 --- a/scripts/lint +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(dirname "$0")/.." - -echo "==> Running lints" - -if command -v ktfmt &> /dev/null; then - echo "==> Checking ktfmt" - ./scripts/kotlin-format --dry-run --set-exit-if-changed -else - echo "==> Running gradlew lintKotlin" - ./scripts/gradle lintKotlin -fi - -if command -v palantir-java-format &> /dev/null; then - echo "==> Checking palantir-java-format" - ./scripts/java-format --dry-run --set-exit-if-changed -else - echo "==> Running gradlew lintJava" - ./scripts/gradle lintJava -fi diff --git a/scripts/mock b/scripts/mock deleted file mode 100755 index efc647aec..000000000 --- a/scripts/mock +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(dirname "$0")/.." - -if [[ -n "$1" && "$1" != '--'* ]]; then - URL="$1" - shift -elif [[ -f .castiron.stats.yml && -f api_reference/openapi.transformed.yml ]]; then - URL="api_reference/openapi.transformed.yml" - EXPECTED_HASH="$(awk '$1 == "openapi_transformed_spec_hash:" { print $2; exit }' .castiron.stats.yml)" - ACTUAL_HASH="$(node -e 'process.stdout.write(require("node:crypto").createHash("md5").update(require("node:fs").readFileSync(process.argv[1])).digest("hex"))' "$URL")" - - if [[ -z "$EXPECTED_HASH" || "$ACTUAL_HASH" != "$EXPECTED_HASH" ]]; then - echo "Error: Local OpenAPI specification does not match generation metadata" >&2 - exit 1 - fi -else - URL="$(grep 'openapi_spec_url' .stats.yml | cut -d' ' -f2)" -fi - -# Check if the URL is empty -if [ -z "$URL" ]; then - echo "Error: No OpenAPI spec path/url provided or found in .stats.yml" - exit 1 -fi - -echo "==> Starting mock server with URL ${URL}" - -# Run steady mock on the given spec -if [ "$1" == "--daemon" ]; then - # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stdy/cli@0.22.1 -- steady --version - - npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=brackets --validator-form-array-format=brackets --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & - - # Wait for server to come online via health endpoint (max 30s) - echo -n "Waiting for server" - attempts=0 - while ! curl --silent --fail "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1; do - if ! kill -0 $! 2>/dev/null; then - echo - cat .stdy.log - exit 1 - fi - attempts=$((attempts + 1)) - if [ "$attempts" -ge 300 ]; then - echo - echo "Timed out waiting for Steady server to start" - cat .stdy.log - exit 1 - fi - echo -n "." - sleep 0.1 - done - - echo -else - npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=brackets --validator-form-array-format=brackets --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" -fi diff --git a/scripts/test b/scripts/test deleted file mode 100755 index 58632a617..000000000 --- a/scripts/test +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(dirname "$0")/.." - -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[0;33m' -NC='\033[0m' # No Color - -function steady_is_running() { - curl --silent "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1 -} - -kill_server_on_port() { - pids=$(lsof -t -i tcp:"$1" || echo "") - if [ "$pids" != "" ]; then - kill "$pids" - echo "Stopped $pids." - fi -} - -function is_overriding_api_base_url() { - [ -n "$TEST_API_BASE_URL" ] -} - -if ! is_overriding_api_base_url && ! steady_is_running ; then - # When we exit this script, make sure to kill the background mock server process - trap 'kill_server_on_port 4010' EXIT - - # Start the dev server - ./scripts/mock --daemon -fi - -if is_overriding_api_base_url ; then - echo -e "${GREEN}✔ Running tests against ${TEST_API_BASE_URL}${NC}" - echo -elif ! steady_is_running ; then - echo -e "${RED}ERROR:${NC} The test suite will not run without a mock Steady server" - echo -e "running against your OpenAPI spec." - echo - echo -e "To run the server, pass in the path or url of your OpenAPI" - echo -e "spec to the steady command:" - echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.22.1 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=brackets --validator-form-array-format=brackets --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" - echo - - exit 1 -else - echo -e "${GREEN}✔ Mock steady server is running with your OpenAPI spec${NC}" - echo -fi - -echo "==> Running tests" - -# Clear OpenAI-related env vars to keep test expectations consistent between laptop and CI. -unset OPENAI_API_KEY -unset OPENAI_ORG_ID -unset OPENAI_PROJECT_ID -unset OPENAI_WEBHOOK_SECRET -unset OPENAI_BASE_URL - -./scripts/gradle test "$@" diff --git a/scripts/upload-artifacts b/scripts/upload-artifacts deleted file mode 100755 index 10f3c7055..000000000 --- a/scripts/upload-artifacts +++ /dev/null @@ -1,193 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -# ANSI Color Codes -GREEN='\033[32m' -RED='\033[31m' -NC='\033[0m' # No Color - -MAVEN_REPO_PATH="./build/local-maven-repo" - -log_error() { - local msg="$1" - local headers="$2" - local body="$3" - echo -e "${RED}${msg}${NC}" - [[ -f "$headers" ]] && echo -e "${RED}Headers:$(cat "$headers")${NC}" - echo -e "${RED}Body: ${body}${NC}" - exit 1 -} - -upload_file() { - local file_name="$1" - local tmp_headers - tmp_headers=$(mktemp) - - if [ -f "$file_name" ]; then - echo -e "${GREEN}Processing file: $file_name${NC}" - pkg_file_name="mvn${file_name#"${MAVEN_REPO_PATH}"}" - - # Get signed URL for uploading artifact file - signed_url_response=$(curl -X POST -G "$URL" \ - -sS --retry 5 \ - -D "$tmp_headers" \ - --data-urlencode "filename=$pkg_file_name" \ - -H "Authorization: Bearer $AUTH" \ - -H "Content-Type: application/json") - - # Validate JSON and extract URL - if ! signed_url=$(echo "$signed_url_response" | jq -e -r '.url' 2>/dev/null) || [[ "$signed_url" == "null" ]]; then - log_error "Failed to get valid signed URL" "$tmp_headers" "$signed_url_response" - fi - - # Set content-type based on file extension - local extension="${file_name##*.}" - local content_type - case "$extension" in - jar) content_type="application/java-archive" ;; - md5|sha1|sha256|sha512) content_type="text/plain" ;; - module) content_type="application/json" ;; - pom|xml) content_type="application/xml" ;; - html) content_type="text/html" ;; - *) content_type="application/octet-stream" ;; - esac - - # Upload file - upload_response=$(curl -v -X PUT \ - --retry 5 \ - --retry-all-errors \ - -D "$tmp_headers" \ - -H "Content-Type: $content_type" \ - --data-binary "@${file_name}" "$signed_url" 2>&1) - - if ! echo "$upload_response" | grep -q "HTTP/[0-9.]* 200"; then - log_error "Failed to upload artifact file" "$tmp_headers" "$upload_response" - fi - - # Insert small throttle to reduce rate limiting risk - sleep 0.1 - fi -} - -walk_tree() { - local current_dir="$1" - - for entry in "$current_dir"/*; do - # Check that entry is valid - [ -e "$entry" ] || [ -h "$entry" ] || continue - - if [ -d "$entry" ]; then - walk_tree "$entry" - else - upload_file "$entry" - fi - done -} - -generate_instructions() { - cat << EOF > "$MAVEN_REPO_PATH/index.html" - - - - Maven Repo - - -

Stainless SDK Maven Repository

-

This is the Maven repository for your Stainless Java SDK build.

- -

Project configuration

- -

The details depend on whether you're using Maven or Gradle as your build tool.

- -

Maven

- -

Add the following to your project's pom.xml:

-
<repositories>
-    <repository>
-        <id>stainless-sdk-repo</id>
-        <url>https://pkg.stainless.com/s/${PROJECT}/${SHA}/mvn</url>
-    </repository>
-</repositories>
- -

Gradle

-

Add the following to your build.gradle file:

-
repositories {
-    maven {
-        url "https://pkg.stainless.com/s/${PROJECT}/${SHA}/mvn"
-    }
-}
- -
-

Configuring authentication (if required)

- -

Some accounts may require authentication to access the repository. If so, use the - following instructions, replacing YOUR_STAINLESS_API_TOKEN with your actual token.

- -

Maven with authentication

- -

First, ensure you have the following in your Maven settings.xml for repo authentication:

-
<servers>
-    <server>
-        <id>stainless-sdk-repo</id>
-        <configuration>
-            <httpHeaders>
-                <property>
-                    <name>Authorization</name>
-                    <value>Bearer YOUR_STAINLESS_API_TOKEN</value>
-                </property>
-            </httpHeaders>
-        </configuration>
-    </server>
-</servers>
- -

Then, add the following to your project's pom.xml:

-
<repositories>
-    <repository>
-        <id>stainless-sdk-repo</id>
-        <url>https://pkg.stainless.com/s/${PROJECT}/${SHA}/mvn</url>
-    </repository>
-</repositories>
- -

Gradle with authentication

-

Add the following to your build.gradle file:

-
repositories {
-    maven {
-        url "https://pkg.stainless.com/s/${PROJECT}/${SHA}/mvn"
-        credentials(HttpHeaderCredentials) {
-            name = "Authorization"
-            value = "Bearer YOUR_STAINLESS_API_TOKEN"
-        }
-        authentication {
-            header(HttpHeaderAuthentication)
-        }
-    }
-}
-
- -

Using the repository

-

Once you've configured the repository, you can include dependencies from it as usual. See your - project README - for more details.

- - -EOF - upload_file "${MAVEN_REPO_PATH}/index.html" - - echo "Configure maven or gradle to use the repo located at 'https://pkg.stainless.com/s/${PROJECT}/${SHA}/mvn'" - echo "For more details, see the directions in https://pkg.stainless.com/s/${PROJECT}/${SHA}/mvn/index.html" -} - -cd "$(dirname "$0")/.." - -echo "::group::Creating local Maven content" -./gradlew publishMavenPublicationToLocalFileSystemRepository -PpublishLocal -echo "::endgroup::" - -echo "::group::Uploading to pkg.stainless.com" -walk_tree "$MAVEN_REPO_PATH" -echo "::endgroup::" - -echo "::group::Generating instructions" -generate_instructions -echo "::endgroup::" diff --git a/settings.gradle.kts b/settings.gradle.kts deleted file mode 100644 index 76435c79f..000000000 --- a/settings.gradle.kts +++ /dev/null @@ -1,14 +0,0 @@ -rootProject.name = "openai-java-root" - -val projectNames = rootDir.listFiles() - ?.asSequence() - .orEmpty() - .filter { file -> - file.isDirectory && - file.name.startsWith("openai-java") && - file.listFiles()?.asSequence().orEmpty().any { it.name == "build.gradle.kts" } - } - .map { it.name } - .toList() -println("projects: $projectNames") -projectNames.forEach { include(it) } From 33648e52a09b8e51058250aa2b692c86de21c0a7 Mon Sep 17 00:00:00 2001 From: Castiron Bot Date: Mon, 3 Aug 2026 12:28:09 -0400 Subject: [PATCH 2/5] [castiron] SDK codegen checkpoint 22cda305-8b5f-4b20-803d-52670cfdd00f Generation metadata: ewogICJjb25maWd1cmF0aW9uX2NoZWNrcG9pbnRfc2hhIjogIjQ2N2Y1OThhOWIyYmIwNzM1Y2Y0NWMwMTQ0M2YwYTg0YjI2ZWEwM2IiLAogICJnZW5lcmF0ZWRfYmFzZWxpbmVfc2hhMjU2IjogImU2NzFlZmZjZTdjYzFkNjZiY2UwMjdiN2MyYTViNTc5YTRmNTZhNmQ4ZTc3ZDI1NTk4MmQxNDgyMDM5MjYxNDMiLAogICJnZW5lcmF0aW9uX2lkIjogIjIyY2RhMzA1LThiNWYtNGIyMC04MDNkLTUyNjcwY2ZkZDAwZiIsCiAgImlucHV0X2J1bmRsZV9kaWdlc3QiOiAiZmNiNjU5ZjQ2ZDUyYTg3YjdjN2M1ZDQ5MjhhNGE4OGIwODljZDkwNThiOTMxYWRlNThmYmZjMjUzYjAwZGVmYiIsCiAgImxhbmd1YWdlIjogImphdmEiLAogICJwcmV2aW91c19nZW5lcmF0aW9uX2lkIjogbnVsbCwKICAicHVibGljX2Jhc2VsaW5lX2NvbW1pdCI6ICI1MmUzYzY0MjE1YjY0N2FlZWJlMWU5MTIzYzFjODU3YTdiYmU5NWFmIiwKICAic291cmNlX2JyYW5jaCI6ICJhcGNoYS1ncHQtNS01IiwKICAidGFyZ2V0IjogIm9wZW5haS1qYXZhIgp9Cg== --- .../kotlin/com/openai/models/ChatModel.kt | 6 ++ .../models/beta/responses/BetaResponse.kt | 6 ++ .../BetaResponseFunctionToolCallOutputItem.kt | 89 ++++++++++++++++- .../beta/responses/BetaResponseInputItem.kt | 95 ++++++++++++++++++- .../responses/BetaResponsesClientEvent.kt | 6 ++ .../beta/responses/ResponseCompactParams.kt | 6 ++ .../beta/responses/ResponseCreateParams.kt | 6 ++ .../models/responses/ResponseCompactParams.kt | 6 ++ .../ResponseFunctionToolCallOutputItem.kt | 88 ++++++++++++++++- .../models/responses/ResponseInputItem.kt | 94 +++++++++++++++++- ...aResponseFunctionToolCallOutputItemTest.kt | 6 ++ .../responses/BetaResponseInputItemTest.kt | 4 + .../beta/responses/BetaResponseItemTest.kt | 4 + .../responses/BetaResponseOutputItemTest.kt | 4 + .../items/ConversationItemTest.kt | 4 + .../ResponseFunctionToolCallOutputItemTest.kt | 6 ++ .../models/responses/ResponseInputItemTest.kt | 4 + .../models/responses/ResponseItemTest.kt | 4 + .../responses/ResponseOutputItemTest.kt | 4 + 19 files changed, 429 insertions(+), 13 deletions(-) diff --git a/openai-java-core/src/main/kotlin/com/openai/models/ChatModel.kt b/openai-java-core/src/main/kotlin/com/openai/models/ChatModel.kt index 35755e10b..5b480c784 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/ChatModel.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/ChatModel.kt @@ -26,6 +26,8 @@ class ChatModel @JsonCreator private constructor(private val value: JsonField Value.GPT_5_6_SOL GPT_5_6_TERRA -> Value.GPT_5_6_TERRA GPT_5_6_LUNA -> Value.GPT_5_6_LUNA + GPT_5_5 -> Value.GPT_5_5 GPT_5_4 -> Value.GPT_5_4 GPT_5_4_MINI -> Value.GPT_5_4_MINI GPT_5_4_NANO -> Value.GPT_5_4_NANO @@ -473,6 +478,7 @@ class ChatModel @JsonCreator private constructor(private val value: JsonField Known.GPT_5_6_SOL GPT_5_6_TERRA -> Known.GPT_5_6_TERRA GPT_5_6_LUNA -> Known.GPT_5_6_LUNA + GPT_5_5 -> Known.GPT_5_5 GPT_5_4 -> Known.GPT_5_4 GPT_5_4_MINI -> Known.GPT_5_4_MINI GPT_5_4_NANO -> Known.GPT_5_4_NANO diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponse.kt index 26b63d89f..ccc9f4f35 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponse.kt @@ -2970,6 +2970,8 @@ private constructor( @JvmField val GPT_5_6_LUNA = of("gpt-5.6-luna") + @JvmField val GPT_5_5 = of("gpt-5.5") + @JvmField val GPT_5_4 = of("gpt-5.4") @JvmField val GPT_5_4_MINI = of("gpt-5.4-mini") @@ -3164,6 +3166,7 @@ private constructor( GPT_5_6_SOL, GPT_5_6_TERRA, GPT_5_6_LUNA, + GPT_5_5, GPT_5_4, GPT_5_4_MINI, GPT_5_4_NANO, @@ -3271,6 +3274,7 @@ private constructor( GPT_5_6_SOL, GPT_5_6_TERRA, GPT_5_6_LUNA, + GPT_5_5, GPT_5_4, GPT_5_4_MINI, GPT_5_4_NANO, @@ -3379,6 +3383,7 @@ private constructor( GPT_5_6_SOL -> Value.GPT_5_6_SOL GPT_5_6_TERRA -> Value.GPT_5_6_TERRA GPT_5_6_LUNA -> Value.GPT_5_6_LUNA + GPT_5_5 -> Value.GPT_5_5 GPT_5_4 -> Value.GPT_5_4 GPT_5_4_MINI -> Value.GPT_5_4_MINI GPT_5_4_NANO -> Value.GPT_5_4_NANO @@ -3488,6 +3493,7 @@ private constructor( GPT_5_6_SOL -> Known.GPT_5_6_SOL GPT_5_6_TERRA -> Known.GPT_5_6_TERRA GPT_5_6_LUNA -> Known.GPT_5_6_LUNA + GPT_5_5 -> Known.GPT_5_5 GPT_5_4 -> Known.GPT_5_4 GPT_5_4_MINI -> Known.GPT_5_4_MINI GPT_5_4_NANO -> Known.GPT_5_4_NANO diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItem.kt index 591494216..9d73f3320 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItem.kt @@ -41,6 +41,8 @@ private constructor( private val agent: JsonField, private val caller: JsonField, private val createdBy: JsonField, + private val name: JsonField, + private val namespace: JsonField, private val additionalProperties: MutableMap, ) { @@ -54,7 +56,21 @@ private constructor( @JsonProperty("agent") @ExcludeMissing agent: JsonField = JsonMissing.of(), @JsonProperty("caller") @ExcludeMissing caller: JsonField = JsonMissing.of(), @JsonProperty("created_by") @ExcludeMissing createdBy: JsonField = JsonMissing.of(), - ) : this(id, callId, output, status, type, agent, caller, createdBy, mutableMapOf()) + @JsonProperty("name") @ExcludeMissing name: JsonField = JsonMissing.of(), + @JsonProperty("namespace") @ExcludeMissing namespace: JsonField = JsonMissing.of(), + ) : this( + id, + callId, + output, + status, + type, + agent, + caller, + createdBy, + name, + namespace, + mutableMapOf(), + ) /** * The unique ID of the function call tool output. @@ -127,6 +143,22 @@ private constructor( */ fun createdBy(): Optional = createdBy.getOptional("created_by") + /** + * The name of the tool that produced the output. + * + * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the + * server responded with an unexpected value). + */ + fun name(): Optional = name.getOptional("name") + + /** + * The namespace of the tool that produced the output. + * + * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the + * server responded with an unexpected value). + */ + fun namespace(): Optional = namespace.getOptional("namespace") + /** * Returns the raw JSON value of [id]. * @@ -176,6 +208,20 @@ private constructor( */ @JsonProperty("created_by") @ExcludeMissing fun _createdBy(): JsonField = createdBy + /** + * Returns the raw JSON value of [name]. + * + * Unlike [name], this method doesn't throw if the JSON field has an unexpected type. + */ + @JsonProperty("name") @ExcludeMissing fun _name(): JsonField = name + + /** + * Returns the raw JSON value of [namespace]. + * + * Unlike [namespace], this method doesn't throw if the JSON field has an unexpected type. + */ + @JsonProperty("namespace") @ExcludeMissing fun _namespace(): JsonField = namespace + @JsonAnySetter private fun putAdditionalProperty(key: String, value: JsonValue) { additionalProperties.put(key, value) @@ -216,6 +262,8 @@ private constructor( private var agent: JsonField = JsonMissing.of() private var caller: JsonField = JsonMissing.of() private var createdBy: JsonField = JsonMissing.of() + private var name: JsonField = JsonMissing.of() + private var namespace: JsonField = JsonMissing.of() private var additionalProperties: MutableMap = mutableMapOf() @JvmSynthetic @@ -230,6 +278,8 @@ private constructor( agent = betaResponseFunctionToolCallOutputItem.agent caller = betaResponseFunctionToolCallOutputItem.caller createdBy = betaResponseFunctionToolCallOutputItem.createdBy + name = betaResponseFunctionToolCallOutputItem.name + namespace = betaResponseFunctionToolCallOutputItem.namespace additionalProperties = betaResponseFunctionToolCallOutputItem.additionalProperties.toMutableMap() } @@ -362,6 +412,29 @@ private constructor( */ fun createdBy(createdBy: JsonField) = apply { this.createdBy = createdBy } + /** The name of the tool that produced the output. */ + fun name(name: String) = name(JsonField.of(name)) + + /** + * Sets [Builder.name] to an arbitrary JSON value. + * + * You should usually call [Builder.name] with a well-typed [String] value instead. This + * method is primarily for setting the field to an undocumented or not yet supported value. + */ + fun name(name: JsonField) = apply { this.name = name } + + /** The namespace of the tool that produced the output. */ + fun namespace(namespace: String) = namespace(JsonField.of(namespace)) + + /** + * Sets [Builder.namespace] to an arbitrary JSON value. + * + * You should usually call [Builder.namespace] with a well-typed [String] value instead. + * This method is primarily for setting the field to an undocumented or not yet supported + * value. + */ + fun namespace(namespace: JsonField) = apply { this.namespace = namespace } + fun additionalProperties(additionalProperties: Map) = apply { this.additionalProperties.clear() putAllAdditionalProperties(additionalProperties) @@ -406,6 +479,8 @@ private constructor( agent, caller, createdBy, + name, + namespace, additionalProperties.toMutableMap(), ) } @@ -437,6 +512,8 @@ private constructor( agent().ifPresent { it.validate() } caller().ifPresent { it.validate() } createdBy() + name() + namespace() validated = true } @@ -462,7 +539,9 @@ private constructor( type.let { if (it == JsonValue.from("function_call_output")) 1 else 0 } + (agent.asKnown().getOrNull()?.validity() ?: 0) + (caller.asKnown().getOrNull()?.validity() ?: 0) + - (if (createdBy.asKnown().isPresent) 1 else 0) + (if (createdBy.asKnown().isPresent) 1 else 0) + + (if (name.asKnown().isPresent) 1 else 0) + + (if (namespace.asKnown().isPresent) 1 else 0) /** * The output from the function call generated by your code. Can be a string or an list of @@ -1743,6 +1822,8 @@ private constructor( agent == other.agent && caller == other.caller && createdBy == other.createdBy && + name == other.name && + namespace == other.namespace && additionalProperties == other.additionalProperties } @@ -1756,6 +1837,8 @@ private constructor( agent, caller, createdBy, + name, + namespace, additionalProperties, ) } @@ -1763,5 +1846,5 @@ private constructor( override fun hashCode(): Int = hashCode override fun toString() = - "BetaResponseFunctionToolCallOutputItem{id=$id, callId=$callId, output=$output, status=$status, type=$type, agent=$agent, caller=$caller, createdBy=$createdBy, additionalProperties=$additionalProperties}" + "BetaResponseFunctionToolCallOutputItem{id=$id, callId=$callId, output=$output, status=$status, type=$type, agent=$agent, caller=$caller, createdBy=$createdBy, name=$name, namespace=$namespace, additionalProperties=$additionalProperties}" } diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputItem.kt index 91b4ac0b1..b13b77689 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputItem.kt @@ -3608,6 +3608,8 @@ private constructor( private val id: JsonField, private val agent: JsonField, private val caller: JsonField, + private val name: JsonField, + private val namespace: JsonField, private val status: JsonField, private val additionalProperties: MutableMap, ) { @@ -3620,8 +3622,12 @@ private constructor( @JsonProperty("id") @ExcludeMissing id: JsonField = JsonMissing.of(), @JsonProperty("agent") @ExcludeMissing agent: JsonField = JsonMissing.of(), @JsonProperty("caller") @ExcludeMissing caller: JsonField = JsonMissing.of(), + @JsonProperty("name") @ExcludeMissing name: JsonField = JsonMissing.of(), + @JsonProperty("namespace") + @ExcludeMissing + namespace: JsonField = JsonMissing.of(), @JsonProperty("status") @ExcludeMissing status: JsonField = JsonMissing.of(), - ) : this(callId, output, type, id, agent, caller, status, mutableMapOf()) + ) : this(callId, output, type, id, agent, caller, name, namespace, status, mutableMapOf()) /** * The unique ID of the function tool call generated by the model. @@ -3677,6 +3683,22 @@ private constructor( */ fun caller(): Optional = caller.getOptional("caller") + /** + * The name of the tool that produced the output. + * + * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the + * server responded with an unexpected value). + */ + fun name(): Optional = name.getOptional("name") + + /** + * The namespace of the tool that produced the output. + * + * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the + * server responded with an unexpected value). + */ + fun namespace(): Optional = namespace.getOptional("namespace") + /** * The status of the item. One of `in_progress`, `completed`, or `incomplete`. Populated * when items are returned via API. @@ -3721,6 +3743,20 @@ private constructor( */ @JsonProperty("caller") @ExcludeMissing fun _caller(): JsonField = caller + /** + * Returns the raw JSON value of [name]. + * + * Unlike [name], this method doesn't throw if the JSON field has an unexpected type. + */ + @JsonProperty("name") @ExcludeMissing fun _name(): JsonField = name + + /** + * Returns the raw JSON value of [namespace]. + * + * Unlike [namespace], this method doesn't throw if the JSON field has an unexpected type. + */ + @JsonProperty("namespace") @ExcludeMissing fun _namespace(): JsonField = namespace + /** * Returns the raw JSON value of [status]. * @@ -3763,6 +3799,8 @@ private constructor( private var id: JsonField = JsonMissing.of() private var agent: JsonField = JsonMissing.of() private var caller: JsonField = JsonMissing.of() + private var name: JsonField = JsonMissing.of() + private var namespace: JsonField = JsonMissing.of() private var status: JsonField = JsonMissing.of() private var additionalProperties: MutableMap = mutableMapOf() @@ -3774,6 +3812,8 @@ private constructor( id = functionCallOutput.id agent = functionCallOutput.agent caller = functionCallOutput.caller + name = functionCallOutput.name + namespace = functionCallOutput.namespace status = functionCallOutput.status additionalProperties = functionCallOutput.additionalProperties.toMutableMap() } @@ -3897,6 +3937,36 @@ private constructor( fun programCaller(callerId: String) = caller(Caller.Program.builder().callerId(callerId).build()) + /** The name of the tool that produced the output. */ + fun name(name: String?) = name(JsonField.ofNullable(name)) + + /** Alias for calling [Builder.name] with `name.orElse(null)`. */ + fun name(name: Optional) = name(name.getOrNull()) + + /** + * Sets [Builder.name] to an arbitrary JSON value. + * + * You should usually call [Builder.name] with a well-typed [String] value instead. This + * method is primarily for setting the field to an undocumented or not yet supported + * value. + */ + fun name(name: JsonField) = apply { this.name = name } + + /** The namespace of the tool that produced the output. */ + fun namespace(namespace: String?) = namespace(JsonField.ofNullable(namespace)) + + /** Alias for calling [Builder.namespace] with `namespace.orElse(null)`. */ + fun namespace(namespace: Optional) = namespace(namespace.getOrNull()) + + /** + * Sets [Builder.namespace] to an arbitrary JSON value. + * + * You should usually call [Builder.namespace] with a well-typed [String] value instead. + * This method is primarily for setting the field to an undocumented or not yet + * supported value. + */ + fun namespace(namespace: JsonField) = apply { this.namespace = namespace } + /** * The status of the item. One of `in_progress`, `completed`, or `incomplete`. Populated * when items are returned via API. @@ -3955,6 +4025,8 @@ private constructor( id, agent, caller, + name, + namespace, status, additionalProperties.toMutableMap(), ) @@ -3986,6 +4058,8 @@ private constructor( id() agent().ifPresent { it.validate() } caller().ifPresent { it.validate() } + name() + namespace() status().ifPresent { it.validate() } validated = true } @@ -4012,6 +4086,8 @@ private constructor( (if (id.asKnown().isPresent) 1 else 0) + (agent.asKnown().getOrNull()?.validity() ?: 0) + (caller.asKnown().getOrNull()?.validity() ?: 0) + + (if (name.asKnown().isPresent) 1 else 0) + + (if (namespace.asKnown().isPresent) 1 else 0) + (status.asKnown().getOrNull()?.validity() ?: 0) /** Text, image, or file output of the function tool call. */ @@ -5053,18 +5129,31 @@ private constructor( id == other.id && agent == other.agent && caller == other.caller && + name == other.name && + namespace == other.namespace && status == other.status && additionalProperties == other.additionalProperties } private val hashCode: Int by lazy { - Objects.hash(callId, output, type, id, agent, caller, status, additionalProperties) + Objects.hash( + callId, + output, + type, + id, + agent, + caller, + name, + namespace, + status, + additionalProperties, + ) } override fun hashCode(): Int = hashCode override fun toString() = - "FunctionCallOutput{callId=$callId, output=$output, type=$type, id=$id, agent=$agent, caller=$caller, status=$status, additionalProperties=$additionalProperties}" + "FunctionCallOutput{callId=$callId, output=$output, type=$type, id=$id, agent=$agent, caller=$caller, name=$name, namespace=$namespace, status=$status, additionalProperties=$additionalProperties}" } /** A message routed between agents. */ diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesClientEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesClientEvent.kt index c0ae3b1f8..47d59415a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesClientEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesClientEvent.kt @@ -3347,6 +3347,8 @@ private constructor( @JvmField val GPT_5_6_LUNA = of("gpt-5.6-luna") + @JvmField val GPT_5_5 = of("gpt-5.5") + @JvmField val GPT_5_4 = of("gpt-5.4") @JvmField val GPT_5_4_MINI = of("gpt-5.4-mini") @@ -3549,6 +3551,7 @@ private constructor( GPT_5_6_SOL, GPT_5_6_TERRA, GPT_5_6_LUNA, + GPT_5_5, GPT_5_4, GPT_5_4_MINI, GPT_5_4_NANO, @@ -3656,6 +3659,7 @@ private constructor( GPT_5_6_SOL, GPT_5_6_TERRA, GPT_5_6_LUNA, + GPT_5_5, GPT_5_4, GPT_5_4_MINI, GPT_5_4_NANO, @@ -3766,6 +3770,7 @@ private constructor( GPT_5_6_SOL -> Value.GPT_5_6_SOL GPT_5_6_TERRA -> Value.GPT_5_6_TERRA GPT_5_6_LUNA -> Value.GPT_5_6_LUNA + GPT_5_5 -> Value.GPT_5_5 GPT_5_4 -> Value.GPT_5_4 GPT_5_4_MINI -> Value.GPT_5_4_MINI GPT_5_4_NANO -> Value.GPT_5_4_NANO @@ -3877,6 +3882,7 @@ private constructor( GPT_5_6_SOL -> Known.GPT_5_6_SOL GPT_5_6_TERRA -> Known.GPT_5_6_TERRA GPT_5_6_LUNA -> Known.GPT_5_6_LUNA + GPT_5_5 -> Known.GPT_5_5 GPT_5_4 -> Known.GPT_5_4 GPT_5_4_MINI -> Known.GPT_5_4_MINI GPT_5_4_NANO -> Known.GPT_5_4_NANO diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCompactParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCompactParams.kt index 7f906e18a..1edb5e284 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCompactParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCompactParams.kt @@ -1274,6 +1274,8 @@ private constructor( @JvmField val GPT_5_6_LUNA = of("gpt-5.6-luna") + @JvmField val GPT_5_5 = of("gpt-5.5") + @JvmField val GPT_5_4 = of("gpt-5.4") @JvmField val GPT_5_4_MINI = of("gpt-5.4-mini") @@ -1468,6 +1470,7 @@ private constructor( GPT_5_6_SOL, GPT_5_6_TERRA, GPT_5_6_LUNA, + GPT_5_5, GPT_5_4, GPT_5_4_MINI, GPT_5_4_NANO, @@ -1575,6 +1578,7 @@ private constructor( GPT_5_6_SOL, GPT_5_6_TERRA, GPT_5_6_LUNA, + GPT_5_5, GPT_5_4, GPT_5_4_MINI, GPT_5_4_NANO, @@ -1683,6 +1687,7 @@ private constructor( GPT_5_6_SOL -> Value.GPT_5_6_SOL GPT_5_6_TERRA -> Value.GPT_5_6_TERRA GPT_5_6_LUNA -> Value.GPT_5_6_LUNA + GPT_5_5 -> Value.GPT_5_5 GPT_5_4 -> Value.GPT_5_4 GPT_5_4_MINI -> Value.GPT_5_4_MINI GPT_5_4_NANO -> Value.GPT_5_4_NANO @@ -1792,6 +1797,7 @@ private constructor( GPT_5_6_SOL -> Known.GPT_5_6_SOL GPT_5_6_TERRA -> Known.GPT_5_6_TERRA GPT_5_6_LUNA -> Known.GPT_5_6_LUNA + GPT_5_5 -> Known.GPT_5_5 GPT_5_4 -> Known.GPT_5_4 GPT_5_4_MINI -> Known.GPT_5_4_MINI GPT_5_4_NANO -> Known.GPT_5_4_NANO diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCreateParams.kt index 2a712a06c..b1fdfaac2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCreateParams.kt @@ -4820,6 +4820,8 @@ private constructor( @JvmField val GPT_5_6_LUNA = of("gpt-5.6-luna") + @JvmField val GPT_5_5 = of("gpt-5.5") + @JvmField val GPT_5_4 = of("gpt-5.4") @JvmField val GPT_5_4_MINI = of("gpt-5.4-mini") @@ -5014,6 +5016,7 @@ private constructor( GPT_5_6_SOL, GPT_5_6_TERRA, GPT_5_6_LUNA, + GPT_5_5, GPT_5_4, GPT_5_4_MINI, GPT_5_4_NANO, @@ -5121,6 +5124,7 @@ private constructor( GPT_5_6_SOL, GPT_5_6_TERRA, GPT_5_6_LUNA, + GPT_5_5, GPT_5_4, GPT_5_4_MINI, GPT_5_4_NANO, @@ -5229,6 +5233,7 @@ private constructor( GPT_5_6_SOL -> Value.GPT_5_6_SOL GPT_5_6_TERRA -> Value.GPT_5_6_TERRA GPT_5_6_LUNA -> Value.GPT_5_6_LUNA + GPT_5_5 -> Value.GPT_5_5 GPT_5_4 -> Value.GPT_5_4 GPT_5_4_MINI -> Value.GPT_5_4_MINI GPT_5_4_NANO -> Value.GPT_5_4_NANO @@ -5338,6 +5343,7 @@ private constructor( GPT_5_6_SOL -> Known.GPT_5_6_SOL GPT_5_6_TERRA -> Known.GPT_5_6_TERRA GPT_5_6_LUNA -> Known.GPT_5_6_LUNA + GPT_5_5 -> Known.GPT_5_5 GPT_5_4 -> Known.GPT_5_4 GPT_5_4_MINI -> Known.GPT_5_4_MINI GPT_5_4_NANO -> Known.GPT_5_4_NANO diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactParams.kt index 08171a5ae..78f0f2d86 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactParams.kt @@ -1244,6 +1244,8 @@ private constructor( @JvmField val GPT_5_6_LUNA = of("gpt-5.6-luna") + @JvmField val GPT_5_5 = of("gpt-5.5") + @JvmField val GPT_5_4 = of("gpt-5.4") @JvmField val GPT_5_4_MINI = of("gpt-5.4-mini") @@ -1438,6 +1440,7 @@ private constructor( GPT_5_6_SOL, GPT_5_6_TERRA, GPT_5_6_LUNA, + GPT_5_5, GPT_5_4, GPT_5_4_MINI, GPT_5_4_NANO, @@ -1545,6 +1548,7 @@ private constructor( GPT_5_6_SOL, GPT_5_6_TERRA, GPT_5_6_LUNA, + GPT_5_5, GPT_5_4, GPT_5_4_MINI, GPT_5_4_NANO, @@ -1653,6 +1657,7 @@ private constructor( GPT_5_6_SOL -> Value.GPT_5_6_SOL GPT_5_6_TERRA -> Value.GPT_5_6_TERRA GPT_5_6_LUNA -> Value.GPT_5_6_LUNA + GPT_5_5 -> Value.GPT_5_5 GPT_5_4 -> Value.GPT_5_4 GPT_5_4_MINI -> Value.GPT_5_4_MINI GPT_5_4_NANO -> Value.GPT_5_4_NANO @@ -1762,6 +1767,7 @@ private constructor( GPT_5_6_SOL -> Known.GPT_5_6_SOL GPT_5_6_TERRA -> Known.GPT_5_6_TERRA GPT_5_6_LUNA -> Known.GPT_5_6_LUNA + GPT_5_5 -> Known.GPT_5_5 GPT_5_4 -> Known.GPT_5_4 GPT_5_4_MINI -> Known.GPT_5_4_MINI GPT_5_4_NANO -> Known.GPT_5_4_NANO diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItem.kt index 50b7b9a73..599b5be04 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItem.kt @@ -40,6 +40,8 @@ private constructor( private val type: JsonValue, private val caller: JsonField, private val createdBy: JsonField, + private val name: JsonField, + private val namespace: JsonField, private val additionalProperties: MutableMap, ) { @@ -52,7 +54,9 @@ private constructor( @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), @JsonProperty("caller") @ExcludeMissing caller: JsonField = JsonMissing.of(), @JsonProperty("created_by") @ExcludeMissing createdBy: JsonField = JsonMissing.of(), - ) : this(id, callId, output, status, type, caller, createdBy, mutableMapOf()) + @JsonProperty("name") @ExcludeMissing name: JsonField = JsonMissing.of(), + @JsonProperty("namespace") @ExcludeMissing namespace: JsonField = JsonMissing.of(), + ) : this(id, callId, output, status, type, caller, createdBy, name, namespace, mutableMapOf()) /** * The unique ID of the function call tool output. @@ -117,6 +121,22 @@ private constructor( */ fun createdBy(): Optional = createdBy.getOptional("created_by") + /** + * The name of the tool that produced the output. + * + * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the + * server responded with an unexpected value). + */ + fun name(): Optional = name.getOptional("name") + + /** + * The namespace of the tool that produced the output. + * + * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the + * server responded with an unexpected value). + */ + fun namespace(): Optional = namespace.getOptional("namespace") + /** * Returns the raw JSON value of [id]. * @@ -159,6 +179,20 @@ private constructor( */ @JsonProperty("created_by") @ExcludeMissing fun _createdBy(): JsonField = createdBy + /** + * Returns the raw JSON value of [name]. + * + * Unlike [name], this method doesn't throw if the JSON field has an unexpected type. + */ + @JsonProperty("name") @ExcludeMissing fun _name(): JsonField = name + + /** + * Returns the raw JSON value of [namespace]. + * + * Unlike [namespace], this method doesn't throw if the JSON field has an unexpected type. + */ + @JsonProperty("namespace") @ExcludeMissing fun _namespace(): JsonField = namespace + @JsonAnySetter private fun putAdditionalProperty(key: String, value: JsonValue) { additionalProperties.put(key, value) @@ -198,6 +232,8 @@ private constructor( private var type: JsonValue = JsonValue.from("function_call_output") private var caller: JsonField = JsonMissing.of() private var createdBy: JsonField = JsonMissing.of() + private var name: JsonField = JsonMissing.of() + private var namespace: JsonField = JsonMissing.of() private var additionalProperties: MutableMap = mutableMapOf() @JvmSynthetic @@ -210,6 +246,8 @@ private constructor( type = responseFunctionToolCallOutputItem.type caller = responseFunctionToolCallOutputItem.caller createdBy = responseFunctionToolCallOutputItem.createdBy + name = responseFunctionToolCallOutputItem.name + namespace = responseFunctionToolCallOutputItem.namespace additionalProperties = responseFunctionToolCallOutputItem.additionalProperties.toMutableMap() } @@ -328,6 +366,29 @@ private constructor( */ fun createdBy(createdBy: JsonField) = apply { this.createdBy = createdBy } + /** The name of the tool that produced the output. */ + fun name(name: String) = name(JsonField.of(name)) + + /** + * Sets [Builder.name] to an arbitrary JSON value. + * + * You should usually call [Builder.name] with a well-typed [String] value instead. This + * method is primarily for setting the field to an undocumented or not yet supported value. + */ + fun name(name: JsonField) = apply { this.name = name } + + /** The namespace of the tool that produced the output. */ + fun namespace(namespace: String) = namespace(JsonField.of(namespace)) + + /** + * Sets [Builder.namespace] to an arbitrary JSON value. + * + * You should usually call [Builder.namespace] with a well-typed [String] value instead. + * This method is primarily for setting the field to an undocumented or not yet supported + * value. + */ + fun namespace(namespace: JsonField) = apply { this.namespace = namespace } + fun additionalProperties(additionalProperties: Map) = apply { this.additionalProperties.clear() putAllAdditionalProperties(additionalProperties) @@ -371,6 +432,8 @@ private constructor( type, caller, createdBy, + name, + namespace, additionalProperties.toMutableMap(), ) } @@ -401,6 +464,8 @@ private constructor( } caller().ifPresent { it.validate() } createdBy() + name() + namespace() validated = true } @@ -425,7 +490,9 @@ private constructor( (status.asKnown().getOrNull()?.validity() ?: 0) + type.let { if (it == JsonValue.from("function_call_output")) 1 else 0 } + (caller.asKnown().getOrNull()?.validity() ?: 0) + - (if (createdBy.asKnown().isPresent) 1 else 0) + (if (createdBy.asKnown().isPresent) 1 else 0) + + (if (name.asKnown().isPresent) 1 else 0) + + (if (namespace.asKnown().isPresent) 1 else 0) /** * The output from the function call generated by your code. Can be a string or an list of @@ -1521,15 +1588,28 @@ private constructor( type == other.type && caller == other.caller && createdBy == other.createdBy && + name == other.name && + namespace == other.namespace && additionalProperties == other.additionalProperties } private val hashCode: Int by lazy { - Objects.hash(id, callId, output, status, type, caller, createdBy, additionalProperties) + Objects.hash( + id, + callId, + output, + status, + type, + caller, + createdBy, + name, + namespace, + additionalProperties, + ) } override fun hashCode(): Int = hashCode override fun toString() = - "ResponseFunctionToolCallOutputItem{id=$id, callId=$callId, output=$output, status=$status, type=$type, caller=$caller, createdBy=$createdBy, additionalProperties=$additionalProperties}" + "ResponseFunctionToolCallOutputItem{id=$id, callId=$callId, output=$output, status=$status, type=$type, caller=$caller, createdBy=$createdBy, name=$name, namespace=$namespace, additionalProperties=$additionalProperties}" } diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputItem.kt index 8767da982..f6fa78941 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputItem.kt @@ -3057,6 +3057,8 @@ private constructor( private val type: JsonValue, private val id: JsonField, private val caller: JsonField, + private val name: JsonField, + private val namespace: JsonField, private val status: JsonField, private val additionalProperties: MutableMap, ) { @@ -3068,8 +3070,12 @@ private constructor( @JsonProperty("type") @ExcludeMissing type: JsonValue = JsonMissing.of(), @JsonProperty("id") @ExcludeMissing id: JsonField = JsonMissing.of(), @JsonProperty("caller") @ExcludeMissing caller: JsonField = JsonMissing.of(), + @JsonProperty("name") @ExcludeMissing name: JsonField = JsonMissing.of(), + @JsonProperty("namespace") + @ExcludeMissing + namespace: JsonField = JsonMissing.of(), @JsonProperty("status") @ExcludeMissing status: JsonField = JsonMissing.of(), - ) : this(callId, output, type, id, caller, status, mutableMapOf()) + ) : this(callId, output, type, id, caller, name, namespace, status, mutableMapOf()) /** * The unique ID of the function tool call generated by the model. @@ -3117,6 +3123,22 @@ private constructor( */ fun caller(): Optional = caller.getOptional("caller") + /** + * The name of the tool that produced the output. + * + * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the + * server responded with an unexpected value). + */ + fun name(): Optional = name.getOptional("name") + + /** + * The namespace of the tool that produced the output. + * + * @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the + * server responded with an unexpected value). + */ + fun namespace(): Optional = namespace.getOptional("namespace") + /** * The status of the item. One of `in_progress`, `completed`, or `incomplete`. Populated * when items are returned via API. @@ -3154,6 +3176,20 @@ private constructor( */ @JsonProperty("caller") @ExcludeMissing fun _caller(): JsonField = caller + /** + * Returns the raw JSON value of [name]. + * + * Unlike [name], this method doesn't throw if the JSON field has an unexpected type. + */ + @JsonProperty("name") @ExcludeMissing fun _name(): JsonField = name + + /** + * Returns the raw JSON value of [namespace]. + * + * Unlike [namespace], this method doesn't throw if the JSON field has an unexpected type. + */ + @JsonProperty("namespace") @ExcludeMissing fun _namespace(): JsonField = namespace + /** * Returns the raw JSON value of [status]. * @@ -3195,6 +3231,8 @@ private constructor( private var type: JsonValue = JsonValue.from("function_call_output") private var id: JsonField = JsonMissing.of() private var caller: JsonField = JsonMissing.of() + private var name: JsonField = JsonMissing.of() + private var namespace: JsonField = JsonMissing.of() private var status: JsonField = JsonMissing.of() private var additionalProperties: MutableMap = mutableMapOf() @@ -3205,6 +3243,8 @@ private constructor( type = functionCallOutput.type id = functionCallOutput.id caller = functionCallOutput.caller + name = functionCallOutput.name + namespace = functionCallOutput.namespace status = functionCallOutput.status additionalProperties = functionCallOutput.additionalProperties.toMutableMap() } @@ -3311,6 +3351,36 @@ private constructor( fun programCaller(callerId: String) = caller(Caller.Program.builder().callerId(callerId).build()) + /** The name of the tool that produced the output. */ + fun name(name: String?) = name(JsonField.ofNullable(name)) + + /** Alias for calling [Builder.name] with `name.orElse(null)`. */ + fun name(name: Optional) = name(name.getOrNull()) + + /** + * Sets [Builder.name] to an arbitrary JSON value. + * + * You should usually call [Builder.name] with a well-typed [String] value instead. This + * method is primarily for setting the field to an undocumented or not yet supported + * value. + */ + fun name(name: JsonField) = apply { this.name = name } + + /** The namespace of the tool that produced the output. */ + fun namespace(namespace: String?) = namespace(JsonField.ofNullable(namespace)) + + /** Alias for calling [Builder.namespace] with `namespace.orElse(null)`. */ + fun namespace(namespace: Optional) = namespace(namespace.getOrNull()) + + /** + * Sets [Builder.namespace] to an arbitrary JSON value. + * + * You should usually call [Builder.namespace] with a well-typed [String] value instead. + * This method is primarily for setting the field to an undocumented or not yet + * supported value. + */ + fun namespace(namespace: JsonField) = apply { this.namespace = namespace } + /** * The status of the item. One of `in_progress`, `completed`, or `incomplete`. Populated * when items are returned via API. @@ -3368,6 +3438,8 @@ private constructor( type, id, caller, + name, + namespace, status, additionalProperties.toMutableMap(), ) @@ -3398,6 +3470,8 @@ private constructor( } id() caller().ifPresent { it.validate() } + name() + namespace() status().ifPresent { it.validate() } validated = true } @@ -3423,6 +3497,8 @@ private constructor( type.let { if (it == JsonValue.from("function_call_output")) 1 else 0 } + (if (id.asKnown().isPresent) 1 else 0) + (caller.asKnown().getOrNull()?.validity() ?: 0) + + (if (name.asKnown().isPresent) 1 else 0) + + (if (namespace.asKnown().isPresent) 1 else 0) + (status.asKnown().getOrNull()?.validity() ?: 0) /** Text, image, or file output of the function tool call. */ @@ -4275,18 +4351,30 @@ private constructor( type == other.type && id == other.id && caller == other.caller && + name == other.name && + namespace == other.namespace && status == other.status && additionalProperties == other.additionalProperties } private val hashCode: Int by lazy { - Objects.hash(callId, output, type, id, caller, status, additionalProperties) + Objects.hash( + callId, + output, + type, + id, + caller, + name, + namespace, + status, + additionalProperties, + ) } override fun hashCode(): Int = hashCode override fun toString() = - "FunctionCallOutput{callId=$callId, output=$output, type=$type, id=$id, caller=$caller, status=$status, additionalProperties=$additionalProperties}" + "FunctionCallOutput{callId=$callId, output=$output, type=$type, id=$id, caller=$caller, name=$name, namespace=$namespace, status=$status, additionalProperties=$additionalProperties}" } class ToolSearchCall diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItemTest.kt index 653f8c375..1d4389800 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItemTest.kt @@ -24,6 +24,8 @@ internal class BetaResponseFunctionToolCallOutputItemTest { ) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() assertThat(betaResponseFunctionToolCallOutputItem.id()).isEqualTo("id") @@ -41,6 +43,8 @@ internal class BetaResponseFunctionToolCallOutputItemTest { assertThat(betaResponseFunctionToolCallOutputItem.caller()) .contains(BetaResponseFunctionToolCallOutputItem.Caller.ofDirect()) assertThat(betaResponseFunctionToolCallOutputItem.createdBy()).contains("created_by") + assertThat(betaResponseFunctionToolCallOutputItem.name()).contains("name") + assertThat(betaResponseFunctionToolCallOutputItem.namespace()).contains("namespace") } @Test @@ -59,6 +63,8 @@ internal class BetaResponseFunctionToolCallOutputItemTest { ) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() val roundtrippedBetaResponseFunctionToolCallOutputItem = diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputItemTest.kt index 33354115b..83fc5e54b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputItemTest.kt @@ -826,6 +826,8 @@ internal class BetaResponseInputItemTest { .build() ) .callerDirect() + .name("x") + .namespace("namespace") .status(BetaResponseInputItem.FunctionCallOutput.Status.IN_PROGRESS) .build() @@ -883,6 +885,8 @@ internal class BetaResponseInputItemTest { .build() ) .callerDirect() + .name("x") + .namespace("namespace") .status(BetaResponseInputItem.FunctionCallOutput.Status.IN_PROGRESS) .build() ) diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseItemTest.kt index bd7389cf2..5efe2befc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseItemTest.kt @@ -736,6 +736,8 @@ internal class BetaResponseItemTest { ) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() val betaResponseItem = BetaResponseItem.ofFunctionCallOutput(functionCallOutput) @@ -791,6 +793,8 @@ internal class BetaResponseItemTest { ) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() ) diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemTest.kt index 283a29b60..17c690604 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemTest.kt @@ -326,6 +326,8 @@ internal class BetaResponseOutputItemTest { ) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() val betaResponseOutputItem = BetaResponseOutputItem.ofFunctionCallOutput(functionCallOutput) @@ -380,6 +382,8 @@ internal class BetaResponseOutputItemTest { ) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() ) diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ConversationItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ConversationItemTest.kt index cbaa8a534..5d9ade110 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ConversationItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ConversationItemTest.kt @@ -200,6 +200,8 @@ internal class ConversationItemTest { .status(ResponseFunctionToolCallOutputItem.Status.IN_PROGRESS) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() val conversationItem = ConversationItem.ofFunctionCallOutput(functionCallOutput) @@ -246,6 +248,8 @@ internal class ConversationItemTest { .status(ResponseFunctionToolCallOutputItem.Status.IN_PROGRESS) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() ) diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItemTest.kt index 2ec0580db..46b9ceec4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItemTest.kt @@ -19,6 +19,8 @@ internal class ResponseFunctionToolCallOutputItemTest { .status(ResponseFunctionToolCallOutputItem.Status.IN_PROGRESS) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() assertThat(responseFunctionToolCallOutputItem.id()).isEqualTo("id") @@ -30,6 +32,8 @@ internal class ResponseFunctionToolCallOutputItemTest { assertThat(responseFunctionToolCallOutputItem.caller()) .contains(ResponseFunctionToolCallOutputItem.Caller.ofDirect()) assertThat(responseFunctionToolCallOutputItem.createdBy()).contains("created_by") + assertThat(responseFunctionToolCallOutputItem.name()).contains("name") + assertThat(responseFunctionToolCallOutputItem.namespace()).contains("namespace") } @Test @@ -43,6 +47,8 @@ internal class ResponseFunctionToolCallOutputItemTest { .status(ResponseFunctionToolCallOutputItem.Status.IN_PROGRESS) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() val roundtrippedResponseFunctionToolCallOutputItem = diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputItemTest.kt index 2280460cb..3e74c2239 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputItemTest.kt @@ -748,6 +748,8 @@ internal class ResponseInputItemTest { .output("string") .id("fc_123") .callerDirect() + .name("x") + .namespace("namespace") .status(ResponseInputItem.FunctionCallOutput.Status.IN_PROGRESS) .build() @@ -797,6 +799,8 @@ internal class ResponseInputItemTest { .output("string") .id("fc_123") .callerDirect() + .name("x") + .namespace("namespace") .status(ResponseInputItem.FunctionCallOutput.Status.IN_PROGRESS) .build() ) diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseItemTest.kt index cab1c89d4..d014ec44d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseItemTest.kt @@ -665,6 +665,8 @@ internal class ResponseItemTest { .status(ResponseFunctionToolCallOutputItem.Status.IN_PROGRESS) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() val responseItem = ResponseItem.ofFunctionCallOutput(functionCallOutput) @@ -712,6 +714,8 @@ internal class ResponseItemTest { .status(ResponseFunctionToolCallOutputItem.Status.IN_PROGRESS) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() ) diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemTest.kt index 92c64aae0..f520b64fd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemTest.kt @@ -296,6 +296,8 @@ internal class ResponseOutputItemTest { .status(ResponseFunctionToolCallOutputItem.Status.IN_PROGRESS) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() val responseOutputItem = ResponseOutputItem.ofFunctionCallOutput(functionCallOutput) @@ -342,6 +344,8 @@ internal class ResponseOutputItemTest { .status(ResponseFunctionToolCallOutputItem.Status.IN_PROGRESS) .callerDirect() .createdBy("created_by") + .name("name") + .namespace("namespace") .build() ) From 0a0b0468da40bef16f4889adaa4d118639962570 Mon Sep 17 00:00:00 2001 From: Castiron Bot Date: Thu, 6 Aug 2026 15:49:54 -0700 Subject: [PATCH 3/5] [castiron] SDK codegen checkpoint 3d564437-7741-4718-ac14-d136f0ddbb80 Generation metadata: ewogICJjb25maWd1cmF0aW9uX2NoZWNrcG9pbnRfc2hhIjogImQxYTYyOGRiZjU5ODQwNzM0NGVhNmNhNjViMDRiNDQ3NGRmY2ViMjUiLAogICJnZW5lcmF0ZWRfYmFzZWxpbmVfc2hhMjU2IjogImU1N2RiNDhhZmRhNGE5MTZiN2RkZWZkNjRmNmEwOTExZmE1NmZjMzE4MjZmZDNlMGUyMzE4Yjc1Y2E2ZTk3ZTgiLAogICJnZW5lcmF0aW9uX2lkIjogIjNkNTY0NDM3LTc3NDEtNDcxOC1hYzE0LWQxMzZmMGRkYmI4MCIsCiAgImlucHV0X2J1bmRsZV9kaWdlc3QiOiAiY2FjZTNhYzRkMWExY2UwODczN2UyN2VjZjNiY2E0ZjJjZmYyZGVjYWUwNzgxYTgyMzZjZTI5MGM5OTIwNzMxNyIsCiAgImxhbmd1YWdlIjogImphdmEiLAogICJwcmV2aW91c19nZW5lcmF0aW9uX2lkIjogIjIyY2RhMzA1LThiNWYtNGIyMC04MDNkLTUyNjcwY2ZkZDAwZiIsCiAgInB1YmxpY19iYXNlbGluZV9jb21taXQiOiAiZDAxYmVhMjA1OGFjOGQ0MWYzMjU0YzU0ZmQ0OTgxNjM1NzUzMzZhZCIsCiAgInNvdXJjZV9icmFuY2giOiAiYXBjaGEtYXVnLTYiLAogICJ0YXJnZXQiOiAib3BlbmFpLWphdmEiCn0K --- .../src/main/kotlin/com/openai/client/OpenAIClient.kt | 2 +- .../main/kotlin/com/openai/client/OpenAIClientAsync.kt | 2 +- .../kotlin/com/openai/client/OpenAIClientAsyncImpl.kt | 2 +- .../src/main/kotlin/com/openai/client/OpenAIClientImpl.kt | 2 +- .../src/main/kotlin/com/openai/models/AllModels.kt | 2 +- .../src/main/kotlin/com/openai/models/ChatModel.kt | 2 +- .../src/main/kotlin/com/openai/models/ComparisonFilter.kt | 2 +- .../src/main/kotlin/com/openai/models/CompoundFilter.kt | 2 +- .../kotlin/com/openai/models/CustomToolInputFormat.kt | 2 +- .../src/main/kotlin/com/openai/models/ErrorObject.kt | 2 +- .../main/kotlin/com/openai/models/FunctionDefinition.kt | 2 +- .../main/kotlin/com/openai/models/FunctionParameters.kt | 2 +- .../src/main/kotlin/com/openai/models/OAuthErrorCode.kt | 2 +- .../src/main/kotlin/com/openai/models/Reasoning.kt | 2 +- .../src/main/kotlin/com/openai/models/ReasoningEffort.kt | 2 +- .../kotlin/com/openai/models/ResponseFormatJsonObject.kt | 2 +- .../kotlin/com/openai/models/ResponseFormatJsonSchema.kt | 2 +- .../main/kotlin/com/openai/models/ResponseFormatText.kt | 2 +- .../kotlin/com/openai/models/ResponseFormatTextGrammar.kt | 2 +- .../kotlin/com/openai/models/ResponseFormatTextPython.kt | 2 +- .../src/main/kotlin/com/openai/models/ResponsesModel.kt | 2 +- .../models/admin/organization/adminapikeys/AdminApiKey.kt | 2 +- .../organization/adminapikeys/AdminApiKeyCreateParams.kt | 2 +- .../adminapikeys/AdminApiKeyCreateResponse.kt | 2 +- .../organization/adminapikeys/AdminApiKeyDeleteParams.kt | 2 +- .../adminapikeys/AdminApiKeyDeleteResponse.kt | 2 +- .../organization/adminapikeys/AdminApiKeyListPage.kt | 2 +- .../organization/adminapikeys/AdminApiKeyListPageAsync.kt | 2 +- .../adminapikeys/AdminApiKeyListPageResponse.kt | 2 +- .../organization/adminapikeys/AdminApiKeyListParams.kt | 2 +- .../adminapikeys/AdminApiKeyRetrieveParams.kt | 2 +- .../admin/organization/auditlogs/AuditLogListPage.kt | 2 +- .../admin/organization/auditlogs/AuditLogListPageAsync.kt | 2 +- .../organization/auditlogs/AuditLogListPageResponse.kt | 2 +- .../admin/organization/auditlogs/AuditLogListParams.kt | 2 +- .../admin/organization/auditlogs/AuditLogListResponse.kt | 2 +- .../models/admin/organization/certificates/Certificate.kt | 2 +- .../organization/certificates/CertificateActivatePage.kt | 2 +- .../certificates/CertificateActivatePageAsync.kt | 2 +- .../certificates/CertificateActivatePageResponse.kt | 2 +- .../certificates/CertificateActivateParams.kt | 2 +- .../certificates/CertificateActivateResponse.kt | 2 +- .../organization/certificates/CertificateCreateParams.kt | 2 +- .../certificates/CertificateDeactivatePage.kt | 2 +- .../certificates/CertificateDeactivatePageAsync.kt | 2 +- .../certificates/CertificateDeactivatePageResponse.kt | 2 +- .../certificates/CertificateDeactivateParams.kt | 2 +- .../certificates/CertificateDeactivateResponse.kt | 2 +- .../organization/certificates/CertificateDeleteParams.kt | 2 +- .../certificates/CertificateDeleteResponse.kt | 2 +- .../organization/certificates/CertificateListPage.kt | 2 +- .../organization/certificates/CertificateListPageAsync.kt | 2 +- .../certificates/CertificateListPageResponse.kt | 2 +- .../organization/certificates/CertificateListParams.kt | 2 +- .../organization/certificates/CertificateListResponse.kt | 2 +- .../certificates/CertificateRetrieveParams.kt | 2 +- .../organization/certificates/CertificateUpdateParams.kt | 2 +- .../dataretention/DataRetentionRetrieveParams.kt | 2 +- .../dataretention/DataRetentionUpdateParams.kt | 2 +- .../dataretention/OrganizationDataRetention.kt | 2 +- .../com/openai/models/admin/organization/groups/Group.kt | 2 +- .../models/admin/organization/groups/GroupCreateParams.kt | 2 +- .../models/admin/organization/groups/GroupDeleteParams.kt | 2 +- .../admin/organization/groups/GroupDeleteResponse.kt | 2 +- .../models/admin/organization/groups/GroupListPage.kt | 2 +- .../admin/organization/groups/GroupListPageAsync.kt | 2 +- .../admin/organization/groups/GroupListPageResponse.kt | 2 +- .../models/admin/organization/groups/GroupListParams.kt | 2 +- .../admin/organization/groups/GroupRetrieveParams.kt | 2 +- .../models/admin/organization/groups/GroupUpdateParams.kt | 2 +- .../admin/organization/groups/GroupUpdateResponse.kt | 2 +- .../admin/organization/groups/roles/RoleCreateParams.kt | 2 +- .../admin/organization/groups/roles/RoleCreateResponse.kt | 2 +- .../admin/organization/groups/roles/RoleDeleteParams.kt | 2 +- .../admin/organization/groups/roles/RoleDeleteResponse.kt | 2 +- .../admin/organization/groups/roles/RoleListPage.kt | 2 +- .../admin/organization/groups/roles/RoleListPageAsync.kt | 2 +- .../organization/groups/roles/RoleListPageResponse.kt | 2 +- .../admin/organization/groups/roles/RoleListParams.kt | 2 +- .../admin/organization/groups/roles/RoleListResponse.kt | 2 +- .../admin/organization/groups/roles/RoleRetrieveParams.kt | 2 +- .../organization/groups/roles/RoleRetrieveResponse.kt | 2 +- .../organization/groups/users/OrganizationGroupUser.kt | 2 +- .../admin/organization/groups/users/UserCreateParams.kt | 2 +- .../admin/organization/groups/users/UserCreateResponse.kt | 2 +- .../admin/organization/groups/users/UserDeleteParams.kt | 2 +- .../admin/organization/groups/users/UserDeleteResponse.kt | 2 +- .../admin/organization/groups/users/UserListPage.kt | 2 +- .../admin/organization/groups/users/UserListPageAsync.kt | 2 +- .../organization/groups/users/UserListPageResponse.kt | 2 +- .../admin/organization/groups/users/UserListParams.kt | 2 +- .../admin/organization/groups/users/UserRetrieveParams.kt | 2 +- .../organization/groups/users/UserRetrieveResponse.kt | 2 +- .../openai/models/admin/organization/invites/Invite.kt | 2 +- .../admin/organization/invites/InviteCreateParams.kt | 2 +- .../admin/organization/invites/InviteDeleteParams.kt | 2 +- .../admin/organization/invites/InviteDeleteResponse.kt | 2 +- .../models/admin/organization/invites/InviteListPage.kt | 2 +- .../admin/organization/invites/InviteListPageAsync.kt | 2 +- .../admin/organization/invites/InviteListPageResponse.kt | 2 +- .../models/admin/organization/invites/InviteListParams.kt | 2 +- .../admin/organization/invites/InviteRetrieveParams.kt | 2 +- .../openai/models/admin/organization/projects/Project.kt | 2 +- .../admin/organization/projects/ProjectArchiveParams.kt | 2 +- .../admin/organization/projects/ProjectCreateParams.kt | 2 +- .../models/admin/organization/projects/ProjectListPage.kt | 2 +- .../admin/organization/projects/ProjectListPageAsync.kt | 2 +- .../organization/projects/ProjectListPageResponse.kt | 2 +- .../admin/organization/projects/ProjectListParams.kt | 2 +- .../admin/organization/projects/ProjectRetrieveParams.kt | 2 +- .../admin/organization/projects/ProjectUpdateParams.kt | 2 +- .../organization/projects/apikeys/ApiKeyDeleteParams.kt | 2 +- .../organization/projects/apikeys/ApiKeyDeleteResponse.kt | 2 +- .../admin/organization/projects/apikeys/ApiKeyListPage.kt | 2 +- .../organization/projects/apikeys/ApiKeyListPageAsync.kt | 2 +- .../projects/apikeys/ApiKeyListPageResponse.kt | 2 +- .../organization/projects/apikeys/ApiKeyListParams.kt | 2 +- .../organization/projects/apikeys/ApiKeyRetrieveParams.kt | 2 +- .../admin/organization/projects/apikeys/ProjectApiKey.kt | 2 +- .../projects/certificates/CertificateActivatePage.kt | 2 +- .../projects/certificates/CertificateActivatePageAsync.kt | 2 +- .../certificates/CertificateActivatePageResponse.kt | 2 +- .../projects/certificates/CertificateActivateParams.kt | 2 +- .../projects/certificates/CertificateActivateResponse.kt | 2 +- .../projects/certificates/CertificateDeactivatePage.kt | 2 +- .../certificates/CertificateDeactivatePageAsync.kt | 2 +- .../certificates/CertificateDeactivatePageResponse.kt | 2 +- .../projects/certificates/CertificateDeactivateParams.kt | 2 +- .../certificates/CertificateDeactivateResponse.kt | 2 +- .../projects/certificates/CertificateListPage.kt | 2 +- .../projects/certificates/CertificateListPageAsync.kt | 2 +- .../projects/certificates/CertificateListPageResponse.kt | 2 +- .../projects/certificates/CertificateListParams.kt | 2 +- .../projects/certificates/CertificateListResponse.kt | 2 +- .../projects/dataretention/DataRetentionRetrieveParams.kt | 2 +- .../projects/dataretention/DataRetentionUpdateParams.kt | 2 +- .../projects/dataretention/ProjectDataRetention.kt | 2 +- .../organization/projects/groups/GroupCreateParams.kt | 2 +- .../organization/projects/groups/GroupDeleteParams.kt | 2 +- .../organization/projects/groups/GroupDeleteResponse.kt | 2 +- .../admin/organization/projects/groups/GroupListPage.kt | 2 +- .../organization/projects/groups/GroupListPageAsync.kt | 2 +- .../organization/projects/groups/GroupListPageResponse.kt | 2 +- .../admin/organization/projects/groups/GroupListParams.kt | 2 +- .../organization/projects/groups/GroupRetrieveParams.kt | 2 +- .../admin/organization/projects/groups/ProjectGroup.kt | 2 +- .../projects/groups/roles/RoleCreateParams.kt | 2 +- .../projects/groups/roles/RoleCreateResponse.kt | 2 +- .../projects/groups/roles/RoleDeleteParams.kt | 2 +- .../projects/groups/roles/RoleDeleteResponse.kt | 2 +- .../organization/projects/groups/roles/RoleListPage.kt | 2 +- .../projects/groups/roles/RoleListPageAsync.kt | 2 +- .../projects/groups/roles/RoleListPageResponse.kt | 2 +- .../organization/projects/groups/roles/RoleListParams.kt | 2 +- .../projects/groups/roles/RoleListResponse.kt | 2 +- .../projects/groups/roles/RoleRetrieveParams.kt | 2 +- .../projects/groups/roles/RoleRetrieveResponse.kt | 2 +- .../HostedToolPermissionRetrieveParams.kt | 2 +- .../HostedToolPermissionUpdateParams.kt | 2 +- .../hostedtoolpermissions/ProjectHostedToolPermissions.kt | 2 +- .../modelpermissions/ModelPermissionDeleteParams.kt | 2 +- .../modelpermissions/ModelPermissionRetrieveParams.kt | 2 +- .../modelpermissions/ModelPermissionUpdateParams.kt | 2 +- .../projects/modelpermissions/ProjectModelPermissions.kt | 2 +- .../modelpermissions/ProjectModelPermissionsDeleted.kt | 2 +- .../organization/projects/ratelimits/ProjectRateLimit.kt | 2 +- .../projects/ratelimits/RateLimitListRateLimitsPage.kt | 2 +- .../ratelimits/RateLimitListRateLimitsPageAsync.kt | 2 +- .../ratelimits/RateLimitListRateLimitsPageResponse.kt | 2 +- .../projects/ratelimits/RateLimitListRateLimitsParams.kt | 2 +- .../projects/ratelimits/RateLimitUpdateRateLimitParams.kt | 2 +- .../admin/organization/projects/roles/RoleCreateParams.kt | 2 +- .../admin/organization/projects/roles/RoleDeleteParams.kt | 2 +- .../organization/projects/roles/RoleDeleteResponse.kt | 2 +- .../admin/organization/projects/roles/RoleListPage.kt | 2 +- .../organization/projects/roles/RoleListPageAsync.kt | 2 +- .../organization/projects/roles/RoleListPageResponse.kt | 2 +- .../admin/organization/projects/roles/RoleListParams.kt | 2 +- .../organization/projects/roles/RoleRetrieveParams.kt | 2 +- .../admin/organization/projects/roles/RoleUpdateParams.kt | 2 +- .../projects/serviceaccounts/ProjectServiceAccount.kt | 2 +- .../serviceaccounts/ServiceAccountCreateParams.kt | 2 +- .../serviceaccounts/ServiceAccountCreateResponse.kt | 2 +- .../serviceaccounts/ServiceAccountDeleteParams.kt | 2 +- .../serviceaccounts/ServiceAccountDeleteResponse.kt | 2 +- .../projects/serviceaccounts/ServiceAccountListPage.kt | 2 +- .../serviceaccounts/ServiceAccountListPageAsync.kt | 2 +- .../serviceaccounts/ServiceAccountListPageResponse.kt | 2 +- .../projects/serviceaccounts/ServiceAccountListParams.kt | 2 +- .../serviceaccounts/ServiceAccountRetrieveParams.kt | 2 +- .../serviceaccounts/ServiceAccountUpdateParams.kt | 2 +- .../serviceaccounts/apikeys/ApiKeyCreateParams.kt | 2 +- .../serviceaccounts/apikeys/ApiKeyCreateResponse.kt | 2 +- .../projects/spendalerts/ProjectSpendAlert.kt | 2 +- .../projects/spendalerts/ProjectSpendAlertDeleted.kt | 2 +- .../projects/spendalerts/SpendAlertCreateParams.kt | 2 +- .../projects/spendalerts/SpendAlertDeleteParams.kt | 2 +- .../projects/spendalerts/SpendAlertListPage.kt | 2 +- .../projects/spendalerts/SpendAlertListPageAsync.kt | 2 +- .../projects/spendalerts/SpendAlertListPageResponse.kt | 2 +- .../projects/spendalerts/SpendAlertListParams.kt | 2 +- .../projects/spendalerts/SpendAlertRetrieveParams.kt | 2 +- .../projects/spendalerts/SpendAlertUpdateParams.kt | 2 +- .../organization/projects/spendlimit/ProjectSpendLimit.kt | 2 +- .../projects/spendlimit/ProjectSpendLimitDeleted.kt | 2 +- .../projects/spendlimit/SpendLimitDeleteParams.kt | 2 +- .../projects/spendlimit/SpendLimitRetrieveParams.kt | 2 +- .../projects/spendlimit/SpendLimitUpdateParams.kt | 2 +- .../admin/organization/projects/users/ProjectUser.kt | 2 +- .../admin/organization/projects/users/UserCreateParams.kt | 2 +- .../admin/organization/projects/users/UserDeleteParams.kt | 2 +- .../organization/projects/users/UserDeleteResponse.kt | 2 +- .../admin/organization/projects/users/UserListPage.kt | 2 +- .../organization/projects/users/UserListPageAsync.kt | 2 +- .../organization/projects/users/UserListPageResponse.kt | 2 +- .../admin/organization/projects/users/UserListParams.kt | 2 +- .../organization/projects/users/UserRetrieveParams.kt | 2 +- .../admin/organization/projects/users/UserUpdateParams.kt | 2 +- .../organization/projects/users/roles/RoleCreateParams.kt | 2 +- .../projects/users/roles/RoleCreateResponse.kt | 2 +- .../organization/projects/users/roles/RoleDeleteParams.kt | 2 +- .../projects/users/roles/RoleDeleteResponse.kt | 2 +- .../organization/projects/users/roles/RoleListPage.kt | 2 +- .../projects/users/roles/RoleListPageAsync.kt | 2 +- .../projects/users/roles/RoleListPageResponse.kt | 2 +- .../organization/projects/users/roles/RoleListParams.kt | 2 +- .../organization/projects/users/roles/RoleListResponse.kt | 2 +- .../projects/users/roles/RoleRetrieveParams.kt | 2 +- .../projects/users/roles/RoleRetrieveResponse.kt | 2 +- .../com/openai/models/admin/organization/roles/Role.kt | 2 +- .../models/admin/organization/roles/RoleCreateParams.kt | 2 +- .../models/admin/organization/roles/RoleDeleteParams.kt | 2 +- .../models/admin/organization/roles/RoleDeleteResponse.kt | 2 +- .../models/admin/organization/roles/RoleListPage.kt | 2 +- .../models/admin/organization/roles/RoleListPageAsync.kt | 2 +- .../admin/organization/roles/RoleListPageResponse.kt | 2 +- .../models/admin/organization/roles/RoleListParams.kt | 2 +- .../models/admin/organization/roles/RoleRetrieveParams.kt | 2 +- .../models/admin/organization/roles/RoleUpdateParams.kt | 2 +- .../organization/spendalerts/OrganizationSpendAlert.kt | 2 +- .../spendalerts/OrganizationSpendAlertDeleted.kt | 2 +- .../organization/spendalerts/SpendAlertCreateParams.kt | 2 +- .../organization/spendalerts/SpendAlertDeleteParams.kt | 2 +- .../admin/organization/spendalerts/SpendAlertListPage.kt | 2 +- .../organization/spendalerts/SpendAlertListPageAsync.kt | 2 +- .../spendalerts/SpendAlertListPageResponse.kt | 2 +- .../organization/spendalerts/SpendAlertListParams.kt | 2 +- .../organization/spendalerts/SpendAlertRetrieveParams.kt | 2 +- .../organization/spendalerts/SpendAlertUpdateParams.kt | 2 +- .../organization/spendlimit/OrganizationSpendLimit.kt | 2 +- .../spendlimit/OrganizationSpendLimitDeleted.kt | 2 +- .../organization/spendlimit/SpendLimitDeleteParams.kt | 2 +- .../organization/spendlimit/SpendLimitRetrieveParams.kt | 2 +- .../organization/spendlimit/SpendLimitUpdateParams.kt | 2 +- .../admin/organization/usage/UsageAudioSpeechesParams.kt | 2 +- .../organization/usage/UsageAudioSpeechesResponse.kt | 2 +- .../organization/usage/UsageAudioTranscriptionsParams.kt | 2 +- .../usage/UsageAudioTranscriptionsResponse.kt | 2 +- .../usage/UsageCodeInterpreterSessionsParams.kt | 2 +- .../usage/UsageCodeInterpreterSessionsResponse.kt | 2 +- .../admin/organization/usage/UsageCompletionsParams.kt | 2 +- .../admin/organization/usage/UsageCompletionsResponse.kt | 2 +- .../models/admin/organization/usage/UsageCostsParams.kt | 2 +- .../models/admin/organization/usage/UsageCostsResponse.kt | 2 +- .../admin/organization/usage/UsageEmbeddingsParams.kt | 2 +- .../admin/organization/usage/UsageEmbeddingsResponse.kt | 2 +- .../organization/usage/UsageFileSearchCallsParams.kt | 2 +- .../organization/usage/UsageFileSearchCallsResponse.kt | 2 +- .../models/admin/organization/usage/UsageImagesParams.kt | 2 +- .../admin/organization/usage/UsageImagesResponse.kt | 2 +- .../admin/organization/usage/UsageModerationsParams.kt | 2 +- .../admin/organization/usage/UsageModerationsResponse.kt | 2 +- .../admin/organization/usage/UsageVectorStoresParams.kt | 2 +- .../admin/organization/usage/UsageVectorStoresResponse.kt | 2 +- .../admin/organization/usage/UsageWebSearchCallsParams.kt | 2 +- .../organization/usage/UsageWebSearchCallsResponse.kt | 2 +- .../models/admin/organization/users/OrganizationUser.kt | 2 +- .../models/admin/organization/users/UserDeleteParams.kt | 2 +- .../models/admin/organization/users/UserDeleteResponse.kt | 2 +- .../models/admin/organization/users/UserListPage.kt | 2 +- .../models/admin/organization/users/UserListPageAsync.kt | 2 +- .../admin/organization/users/UserListPageResponse.kt | 2 +- .../models/admin/organization/users/UserListParams.kt | 2 +- .../models/admin/organization/users/UserRetrieveParams.kt | 2 +- .../models/admin/organization/users/UserUpdateParams.kt | 2 +- .../admin/organization/users/roles/RoleCreateParams.kt | 2 +- .../admin/organization/users/roles/RoleCreateResponse.kt | 2 +- .../admin/organization/users/roles/RoleDeleteParams.kt | 2 +- .../admin/organization/users/roles/RoleDeleteResponse.kt | 2 +- .../models/admin/organization/users/roles/RoleListPage.kt | 2 +- .../admin/organization/users/roles/RoleListPageAsync.kt | 2 +- .../organization/users/roles/RoleListPageResponse.kt | 2 +- .../admin/organization/users/roles/RoleListParams.kt | 2 +- .../admin/organization/users/roles/RoleListResponse.kt | 2 +- .../admin/organization/users/roles/RoleRetrieveParams.kt | 2 +- .../organization/users/roles/RoleRetrieveResponse.kt | 2 +- .../src/main/kotlin/com/openai/models/audio/AudioModel.kt | 2 +- .../kotlin/com/openai/models/audio/AudioResponseFormat.kt | 2 +- .../com/openai/models/audio/speech/SpeechCreateParams.kt | 2 +- .../kotlin/com/openai/models/audio/speech/SpeechModel.kt | 2 +- .../openai/models/audio/transcriptions/Transcription.kt | 2 +- .../audio/transcriptions/TranscriptionCreateParams.kt | 2 +- .../audio/transcriptions/TranscriptionCreateResponse.kt | 2 +- .../models/audio/transcriptions/TranscriptionDiarized.kt | 2 +- .../audio/transcriptions/TranscriptionDiarizedSegment.kt | 2 +- .../models/audio/transcriptions/TranscriptionInclude.kt | 2 +- .../models/audio/transcriptions/TranscriptionLanguage.kt | 2 +- .../models/audio/transcriptions/TranscriptionSegment.kt | 2 +- .../audio/transcriptions/TranscriptionStreamEvent.kt | 2 +- .../audio/transcriptions/TranscriptionTextDeltaEvent.kt | 2 +- .../audio/transcriptions/TranscriptionTextDoneEvent.kt | 2 +- .../audio/transcriptions/TranscriptionTextSegmentEvent.kt | 2 +- .../models/audio/transcriptions/TranscriptionVerbose.kt | 2 +- .../models/audio/transcriptions/TranscriptionWord.kt | 2 +- .../com/openai/models/audio/translations/Translation.kt | 2 +- .../models/audio/translations/TranslationCreateParams.kt | 2 +- .../audio/translations/TranslationCreateResponse.kt | 2 +- .../models/audio/translations/TranslationVerbose.kt | 2 +- .../src/main/kotlin/com/openai/models/batches/Batch.kt | 2 +- .../kotlin/com/openai/models/batches/BatchCancelParams.kt | 2 +- .../kotlin/com/openai/models/batches/BatchCreateParams.kt | 2 +- .../main/kotlin/com/openai/models/batches/BatchError.kt | 2 +- .../kotlin/com/openai/models/batches/BatchListPage.kt | 2 +- .../com/openai/models/batches/BatchListPageAsync.kt | 2 +- .../com/openai/models/batches/BatchListPageResponse.kt | 2 +- .../kotlin/com/openai/models/batches/BatchListParams.kt | 2 +- .../com/openai/models/batches/BatchRequestCounts.kt | 2 +- .../com/openai/models/batches/BatchRetrieveParams.kt | 2 +- .../main/kotlin/com/openai/models/batches/BatchUsage.kt | 2 +- .../kotlin/com/openai/models/beta/assistants/Assistant.kt | 2 +- .../models/beta/assistants/AssistantCreateParams.kt | 2 +- .../models/beta/assistants/AssistantDeleteParams.kt | 2 +- .../com/openai/models/beta/assistants/AssistantDeleted.kt | 2 +- .../openai/models/beta/assistants/AssistantListPage.kt | 2 +- .../models/beta/assistants/AssistantListPageAsync.kt | 2 +- .../models/beta/assistants/AssistantListPageResponse.kt | 2 +- .../openai/models/beta/assistants/AssistantListParams.kt | 2 +- .../models/beta/assistants/AssistantRetrieveParams.kt | 2 +- .../openai/models/beta/assistants/AssistantStreamEvent.kt | 2 +- .../com/openai/models/beta/assistants/AssistantTool.kt | 2 +- .../models/beta/assistants/AssistantUpdateParams.kt | 2 +- .../openai/models/beta/assistants/CodeInterpreterTool.kt | 2 +- .../com/openai/models/beta/assistants/FileSearchTool.kt | 2 +- .../com/openai/models/beta/assistants/FunctionTool.kt | 2 +- .../openai/models/beta/assistants/MessageStreamEvent.kt | 2 +- .../openai/models/beta/assistants/RunStepStreamEvent.kt | 2 +- .../com/openai/models/beta/assistants/RunStreamEvent.kt | 2 +- .../openai/models/beta/assistants/ThreadStreamEvent.kt | 2 +- .../com/openai/models/beta/chatkit/ChatKitWorkflow.kt | 2 +- .../models/beta/chatkit/sessions/SessionCancelParams.kt | 2 +- .../models/beta/chatkit/sessions/SessionCreateParams.kt | 2 +- .../models/beta/chatkit/threads/ChatKitAttachment.kt | 2 +- .../beta/chatkit/threads/ChatKitResponseOutputText.kt | 2 +- .../openai/models/beta/chatkit/threads/ChatKitThread.kt | 2 +- .../chatkit/threads/ChatKitThreadAssistantMessageItem.kt | 2 +- .../models/beta/chatkit/threads/ChatKitThreadItemList.kt | 2 +- .../beta/chatkit/threads/ChatKitThreadUserMessageItem.kt | 2 +- .../models/beta/chatkit/threads/ChatKitWidgetItem.kt | 2 +- .../com/openai/models/beta/chatkit/threads/ChatSession.kt | 2 +- .../chatkit/threads/ChatSessionAutomaticThreadTitling.kt | 2 +- .../chatkit/threads/ChatSessionChatKitConfiguration.kt | 2 +- .../threads/ChatSessionChatKitConfigurationParam.kt | 2 +- .../beta/chatkit/threads/ChatSessionExpiresAfterParam.kt | 2 +- .../models/beta/chatkit/threads/ChatSessionFileUpload.kt | 2 +- .../models/beta/chatkit/threads/ChatSessionHistory.kt | 2 +- .../models/beta/chatkit/threads/ChatSessionRateLimits.kt | 2 +- .../beta/chatkit/threads/ChatSessionRateLimitsParam.kt | 2 +- .../models/beta/chatkit/threads/ChatSessionStatus.kt | 2 +- .../beta/chatkit/threads/ChatSessionWorkflowParam.kt | 2 +- .../models/beta/chatkit/threads/ThreadDeleteParams.kt | 2 +- .../models/beta/chatkit/threads/ThreadDeleteResponse.kt | 2 +- .../models/beta/chatkit/threads/ThreadListItemsPage.kt | 2 +- .../beta/chatkit/threads/ThreadListItemsPageAsync.kt | 2 +- .../models/beta/chatkit/threads/ThreadListItemsParams.kt | 2 +- .../openai/models/beta/chatkit/threads/ThreadListPage.kt | 2 +- .../models/beta/chatkit/threads/ThreadListPageAsync.kt | 2 +- .../models/beta/chatkit/threads/ThreadListPageResponse.kt | 2 +- .../models/beta/chatkit/threads/ThreadListParams.kt | 2 +- .../models/beta/chatkit/threads/ThreadRetrieveParams.kt | 2 +- .../openai/models/beta/responses/BetaApplyPatchTool.kt | 2 +- .../openai/models/beta/responses/BetaCompactedResponse.kt | 2 +- .../openai/models/beta/responses/BetaComputerAction.kt | 2 +- .../com/openai/models/beta/responses/BetaComputerTool.kt | 2 +- .../models/beta/responses/BetaComputerUsePreviewTool.kt | 2 +- .../com/openai/models/beta/responses/BetaContainerAuto.kt | 2 +- .../beta/responses/BetaContainerNetworkPolicyAllowlist.kt | 2 +- .../beta/responses/BetaContainerNetworkPolicyDisabled.kt | 2 +- .../responses/BetaContainerNetworkPolicyDomainSecret.kt | 2 +- .../models/beta/responses/BetaContainerReference.kt | 2 +- .../com/openai/models/beta/responses/BetaCustomTool.kt | 2 +- .../openai/models/beta/responses/BetaEasyInputMessage.kt | 2 +- .../openai/models/beta/responses/BetaFileSearchTool.kt | 2 +- .../openai/models/beta/responses/BetaFunctionShellTool.kt | 2 +- .../com/openai/models/beta/responses/BetaFunctionTool.kt | 2 +- .../com/openai/models/beta/responses/BetaInlineSkill.kt | 2 +- .../openai/models/beta/responses/BetaInlineSkillSource.kt | 2 +- .../openai/models/beta/responses/BetaLocalEnvironment.kt | 2 +- .../com/openai/models/beta/responses/BetaLocalSkill.kt | 2 +- .../com/openai/models/beta/responses/BetaNamespaceTool.kt | 2 +- .../com/openai/models/beta/responses/BetaResponse.kt | 2 +- .../beta/responses/BetaResponseApplyPatchToolCall.kt | 2 +- .../responses/BetaResponseApplyPatchToolCallOutput.kt | 2 +- .../models/beta/responses/BetaResponseAudioDeltaEvent.kt | 2 +- .../models/beta/responses/BetaResponseAudioDoneEvent.kt | 2 +- .../responses/BetaResponseAudioTranscriptDeltaEvent.kt | 2 +- .../responses/BetaResponseAudioTranscriptDoneEvent.kt | 2 +- .../BetaResponseCodeInterpreterCallCodeDeltaEvent.kt | 2 +- .../BetaResponseCodeInterpreterCallCodeDoneEvent.kt | 2 +- .../BetaResponseCodeInterpreterCallCompletedEvent.kt | 2 +- .../BetaResponseCodeInterpreterCallInProgressEvent.kt | 2 +- .../BetaResponseCodeInterpreterCallInterpretingEvent.kt | 2 +- .../beta/responses/BetaResponseCodeInterpreterToolCall.kt | 2 +- .../models/beta/responses/BetaResponseCompactionItem.kt | 2 +- .../beta/responses/BetaResponseCompactionItemParam.kt | 2 +- .../models/beta/responses/BetaResponseCompletedEvent.kt | 2 +- .../models/beta/responses/BetaResponseComputerToolCall.kt | 2 +- .../responses/BetaResponseComputerToolCallOutputItem.kt | 2 +- .../BetaResponseComputerToolCallOutputScreenshot.kt | 2 +- .../beta/responses/BetaResponseContainerReference.kt | 2 +- .../openai/models/beta/responses/BetaResponseContent.kt | 2 +- .../beta/responses/BetaResponseContentPartAddedEvent.kt | 2 +- .../beta/responses/BetaResponseContentPartDoneEvent.kt | 2 +- .../beta/responses/BetaResponseConversationParam.kt | 2 +- .../models/beta/responses/BetaResponseCreatedEvent.kt | 2 +- .../models/beta/responses/BetaResponseCustomToolCall.kt | 2 +- .../BetaResponseCustomToolCallInputDeltaEvent.kt | 2 +- .../responses/BetaResponseCustomToolCallInputDoneEvent.kt | 2 +- .../beta/responses/BetaResponseCustomToolCallItem.kt | 2 +- .../beta/responses/BetaResponseCustomToolCallOutput.kt | 2 +- .../responses/BetaResponseCustomToolCallOutputItem.kt | 2 +- .../com/openai/models/beta/responses/BetaResponseError.kt | 2 +- .../models/beta/responses/BetaResponseErrorEvent.kt | 2 +- .../models/beta/responses/BetaResponseFailedEvent.kt | 2 +- .../responses/BetaResponseFileSearchCallCompletedEvent.kt | 2 +- .../BetaResponseFileSearchCallInProgressEvent.kt | 2 +- .../responses/BetaResponseFileSearchCallSearchingEvent.kt | 2 +- .../beta/responses/BetaResponseFileSearchToolCall.kt | 2 +- .../models/beta/responses/BetaResponseFormatTextConfig.kt | 2 +- .../responses/BetaResponseFormatTextJsonSchemaConfig.kt | 2 +- .../BetaResponseFunctionCallArgumentsDeltaEvent.kt | 2 +- .../BetaResponseFunctionCallArgumentsDoneEvent.kt | 2 +- .../beta/responses/BetaResponseFunctionCallOutputItem.kt | 2 +- .../BetaResponseFunctionShellCallOutputContent.kt | 2 +- .../beta/responses/BetaResponseFunctionShellToolCall.kt | 2 +- .../responses/BetaResponseFunctionShellToolCallOutput.kt | 2 +- .../models/beta/responses/BetaResponseFunctionToolCall.kt | 2 +- .../beta/responses/BetaResponseFunctionToolCallItem.kt | 2 +- .../responses/BetaResponseFunctionToolCallOutputItem.kt | 2 +- .../beta/responses/BetaResponseFunctionWebSearch.kt | 2 +- .../responses/BetaResponseImageGenCallCompletedEvent.kt | 2 +- .../responses/BetaResponseImageGenCallGeneratingEvent.kt | 2 +- .../responses/BetaResponseImageGenCallInProgressEvent.kt | 2 +- .../BetaResponseImageGenCallPartialImageEvent.kt | 2 +- .../models/beta/responses/BetaResponseInProgressEvent.kt | 2 +- .../models/beta/responses/BetaResponseIncludable.kt | 2 +- .../models/beta/responses/BetaResponseIncompleteEvent.kt | 2 +- .../beta/responses/BetaResponseInjectCreatedEvent.kt | 2 +- .../models/beta/responses/BetaResponseInjectEvent.kt | 2 +- .../beta/responses/BetaResponseInjectFailedEvent.kt | 2 +- .../models/beta/responses/BetaResponseInputAudio.kt | 2 +- .../models/beta/responses/BetaResponseInputContent.kt | 2 +- .../openai/models/beta/responses/BetaResponseInputFile.kt | 2 +- .../models/beta/responses/BetaResponseInputFileContent.kt | 2 +- .../models/beta/responses/BetaResponseInputImage.kt | 2 +- .../beta/responses/BetaResponseInputImageContent.kt | 2 +- .../openai/models/beta/responses/BetaResponseInputItem.kt | 2 +- .../models/beta/responses/BetaResponseInputMessageItem.kt | 2 +- .../openai/models/beta/responses/BetaResponseInputText.kt | 2 +- .../models/beta/responses/BetaResponseInputTextContent.kt | 2 +- .../com/openai/models/beta/responses/BetaResponseItem.kt | 2 +- .../models/beta/responses/BetaResponseLocalEnvironment.kt | 2 +- .../responses/BetaResponseMcpCallArgumentsDeltaEvent.kt | 2 +- .../responses/BetaResponseMcpCallArgumentsDoneEvent.kt | 2 +- .../beta/responses/BetaResponseMcpCallCompletedEvent.kt | 2 +- .../beta/responses/BetaResponseMcpCallFailedEvent.kt | 2 +- .../beta/responses/BetaResponseMcpCallInProgressEvent.kt | 2 +- .../responses/BetaResponseMcpListToolsCompletedEvent.kt | 2 +- .../beta/responses/BetaResponseMcpListToolsFailedEvent.kt | 2 +- .../responses/BetaResponseMcpListToolsInProgressEvent.kt | 2 +- .../models/beta/responses/BetaResponseOutputAudio.kt | 2 +- .../models/beta/responses/BetaResponseOutputItem.kt | 2 +- .../beta/responses/BetaResponseOutputItemAddedEvent.kt | 2 +- .../beta/responses/BetaResponseOutputItemDoneEvent.kt | 2 +- .../models/beta/responses/BetaResponseOutputMessage.kt | 2 +- .../models/beta/responses/BetaResponseOutputRefusal.kt | 2 +- .../models/beta/responses/BetaResponseOutputText.kt | 2 +- .../BetaResponseOutputTextAnnotationAddedEvent.kt | 2 +- .../openai/models/beta/responses/BetaResponsePrompt.kt | 2 +- .../models/beta/responses/BetaResponseQueuedEvent.kt | 2 +- .../models/beta/responses/BetaResponseReasoningItem.kt | 2 +- .../BetaResponseReasoningSummaryPartAddedEvent.kt | 2 +- .../BetaResponseReasoningSummaryPartDoneEvent.kt | 2 +- .../BetaResponseReasoningSummaryTextDeltaEvent.kt | 2 +- .../BetaResponseReasoningSummaryTextDoneEvent.kt | 2 +- .../beta/responses/BetaResponseReasoningTextDeltaEvent.kt | 2 +- .../beta/responses/BetaResponseReasoningTextDoneEvent.kt | 2 +- .../beta/responses/BetaResponseRefusalDeltaEvent.kt | 2 +- .../models/beta/responses/BetaResponseRefusalDoneEvent.kt | 2 +- .../openai/models/beta/responses/BetaResponseStatus.kt | 2 +- .../models/beta/responses/BetaResponseStreamEvent.kt | 2 +- .../models/beta/responses/BetaResponseTextConfig.kt | 2 +- .../models/beta/responses/BetaResponseTextDeltaEvent.kt | 2 +- .../models/beta/responses/BetaResponseTextDoneEvent.kt | 2 +- .../models/beta/responses/BetaResponseToolSearchCall.kt | 2 +- .../beta/responses/BetaResponseToolSearchOutputItem.kt | 2 +- .../responses/BetaResponseToolSearchOutputItemParam.kt | 2 +- .../com/openai/models/beta/responses/BetaResponseUsage.kt | 2 +- .../responses/BetaResponseWebSearchCallCompletedEvent.kt | 2 +- .../responses/BetaResponseWebSearchCallInProgressEvent.kt | 2 +- .../responses/BetaResponseWebSearchCallSearchingEvent.kt | 2 +- .../models/beta/responses/BetaResponsesClientEvent.kt | 2 +- .../models/beta/responses/BetaResponsesServerEvent.kt | 2 +- .../openai/models/beta/responses/BetaSkillReference.kt | 2 +- .../kotlin/com/openai/models/beta/responses/BetaTool.kt | 2 +- .../openai/models/beta/responses/BetaToolChoiceAllowed.kt | 2 +- .../models/beta/responses/BetaToolChoiceApplyPatch.kt | 2 +- .../openai/models/beta/responses/BetaToolChoiceCustom.kt | 2 +- .../models/beta/responses/BetaToolChoiceFunction.kt | 2 +- .../com/openai/models/beta/responses/BetaToolChoiceMcp.kt | 2 +- .../openai/models/beta/responses/BetaToolChoiceOptions.kt | 2 +- .../openai/models/beta/responses/BetaToolChoiceShell.kt | 2 +- .../openai/models/beta/responses/BetaToolChoiceTypes.kt | 2 +- .../openai/models/beta/responses/BetaToolSearchTool.kt | 2 +- .../models/beta/responses/BetaWebSearchPreviewTool.kt | 2 +- .../com/openai/models/beta/responses/BetaWebSearchTool.kt | 2 +- .../openai/models/beta/responses/ResponseCancelParams.kt | 2 +- .../openai/models/beta/responses/ResponseCompactParams.kt | 2 +- .../openai/models/beta/responses/ResponseCreateParams.kt | 2 +- .../openai/models/beta/responses/ResponseDeleteParams.kt | 2 +- .../models/beta/responses/ResponseRetrieveParams.kt | 2 +- .../beta/responses/inputitems/BetaResponseItemList.kt | 2 +- .../models/beta/responses/inputitems/InputItemListPage.kt | 2 +- .../beta/responses/inputitems/InputItemListPageAsync.kt | 2 +- .../beta/responses/inputitems/InputItemListParams.kt | 2 +- .../beta/responses/inputtokens/InputTokenCountParams.kt | 2 +- .../beta/responses/inputtokens/InputTokenCountResponse.kt | 2 +- .../models/beta/threads/AssistantResponseFormatOption.kt | 2 +- .../com/openai/models/beta/threads/AssistantToolChoice.kt | 2 +- .../models/beta/threads/AssistantToolChoiceFunction.kt | 2 +- .../models/beta/threads/AssistantToolChoiceOption.kt | 2 +- .../main/kotlin/com/openai/models/beta/threads/Thread.kt | 2 +- .../models/beta/threads/ThreadCreateAndRunParams.kt | 2 +- .../com/openai/models/beta/threads/ThreadCreateParams.kt | 2 +- .../com/openai/models/beta/threads/ThreadDeleteParams.kt | 2 +- .../com/openai/models/beta/threads/ThreadDeleted.kt | 2 +- .../openai/models/beta/threads/ThreadRetrieveParams.kt | 2 +- .../com/openai/models/beta/threads/ThreadUpdateParams.kt | 2 +- .../com/openai/models/beta/threads/messages/Annotation.kt | 2 +- .../models/beta/threads/messages/AnnotationDelta.kt | 2 +- .../beta/threads/messages/FileCitationAnnotation.kt | 2 +- .../beta/threads/messages/FileCitationDeltaAnnotation.kt | 2 +- .../models/beta/threads/messages/FilePathAnnotation.kt | 2 +- .../beta/threads/messages/FilePathDeltaAnnotation.kt | 2 +- .../com/openai/models/beta/threads/messages/ImageFile.kt | 2 +- .../models/beta/threads/messages/ImageFileContentBlock.kt | 2 +- .../openai/models/beta/threads/messages/ImageFileDelta.kt | 2 +- .../models/beta/threads/messages/ImageFileDeltaBlock.kt | 2 +- .../com/openai/models/beta/threads/messages/ImageUrl.kt | 2 +- .../models/beta/threads/messages/ImageUrlContentBlock.kt | 2 +- .../openai/models/beta/threads/messages/ImageUrlDelta.kt | 2 +- .../models/beta/threads/messages/ImageUrlDeltaBlock.kt | 2 +- .../com/openai/models/beta/threads/messages/Message.kt | 2 +- .../openai/models/beta/threads/messages/MessageContent.kt | 2 +- .../models/beta/threads/messages/MessageContentDelta.kt | 2 +- .../beta/threads/messages/MessageContentPartParam.kt | 2 +- .../models/beta/threads/messages/MessageCreateParams.kt | 2 +- .../models/beta/threads/messages/MessageDeleteParams.kt | 2 +- .../openai/models/beta/threads/messages/MessageDeleted.kt | 2 +- .../openai/models/beta/threads/messages/MessageDelta.kt | 2 +- .../models/beta/threads/messages/MessageDeltaEvent.kt | 2 +- .../models/beta/threads/messages/MessageListPage.kt | 2 +- .../models/beta/threads/messages/MessageListPageAsync.kt | 2 +- .../beta/threads/messages/MessageListPageResponse.kt | 2 +- .../models/beta/threads/messages/MessageListParams.kt | 2 +- .../models/beta/threads/messages/MessageRetrieveParams.kt | 2 +- .../models/beta/threads/messages/MessageUpdateParams.kt | 2 +- .../models/beta/threads/messages/RefusalContentBlock.kt | 2 +- .../models/beta/threads/messages/RefusalDeltaBlock.kt | 2 +- .../com/openai/models/beta/threads/messages/Text.kt | 2 +- .../models/beta/threads/messages/TextContentBlock.kt | 2 +- .../models/beta/threads/messages/TextContentBlockParam.kt | 2 +- .../com/openai/models/beta/threads/messages/TextDelta.kt | 2 +- .../openai/models/beta/threads/messages/TextDeltaBlock.kt | 2 +- .../beta/threads/runs/RequiredActionFunctionToolCall.kt | 2 +- .../kotlin/com/openai/models/beta/threads/runs/Run.kt | 2 +- .../openai/models/beta/threads/runs/RunCancelParams.kt | 2 +- .../openai/models/beta/threads/runs/RunCreateParams.kt | 2 +- .../com/openai/models/beta/threads/runs/RunListPage.kt | 2 +- .../openai/models/beta/threads/runs/RunListPageAsync.kt | 2 +- .../models/beta/threads/runs/RunListPageResponse.kt | 2 +- .../com/openai/models/beta/threads/runs/RunListParams.kt | 2 +- .../openai/models/beta/threads/runs/RunRetrieveParams.kt | 2 +- .../com/openai/models/beta/threads/runs/RunStatus.kt | 2 +- .../beta/threads/runs/RunSubmitToolOutputsParams.kt | 2 +- .../openai/models/beta/threads/runs/RunUpdateParams.kt | 2 +- .../models/beta/threads/runs/steps/CodeInterpreterLogs.kt | 2 +- .../beta/threads/runs/steps/CodeInterpreterOutputImage.kt | 2 +- .../beta/threads/runs/steps/CodeInterpreterToolCall.kt | 2 +- .../threads/runs/steps/CodeInterpreterToolCallDelta.kt | 2 +- .../models/beta/threads/runs/steps/FileSearchToolCall.kt | 2 +- .../beta/threads/runs/steps/FileSearchToolCallDelta.kt | 2 +- .../models/beta/threads/runs/steps/FunctionToolCall.kt | 2 +- .../beta/threads/runs/steps/FunctionToolCallDelta.kt | 2 +- .../beta/threads/runs/steps/MessageCreationStepDetails.kt | 2 +- .../com/openai/models/beta/threads/runs/steps/RunStep.kt | 2 +- .../openai/models/beta/threads/runs/steps/RunStepDelta.kt | 2 +- .../models/beta/threads/runs/steps/RunStepDeltaEvent.kt | 2 +- .../beta/threads/runs/steps/RunStepDeltaMessageDelta.kt | 2 +- .../models/beta/threads/runs/steps/RunStepInclude.kt | 2 +- .../openai/models/beta/threads/runs/steps/StepListPage.kt | 2 +- .../models/beta/threads/runs/steps/StepListPageAsync.kt | 2 +- .../beta/threads/runs/steps/StepListPageResponse.kt | 2 +- .../models/beta/threads/runs/steps/StepListParams.kt | 2 +- .../models/beta/threads/runs/steps/StepRetrieveParams.kt | 2 +- .../com/openai/models/beta/threads/runs/steps/ToolCall.kt | 2 +- .../models/beta/threads/runs/steps/ToolCallDelta.kt | 2 +- .../models/beta/threads/runs/steps/ToolCallDeltaObject.kt | 2 +- .../beta/threads/runs/steps/ToolCallsStepDetails.kt | 2 +- .../com/openai/models/chat/completions/ChatCompletion.kt | 2 +- .../chat/completions/ChatCompletionAllowedToolChoice.kt | 2 +- .../models/chat/completions/ChatCompletionAllowedTools.kt | 2 +- .../completions/ChatCompletionAssistantMessageParam.kt | 2 +- .../openai/models/chat/completions/ChatCompletionAudio.kt | 2 +- .../models/chat/completions/ChatCompletionAudioParam.kt | 2 +- .../openai/models/chat/completions/ChatCompletionChunk.kt | 2 +- .../models/chat/completions/ChatCompletionContentPart.kt | 2 +- .../chat/completions/ChatCompletionContentPartImage.kt | 2 +- .../completions/ChatCompletionContentPartInputAudio.kt | 2 +- .../chat/completions/ChatCompletionContentPartRefusal.kt | 2 +- .../chat/completions/ChatCompletionContentPartText.kt | 2 +- .../models/chat/completions/ChatCompletionCreateParams.kt | 2 +- .../models/chat/completions/ChatCompletionCustomTool.kt | 2 +- .../models/chat/completions/ChatCompletionDeleteParams.kt | 2 +- .../models/chat/completions/ChatCompletionDeleted.kt | 2 +- .../completions/ChatCompletionDeveloperMessageParam.kt | 2 +- .../chat/completions/ChatCompletionFunctionCallOption.kt | 2 +- .../completions/ChatCompletionFunctionMessageParam.kt | 2 +- .../models/chat/completions/ChatCompletionFunctionTool.kt | 2 +- .../models/chat/completions/ChatCompletionListPage.kt | 2 +- .../chat/completions/ChatCompletionListPageAsync.kt | 2 +- .../chat/completions/ChatCompletionListPageResponse.kt | 2 +- .../models/chat/completions/ChatCompletionListParams.kt | 2 +- .../models/chat/completions/ChatCompletionMessage.kt | 2 +- .../completions/ChatCompletionMessageCustomToolCall.kt | 2 +- .../completions/ChatCompletionMessageFunctionToolCall.kt | 2 +- .../models/chat/completions/ChatCompletionMessageParam.kt | 2 +- .../chat/completions/ChatCompletionMessageToolCall.kt | 2 +- .../models/chat/completions/ChatCompletionModality.kt | 2 +- .../chat/completions/ChatCompletionNamedToolChoice.kt | 2 +- .../completions/ChatCompletionNamedToolChoiceCustom.kt | 2 +- .../chat/completions/ChatCompletionPredictionContent.kt | 2 +- .../chat/completions/ChatCompletionRetrieveParams.kt | 2 +- .../openai/models/chat/completions/ChatCompletionRole.kt | 2 +- .../models/chat/completions/ChatCompletionStoreMessage.kt | 2 +- .../chat/completions/ChatCompletionStreamOptions.kt | 2 +- .../chat/completions/ChatCompletionSystemMessageParam.kt | 2 +- .../models/chat/completions/ChatCompletionTokenLogprob.kt | 2 +- .../openai/models/chat/completions/ChatCompletionTool.kt | 2 +- .../chat/completions/ChatCompletionToolChoiceOption.kt | 2 +- .../chat/completions/ChatCompletionToolMessageParam.kt | 2 +- .../models/chat/completions/ChatCompletionUpdateParams.kt | 2 +- .../chat/completions/ChatCompletionUserMessageParam.kt | 2 +- .../models/chat/completions/messages/MessageListPage.kt | 2 +- .../chat/completions/messages/MessageListPageAsync.kt | 2 +- .../chat/completions/messages/MessageListPageResponse.kt | 2 +- .../models/chat/completions/messages/MessageListParams.kt | 2 +- .../kotlin/com/openai/models/completions/Completion.kt | 2 +- .../com/openai/models/completions/CompletionChoice.kt | 2 +- .../openai/models/completions/CompletionCreateParams.kt | 2 +- .../com/openai/models/completions/CompletionUsage.kt | 2 +- .../com/openai/models/containers/ContainerCreateParams.kt | 2 +- .../openai/models/containers/ContainerCreateResponse.kt | 2 +- .../com/openai/models/containers/ContainerDeleteParams.kt | 2 +- .../com/openai/models/containers/ContainerListPage.kt | 2 +- .../openai/models/containers/ContainerListPageAsync.kt | 2 +- .../openai/models/containers/ContainerListPageResponse.kt | 2 +- .../com/openai/models/containers/ContainerListParams.kt | 2 +- .../com/openai/models/containers/ContainerListResponse.kt | 2 +- .../openai/models/containers/ContainerRetrieveParams.kt | 2 +- .../openai/models/containers/ContainerRetrieveResponse.kt | 2 +- .../openai/models/containers/files/FileCreateParams.kt | 2 +- .../openai/models/containers/files/FileCreateResponse.kt | 2 +- .../openai/models/containers/files/FileDeleteParams.kt | 2 +- .../com/openai/models/containers/files/FileListPage.kt | 2 +- .../openai/models/containers/files/FileListPageAsync.kt | 2 +- .../models/containers/files/FileListPageResponse.kt | 2 +- .../com/openai/models/containers/files/FileListParams.kt | 2 +- .../openai/models/containers/files/FileListResponse.kt | 2 +- .../openai/models/containers/files/FileRetrieveParams.kt | 2 +- .../models/containers/files/FileRetrieveResponse.kt | 2 +- .../containers/files/content/ContentRetrieveParams.kt | 2 +- .../contentprovenancechecks/ContentProvenanceCheck.kt | 2 +- .../ContentProvenanceCheckCreateParams.kt | 2 +- .../models/conversations/ComputerScreenshotContent.kt | 2 +- .../com/openai/models/conversations/Conversation.kt | 2 +- .../models/conversations/ConversationCreateParams.kt | 2 +- .../models/conversations/ConversationDeleteParams.kt | 2 +- .../openai/models/conversations/ConversationDeleted.kt | 2 +- .../models/conversations/ConversationDeletedResource.kt | 2 +- .../models/conversations/ConversationRetrieveParams.kt | 2 +- .../models/conversations/ConversationUpdateParams.kt | 2 +- .../kotlin/com/openai/models/conversations/Message.kt | 2 +- .../com/openai/models/conversations/SummaryTextContent.kt | 2 +- .../kotlin/com/openai/models/conversations/TextContent.kt | 2 +- .../openai/models/conversations/items/ConversationItem.kt | 2 +- .../models/conversations/items/ConversationItemList.kt | 2 +- .../openai/models/conversations/items/ItemCreateParams.kt | 2 +- .../openai/models/conversations/items/ItemDeleteParams.kt | 2 +- .../com/openai/models/conversations/items/ItemListPage.kt | 2 +- .../models/conversations/items/ItemListPageAsync.kt | 2 +- .../openai/models/conversations/items/ItemListParams.kt | 2 +- .../models/conversations/items/ItemRetrieveParams.kt | 2 +- .../openai/models/embeddings/CreateEmbeddingResponse.kt | 2 +- .../main/kotlin/com/openai/models/embeddings/Embedding.kt | 2 +- .../com/openai/models/embeddings/EmbeddingCreateParams.kt | 2 +- .../kotlin/com/openai/models/embeddings/EmbeddingModel.kt | 2 +- .../kotlin/com/openai/models/evals/EvalCreateParams.kt | 2 +- .../kotlin/com/openai/models/evals/EvalCreateResponse.kt | 2 +- .../com/openai/models/evals/EvalCustomDataSourceConfig.kt | 2 +- .../kotlin/com/openai/models/evals/EvalDeleteParams.kt | 2 +- .../kotlin/com/openai/models/evals/EvalDeleteResponse.kt | 2 +- .../main/kotlin/com/openai/models/evals/EvalListPage.kt | 2 +- .../kotlin/com/openai/models/evals/EvalListPageAsync.kt | 2 +- .../com/openai/models/evals/EvalListPageResponse.kt | 2 +- .../main/kotlin/com/openai/models/evals/EvalListParams.kt | 2 +- .../kotlin/com/openai/models/evals/EvalListResponse.kt | 2 +- .../kotlin/com/openai/models/evals/EvalRetrieveParams.kt | 2 +- .../com/openai/models/evals/EvalRetrieveResponse.kt | 2 +- .../models/evals/EvalStoredCompletionsDataSourceConfig.kt | 2 +- .../kotlin/com/openai/models/evals/EvalUpdateParams.kt | 2 +- .../kotlin/com/openai/models/evals/EvalUpdateResponse.kt | 2 +- .../evals/runs/CreateEvalCompletionsRunDataSource.kt | 2 +- .../models/evals/runs/CreateEvalJsonlRunDataSource.kt | 2 +- .../kotlin/com/openai/models/evals/runs/EvalApiError.kt | 2 +- .../com/openai/models/evals/runs/RunCancelParams.kt | 2 +- .../com/openai/models/evals/runs/RunCancelResponse.kt | 2 +- .../com/openai/models/evals/runs/RunCreateParams.kt | 2 +- .../com/openai/models/evals/runs/RunCreateResponse.kt | 2 +- .../com/openai/models/evals/runs/RunDeleteParams.kt | 2 +- .../com/openai/models/evals/runs/RunDeleteResponse.kt | 2 +- .../kotlin/com/openai/models/evals/runs/RunListPage.kt | 2 +- .../com/openai/models/evals/runs/RunListPageAsync.kt | 2 +- .../com/openai/models/evals/runs/RunListPageResponse.kt | 2 +- .../kotlin/com/openai/models/evals/runs/RunListParams.kt | 2 +- .../com/openai/models/evals/runs/RunListResponse.kt | 2 +- .../com/openai/models/evals/runs/RunRetrieveParams.kt | 2 +- .../com/openai/models/evals/runs/RunRetrieveResponse.kt | 2 +- .../models/evals/runs/outputitems/OutputItemListPage.kt | 2 +- .../evals/runs/outputitems/OutputItemListPageAsync.kt | 2 +- .../evals/runs/outputitems/OutputItemListPageResponse.kt | 2 +- .../models/evals/runs/outputitems/OutputItemListParams.kt | 2 +- .../evals/runs/outputitems/OutputItemListResponse.kt | 2 +- .../evals/runs/outputitems/OutputItemRetrieveParams.kt | 2 +- .../evals/runs/outputitems/OutputItemRetrieveResponse.kt | 2 +- .../kotlin/com/openai/models/files/FileContentParams.kt | 2 +- .../kotlin/com/openai/models/files/FileCreateParams.kt | 2 +- .../kotlin/com/openai/models/files/FileDeleteParams.kt | 2 +- .../main/kotlin/com/openai/models/files/FileDeleted.kt | 2 +- .../main/kotlin/com/openai/models/files/FileListPage.kt | 2 +- .../kotlin/com/openai/models/files/FileListPageAsync.kt | 2 +- .../com/openai/models/files/FileListPageResponse.kt | 2 +- .../main/kotlin/com/openai/models/files/FileListParams.kt | 2 +- .../src/main/kotlin/com/openai/models/files/FileObject.kt | 2 +- .../main/kotlin/com/openai/models/files/FilePurpose.kt | 2 +- .../kotlin/com/openai/models/files/FileRetrieveParams.kt | 2 +- .../models/finetuning/alpha/graders/GraderRunParams.kt | 2 +- .../models/finetuning/alpha/graders/GraderRunResponse.kt | 2 +- .../finetuning/alpha/graders/GraderValidateParams.kt | 2 +- .../finetuning/alpha/graders/GraderValidateResponse.kt | 2 +- .../checkpoints/permissions/PermissionCreatePage.kt | 2 +- .../checkpoints/permissions/PermissionCreatePageAsync.kt | 2 +- .../permissions/PermissionCreatePageResponse.kt | 2 +- .../checkpoints/permissions/PermissionCreateParams.kt | 2 +- .../checkpoints/permissions/PermissionCreateResponse.kt | 2 +- .../checkpoints/permissions/PermissionDeleteParams.kt | 2 +- .../checkpoints/permissions/PermissionDeleteResponse.kt | 2 +- .../checkpoints/permissions/PermissionListPage.kt | 2 +- .../checkpoints/permissions/PermissionListPageAsync.kt | 2 +- .../checkpoints/permissions/PermissionListPageResponse.kt | 2 +- .../checkpoints/permissions/PermissionListParams.kt | 2 +- .../checkpoints/permissions/PermissionListResponse.kt | 2 +- .../checkpoints/permissions/PermissionRetrieveParams.kt | 2 +- .../checkpoints/permissions/PermissionRetrieveResponse.kt | 2 +- .../com/openai/models/finetuning/jobs/FineTuningJob.kt | 2 +- .../openai/models/finetuning/jobs/FineTuningJobEvent.kt | 2 +- .../finetuning/jobs/FineTuningJobWandbIntegration.kt | 2 +- .../jobs/FineTuningJobWandbIntegrationObject.kt | 2 +- .../com/openai/models/finetuning/jobs/JobCancelParams.kt | 2 +- .../com/openai/models/finetuning/jobs/JobCreateParams.kt | 2 +- .../openai/models/finetuning/jobs/JobListEventsPage.kt | 2 +- .../models/finetuning/jobs/JobListEventsPageAsync.kt | 2 +- .../models/finetuning/jobs/JobListEventsPageResponse.kt | 2 +- .../openai/models/finetuning/jobs/JobListEventsParams.kt | 2 +- .../com/openai/models/finetuning/jobs/JobListPage.kt | 2 +- .../com/openai/models/finetuning/jobs/JobListPageAsync.kt | 2 +- .../openai/models/finetuning/jobs/JobListPageResponse.kt | 2 +- .../com/openai/models/finetuning/jobs/JobListParams.kt | 2 +- .../com/openai/models/finetuning/jobs/JobPauseParams.kt | 2 +- .../com/openai/models/finetuning/jobs/JobResumeParams.kt | 2 +- .../openai/models/finetuning/jobs/JobRetrieveParams.kt | 2 +- .../finetuning/jobs/checkpoints/CheckpointListPage.kt | 2 +- .../jobs/checkpoints/CheckpointListPageAsync.kt | 2 +- .../jobs/checkpoints/CheckpointListPageResponse.kt | 2 +- .../finetuning/jobs/checkpoints/CheckpointListParams.kt | 2 +- .../jobs/checkpoints/FineTuningJobCheckpoint.kt | 2 +- .../models/finetuning/methods/DpoHyperparameters.kt | 2 +- .../com/openai/models/finetuning/methods/DpoMethod.kt | 2 +- .../finetuning/methods/ReinforcementHyperparameters.kt | 2 +- .../models/finetuning/methods/ReinforcementMethod.kt | 2 +- .../finetuning/methods/SupervisedHyperparameters.kt | 2 +- .../openai/models/finetuning/methods/SupervisedMethod.kt | 2 +- .../openai/models/graders/gradermodels/EvalContentItem.kt | 2 +- .../models/graders/gradermodels/LabelModelGrader.kt | 2 +- .../com/openai/models/graders/gradermodels/MultiGrader.kt | 2 +- .../openai/models/graders/gradermodels/PythonGrader.kt | 2 +- .../models/graders/gradermodels/ScoreModelGrader.kt | 2 +- .../models/graders/gradermodels/StringCheckGrader.kt | 2 +- .../models/graders/gradermodels/TextSimilarityGrader.kt | 2 +- .../src/main/kotlin/com/openai/models/images/Image.kt | 2 +- .../openai/models/images/ImageCreateVariationParams.kt | 2 +- .../com/openai/models/images/ImageEditCompletedEvent.kt | 2 +- .../kotlin/com/openai/models/images/ImageEditParams.kt | 2 +- .../openai/models/images/ImageEditPartialImageEvent.kt | 2 +- .../com/openai/models/images/ImageEditStreamEvent.kt | 2 +- .../com/openai/models/images/ImageGenCompletedEvent.kt | 2 +- .../com/openai/models/images/ImageGenPartialImageEvent.kt | 2 +- .../com/openai/models/images/ImageGenStreamEvent.kt | 2 +- .../com/openai/models/images/ImageGenerateParams.kt | 2 +- .../main/kotlin/com/openai/models/images/ImageModel.kt | 2 +- .../kotlin/com/openai/models/images/ImagesResponse.kt | 2 +- .../src/main/kotlin/com/openai/models/models/Model.kt | 2 +- .../kotlin/com/openai/models/models/ModelDeleteParams.kt | 2 +- .../main/kotlin/com/openai/models/models/ModelDeleted.kt | 2 +- .../main/kotlin/com/openai/models/models/ModelListPage.kt | 2 +- .../kotlin/com/openai/models/models/ModelListPageAsync.kt | 2 +- .../com/openai/models/models/ModelListPageResponse.kt | 2 +- .../kotlin/com/openai/models/models/ModelListParams.kt | 2 +- .../com/openai/models/models/ModelRetrieveParams.kt | 2 +- .../kotlin/com/openai/models/moderations/Moderation.kt | 2 +- .../openai/models/moderations/ModerationCreateParams.kt | 2 +- .../openai/models/moderations/ModerationCreateResponse.kt | 2 +- .../openai/models/moderations/ModerationImageUrlInput.kt | 2 +- .../com/openai/models/moderations/ModerationModel.kt | 2 +- .../models/moderations/ModerationMultiModalInput.kt | 2 +- .../com/openai/models/moderations/ModerationTextInput.kt | 2 +- .../com/openai/models/realtime/AudioTranscription.kt | 2 +- .../openai/models/realtime/ConversationCreatedEvent.kt | 2 +- .../kotlin/com/openai/models/realtime/ConversationItem.kt | 2 +- .../com/openai/models/realtime/ConversationItemAdded.kt | 2 +- .../openai/models/realtime/ConversationItemCreateEvent.kt | 2 +- .../models/realtime/ConversationItemCreatedEvent.kt | 2 +- .../openai/models/realtime/ConversationItemDeleteEvent.kt | 2 +- .../models/realtime/ConversationItemDeletedEvent.kt | 2 +- .../com/openai/models/realtime/ConversationItemDone.kt | 2 +- ...nversationItemInputAudioTranscriptionCompletedEvent.kt | 2 +- .../ConversationItemInputAudioTranscriptionDeltaEvent.kt | 2 +- .../ConversationItemInputAudioTranscriptionFailedEvent.kt | 2 +- .../ConversationItemInputAudioTranscriptionSegment.kt | 2 +- .../models/realtime/ConversationItemRetrieveEvent.kt | 2 +- .../models/realtime/ConversationItemTruncateEvent.kt | 2 +- .../models/realtime/ConversationItemTruncatedEvent.kt | 2 +- .../models/realtime/ConversationItemWithReference.kt | 2 +- .../openai/models/realtime/InputAudioBufferAppendEvent.kt | 2 +- .../openai/models/realtime/InputAudioBufferClearEvent.kt | 2 +- .../models/realtime/InputAudioBufferClearedEvent.kt | 2 +- .../openai/models/realtime/InputAudioBufferCommitEvent.kt | 2 +- .../models/realtime/InputAudioBufferCommittedEvent.kt | 2 +- .../realtime/InputAudioBufferDtmfEventReceivedEvent.kt | 2 +- .../models/realtime/InputAudioBufferSpeechStartedEvent.kt | 2 +- .../models/realtime/InputAudioBufferSpeechStoppedEvent.kt | 2 +- .../models/realtime/InputAudioBufferTimeoutTriggered.kt | 2 +- .../com/openai/models/realtime/LogProbProperties.kt | 2 +- .../com/openai/models/realtime/McpListToolsCompleted.kt | 2 +- .../com/openai/models/realtime/McpListToolsFailed.kt | 2 +- .../com/openai/models/realtime/McpListToolsInProgress.kt | 2 +- .../com/openai/models/realtime/NoiseReductionType.kt | 2 +- .../openai/models/realtime/OutputAudioBufferClearEvent.kt | 2 +- .../com/openai/models/realtime/RateLimitsUpdatedEvent.kt | 2 +- .../com/openai/models/realtime/RealtimeAudioConfig.kt | 2 +- .../openai/models/realtime/RealtimeAudioConfigInput.kt | 2 +- .../openai/models/realtime/RealtimeAudioConfigOutput.kt | 2 +- .../com/openai/models/realtime/RealtimeAudioFormats.kt | 2 +- .../models/realtime/RealtimeAudioInputTurnDetection.kt | 2 +- .../com/openai/models/realtime/RealtimeClientEvent.kt | 2 +- .../realtime/RealtimeConversationItemAssistantMessage.kt | 2 +- .../realtime/RealtimeConversationItemFunctionCall.kt | 2 +- .../RealtimeConversationItemFunctionCallOutput.kt | 2 +- .../realtime/RealtimeConversationItemSystemMessage.kt | 2 +- .../realtime/RealtimeConversationItemUserMessage.kt | 2 +- .../kotlin/com/openai/models/realtime/RealtimeError.kt | 2 +- .../com/openai/models/realtime/RealtimeErrorEvent.kt | 2 +- .../com/openai/models/realtime/RealtimeFunctionTool.kt | 2 +- .../openai/models/realtime/RealtimeMcpApprovalRequest.kt | 2 +- .../openai/models/realtime/RealtimeMcpApprovalResponse.kt | 2 +- .../com/openai/models/realtime/RealtimeMcpListTools.kt | 2 +- .../openai/models/realtime/RealtimeMcpProtocolError.kt | 2 +- .../com/openai/models/realtime/RealtimeMcpToolCall.kt | 2 +- .../models/realtime/RealtimeMcpToolExecutionError.kt | 2 +- .../com/openai/models/realtime/RealtimeMcphttpError.kt | 2 +- .../com/openai/models/realtime/RealtimeReasoning.kt | 2 +- .../com/openai/models/realtime/RealtimeReasoningEffort.kt | 2 +- .../kotlin/com/openai/models/realtime/RealtimeResponse.kt | 2 +- .../models/realtime/RealtimeResponseCreateAudioOutput.kt | 2 +- .../models/realtime/RealtimeResponseCreateMcpTool.kt | 2 +- .../models/realtime/RealtimeResponseCreateParams.kt | 2 +- .../com/openai/models/realtime/RealtimeResponseStatus.kt | 2 +- .../com/openai/models/realtime/RealtimeResponseUsage.kt | 2 +- .../realtime/RealtimeResponseUsageInputTokenDetails.kt | 2 +- .../realtime/RealtimeResponseUsageOutputTokenDetails.kt | 2 +- .../com/openai/models/realtime/RealtimeServerEvent.kt | 2 +- .../kotlin/com/openai/models/realtime/RealtimeSession.kt | 2 +- .../models/realtime/RealtimeSessionCreateRequest.kt | 2 +- .../openai/models/realtime/RealtimeToolChoiceConfig.kt | 2 +- .../openai/models/realtime/RealtimeToolsConfigUnion.kt | 2 +- .../com/openai/models/realtime/RealtimeTracingConfig.kt | 2 +- .../models/realtime/RealtimeTranscriptionSessionAudio.kt | 2 +- .../realtime/RealtimeTranscriptionSessionAudioInput.kt | 2 +- ...RealtimeTranscriptionSessionAudioInputTurnDetection.kt | 2 +- .../realtime/RealtimeTranscriptionSessionCreateRequest.kt | 2 +- .../models/realtime/RealtimeTranslationClientEvent.kt | 2 +- .../RealtimeTranslationClientSecretCreateRequest.kt | 2 +- .../RealtimeTranslationClientSecretCreateResponse.kt | 2 +- .../RealtimeTranslationInputAudioBufferAppendEvent.kt | 2 +- .../RealtimeTranslationInputTranscriptDeltaEvent.kt | 2 +- .../realtime/RealtimeTranslationOutputAudioDeltaEvent.kt | 2 +- .../RealtimeTranslationOutputTranscriptDeltaEvent.kt | 2 +- .../models/realtime/RealtimeTranslationServerEvent.kt | 2 +- .../openai/models/realtime/RealtimeTranslationSession.kt | 2 +- .../realtime/RealtimeTranslationSessionCloseEvent.kt | 2 +- .../realtime/RealtimeTranslationSessionClosedEvent.kt | 2 +- .../realtime/RealtimeTranslationSessionCreateRequest.kt | 2 +- .../realtime/RealtimeTranslationSessionCreatedEvent.kt | 2 +- .../realtime/RealtimeTranslationSessionUpdateEvent.kt | 2 +- .../realtime/RealtimeTranslationSessionUpdateRequest.kt | 2 +- .../realtime/RealtimeTranslationSessionUpdatedEvent.kt | 2 +- .../com/openai/models/realtime/RealtimeTruncation.kt | 2 +- .../models/realtime/RealtimeTruncationRetentionRatio.kt | 2 +- .../com/openai/models/realtime/ResponseAudioDeltaEvent.kt | 2 +- .../com/openai/models/realtime/ResponseAudioDoneEvent.kt | 2 +- .../models/realtime/ResponseAudioTranscriptDeltaEvent.kt | 2 +- .../models/realtime/ResponseAudioTranscriptDoneEvent.kt | 2 +- .../com/openai/models/realtime/ResponseCancelEvent.kt | 2 +- .../models/realtime/ResponseContentPartAddedEvent.kt | 2 +- .../models/realtime/ResponseContentPartDoneEvent.kt | 2 +- .../com/openai/models/realtime/ResponseCreateEvent.kt | 2 +- .../com/openai/models/realtime/ResponseCreatedEvent.kt | 2 +- .../com/openai/models/realtime/ResponseDoneEvent.kt | 2 +- .../realtime/ResponseFunctionCallArgumentsDeltaEvent.kt | 2 +- .../realtime/ResponseFunctionCallArgumentsDoneEvent.kt | 2 +- .../models/realtime/ResponseMcpCallArgumentsDelta.kt | 2 +- .../models/realtime/ResponseMcpCallArgumentsDone.kt | 2 +- .../openai/models/realtime/ResponseMcpCallCompleted.kt | 2 +- .../com/openai/models/realtime/ResponseMcpCallFailed.kt | 2 +- .../openai/models/realtime/ResponseMcpCallInProgress.kt | 2 +- .../models/realtime/ResponseOutputItemAddedEvent.kt | 2 +- .../openai/models/realtime/ResponseOutputItemDoneEvent.kt | 2 +- .../com/openai/models/realtime/ResponseTextDeltaEvent.kt | 2 +- .../com/openai/models/realtime/ResponseTextDoneEvent.kt | 2 +- .../com/openai/models/realtime/SessionCreatedEvent.kt | 2 +- .../com/openai/models/realtime/SessionUpdateEvent.kt | 2 +- .../com/openai/models/realtime/SessionUpdatedEvent.kt | 2 +- .../openai/models/realtime/TranscriptionSessionUpdate.kt | 2 +- .../models/realtime/TranscriptionSessionUpdatedEvent.kt | 2 +- .../com/openai/models/realtime/calls/CallAcceptParams.kt | 2 +- .../com/openai/models/realtime/calls/CallHangupParams.kt | 2 +- .../com/openai/models/realtime/calls/CallReferParams.kt | 2 +- .../com/openai/models/realtime/calls/CallRejectParams.kt | 2 +- .../realtime/clientsecrets/ClientSecretCreateParams.kt | 2 +- .../realtime/clientsecrets/ClientSecretCreateResponse.kt | 2 +- .../clientsecrets/RealtimeSessionCreateResponse.kt | 2 +- .../RealtimeTranscriptionSessionCreateResponse.kt | 2 +- .../RealtimeTranscriptionSessionTurnDetection.kt | 2 +- .../kotlin/com/openai/models/responses/ApplyPatchTool.kt | 2 +- .../com/openai/models/responses/CompactedResponse.kt | 2 +- .../kotlin/com/openai/models/responses/ComputerAction.kt | 2 +- .../kotlin/com/openai/models/responses/ComputerTool.kt | 2 +- .../com/openai/models/responses/ComputerUsePreviewTool.kt | 2 +- .../kotlin/com/openai/models/responses/ContainerAuto.kt | 2 +- .../models/responses/ContainerNetworkPolicyAllowlist.kt | 2 +- .../models/responses/ContainerNetworkPolicyDisabled.kt | 2 +- .../responses/ContainerNetworkPolicyDomainSecret.kt | 2 +- .../com/openai/models/responses/ContainerReference.kt | 2 +- .../main/kotlin/com/openai/models/responses/CustomTool.kt | 2 +- .../com/openai/models/responses/EasyInputMessage.kt | 2 +- .../kotlin/com/openai/models/responses/FileSearchTool.kt | 2 +- .../com/openai/models/responses/FunctionShellTool.kt | 2 +- .../kotlin/com/openai/models/responses/FunctionTool.kt | 2 +- .../kotlin/com/openai/models/responses/InlineSkill.kt | 2 +- .../com/openai/models/responses/InlineSkillSource.kt | 2 +- .../com/openai/models/responses/LocalEnvironment.kt | 2 +- .../main/kotlin/com/openai/models/responses/LocalSkill.kt | 2 +- .../kotlin/com/openai/models/responses/NamespaceTool.kt | 2 +- .../main/kotlin/com/openai/models/responses/Response.kt | 2 +- .../openai/models/responses/ResponseApplyPatchToolCall.kt | 2 +- .../models/responses/ResponseApplyPatchToolCallOutput.kt | 2 +- .../openai/models/responses/ResponseAudioDeltaEvent.kt | 2 +- .../com/openai/models/responses/ResponseAudioDoneEvent.kt | 2 +- .../models/responses/ResponseAudioTranscriptDeltaEvent.kt | 2 +- .../models/responses/ResponseAudioTranscriptDoneEvent.kt | 2 +- .../com/openai/models/responses/ResponseCancelParams.kt | 2 +- .../ResponseCodeInterpreterCallCodeDeltaEvent.kt | 2 +- .../responses/ResponseCodeInterpreterCallCodeDoneEvent.kt | 2 +- .../ResponseCodeInterpreterCallCompletedEvent.kt | 2 +- .../ResponseCodeInterpreterCallInProgressEvent.kt | 2 +- .../ResponseCodeInterpreterCallInterpretingEvent.kt | 2 +- .../models/responses/ResponseCodeInterpreterToolCall.kt | 2 +- .../com/openai/models/responses/ResponseCompactParams.kt | 2 +- .../com/openai/models/responses/ResponseCompactionItem.kt | 2 +- .../models/responses/ResponseCompactionItemParam.kt | 2 +- .../com/openai/models/responses/ResponseCompletedEvent.kt | 2 +- .../openai/models/responses/ResponseComputerToolCall.kt | 2 +- .../responses/ResponseComputerToolCallOutputItem.kt | 2 +- .../responses/ResponseComputerToolCallOutputScreenshot.kt | 2 +- .../openai/models/responses/ResponseContainerReference.kt | 2 +- .../kotlin/com/openai/models/responses/ResponseContent.kt | 2 +- .../models/responses/ResponseContentPartAddedEvent.kt | 2 +- .../models/responses/ResponseContentPartDoneEvent.kt | 2 +- .../openai/models/responses/ResponseConversationParam.kt | 2 +- .../com/openai/models/responses/ResponseCreateParams.kt | 2 +- .../com/openai/models/responses/ResponseCreatedEvent.kt | 2 +- .../com/openai/models/responses/ResponseCustomToolCall.kt | 2 +- .../responses/ResponseCustomToolCallInputDeltaEvent.kt | 2 +- .../responses/ResponseCustomToolCallInputDoneEvent.kt | 2 +- .../openai/models/responses/ResponseCustomToolCallItem.kt | 2 +- .../models/responses/ResponseCustomToolCallOutput.kt | 2 +- .../models/responses/ResponseCustomToolCallOutputItem.kt | 2 +- .../com/openai/models/responses/ResponseDeleteParams.kt | 2 +- .../kotlin/com/openai/models/responses/ResponseError.kt | 2 +- .../com/openai/models/responses/ResponseErrorEvent.kt | 2 +- .../com/openai/models/responses/ResponseFailedEvent.kt | 2 +- .../responses/ResponseFileSearchCallCompletedEvent.kt | 2 +- .../responses/ResponseFileSearchCallInProgressEvent.kt | 2 +- .../responses/ResponseFileSearchCallSearchingEvent.kt | 2 +- .../openai/models/responses/ResponseFileSearchToolCall.kt | 2 +- .../openai/models/responses/ResponseFormatTextConfig.kt | 2 +- .../responses/ResponseFormatTextJsonSchemaConfig.kt | 2 +- .../responses/ResponseFunctionCallArgumentsDeltaEvent.kt | 2 +- .../responses/ResponseFunctionCallArgumentsDoneEvent.kt | 2 +- .../models/responses/ResponseFunctionCallOutputItem.kt | 2 +- .../responses/ResponseFunctionShellCallOutputContent.kt | 2 +- .../models/responses/ResponseFunctionShellToolCall.kt | 2 +- .../responses/ResponseFunctionShellToolCallOutput.kt | 2 +- .../openai/models/responses/ResponseFunctionToolCall.kt | 2 +- .../models/responses/ResponseFunctionToolCallItem.kt | 2 +- .../responses/ResponseFunctionToolCallOutputItem.kt | 2 +- .../openai/models/responses/ResponseFunctionWebSearch.kt | 2 +- .../responses/ResponseImageGenCallCompletedEvent.kt | 2 +- .../responses/ResponseImageGenCallGeneratingEvent.kt | 2 +- .../responses/ResponseImageGenCallInProgressEvent.kt | 2 +- .../responses/ResponseImageGenCallPartialImageEvent.kt | 2 +- .../openai/models/responses/ResponseInProgressEvent.kt | 2 +- .../com/openai/models/responses/ResponseIncludable.kt | 2 +- .../openai/models/responses/ResponseIncompleteEvent.kt | 2 +- .../com/openai/models/responses/ResponseInputAudio.kt | 2 +- .../com/openai/models/responses/ResponseInputContent.kt | 2 +- .../com/openai/models/responses/ResponseInputFile.kt | 2 +- .../openai/models/responses/ResponseInputFileContent.kt | 2 +- .../com/openai/models/responses/ResponseInputImage.kt | 2 +- .../openai/models/responses/ResponseInputImageContent.kt | 2 +- .../com/openai/models/responses/ResponseInputItem.kt | 2 +- .../openai/models/responses/ResponseInputMessageItem.kt | 2 +- .../com/openai/models/responses/ResponseInputText.kt | 2 +- .../openai/models/responses/ResponseInputTextContent.kt | 2 +- .../kotlin/com/openai/models/responses/ResponseItem.kt | 2 +- .../openai/models/responses/ResponseLocalEnvironment.kt | 2 +- .../responses/ResponseMcpCallArgumentsDeltaEvent.kt | 2 +- .../models/responses/ResponseMcpCallArgumentsDoneEvent.kt | 2 +- .../models/responses/ResponseMcpCallCompletedEvent.kt | 2 +- .../openai/models/responses/ResponseMcpCallFailedEvent.kt | 2 +- .../models/responses/ResponseMcpCallInProgressEvent.kt | 2 +- .../responses/ResponseMcpListToolsCompletedEvent.kt | 2 +- .../models/responses/ResponseMcpListToolsFailedEvent.kt | 2 +- .../responses/ResponseMcpListToolsInProgressEvent.kt | 2 +- .../com/openai/models/responses/ResponseOutputAudio.kt | 2 +- .../com/openai/models/responses/ResponseOutputItem.kt | 2 +- .../models/responses/ResponseOutputItemAddedEvent.kt | 2 +- .../models/responses/ResponseOutputItemDoneEvent.kt | 2 +- .../com/openai/models/responses/ResponseOutputMessage.kt | 2 +- .../com/openai/models/responses/ResponseOutputRefusal.kt | 2 +- .../com/openai/models/responses/ResponseOutputText.kt | 2 +- .../responses/ResponseOutputTextAnnotationAddedEvent.kt | 2 +- .../kotlin/com/openai/models/responses/ResponsePrompt.kt | 2 +- .../com/openai/models/responses/ResponseQueuedEvent.kt | 2 +- .../com/openai/models/responses/ResponseReasoningItem.kt | 2 +- .../responses/ResponseReasoningSummaryPartAddedEvent.kt | 2 +- .../responses/ResponseReasoningSummaryPartDoneEvent.kt | 2 +- .../responses/ResponseReasoningSummaryTextDeltaEvent.kt | 2 +- .../responses/ResponseReasoningSummaryTextDoneEvent.kt | 2 +- .../models/responses/ResponseReasoningTextDeltaEvent.kt | 2 +- .../models/responses/ResponseReasoningTextDoneEvent.kt | 2 +- .../openai/models/responses/ResponseRefusalDeltaEvent.kt | 2 +- .../openai/models/responses/ResponseRefusalDoneEvent.kt | 2 +- .../com/openai/models/responses/ResponseRetrieveParams.kt | 2 +- .../kotlin/com/openai/models/responses/ResponseStatus.kt | 2 +- .../com/openai/models/responses/ResponseStreamEvent.kt | 2 +- .../com/openai/models/responses/ResponseTextConfig.kt | 2 +- .../com/openai/models/responses/ResponseTextDeltaEvent.kt | 2 +- .../com/openai/models/responses/ResponseTextDoneEvent.kt | 2 +- .../com/openai/models/responses/ResponseToolSearchCall.kt | 2 +- .../models/responses/ResponseToolSearchOutputItem.kt | 2 +- .../models/responses/ResponseToolSearchOutputItemParam.kt | 2 +- .../kotlin/com/openai/models/responses/ResponseUsage.kt | 2 +- .../responses/ResponseWebSearchCallCompletedEvent.kt | 2 +- .../responses/ResponseWebSearchCallInProgressEvent.kt | 2 +- .../responses/ResponseWebSearchCallSearchingEvent.kt | 2 +- .../com/openai/models/responses/ResponsesClientEvent.kt | 2 +- .../com/openai/models/responses/ResponsesServerEvent.kt | 2 +- .../kotlin/com/openai/models/responses/SkillReference.kt | 2 +- .../src/main/kotlin/com/openai/models/responses/Tool.kt | 2 +- .../com/openai/models/responses/ToolChoiceAllowed.kt | 2 +- .../com/openai/models/responses/ToolChoiceApplyPatch.kt | 2 +- .../com/openai/models/responses/ToolChoiceCustom.kt | 2 +- .../com/openai/models/responses/ToolChoiceFunction.kt | 2 +- .../kotlin/com/openai/models/responses/ToolChoiceMcp.kt | 2 +- .../com/openai/models/responses/ToolChoiceOptions.kt | 2 +- .../kotlin/com/openai/models/responses/ToolChoiceShell.kt | 2 +- .../kotlin/com/openai/models/responses/ToolChoiceTypes.kt | 2 +- .../kotlin/com/openai/models/responses/ToolSearchTool.kt | 2 +- .../com/openai/models/responses/WebSearchPreviewTool.kt | 2 +- .../kotlin/com/openai/models/responses/WebSearchTool.kt | 2 +- .../models/responses/inputitems/InputItemListPage.kt | 2 +- .../models/responses/inputitems/InputItemListPageAsync.kt | 2 +- .../models/responses/inputitems/InputItemListParams.kt | 2 +- .../models/responses/inputitems/ResponseItemList.kt | 2 +- .../models/responses/inputtokens/InputTokenCountParams.kt | 2 +- .../responses/inputtokens/InputTokenCountResponse.kt | 2 +- .../main/kotlin/com/openai/models/skills/DeletedSkill.kt | 2 +- .../src/main/kotlin/com/openai/models/skills/Skill.kt | 2 +- .../kotlin/com/openai/models/skills/SkillCreateParams.kt | 2 +- .../kotlin/com/openai/models/skills/SkillDeleteParams.kt | 2 +- .../src/main/kotlin/com/openai/models/skills/SkillList.kt | 2 +- .../main/kotlin/com/openai/models/skills/SkillListPage.kt | 2 +- .../kotlin/com/openai/models/skills/SkillListPageAsync.kt | 2 +- .../kotlin/com/openai/models/skills/SkillListParams.kt | 2 +- .../com/openai/models/skills/SkillRetrieveParams.kt | 2 +- .../kotlin/com/openai/models/skills/SkillUpdateParams.kt | 2 +- .../openai/models/skills/content/ContentRetrieveParams.kt | 2 +- .../openai/models/skills/versions/DeletedSkillVersion.kt | 2 +- .../com/openai/models/skills/versions/SkillVersion.kt | 2 +- .../com/openai/models/skills/versions/SkillVersionList.kt | 2 +- .../openai/models/skills/versions/VersionCreateParams.kt | 2 +- .../openai/models/skills/versions/VersionDeleteParams.kt | 2 +- .../com/openai/models/skills/versions/VersionListPage.kt | 2 +- .../openai/models/skills/versions/VersionListPageAsync.kt | 2 +- .../openai/models/skills/versions/VersionListParams.kt | 2 +- .../models/skills/versions/VersionRetrieveParams.kt | 2 +- .../skills/versions/content/ContentRetrieveParams.kt | 2 +- .../src/main/kotlin/com/openai/models/uploads/Upload.kt | 2 +- .../com/openai/models/uploads/UploadCancelParams.kt | 2 +- .../com/openai/models/uploads/UploadCompleteParams.kt | 2 +- .../com/openai/models/uploads/UploadCreateParams.kt | 2 +- .../com/openai/models/uploads/parts/PartCreateParams.kt | 2 +- .../kotlin/com/openai/models/uploads/parts/UploadPart.kt | 2 +- .../models/vectorstores/AutoFileChunkingStrategyParam.kt | 2 +- .../openai/models/vectorstores/FileChunkingStrategy.kt | 2 +- .../models/vectorstores/FileChunkingStrategyParam.kt | 2 +- .../vectorstores/OtherFileChunkingStrategyObject.kt | 2 +- .../models/vectorstores/StaticFileChunkingStrategy.kt | 2 +- .../vectorstores/StaticFileChunkingStrategyObject.kt | 2 +- .../vectorstores/StaticFileChunkingStrategyObjectParam.kt | 2 +- .../kotlin/com/openai/models/vectorstores/VectorStore.kt | 2 +- .../openai/models/vectorstores/VectorStoreCreateParams.kt | 2 +- .../openai/models/vectorstores/VectorStoreDeleteParams.kt | 2 +- .../com/openai/models/vectorstores/VectorStoreDeleted.kt | 2 +- .../com/openai/models/vectorstores/VectorStoreListPage.kt | 2 +- .../models/vectorstores/VectorStoreListPageAsync.kt | 2 +- .../models/vectorstores/VectorStoreListPageResponse.kt | 2 +- .../openai/models/vectorstores/VectorStoreListParams.kt | 2 +- .../models/vectorstores/VectorStoreRetrieveParams.kt | 2 +- .../openai/models/vectorstores/VectorStoreSearchPage.kt | 2 +- .../models/vectorstores/VectorStoreSearchPageAsync.kt | 2 +- .../models/vectorstores/VectorStoreSearchPageResponse.kt | 2 +- .../openai/models/vectorstores/VectorStoreSearchParams.kt | 2 +- .../models/vectorstores/VectorStoreSearchResponse.kt | 2 +- .../openai/models/vectorstores/VectorStoreUpdateParams.kt | 2 +- .../vectorstores/filebatches/FileBatchCancelParams.kt | 2 +- .../vectorstores/filebatches/FileBatchCreateParams.kt | 2 +- .../vectorstores/filebatches/FileBatchListFilesPage.kt | 2 +- .../filebatches/FileBatchListFilesPageAsync.kt | 2 +- .../filebatches/FileBatchListFilesPageResponse.kt | 2 +- .../vectorstores/filebatches/FileBatchListFilesParams.kt | 2 +- .../vectorstores/filebatches/FileBatchRetrieveParams.kt | 2 +- .../vectorstores/filebatches/VectorStoreFileBatch.kt | 2 +- .../openai/models/vectorstores/files/FileContentPage.kt | 2 +- .../models/vectorstores/files/FileContentPageAsync.kt | 2 +- .../models/vectorstores/files/FileContentPageResponse.kt | 2 +- .../openai/models/vectorstores/files/FileContentParams.kt | 2 +- .../models/vectorstores/files/FileContentResponse.kt | 2 +- .../openai/models/vectorstores/files/FileCreateParams.kt | 2 +- .../openai/models/vectorstores/files/FileDeleteParams.kt | 2 +- .../com/openai/models/vectorstores/files/FileListPage.kt | 2 +- .../openai/models/vectorstores/files/FileListPageAsync.kt | 2 +- .../models/vectorstores/files/FileListPageResponse.kt | 2 +- .../openai/models/vectorstores/files/FileListParams.kt | 2 +- .../models/vectorstores/files/FileRetrieveParams.kt | 2 +- .../openai/models/vectorstores/files/FileUpdateParams.kt | 2 +- .../openai/models/vectorstores/files/VectorStoreFile.kt | 2 +- .../models/vectorstores/files/VectorStoreFileDeleted.kt | 2 +- .../com/openai/models/videos/ImageInputReferenceParam.kt | 2 +- .../src/main/kotlin/com/openai/models/videos/Video.kt | 2 +- .../openai/models/videos/VideoCreateCharacterParams.kt | 2 +- .../openai/models/videos/VideoCreateCharacterResponse.kt | 2 +- .../kotlin/com/openai/models/videos/VideoCreateError.kt | 2 +- .../kotlin/com/openai/models/videos/VideoCreateParams.kt | 2 +- .../kotlin/com/openai/models/videos/VideoDeleteParams.kt | 2 +- .../com/openai/models/videos/VideoDeleteResponse.kt | 2 +- .../openai/models/videos/VideoDownloadContentParams.kt | 2 +- .../kotlin/com/openai/models/videos/VideoEditParams.kt | 2 +- .../kotlin/com/openai/models/videos/VideoExtendParams.kt | 2 +- .../com/openai/models/videos/VideoGetCharacterParams.kt | 2 +- .../com/openai/models/videos/VideoGetCharacterResponse.kt | 2 +- .../main/kotlin/com/openai/models/videos/VideoListPage.kt | 2 +- .../kotlin/com/openai/models/videos/VideoListPageAsync.kt | 2 +- .../com/openai/models/videos/VideoListPageResponse.kt | 2 +- .../kotlin/com/openai/models/videos/VideoListParams.kt | 2 +- .../main/kotlin/com/openai/models/videos/VideoModel.kt | 2 +- .../kotlin/com/openai/models/videos/VideoRemixParams.kt | 2 +- .../com/openai/models/videos/VideoRetrieveParams.kt | 2 +- .../main/kotlin/com/openai/models/videos/VideoSeconds.kt | 2 +- .../src/main/kotlin/com/openai/models/videos/VideoSize.kt | 2 +- .../openai/models/webhooks/BatchCancelledWebhookEvent.kt | 2 +- .../openai/models/webhooks/BatchCompletedWebhookEvent.kt | 2 +- .../openai/models/webhooks/BatchExpiredWebhookEvent.kt | 2 +- .../com/openai/models/webhooks/BatchFailedWebhookEvent.kt | 2 +- .../openai/models/webhooks/EvalRunCanceledWebhookEvent.kt | 2 +- .../openai/models/webhooks/EvalRunFailedWebhookEvent.kt | 2 +- .../models/webhooks/EvalRunSucceededWebhookEvent.kt | 2 +- .../models/webhooks/FineTuningJobCancelledWebhookEvent.kt | 2 +- .../models/webhooks/FineTuningJobFailedWebhookEvent.kt | 2 +- .../models/webhooks/FineTuningJobSucceededWebhookEvent.kt | 2 +- .../models/webhooks/LiveCallIncomingWebhookEvent.kt | 2 +- .../models/webhooks/RealtimeCallIncomingWebhookEvent.kt | 2 +- .../models/webhooks/ResponseCancelledWebhookEvent.kt | 2 +- .../models/webhooks/ResponseCompletedWebhookEvent.kt | 2 +- .../openai/models/webhooks/ResponseFailedWebhookEvent.kt | 2 +- .../models/webhooks/ResponseIncompleteWebhookEvent.kt | 2 +- .../com/openai/models/webhooks/UnwrapWebhookEvent.kt | 2 +- .../kotlin/com/openai/services/async/AdminServiceAsync.kt | 2 +- .../com/openai/services/async/AdminServiceAsyncImpl.kt | 2 +- .../kotlin/com/openai/services/async/AudioServiceAsync.kt | 2 +- .../com/openai/services/async/AudioServiceAsyncImpl.kt | 2 +- .../kotlin/com/openai/services/async/BatchServiceAsync.kt | 2 +- .../com/openai/services/async/BatchServiceAsyncImpl.kt | 2 +- .../kotlin/com/openai/services/async/BetaServiceAsync.kt | 2 +- .../com/openai/services/async/BetaServiceAsyncImpl.kt | 2 +- .../kotlin/com/openai/services/async/ChatServiceAsync.kt | 2 +- .../com/openai/services/async/ChatServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/CompletionServiceAsync.kt | 2 +- .../openai/services/async/CompletionServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/ContainerServiceAsync.kt | 2 +- .../openai/services/async/ContainerServiceAsyncImpl.kt | 2 +- .../services/async/ContentProvenanceCheckServiceAsync.kt | 2 +- .../async/ContentProvenanceCheckServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/ConversationServiceAsync.kt | 2 +- .../openai/services/async/ConversationServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/EmbeddingServiceAsync.kt | 2 +- .../openai/services/async/EmbeddingServiceAsyncImpl.kt | 2 +- .../kotlin/com/openai/services/async/EvalServiceAsync.kt | 2 +- .../com/openai/services/async/EvalServiceAsyncImpl.kt | 2 +- .../kotlin/com/openai/services/async/FileServiceAsync.kt | 2 +- .../com/openai/services/async/FileServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/FineTuningServiceAsync.kt | 2 +- .../openai/services/async/FineTuningServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/GraderServiceAsync.kt | 2 +- .../com/openai/services/async/GraderServiceAsyncImpl.kt | 2 +- .../kotlin/com/openai/services/async/ImageServiceAsync.kt | 2 +- .../com/openai/services/async/ImageServiceAsyncImpl.kt | 2 +- .../kotlin/com/openai/services/async/ModelServiceAsync.kt | 2 +- .../com/openai/services/async/ModelServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/ModerationServiceAsync.kt | 2 +- .../openai/services/async/ModerationServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/RealtimeServiceAsync.kt | 2 +- .../com/openai/services/async/RealtimeServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/ResponseServiceAsync.kt | 2 +- .../com/openai/services/async/ResponseServiceAsyncImpl.kt | 2 +- .../kotlin/com/openai/services/async/SkillServiceAsync.kt | 2 +- .../com/openai/services/async/SkillServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/UploadServiceAsync.kt | 2 +- .../com/openai/services/async/UploadServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/VectorStoreServiceAsync.kt | 2 +- .../openai/services/async/VectorStoreServiceAsyncImpl.kt | 2 +- .../kotlin/com/openai/services/async/VideoServiceAsync.kt | 2 +- .../com/openai/services/async/VideoServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/WebhookServiceAsync.kt | 2 +- .../com/openai/services/async/WebhookServiceAsyncImpl.kt | 2 +- .../services/async/admin/OrganizationServiceAsync.kt | 2 +- .../services/async/admin/OrganizationServiceAsyncImpl.kt | 2 +- .../async/admin/organization/AdminApiKeyServiceAsync.kt | 2 +- .../admin/organization/AdminApiKeyServiceAsyncImpl.kt | 2 +- .../async/admin/organization/AuditLogServiceAsync.kt | 2 +- .../async/admin/organization/AuditLogServiceAsyncImpl.kt | 2 +- .../async/admin/organization/CertificateServiceAsync.kt | 2 +- .../admin/organization/CertificateServiceAsyncImpl.kt | 2 +- .../async/admin/organization/DataRetentionServiceAsync.kt | 2 +- .../admin/organization/DataRetentionServiceAsyncImpl.kt | 2 +- .../async/admin/organization/GroupServiceAsync.kt | 2 +- .../async/admin/organization/GroupServiceAsyncImpl.kt | 2 +- .../async/admin/organization/InviteServiceAsync.kt | 2 +- .../async/admin/organization/InviteServiceAsyncImpl.kt | 2 +- .../async/admin/organization/ProjectServiceAsync.kt | 2 +- .../async/admin/organization/ProjectServiceAsyncImpl.kt | 2 +- .../services/async/admin/organization/RoleServiceAsync.kt | 2 +- .../async/admin/organization/RoleServiceAsyncImpl.kt | 2 +- .../async/admin/organization/SpendAlertServiceAsync.kt | 2 +- .../admin/organization/SpendAlertServiceAsyncImpl.kt | 2 +- .../async/admin/organization/SpendLimitServiceAsync.kt | 2 +- .../admin/organization/SpendLimitServiceAsyncImpl.kt | 2 +- .../async/admin/organization/UsageServiceAsync.kt | 2 +- .../async/admin/organization/UsageServiceAsyncImpl.kt | 2 +- .../services/async/admin/organization/UserServiceAsync.kt | 2 +- .../async/admin/organization/UserServiceAsyncImpl.kt | 2 +- .../async/admin/organization/groups/RoleServiceAsync.kt | 2 +- .../admin/organization/groups/RoleServiceAsyncImpl.kt | 2 +- .../async/admin/organization/groups/UserServiceAsync.kt | 2 +- .../admin/organization/groups/UserServiceAsyncImpl.kt | 2 +- .../admin/organization/projects/ApiKeyServiceAsync.kt | 2 +- .../admin/organization/projects/ApiKeyServiceAsyncImpl.kt | 2 +- .../organization/projects/CertificateServiceAsync.kt | 2 +- .../organization/projects/CertificateServiceAsyncImpl.kt | 2 +- .../organization/projects/DataRetentionServiceAsync.kt | 2 +- .../projects/DataRetentionServiceAsyncImpl.kt | 2 +- .../admin/organization/projects/GroupServiceAsync.kt | 2 +- .../admin/organization/projects/GroupServiceAsyncImpl.kt | 2 +- .../projects/HostedToolPermissionServiceAsync.kt | 2 +- .../projects/HostedToolPermissionServiceAsyncImpl.kt | 2 +- .../organization/projects/ModelPermissionServiceAsync.kt | 2 +- .../projects/ModelPermissionServiceAsyncImpl.kt | 2 +- .../admin/organization/projects/RateLimitServiceAsync.kt | 2 +- .../organization/projects/RateLimitServiceAsyncImpl.kt | 2 +- .../async/admin/organization/projects/RoleServiceAsync.kt | 2 +- .../admin/organization/projects/RoleServiceAsyncImpl.kt | 2 +- .../organization/projects/ServiceAccountServiceAsync.kt | 2 +- .../projects/ServiceAccountServiceAsyncImpl.kt | 2 +- .../admin/organization/projects/SpendAlertServiceAsync.kt | 2 +- .../organization/projects/SpendAlertServiceAsyncImpl.kt | 2 +- .../admin/organization/projects/SpendLimitServiceAsync.kt | 2 +- .../organization/projects/SpendLimitServiceAsyncImpl.kt | 2 +- .../async/admin/organization/projects/UserServiceAsync.kt | 2 +- .../admin/organization/projects/UserServiceAsyncImpl.kt | 2 +- .../organization/projects/groups/RoleServiceAsync.kt | 2 +- .../organization/projects/groups/RoleServiceAsyncImpl.kt | 2 +- .../projects/serviceaccounts/ApiKeyServiceAsync.kt | 2 +- .../projects/serviceaccounts/ApiKeyServiceAsyncImpl.kt | 2 +- .../admin/organization/projects/users/RoleServiceAsync.kt | 2 +- .../organization/projects/users/RoleServiceAsyncImpl.kt | 2 +- .../async/admin/organization/users/RoleServiceAsync.kt | 2 +- .../admin/organization/users/RoleServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/audio/SpeechServiceAsync.kt | 2 +- .../openai/services/async/audio/SpeechServiceAsyncImpl.kt | 2 +- .../services/async/audio/TranscriptionServiceAsync.kt | 2 +- .../services/async/audio/TranscriptionServiceAsyncImpl.kt | 2 +- .../services/async/audio/TranslationServiceAsync.kt | 2 +- .../services/async/audio/TranslationServiceAsyncImpl.kt | 2 +- .../openai/services/async/beta/AssistantServiceAsync.kt | 2 +- .../services/async/beta/AssistantServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/beta/ChatKitServiceAsync.kt | 2 +- .../openai/services/async/beta/ChatKitServiceAsyncImpl.kt | 2 +- .../openai/services/async/beta/ResponseServiceAsync.kt | 2 +- .../services/async/beta/ResponseServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/beta/ThreadServiceAsync.kt | 2 +- .../openai/services/async/beta/ThreadServiceAsyncImpl.kt | 2 +- .../services/async/beta/chatkit/SessionServiceAsync.kt | 2 +- .../async/beta/chatkit/SessionServiceAsyncImpl.kt | 2 +- .../services/async/beta/chatkit/ThreadServiceAsync.kt | 2 +- .../services/async/beta/chatkit/ThreadServiceAsyncImpl.kt | 2 +- .../async/beta/responses/InputItemServiceAsync.kt | 2 +- .../async/beta/responses/InputItemServiceAsyncImpl.kt | 2 +- .../async/beta/responses/InputTokenServiceAsync.kt | 2 +- .../async/beta/responses/InputTokenServiceAsyncImpl.kt | 2 +- .../services/async/beta/threads/MessageServiceAsync.kt | 2 +- .../async/beta/threads/MessageServiceAsyncImpl.kt | 2 +- .../openai/services/async/beta/threads/RunServiceAsync.kt | 2 +- .../services/async/beta/threads/RunServiceAsyncImpl.kt | 2 +- .../services/async/beta/threads/runs/StepServiceAsync.kt | 2 +- .../async/beta/threads/runs/StepServiceAsyncImpl.kt | 2 +- .../services/async/chat/ChatCompletionServiceAsync.kt | 2 +- .../services/async/chat/ChatCompletionServiceAsyncImpl.kt | 2 +- .../async/chat/completions/MessageServiceAsync.kt | 2 +- .../async/chat/completions/MessageServiceAsyncImpl.kt | 2 +- .../openai/services/async/containers/FileServiceAsync.kt | 2 +- .../services/async/containers/FileServiceAsyncImpl.kt | 2 +- .../async/containers/files/ContentServiceAsync.kt | 2 +- .../async/containers/files/ContentServiceAsyncImpl.kt | 2 +- .../services/async/conversations/ItemServiceAsync.kt | 2 +- .../services/async/conversations/ItemServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/evals/RunServiceAsync.kt | 2 +- .../openai/services/async/evals/RunServiceAsyncImpl.kt | 2 +- .../services/async/evals/runs/OutputItemServiceAsync.kt | 2 +- .../async/evals/runs/OutputItemServiceAsyncImpl.kt | 2 +- .../openai/services/async/finetuning/AlphaServiceAsync.kt | 2 +- .../services/async/finetuning/AlphaServiceAsyncImpl.kt | 2 +- .../services/async/finetuning/CheckpointServiceAsync.kt | 2 +- .../async/finetuning/CheckpointServiceAsyncImpl.kt | 2 +- .../openai/services/async/finetuning/JobServiceAsync.kt | 2 +- .../services/async/finetuning/JobServiceAsyncImpl.kt | 2 +- .../services/async/finetuning/MethodServiceAsync.kt | 2 +- .../services/async/finetuning/MethodServiceAsyncImpl.kt | 2 +- .../services/async/finetuning/alpha/GraderServiceAsync.kt | 2 +- .../async/finetuning/alpha/GraderServiceAsyncImpl.kt | 2 +- .../finetuning/checkpoints/PermissionServiceAsync.kt | 2 +- .../finetuning/checkpoints/PermissionServiceAsyncImpl.kt | 2 +- .../async/finetuning/jobs/CheckpointServiceAsync.kt | 2 +- .../async/finetuning/jobs/CheckpointServiceAsyncImpl.kt | 2 +- .../services/async/graders/GraderModelServiceAsync.kt | 2 +- .../services/async/graders/GraderModelServiceAsyncImpl.kt | 2 +- .../openai/services/async/realtime/CallServiceAsync.kt | 2 +- .../services/async/realtime/CallServiceAsyncImpl.kt | 2 +- .../services/async/realtime/ClientSecretServiceAsync.kt | 2 +- .../async/realtime/ClientSecretServiceAsyncImpl.kt | 2 +- .../services/async/responses/InputItemServiceAsync.kt | 2 +- .../services/async/responses/InputItemServiceAsyncImpl.kt | 2 +- .../services/async/responses/InputTokenServiceAsync.kt | 2 +- .../async/responses/InputTokenServiceAsyncImpl.kt | 2 +- .../openai/services/async/skills/ContentServiceAsync.kt | 2 +- .../services/async/skills/ContentServiceAsyncImpl.kt | 2 +- .../openai/services/async/skills/VersionServiceAsync.kt | 2 +- .../services/async/skills/VersionServiceAsyncImpl.kt | 2 +- .../services/async/skills/versions/ContentServiceAsync.kt | 2 +- .../async/skills/versions/ContentServiceAsyncImpl.kt | 2 +- .../com/openai/services/async/uploads/PartServiceAsync.kt | 2 +- .../openai/services/async/uploads/PartServiceAsyncImpl.kt | 2 +- .../services/async/vectorstores/FileBatchServiceAsync.kt | 2 +- .../async/vectorstores/FileBatchServiceAsyncImpl.kt | 2 +- .../services/async/vectorstores/FileServiceAsync.kt | 2 +- .../services/async/vectorstores/FileServiceAsyncImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/AdminService.kt | 2 +- .../com/openai/services/blocking/AdminServiceImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/AudioService.kt | 2 +- .../com/openai/services/blocking/AudioServiceImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/BatchService.kt | 2 +- .../com/openai/services/blocking/BatchServiceImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/BetaService.kt | 2 +- .../com/openai/services/blocking/BetaServiceImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/ChatService.kt | 2 +- .../com/openai/services/blocking/ChatServiceImpl.kt | 2 +- .../com/openai/services/blocking/CompletionService.kt | 2 +- .../com/openai/services/blocking/CompletionServiceImpl.kt | 2 +- .../com/openai/services/blocking/ContainerService.kt | 2 +- .../com/openai/services/blocking/ContainerServiceImpl.kt | 2 +- .../services/blocking/ContentProvenanceCheckService.kt | 2 +- .../blocking/ContentProvenanceCheckServiceImpl.kt | 2 +- .../com/openai/services/blocking/ConversationService.kt | 2 +- .../openai/services/blocking/ConversationServiceImpl.kt | 2 +- .../com/openai/services/blocking/EmbeddingService.kt | 2 +- .../com/openai/services/blocking/EmbeddingServiceImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/EvalService.kt | 2 +- .../com/openai/services/blocking/EvalServiceImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/FileService.kt | 2 +- .../com/openai/services/blocking/FileServiceImpl.kt | 2 +- .../com/openai/services/blocking/FineTuningService.kt | 2 +- .../com/openai/services/blocking/FineTuningServiceImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/GraderService.kt | 2 +- .../com/openai/services/blocking/GraderServiceImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/ImageService.kt | 2 +- .../com/openai/services/blocking/ImageServiceImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/ModelService.kt | 2 +- .../com/openai/services/blocking/ModelServiceImpl.kt | 2 +- .../com/openai/services/blocking/ModerationService.kt | 2 +- .../com/openai/services/blocking/ModerationServiceImpl.kt | 2 +- .../com/openai/services/blocking/RealtimeService.kt | 2 +- .../com/openai/services/blocking/RealtimeServiceImpl.kt | 2 +- .../com/openai/services/blocking/ResponseService.kt | 2 +- .../com/openai/services/blocking/ResponseServiceImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/SkillService.kt | 2 +- .../com/openai/services/blocking/SkillServiceImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/UploadService.kt | 2 +- .../com/openai/services/blocking/UploadServiceImpl.kt | 2 +- .../com/openai/services/blocking/VectorStoreService.kt | 2 +- .../openai/services/blocking/VectorStoreServiceImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/VideoService.kt | 2 +- .../com/openai/services/blocking/VideoServiceImpl.kt | 2 +- .../kotlin/com/openai/services/blocking/WebhookService.kt | 2 +- .../com/openai/services/blocking/WebhookServiceImpl.kt | 2 +- .../openai/services/blocking/admin/OrganizationService.kt | 2 +- .../services/blocking/admin/OrganizationServiceImpl.kt | 2 +- .../blocking/admin/organization/AdminApiKeyService.kt | 2 +- .../blocking/admin/organization/AdminApiKeyServiceImpl.kt | 2 +- .../blocking/admin/organization/AuditLogService.kt | 2 +- .../blocking/admin/organization/AuditLogServiceImpl.kt | 2 +- .../blocking/admin/organization/CertificateService.kt | 2 +- .../blocking/admin/organization/CertificateServiceImpl.kt | 2 +- .../blocking/admin/organization/DataRetentionService.kt | 2 +- .../admin/organization/DataRetentionServiceImpl.kt | 2 +- .../services/blocking/admin/organization/GroupService.kt | 2 +- .../blocking/admin/organization/GroupServiceImpl.kt | 2 +- .../services/blocking/admin/organization/InviteService.kt | 2 +- .../blocking/admin/organization/InviteServiceImpl.kt | 2 +- .../blocking/admin/organization/ProjectService.kt | 2 +- .../blocking/admin/organization/ProjectServiceImpl.kt | 2 +- .../services/blocking/admin/organization/RoleService.kt | 2 +- .../blocking/admin/organization/RoleServiceImpl.kt | 2 +- .../blocking/admin/organization/SpendAlertService.kt | 2 +- .../blocking/admin/organization/SpendAlertServiceImpl.kt | 2 +- .../blocking/admin/organization/SpendLimitService.kt | 2 +- .../blocking/admin/organization/SpendLimitServiceImpl.kt | 2 +- .../services/blocking/admin/organization/UsageService.kt | 2 +- .../blocking/admin/organization/UsageServiceImpl.kt | 2 +- .../services/blocking/admin/organization/UserService.kt | 2 +- .../blocking/admin/organization/UserServiceImpl.kt | 2 +- .../blocking/admin/organization/groups/RoleService.kt | 2 +- .../blocking/admin/organization/groups/RoleServiceImpl.kt | 2 +- .../blocking/admin/organization/groups/UserService.kt | 2 +- .../blocking/admin/organization/groups/UserServiceImpl.kt | 2 +- .../blocking/admin/organization/projects/ApiKeyService.kt | 2 +- .../admin/organization/projects/ApiKeyServiceImpl.kt | 2 +- .../admin/organization/projects/CertificateService.kt | 2 +- .../admin/organization/projects/CertificateServiceImpl.kt | 2 +- .../admin/organization/projects/DataRetentionService.kt | 2 +- .../organization/projects/DataRetentionServiceImpl.kt | 2 +- .../blocking/admin/organization/projects/GroupService.kt | 2 +- .../admin/organization/projects/GroupServiceImpl.kt | 2 +- .../organization/projects/HostedToolPermissionService.kt | 2 +- .../projects/HostedToolPermissionServiceImpl.kt | 2 +- .../admin/organization/projects/ModelPermissionService.kt | 2 +- .../organization/projects/ModelPermissionServiceImpl.kt | 2 +- .../admin/organization/projects/RateLimitService.kt | 2 +- .../admin/organization/projects/RateLimitServiceImpl.kt | 2 +- .../blocking/admin/organization/projects/RoleService.kt | 2 +- .../admin/organization/projects/RoleServiceImpl.kt | 2 +- .../admin/organization/projects/ServiceAccountService.kt | 2 +- .../organization/projects/ServiceAccountServiceImpl.kt | 2 +- .../admin/organization/projects/SpendAlertService.kt | 2 +- .../admin/organization/projects/SpendAlertServiceImpl.kt | 2 +- .../admin/organization/projects/SpendLimitService.kt | 2 +- .../admin/organization/projects/SpendLimitServiceImpl.kt | 2 +- .../blocking/admin/organization/projects/UserService.kt | 2 +- .../admin/organization/projects/UserServiceImpl.kt | 2 +- .../admin/organization/projects/groups/RoleService.kt | 2 +- .../admin/organization/projects/groups/RoleServiceImpl.kt | 2 +- .../projects/serviceaccounts/ApiKeyService.kt | 2 +- .../projects/serviceaccounts/ApiKeyServiceImpl.kt | 2 +- .../admin/organization/projects/users/RoleService.kt | 2 +- .../admin/organization/projects/users/RoleServiceImpl.kt | 2 +- .../blocking/admin/organization/users/RoleService.kt | 2 +- .../blocking/admin/organization/users/RoleServiceImpl.kt | 2 +- .../com/openai/services/blocking/audio/SpeechService.kt | 2 +- .../openai/services/blocking/audio/SpeechServiceImpl.kt | 2 +- .../services/blocking/audio/TranscriptionService.kt | 2 +- .../services/blocking/audio/TranscriptionServiceImpl.kt | 2 +- .../openai/services/blocking/audio/TranslationService.kt | 2 +- .../services/blocking/audio/TranslationServiceImpl.kt | 2 +- .../com/openai/services/blocking/beta/AssistantService.kt | 2 +- .../openai/services/blocking/beta/AssistantServiceImpl.kt | 2 +- .../com/openai/services/blocking/beta/ChatKitService.kt | 2 +- .../openai/services/blocking/beta/ChatKitServiceImpl.kt | 2 +- .../com/openai/services/blocking/beta/ResponseService.kt | 2 +- .../openai/services/blocking/beta/ResponseServiceImpl.kt | 2 +- .../com/openai/services/blocking/beta/ThreadService.kt | 2 +- .../openai/services/blocking/beta/ThreadServiceImpl.kt | 2 +- .../services/blocking/beta/chatkit/SessionService.kt | 2 +- .../services/blocking/beta/chatkit/SessionServiceImpl.kt | 2 +- .../services/blocking/beta/chatkit/ThreadService.kt | 2 +- .../services/blocking/beta/chatkit/ThreadServiceImpl.kt | 2 +- .../services/blocking/beta/responses/InputItemService.kt | 2 +- .../blocking/beta/responses/InputItemServiceImpl.kt | 2 +- .../services/blocking/beta/responses/InputTokenService.kt | 2 +- .../blocking/beta/responses/InputTokenServiceImpl.kt | 2 +- .../services/blocking/beta/threads/MessageService.kt | 2 +- .../services/blocking/beta/threads/MessageServiceImpl.kt | 2 +- .../openai/services/blocking/beta/threads/RunService.kt | 2 +- .../services/blocking/beta/threads/RunServiceImpl.kt | 2 +- .../services/blocking/beta/threads/runs/StepService.kt | 2 +- .../blocking/beta/threads/runs/StepServiceImpl.kt | 2 +- .../services/blocking/chat/ChatCompletionService.kt | 2 +- .../services/blocking/chat/ChatCompletionServiceImpl.kt | 2 +- .../services/blocking/chat/completions/MessageService.kt | 2 +- .../blocking/chat/completions/MessageServiceImpl.kt | 2 +- .../openai/services/blocking/containers/FileService.kt | 2 +- .../services/blocking/containers/FileServiceImpl.kt | 2 +- .../services/blocking/containers/files/ContentService.kt | 2 +- .../blocking/containers/files/ContentServiceImpl.kt | 2 +- .../openai/services/blocking/conversations/ItemService.kt | 2 +- .../services/blocking/conversations/ItemServiceImpl.kt | 2 +- .../com/openai/services/blocking/evals/RunService.kt | 2 +- .../com/openai/services/blocking/evals/RunServiceImpl.kt | 2 +- .../services/blocking/evals/runs/OutputItemService.kt | 2 +- .../services/blocking/evals/runs/OutputItemServiceImpl.kt | 2 +- .../openai/services/blocking/finetuning/AlphaService.kt | 2 +- .../services/blocking/finetuning/AlphaServiceImpl.kt | 2 +- .../services/blocking/finetuning/CheckpointService.kt | 2 +- .../services/blocking/finetuning/CheckpointServiceImpl.kt | 2 +- .../com/openai/services/blocking/finetuning/JobService.kt | 2 +- .../openai/services/blocking/finetuning/JobServiceImpl.kt | 2 +- .../openai/services/blocking/finetuning/MethodService.kt | 2 +- .../services/blocking/finetuning/MethodServiceImpl.kt | 2 +- .../services/blocking/finetuning/alpha/GraderService.kt | 2 +- .../blocking/finetuning/alpha/GraderServiceImpl.kt | 2 +- .../blocking/finetuning/checkpoints/PermissionService.kt | 2 +- .../finetuning/checkpoints/PermissionServiceImpl.kt | 2 +- .../blocking/finetuning/jobs/CheckpointService.kt | 2 +- .../blocking/finetuning/jobs/CheckpointServiceImpl.kt | 2 +- .../services/blocking/graders/GraderModelService.kt | 2 +- .../services/blocking/graders/GraderModelServiceImpl.kt | 2 +- .../com/openai/services/blocking/realtime/CallService.kt | 2 +- .../openai/services/blocking/realtime/CallServiceImpl.kt | 2 +- .../services/blocking/realtime/ClientSecretService.kt | 2 +- .../services/blocking/realtime/ClientSecretServiceImpl.kt | 2 +- .../services/blocking/responses/InputItemService.kt | 2 +- .../services/blocking/responses/InputItemServiceImpl.kt | 2 +- .../services/blocking/responses/InputTokenService.kt | 2 +- .../services/blocking/responses/InputTokenServiceImpl.kt | 2 +- .../com/openai/services/blocking/skills/ContentService.kt | 2 +- .../openai/services/blocking/skills/ContentServiceImpl.kt | 2 +- .../com/openai/services/blocking/skills/VersionService.kt | 2 +- .../openai/services/blocking/skills/VersionServiceImpl.kt | 2 +- .../services/blocking/skills/versions/ContentService.kt | 2 +- .../blocking/skills/versions/ContentServiceImpl.kt | 2 +- .../com/openai/services/blocking/uploads/PartService.kt | 2 +- .../openai/services/blocking/uploads/PartServiceImpl.kt | 2 +- .../services/blocking/vectorstores/FileBatchService.kt | 2 +- .../blocking/vectorstores/FileBatchServiceImpl.kt | 2 +- .../openai/services/blocking/vectorstores/FileService.kt | 2 +- .../services/blocking/vectorstores/FileServiceImpl.kt | 2 +- .../src/test/kotlin/com/openai/models/AllModelsTest.kt | 2 +- .../test/kotlin/com/openai/models/ComparisonFilterTest.kt | 2 +- .../test/kotlin/com/openai/models/CompoundFilterTest.kt | 2 +- .../kotlin/com/openai/models/CustomToolInputFormatTest.kt | 2 +- .../src/test/kotlin/com/openai/models/ErrorObjectTest.kt | 2 +- .../kotlin/com/openai/models/FunctionDefinitionTest.kt | 2 +- .../kotlin/com/openai/models/FunctionParametersTest.kt | 2 +- .../src/test/kotlin/com/openai/models/ReasoningTest.kt | 2 +- .../com/openai/models/ResponseFormatJsonObjectTest.kt | 2 +- .../com/openai/models/ResponseFormatJsonSchemaTest.kt | 2 +- .../com/openai/models/ResponseFormatTextGrammarTest.kt | 2 +- .../com/openai/models/ResponseFormatTextPythonTest.kt | 2 +- .../kotlin/com/openai/models/ResponseFormatTextTest.kt | 2 +- .../test/kotlin/com/openai/models/ResponsesModelTest.kt | 2 +- .../adminapikeys/AdminApiKeyCreateParamsTest.kt | 2 +- .../adminapikeys/AdminApiKeyCreateResponseTest.kt | 2 +- .../adminapikeys/AdminApiKeyDeleteParamsTest.kt | 2 +- .../adminapikeys/AdminApiKeyDeleteResponseTest.kt | 2 +- .../adminapikeys/AdminApiKeyListPageResponseTest.kt | 2 +- .../adminapikeys/AdminApiKeyListParamsTest.kt | 2 +- .../adminapikeys/AdminApiKeyRetrieveParamsTest.kt | 2 +- .../admin/organization/adminapikeys/AdminApiKeyTest.kt | 2 +- .../auditlogs/AuditLogListPageResponseTest.kt | 2 +- .../organization/auditlogs/AuditLogListParamsTest.kt | 2 +- .../organization/auditlogs/AuditLogListResponseTest.kt | 2 +- .../certificates/CertificateActivatePageResponseTest.kt | 2 +- .../certificates/CertificateActivateParamsTest.kt | 2 +- .../certificates/CertificateActivateResponseTest.kt | 2 +- .../certificates/CertificateCreateParamsTest.kt | 2 +- .../certificates/CertificateDeactivatePageResponseTest.kt | 2 +- .../certificates/CertificateDeactivateParamsTest.kt | 2 +- .../certificates/CertificateDeactivateResponseTest.kt | 2 +- .../certificates/CertificateDeleteParamsTest.kt | 2 +- .../certificates/CertificateDeleteResponseTest.kt | 2 +- .../certificates/CertificateListPageResponseTest.kt | 2 +- .../certificates/CertificateListParamsTest.kt | 2 +- .../certificates/CertificateListResponseTest.kt | 2 +- .../certificates/CertificateRetrieveParamsTest.kt | 2 +- .../admin/organization/certificates/CertificateTest.kt | 2 +- .../certificates/CertificateUpdateParamsTest.kt | 2 +- .../dataretention/DataRetentionRetrieveParamsTest.kt | 2 +- .../dataretention/DataRetentionUpdateParamsTest.kt | 2 +- .../dataretention/OrganizationDataRetentionTest.kt | 2 +- .../admin/organization/groups/GroupCreateParamsTest.kt | 2 +- .../admin/organization/groups/GroupDeleteParamsTest.kt | 2 +- .../admin/organization/groups/GroupDeleteResponseTest.kt | 2 +- .../organization/groups/GroupListPageResponseTest.kt | 2 +- .../admin/organization/groups/GroupListParamsTest.kt | 2 +- .../admin/organization/groups/GroupRetrieveParamsTest.kt | 2 +- .../openai/models/admin/organization/groups/GroupTest.kt | 2 +- .../admin/organization/groups/GroupUpdateParamsTest.kt | 2 +- .../admin/organization/groups/GroupUpdateResponseTest.kt | 2 +- .../organization/groups/roles/RoleCreateParamsTest.kt | 2 +- .../organization/groups/roles/RoleCreateResponseTest.kt | 2 +- .../organization/groups/roles/RoleDeleteParamsTest.kt | 2 +- .../organization/groups/roles/RoleDeleteResponseTest.kt | 2 +- .../organization/groups/roles/RoleListPageResponseTest.kt | 2 +- .../admin/organization/groups/roles/RoleListParamsTest.kt | 2 +- .../organization/groups/roles/RoleListResponseTest.kt | 2 +- .../organization/groups/roles/RoleRetrieveParamsTest.kt | 2 +- .../organization/groups/roles/RoleRetrieveResponseTest.kt | 2 +- .../groups/users/OrganizationGroupUserTest.kt | 2 +- .../organization/groups/users/UserCreateParamsTest.kt | 2 +- .../organization/groups/users/UserCreateResponseTest.kt | 2 +- .../organization/groups/users/UserDeleteParamsTest.kt | 2 +- .../organization/groups/users/UserDeleteResponseTest.kt | 2 +- .../organization/groups/users/UserListPageResponseTest.kt | 2 +- .../admin/organization/groups/users/UserListParamsTest.kt | 2 +- .../organization/groups/users/UserRetrieveParamsTest.kt | 2 +- .../organization/groups/users/UserRetrieveResponseTest.kt | 2 +- .../admin/organization/invites/InviteCreateParamsTest.kt | 2 +- .../admin/organization/invites/InviteDeleteParamsTest.kt | 2 +- .../organization/invites/InviteDeleteResponseTest.kt | 2 +- .../organization/invites/InviteListPageResponseTest.kt | 2 +- .../admin/organization/invites/InviteListParamsTest.kt | 2 +- .../organization/invites/InviteRetrieveParamsTest.kt | 2 +- .../models/admin/organization/invites/InviteTest.kt | 2 +- .../organization/projects/ProjectArchiveParamsTest.kt | 2 +- .../organization/projects/ProjectCreateParamsTest.kt | 2 +- .../organization/projects/ProjectListPageResponseTest.kt | 2 +- .../admin/organization/projects/ProjectListParamsTest.kt | 2 +- .../organization/projects/ProjectRetrieveParamsTest.kt | 2 +- .../models/admin/organization/projects/ProjectTest.kt | 2 +- .../organization/projects/ProjectUpdateParamsTest.kt | 2 +- .../projects/apikeys/ApiKeyDeleteParamsTest.kt | 2 +- .../projects/apikeys/ApiKeyDeleteResponseTest.kt | 2 +- .../projects/apikeys/ApiKeyListPageResponseTest.kt | 2 +- .../organization/projects/apikeys/ApiKeyListParamsTest.kt | 2 +- .../projects/apikeys/ApiKeyRetrieveParamsTest.kt | 2 +- .../organization/projects/apikeys/ProjectApiKeyTest.kt | 2 +- .../certificates/CertificateActivatePageResponseTest.kt | 2 +- .../certificates/CertificateActivateParamsTest.kt | 2 +- .../certificates/CertificateActivateResponseTest.kt | 2 +- .../certificates/CertificateDeactivatePageResponseTest.kt | 2 +- .../certificates/CertificateDeactivateParamsTest.kt | 2 +- .../certificates/CertificateDeactivateResponseTest.kt | 2 +- .../certificates/CertificateListPageResponseTest.kt | 2 +- .../projects/certificates/CertificateListParamsTest.kt | 2 +- .../projects/certificates/CertificateListResponseTest.kt | 2 +- .../dataretention/DataRetentionRetrieveParamsTest.kt | 2 +- .../dataretention/DataRetentionUpdateParamsTest.kt | 2 +- .../projects/dataretention/ProjectDataRetentionTest.kt | 2 +- .../organization/projects/groups/GroupCreateParamsTest.kt | 2 +- .../organization/projects/groups/GroupDeleteParamsTest.kt | 2 +- .../projects/groups/GroupDeleteResponseTest.kt | 2 +- .../projects/groups/GroupListPageResponseTest.kt | 2 +- .../organization/projects/groups/GroupListParamsTest.kt | 2 +- .../projects/groups/GroupRetrieveParamsTest.kt | 2 +- .../organization/projects/groups/ProjectGroupTest.kt | 2 +- .../projects/groups/roles/RoleCreateParamsTest.kt | 2 +- .../projects/groups/roles/RoleCreateResponseTest.kt | 2 +- .../projects/groups/roles/RoleDeleteParamsTest.kt | 2 +- .../projects/groups/roles/RoleDeleteResponseTest.kt | 2 +- .../projects/groups/roles/RoleListPageResponseTest.kt | 2 +- .../projects/groups/roles/RoleListParamsTest.kt | 2 +- .../projects/groups/roles/RoleListResponseTest.kt | 2 +- .../projects/groups/roles/RoleRetrieveParamsTest.kt | 2 +- .../projects/groups/roles/RoleRetrieveResponseTest.kt | 2 +- .../HostedToolPermissionRetrieveParamsTest.kt | 2 +- .../HostedToolPermissionUpdateParamsTest.kt | 2 +- .../ProjectHostedToolPermissionsTest.kt | 2 +- .../modelpermissions/ModelPermissionDeleteParamsTest.kt | 2 +- .../modelpermissions/ModelPermissionRetrieveParamsTest.kt | 2 +- .../modelpermissions/ModelPermissionUpdateParamsTest.kt | 2 +- .../ProjectModelPermissionsDeletedTest.kt | 2 +- .../modelpermissions/ProjectModelPermissionsTest.kt | 2 +- .../projects/ratelimits/ProjectRateLimitTest.kt | 2 +- .../ratelimits/RateLimitListRateLimitsPageResponseTest.kt | 2 +- .../ratelimits/RateLimitListRateLimitsParamsTest.kt | 2 +- .../ratelimits/RateLimitUpdateRateLimitParamsTest.kt | 2 +- .../organization/projects/roles/RoleCreateParamsTest.kt | 2 +- .../organization/projects/roles/RoleDeleteParamsTest.kt | 2 +- .../organization/projects/roles/RoleDeleteResponseTest.kt | 2 +- .../projects/roles/RoleListPageResponseTest.kt | 2 +- .../organization/projects/roles/RoleListParamsTest.kt | 2 +- .../organization/projects/roles/RoleRetrieveParamsTest.kt | 2 +- .../organization/projects/roles/RoleUpdateParamsTest.kt | 2 +- .../projects/serviceaccounts/ProjectServiceAccountTest.kt | 2 +- .../serviceaccounts/ServiceAccountCreateParamsTest.kt | 2 +- .../serviceaccounts/ServiceAccountCreateResponseTest.kt | 2 +- .../serviceaccounts/ServiceAccountDeleteParamsTest.kt | 2 +- .../serviceaccounts/ServiceAccountDeleteResponseTest.kt | 2 +- .../serviceaccounts/ServiceAccountListPageResponseTest.kt | 2 +- .../serviceaccounts/ServiceAccountListParamsTest.kt | 2 +- .../serviceaccounts/ServiceAccountRetrieveParamsTest.kt | 2 +- .../serviceaccounts/ServiceAccountUpdateParamsTest.kt | 2 +- .../serviceaccounts/apikeys/ApiKeyCreateParamsTest.kt | 2 +- .../serviceaccounts/apikeys/ApiKeyCreateResponseTest.kt | 2 +- .../projects/spendalerts/ProjectSpendAlertDeletedTest.kt | 2 +- .../projects/spendalerts/ProjectSpendAlertTest.kt | 2 +- .../projects/spendalerts/SpendAlertCreateParamsTest.kt | 2 +- .../projects/spendalerts/SpendAlertDeleteParamsTest.kt | 2 +- .../spendalerts/SpendAlertListPageResponseTest.kt | 2 +- .../projects/spendalerts/SpendAlertListParamsTest.kt | 2 +- .../projects/spendalerts/SpendAlertRetrieveParamsTest.kt | 2 +- .../projects/spendalerts/SpendAlertUpdateParamsTest.kt | 2 +- .../projects/spendlimit/ProjectSpendLimitDeletedTest.kt | 2 +- .../projects/spendlimit/ProjectSpendLimitTest.kt | 2 +- .../projects/spendlimit/SpendLimitDeleteParamsTest.kt | 2 +- .../projects/spendlimit/SpendLimitRetrieveParamsTest.kt | 2 +- .../projects/spendlimit/SpendLimitUpdateParamsTest.kt | 2 +- .../admin/organization/projects/users/ProjectUserTest.kt | 2 +- .../organization/projects/users/UserCreateParamsTest.kt | 2 +- .../organization/projects/users/UserDeleteParamsTest.kt | 2 +- .../organization/projects/users/UserDeleteResponseTest.kt | 2 +- .../projects/users/UserListPageResponseTest.kt | 2 +- .../organization/projects/users/UserListParamsTest.kt | 2 +- .../organization/projects/users/UserRetrieveParamsTest.kt | 2 +- .../organization/projects/users/UserUpdateParamsTest.kt | 2 +- .../projects/users/roles/RoleCreateParamsTest.kt | 2 +- .../projects/users/roles/RoleCreateResponseTest.kt | 2 +- .../projects/users/roles/RoleDeleteParamsTest.kt | 2 +- .../projects/users/roles/RoleDeleteResponseTest.kt | 2 +- .../projects/users/roles/RoleListPageResponseTest.kt | 2 +- .../projects/users/roles/RoleListParamsTest.kt | 2 +- .../projects/users/roles/RoleListResponseTest.kt | 2 +- .../projects/users/roles/RoleRetrieveParamsTest.kt | 2 +- .../projects/users/roles/RoleRetrieveResponseTest.kt | 2 +- .../admin/organization/roles/RoleCreateParamsTest.kt | 2 +- .../admin/organization/roles/RoleDeleteParamsTest.kt | 2 +- .../admin/organization/roles/RoleDeleteResponseTest.kt | 2 +- .../admin/organization/roles/RoleListPageResponseTest.kt | 2 +- .../models/admin/organization/roles/RoleListParamsTest.kt | 2 +- .../admin/organization/roles/RoleRetrieveParamsTest.kt | 2 +- .../openai/models/admin/organization/roles/RoleTest.kt | 2 +- .../admin/organization/roles/RoleUpdateParamsTest.kt | 2 +- .../spendalerts/OrganizationSpendAlertDeletedTest.kt | 2 +- .../spendalerts/OrganizationSpendAlertTest.kt | 2 +- .../spendalerts/SpendAlertCreateParamsTest.kt | 2 +- .../spendalerts/SpendAlertDeleteParamsTest.kt | 2 +- .../spendalerts/SpendAlertListPageResponseTest.kt | 2 +- .../organization/spendalerts/SpendAlertListParamsTest.kt | 2 +- .../spendalerts/SpendAlertRetrieveParamsTest.kt | 2 +- .../spendalerts/SpendAlertUpdateParamsTest.kt | 2 +- .../spendlimit/OrganizationSpendLimitDeletedTest.kt | 2 +- .../organization/spendlimit/OrganizationSpendLimitTest.kt | 2 +- .../organization/spendlimit/SpendLimitDeleteParamsTest.kt | 2 +- .../spendlimit/SpendLimitRetrieveParamsTest.kt | 2 +- .../organization/spendlimit/SpendLimitUpdateParamsTest.kt | 2 +- .../organization/usage/UsageAudioSpeechesParamsTest.kt | 2 +- .../organization/usage/UsageAudioSpeechesResponseTest.kt | 2 +- .../usage/UsageAudioTranscriptionsParamsTest.kt | 2 +- .../usage/UsageAudioTranscriptionsResponseTest.kt | 2 +- .../usage/UsageCodeInterpreterSessionsParamsTest.kt | 2 +- .../usage/UsageCodeInterpreterSessionsResponseTest.kt | 2 +- .../organization/usage/UsageCompletionsParamsTest.kt | 2 +- .../organization/usage/UsageCompletionsResponseTest.kt | 2 +- .../admin/organization/usage/UsageCostsParamsTest.kt | 2 +- .../admin/organization/usage/UsageCostsResponseTest.kt | 2 +- .../admin/organization/usage/UsageEmbeddingsParamsTest.kt | 2 +- .../organization/usage/UsageEmbeddingsResponseTest.kt | 2 +- .../organization/usage/UsageFileSearchCallsParamsTest.kt | 2 +- .../usage/UsageFileSearchCallsResponseTest.kt | 2 +- .../admin/organization/usage/UsageImagesParamsTest.kt | 2 +- .../admin/organization/usage/UsageImagesResponseTest.kt | 2 +- .../organization/usage/UsageModerationsParamsTest.kt | 2 +- .../organization/usage/UsageModerationsResponseTest.kt | 2 +- .../organization/usage/UsageVectorStoresParamsTest.kt | 2 +- .../organization/usage/UsageVectorStoresResponseTest.kt | 2 +- .../organization/usage/UsageWebSearchCallsParamsTest.kt | 2 +- .../organization/usage/UsageWebSearchCallsResponseTest.kt | 2 +- .../admin/organization/users/OrganizationUserTest.kt | 2 +- .../admin/organization/users/UserDeleteParamsTest.kt | 2 +- .../admin/organization/users/UserDeleteResponseTest.kt | 2 +- .../admin/organization/users/UserListPageResponseTest.kt | 2 +- .../models/admin/organization/users/UserListParamsTest.kt | 2 +- .../admin/organization/users/UserRetrieveParamsTest.kt | 2 +- .../admin/organization/users/UserUpdateParamsTest.kt | 2 +- .../organization/users/roles/RoleCreateParamsTest.kt | 2 +- .../organization/users/roles/RoleCreateResponseTest.kt | 2 +- .../organization/users/roles/RoleDeleteParamsTest.kt | 2 +- .../organization/users/roles/RoleDeleteResponseTest.kt | 2 +- .../organization/users/roles/RoleListPageResponseTest.kt | 2 +- .../admin/organization/users/roles/RoleListParamsTest.kt | 2 +- .../organization/users/roles/RoleListResponseTest.kt | 2 +- .../organization/users/roles/RoleRetrieveParamsTest.kt | 2 +- .../organization/users/roles/RoleRetrieveResponseTest.kt | 2 +- .../openai/models/audio/speech/SpeechCreateParamsTest.kt | 2 +- .../audio/transcriptions/TranscriptionCreateParamsTest.kt | 2 +- .../transcriptions/TranscriptionCreateResponseTest.kt | 2 +- .../transcriptions/TranscriptionDiarizedSegmentTest.kt | 2 +- .../audio/transcriptions/TranscriptionDiarizedTest.kt | 2 +- .../audio/transcriptions/TranscriptionLanguageTest.kt | 2 +- .../audio/transcriptions/TranscriptionSegmentTest.kt | 2 +- .../audio/transcriptions/TranscriptionStreamEventTest.kt | 2 +- .../models/audio/transcriptions/TranscriptionTest.kt | 2 +- .../transcriptions/TranscriptionTextDeltaEventTest.kt | 2 +- .../transcriptions/TranscriptionTextDoneEventTest.kt | 2 +- .../transcriptions/TranscriptionTextSegmentEventTest.kt | 2 +- .../audio/transcriptions/TranscriptionVerboseTest.kt | 2 +- .../models/audio/transcriptions/TranscriptionWordTest.kt | 2 +- .../audio/translations/TranslationCreateParamsTest.kt | 2 +- .../audio/translations/TranslationCreateResponseTest.kt | 2 +- .../openai/models/audio/translations/TranslationTest.kt | 2 +- .../models/audio/translations/TranslationVerboseTest.kt | 2 +- .../com/openai/models/batches/BatchCancelParamsTest.kt | 2 +- .../com/openai/models/batches/BatchCreateParamsTest.kt | 2 +- .../kotlin/com/openai/models/batches/BatchErrorTest.kt | 2 +- .../openai/models/batches/BatchListPageResponseTest.kt | 2 +- .../com/openai/models/batches/BatchListParamsTest.kt | 2 +- .../com/openai/models/batches/BatchRequestCountsTest.kt | 2 +- .../com/openai/models/batches/BatchRetrieveParamsTest.kt | 2 +- .../test/kotlin/com/openai/models/batches/BatchTest.kt | 2 +- .../kotlin/com/openai/models/batches/BatchUsageTest.kt | 2 +- .../models/beta/assistants/AssistantCreateParamsTest.kt | 2 +- .../models/beta/assistants/AssistantDeleteParamsTest.kt | 2 +- .../openai/models/beta/assistants/AssistantDeletedTest.kt | 2 +- .../beta/assistants/AssistantListPageResponseTest.kt | 2 +- .../models/beta/assistants/AssistantListParamsTest.kt | 2 +- .../models/beta/assistants/AssistantRetrieveParamsTest.kt | 2 +- .../models/beta/assistants/AssistantStreamEventTest.kt | 2 +- .../com/openai/models/beta/assistants/AssistantTest.kt | 2 +- .../openai/models/beta/assistants/AssistantToolTest.kt | 2 +- .../models/beta/assistants/AssistantUpdateParamsTest.kt | 2 +- .../models/beta/assistants/CodeInterpreterToolTest.kt | 2 +- .../openai/models/beta/assistants/FileSearchToolTest.kt | 2 +- .../com/openai/models/beta/assistants/FunctionToolTest.kt | 2 +- .../models/beta/assistants/MessageStreamEventTest.kt | 2 +- .../models/beta/assistants/RunStepStreamEventTest.kt | 2 +- .../openai/models/beta/assistants/RunStreamEventTest.kt | 2 +- .../models/beta/assistants/ThreadStreamEventTest.kt | 2 +- .../com/openai/models/beta/chatkit/ChatKitWorkflowTest.kt | 2 +- .../beta/chatkit/sessions/SessionCancelParamsTest.kt | 2 +- .../beta/chatkit/sessions/SessionCreateParamsTest.kt | 2 +- .../models/beta/chatkit/threads/ChatKitAttachmentTest.kt | 2 +- .../beta/chatkit/threads/ChatKitResponseOutputTextTest.kt | 2 +- .../threads/ChatKitThreadAssistantMessageItemTest.kt | 2 +- .../beta/chatkit/threads/ChatKitThreadItemListTest.kt | 2 +- .../models/beta/chatkit/threads/ChatKitThreadTest.kt | 2 +- .../chatkit/threads/ChatKitThreadUserMessageItemTest.kt | 2 +- .../models/beta/chatkit/threads/ChatKitWidgetItemTest.kt | 2 +- .../threads/ChatSessionAutomaticThreadTitlingTest.kt | 2 +- .../threads/ChatSessionChatKitConfigurationParamTest.kt | 2 +- .../threads/ChatSessionChatKitConfigurationTest.kt | 2 +- .../chatkit/threads/ChatSessionExpiresAfterParamTest.kt | 2 +- .../beta/chatkit/threads/ChatSessionFileUploadTest.kt | 2 +- .../models/beta/chatkit/threads/ChatSessionHistoryTest.kt | 2 +- .../chatkit/threads/ChatSessionRateLimitsParamTest.kt | 2 +- .../beta/chatkit/threads/ChatSessionRateLimitsTest.kt | 2 +- .../openai/models/beta/chatkit/threads/ChatSessionTest.kt | 2 +- .../beta/chatkit/threads/ChatSessionWorkflowParamTest.kt | 2 +- .../models/beta/chatkit/threads/ThreadDeleteParamsTest.kt | 2 +- .../beta/chatkit/threads/ThreadDeleteResponseTest.kt | 2 +- .../beta/chatkit/threads/ThreadListItemsParamsTest.kt | 2 +- .../beta/chatkit/threads/ThreadListPageResponseTest.kt | 2 +- .../models/beta/chatkit/threads/ThreadListParamsTest.kt | 2 +- .../beta/chatkit/threads/ThreadRetrieveParamsTest.kt | 2 +- .../models/beta/responses/BetaApplyPatchToolTest.kt | 2 +- .../models/beta/responses/BetaCompactedResponseTest.kt | 2 +- .../models/beta/responses/BetaComputerActionTest.kt | 2 +- .../openai/models/beta/responses/BetaComputerToolTest.kt | 2 +- .../beta/responses/BetaComputerUsePreviewToolTest.kt | 2 +- .../openai/models/beta/responses/BetaContainerAutoTest.kt | 2 +- .../responses/BetaContainerNetworkPolicyAllowlistTest.kt | 2 +- .../responses/BetaContainerNetworkPolicyDisabledTest.kt | 2 +- .../BetaContainerNetworkPolicyDomainSecretTest.kt | 2 +- .../models/beta/responses/BetaContainerReferenceTest.kt | 2 +- .../openai/models/beta/responses/BetaCustomToolTest.kt | 2 +- .../models/beta/responses/BetaEasyInputMessageTest.kt | 2 +- .../models/beta/responses/BetaFileSearchToolTest.kt | 2 +- .../models/beta/responses/BetaFunctionShellToolTest.kt | 2 +- .../openai/models/beta/responses/BetaFunctionToolTest.kt | 2 +- .../models/beta/responses/BetaInlineSkillSourceTest.kt | 2 +- .../openai/models/beta/responses/BetaInlineSkillTest.kt | 2 +- .../models/beta/responses/BetaLocalEnvironmentTest.kt | 2 +- .../openai/models/beta/responses/BetaLocalSkillTest.kt | 2 +- .../openai/models/beta/responses/BetaNamespaceToolTest.kt | 8 ++++---- .../responses/BetaResponseApplyPatchToolCallOutputTest.kt | 2 +- .../beta/responses/BetaResponseApplyPatchToolCallTest.kt | 2 +- .../beta/responses/BetaResponseAudioDeltaEventTest.kt | 2 +- .../beta/responses/BetaResponseAudioDoneEventTest.kt | 2 +- .../BetaResponseAudioTranscriptDeltaEventTest.kt | 2 +- .../responses/BetaResponseAudioTranscriptDoneEventTest.kt | 2 +- .../BetaResponseCodeInterpreterCallCodeDeltaEventTest.kt | 2 +- .../BetaResponseCodeInterpreterCallCodeDoneEventTest.kt | 2 +- .../BetaResponseCodeInterpreterCallCompletedEventTest.kt | 2 +- .../BetaResponseCodeInterpreterCallInProgressEventTest.kt | 2 +- ...etaResponseCodeInterpreterCallInterpretingEventTest.kt | 2 +- .../responses/BetaResponseCodeInterpreterToolCallTest.kt | 2 +- .../beta/responses/BetaResponseCompactionItemParamTest.kt | 2 +- .../beta/responses/BetaResponseCompactionItemTest.kt | 2 +- .../beta/responses/BetaResponseCompletedEventTest.kt | 2 +- .../BetaResponseComputerToolCallOutputItemTest.kt | 2 +- .../BetaResponseComputerToolCallOutputScreenshotTest.kt | 2 +- .../beta/responses/BetaResponseComputerToolCallTest.kt | 2 +- .../beta/responses/BetaResponseContainerReferenceTest.kt | 2 +- .../responses/BetaResponseContentPartAddedEventTest.kt | 2 +- .../responses/BetaResponseContentPartDoneEventTest.kt | 2 +- .../models/beta/responses/BetaResponseContentTest.kt | 2 +- .../beta/responses/BetaResponseConversationParamTest.kt | 2 +- .../models/beta/responses/BetaResponseCreatedEventTest.kt | 2 +- .../BetaResponseCustomToolCallInputDeltaEventTest.kt | 2 +- .../BetaResponseCustomToolCallInputDoneEventTest.kt | 2 +- .../beta/responses/BetaResponseCustomToolCallItemTest.kt | 2 +- .../responses/BetaResponseCustomToolCallOutputItemTest.kt | 2 +- .../responses/BetaResponseCustomToolCallOutputTest.kt | 2 +- .../beta/responses/BetaResponseCustomToolCallTest.kt | 2 +- .../models/beta/responses/BetaResponseErrorEventTest.kt | 2 +- .../openai/models/beta/responses/BetaResponseErrorTest.kt | 2 +- .../models/beta/responses/BetaResponseFailedEventTest.kt | 2 +- .../BetaResponseFileSearchCallCompletedEventTest.kt | 2 +- .../BetaResponseFileSearchCallInProgressEventTest.kt | 2 +- .../BetaResponseFileSearchCallSearchingEventTest.kt | 2 +- .../beta/responses/BetaResponseFileSearchToolCallTest.kt | 2 +- .../beta/responses/BetaResponseFormatTextConfigTest.kt | 2 +- .../BetaResponseFormatTextJsonSchemaConfigTest.kt | 2 +- .../BetaResponseFunctionCallArgumentsDeltaEventTest.kt | 2 +- .../BetaResponseFunctionCallArgumentsDoneEventTest.kt | 2 +- .../responses/BetaResponseFunctionCallOutputItemTest.kt | 2 +- .../BetaResponseFunctionShellCallOutputContentTest.kt | 2 +- .../BetaResponseFunctionShellToolCallOutputTest.kt | 2 +- .../responses/BetaResponseFunctionShellToolCallTest.kt | 2 +- .../responses/BetaResponseFunctionToolCallItemTest.kt | 2 +- .../BetaResponseFunctionToolCallOutputItemTest.kt | 2 +- .../beta/responses/BetaResponseFunctionToolCallTest.kt | 2 +- .../beta/responses/BetaResponseFunctionWebSearchTest.kt | 2 +- .../BetaResponseImageGenCallCompletedEventTest.kt | 2 +- .../BetaResponseImageGenCallGeneratingEventTest.kt | 2 +- .../BetaResponseImageGenCallInProgressEventTest.kt | 2 +- .../BetaResponseImageGenCallPartialImageEventTest.kt | 2 +- .../beta/responses/BetaResponseInProgressEventTest.kt | 2 +- .../beta/responses/BetaResponseIncompleteEventTest.kt | 2 +- .../beta/responses/BetaResponseInjectCreatedEventTest.kt | 2 +- .../models/beta/responses/BetaResponseInjectEventTest.kt | 2 +- .../beta/responses/BetaResponseInjectFailedEventTest.kt | 2 +- .../models/beta/responses/BetaResponseInputAudioTest.kt | 2 +- .../models/beta/responses/BetaResponseInputContentTest.kt | 2 +- .../beta/responses/BetaResponseInputFileContentTest.kt | 2 +- .../models/beta/responses/BetaResponseInputFileTest.kt | 2 +- .../beta/responses/BetaResponseInputImageContentTest.kt | 2 +- .../models/beta/responses/BetaResponseInputImageTest.kt | 2 +- .../models/beta/responses/BetaResponseInputItemTest.kt | 2 +- .../beta/responses/BetaResponseInputMessageItemTest.kt | 2 +- .../beta/responses/BetaResponseInputTextContentTest.kt | 2 +- .../models/beta/responses/BetaResponseInputTextTest.kt | 2 +- .../openai/models/beta/responses/BetaResponseItemTest.kt | 2 +- .../beta/responses/BetaResponseLocalEnvironmentTest.kt | 2 +- .../BetaResponseMcpCallArgumentsDeltaEventTest.kt | 2 +- .../BetaResponseMcpCallArgumentsDoneEventTest.kt | 2 +- .../responses/BetaResponseMcpCallCompletedEventTest.kt | 2 +- .../beta/responses/BetaResponseMcpCallFailedEventTest.kt | 2 +- .../responses/BetaResponseMcpCallInProgressEventTest.kt | 2 +- .../BetaResponseMcpListToolsCompletedEventTest.kt | 2 +- .../responses/BetaResponseMcpListToolsFailedEventTest.kt | 2 +- .../BetaResponseMcpListToolsInProgressEventTest.kt | 2 +- .../models/beta/responses/BetaResponseOutputAudioTest.kt | 2 +- .../responses/BetaResponseOutputItemAddedEventTest.kt | 2 +- .../beta/responses/BetaResponseOutputItemDoneEventTest.kt | 2 +- .../models/beta/responses/BetaResponseOutputItemTest.kt | 2 +- .../beta/responses/BetaResponseOutputMessageTest.kt | 2 +- .../beta/responses/BetaResponseOutputRefusalTest.kt | 2 +- .../BetaResponseOutputTextAnnotationAddedEventTest.kt | 2 +- .../models/beta/responses/BetaResponseOutputTextTest.kt | 2 +- .../models/beta/responses/BetaResponsePromptTest.kt | 2 +- .../models/beta/responses/BetaResponseQueuedEventTest.kt | 2 +- .../beta/responses/BetaResponseReasoningItemTest.kt | 2 +- .../BetaResponseReasoningSummaryPartAddedEventTest.kt | 2 +- .../BetaResponseReasoningSummaryPartDoneEventTest.kt | 2 +- .../BetaResponseReasoningSummaryTextDeltaEventTest.kt | 2 +- .../BetaResponseReasoningSummaryTextDoneEventTest.kt | 2 +- .../responses/BetaResponseReasoningTextDeltaEventTest.kt | 2 +- .../responses/BetaResponseReasoningTextDoneEventTest.kt | 2 +- .../beta/responses/BetaResponseRefusalDeltaEventTest.kt | 2 +- .../beta/responses/BetaResponseRefusalDoneEventTest.kt | 2 +- .../models/beta/responses/BetaResponseStreamEventTest.kt | 2 +- .../com/openai/models/beta/responses/BetaResponseTest.kt | 2 +- .../models/beta/responses/BetaResponseTextConfigTest.kt | 2 +- .../beta/responses/BetaResponseTextDeltaEventTest.kt | 2 +- .../beta/responses/BetaResponseTextDoneEventTest.kt | 2 +- .../beta/responses/BetaResponseToolSearchCallTest.kt | 2 +- .../BetaResponseToolSearchOutputItemParamTest.kt | 2 +- .../responses/BetaResponseToolSearchOutputItemTest.kt | 2 +- .../openai/models/beta/responses/BetaResponseUsageTest.kt | 2 +- .../BetaResponseWebSearchCallCompletedEventTest.kt | 2 +- .../BetaResponseWebSearchCallInProgressEventTest.kt | 2 +- .../BetaResponseWebSearchCallSearchingEventTest.kt | 2 +- .../models/beta/responses/BetaResponsesClientEventTest.kt | 2 +- .../models/beta/responses/BetaResponsesServerEventTest.kt | 2 +- .../models/beta/responses/BetaSkillReferenceTest.kt | 2 +- .../models/beta/responses/BetaToolChoiceAllowedTest.kt | 2 +- .../models/beta/responses/BetaToolChoiceApplyPatchTest.kt | 2 +- .../models/beta/responses/BetaToolChoiceCustomTest.kt | 2 +- .../models/beta/responses/BetaToolChoiceFunctionTest.kt | 2 +- .../openai/models/beta/responses/BetaToolChoiceMcpTest.kt | 2 +- .../models/beta/responses/BetaToolChoiceShellTest.kt | 2 +- .../models/beta/responses/BetaToolChoiceTypesTest.kt | 2 +- .../models/beta/responses/BetaToolSearchToolTest.kt | 2 +- .../com/openai/models/beta/responses/BetaToolTest.kt | 6 +++--- .../models/beta/responses/BetaWebSearchPreviewToolTest.kt | 2 +- .../openai/models/beta/responses/BetaWebSearchToolTest.kt | 2 +- .../models/beta/responses/ResponseCancelParamsTest.kt | 2 +- .../models/beta/responses/ResponseCompactParamsTest.kt | 2 +- .../models/beta/responses/ResponseCreateParamsTest.kt | 2 +- .../models/beta/responses/ResponseDeleteParamsTest.kt | 2 +- .../models/beta/responses/ResponseRetrieveParamsTest.kt | 2 +- .../beta/responses/inputitems/BetaResponseItemListTest.kt | 2 +- .../beta/responses/inputitems/InputItemListParamsTest.kt | 2 +- .../responses/inputtokens/InputTokenCountParamsTest.kt | 2 +- .../responses/inputtokens/InputTokenCountResponseTest.kt | 2 +- .../beta/threads/AssistantResponseFormatOptionTest.kt | 2 +- .../beta/threads/AssistantToolChoiceFunctionTest.kt | 2 +- .../models/beta/threads/AssistantToolChoiceOptionTest.kt | 2 +- .../openai/models/beta/threads/AssistantToolChoiceTest.kt | 2 +- .../models/beta/threads/ThreadCreateAndRunParamsTest.kt | 2 +- .../openai/models/beta/threads/ThreadCreateParamsTest.kt | 2 +- .../openai/models/beta/threads/ThreadDeleteParamsTest.kt | 2 +- .../com/openai/models/beta/threads/ThreadDeletedTest.kt | 2 +- .../models/beta/threads/ThreadRetrieveParamsTest.kt | 2 +- .../kotlin/com/openai/models/beta/threads/ThreadTest.kt | 2 +- .../openai/models/beta/threads/ThreadUpdateParamsTest.kt | 2 +- .../models/beta/threads/messages/AnnotationDeltaTest.kt | 2 +- .../openai/models/beta/threads/messages/AnnotationTest.kt | 2 +- .../beta/threads/messages/FileCitationAnnotationTest.kt | 2 +- .../threads/messages/FileCitationDeltaAnnotationTest.kt | 2 +- .../beta/threads/messages/FilePathAnnotationTest.kt | 2 +- .../beta/threads/messages/FilePathDeltaAnnotationTest.kt | 2 +- .../beta/threads/messages/ImageFileContentBlockTest.kt | 2 +- .../beta/threads/messages/ImageFileDeltaBlockTest.kt | 2 +- .../models/beta/threads/messages/ImageFileDeltaTest.kt | 2 +- .../openai/models/beta/threads/messages/ImageFileTest.kt | 2 +- .../beta/threads/messages/ImageUrlContentBlockTest.kt | 2 +- .../beta/threads/messages/ImageUrlDeltaBlockTest.kt | 2 +- .../models/beta/threads/messages/ImageUrlDeltaTest.kt | 2 +- .../openai/models/beta/threads/messages/ImageUrlTest.kt | 2 +- .../beta/threads/messages/MessageContentDeltaTest.kt | 2 +- .../beta/threads/messages/MessageContentPartParamTest.kt | 2 +- .../models/beta/threads/messages/MessageContentTest.kt | 2 +- .../beta/threads/messages/MessageCreateParamsTest.kt | 2 +- .../beta/threads/messages/MessageDeleteParamsTest.kt | 2 +- .../models/beta/threads/messages/MessageDeletedTest.kt | 2 +- .../models/beta/threads/messages/MessageDeltaEventTest.kt | 2 +- .../models/beta/threads/messages/MessageDeltaTest.kt | 2 +- .../beta/threads/messages/MessageListPageResponseTest.kt | 2 +- .../models/beta/threads/messages/MessageListParamsTest.kt | 2 +- .../beta/threads/messages/MessageRetrieveParamsTest.kt | 2 +- .../openai/models/beta/threads/messages/MessageTest.kt | 2 +- .../beta/threads/messages/MessageUpdateParamsTest.kt | 2 +- .../beta/threads/messages/RefusalContentBlockTest.kt | 2 +- .../models/beta/threads/messages/RefusalDeltaBlockTest.kt | 2 +- .../beta/threads/messages/TextContentBlockParamTest.kt | 2 +- .../models/beta/threads/messages/TextContentBlockTest.kt | 2 +- .../models/beta/threads/messages/TextDeltaBlockTest.kt | 2 +- .../openai/models/beta/threads/messages/TextDeltaTest.kt | 2 +- .../com/openai/models/beta/threads/messages/TextTest.kt | 2 +- .../threads/runs/RequiredActionFunctionToolCallTest.kt | 2 +- .../models/beta/threads/runs/RunCancelParamsTest.kt | 2 +- .../models/beta/threads/runs/RunCreateParamsTest.kt | 2 +- .../models/beta/threads/runs/RunListPageResponseTest.kt | 2 +- .../openai/models/beta/threads/runs/RunListParamsTest.kt | 2 +- .../models/beta/threads/runs/RunRetrieveParamsTest.kt | 2 +- .../beta/threads/runs/RunSubmitToolOutputsParamsTest.kt | 2 +- .../kotlin/com/openai/models/beta/threads/runs/RunTest.kt | 2 +- .../models/beta/threads/runs/RunUpdateParamsTest.kt | 2 +- .../beta/threads/runs/steps/CodeInterpreterLogsTest.kt | 2 +- .../threads/runs/steps/CodeInterpreterOutputImageTest.kt | 2 +- .../runs/steps/CodeInterpreterToolCallDeltaTest.kt | 2 +- .../threads/runs/steps/CodeInterpreterToolCallTest.kt | 2 +- .../threads/runs/steps/FileSearchToolCallDeltaTest.kt | 2 +- .../beta/threads/runs/steps/FileSearchToolCallTest.kt | 2 +- .../beta/threads/runs/steps/FunctionToolCallDeltaTest.kt | 2 +- .../beta/threads/runs/steps/FunctionToolCallTest.kt | 2 +- .../threads/runs/steps/MessageCreationStepDetailsTest.kt | 2 +- .../beta/threads/runs/steps/RunStepDeltaEventTest.kt | 2 +- .../threads/runs/steps/RunStepDeltaMessageDeltaTest.kt | 2 +- .../models/beta/threads/runs/steps/RunStepDeltaTest.kt | 2 +- .../openai/models/beta/threads/runs/steps/RunStepTest.kt | 2 +- .../beta/threads/runs/steps/StepListPageResponseTest.kt | 2 +- .../models/beta/threads/runs/steps/StepListParamsTest.kt | 2 +- .../beta/threads/runs/steps/StepRetrieveParamsTest.kt | 2 +- .../beta/threads/runs/steps/ToolCallDeltaObjectTest.kt | 2 +- .../models/beta/threads/runs/steps/ToolCallDeltaTest.kt | 2 +- .../openai/models/beta/threads/runs/steps/ToolCallTest.kt | 2 +- .../beta/threads/runs/steps/ToolCallsStepDetailsTest.kt | 2 +- .../completions/ChatCompletionAllowedToolChoiceTest.kt | 2 +- .../chat/completions/ChatCompletionAllowedToolsTest.kt | 2 +- .../ChatCompletionAssistantMessageParamTest.kt | 2 +- .../chat/completions/ChatCompletionAudioParamTest.kt | 2 +- .../models/chat/completions/ChatCompletionAudioTest.kt | 2 +- .../models/chat/completions/ChatCompletionChunkTest.kt | 2 +- .../completions/ChatCompletionContentPartImageTest.kt | 2 +- .../ChatCompletionContentPartInputAudioTest.kt | 2 +- .../completions/ChatCompletionContentPartRefusalTest.kt | 2 +- .../chat/completions/ChatCompletionContentPartTest.kt | 2 +- .../chat/completions/ChatCompletionContentPartTextTest.kt | 2 +- .../chat/completions/ChatCompletionCreateParamsTest.kt | 2 +- .../chat/completions/ChatCompletionCustomToolTest.kt | 2 +- .../chat/completions/ChatCompletionDeleteParamsTest.kt | 2 +- .../models/chat/completions/ChatCompletionDeletedTest.kt | 2 +- .../ChatCompletionDeveloperMessageParamTest.kt | 2 +- .../completions/ChatCompletionFunctionCallOptionTest.kt | 2 +- .../completions/ChatCompletionFunctionMessageParamTest.kt | 2 +- .../chat/completions/ChatCompletionFunctionToolTest.kt | 2 +- .../completions/ChatCompletionListPageResponseTest.kt | 2 +- .../chat/completions/ChatCompletionListParamsTest.kt | 2 +- .../ChatCompletionMessageCustomToolCallTest.kt | 2 +- .../ChatCompletionMessageFunctionToolCallTest.kt | 2 +- .../chat/completions/ChatCompletionMessageParamTest.kt | 2 +- .../models/chat/completions/ChatCompletionMessageTest.kt | 2 +- .../chat/completions/ChatCompletionMessageToolCallTest.kt | 2 +- .../ChatCompletionNamedToolChoiceCustomTest.kt | 2 +- .../chat/completions/ChatCompletionNamedToolChoiceTest.kt | 2 +- .../completions/ChatCompletionPredictionContentTest.kt | 2 +- .../chat/completions/ChatCompletionRetrieveParamsTest.kt | 2 +- .../chat/completions/ChatCompletionStoreMessageTest.kt | 2 +- .../chat/completions/ChatCompletionStreamOptionsTest.kt | 2 +- .../completions/ChatCompletionSystemMessageParamTest.kt | 2 +- .../openai/models/chat/completions/ChatCompletionTest.kt | 2 +- .../chat/completions/ChatCompletionTokenLogprobTest.kt | 2 +- .../completions/ChatCompletionToolChoiceOptionTest.kt | 2 +- .../completions/ChatCompletionToolMessageParamTest.kt | 2 +- .../models/chat/completions/ChatCompletionToolTest.kt | 2 +- .../chat/completions/ChatCompletionUpdateParamsTest.kt | 2 +- .../completions/ChatCompletionUserMessageParamTest.kt | 2 +- .../completions/messages/MessageListPageResponseTest.kt | 2 +- .../chat/completions/messages/MessageListParamsTest.kt | 2 +- .../com/openai/models/completions/CompletionChoiceTest.kt | 2 +- .../models/completions/CompletionCreateParamsTest.kt | 2 +- .../com/openai/models/completions/CompletionTest.kt | 2 +- .../com/openai/models/completions/CompletionUsageTest.kt | 2 +- .../openai/models/containers/ContainerCreateParamsTest.kt | 2 +- .../models/containers/ContainerCreateResponseTest.kt | 2 +- .../openai/models/containers/ContainerDeleteParamsTest.kt | 2 +- .../models/containers/ContainerListPageResponseTest.kt | 2 +- .../openai/models/containers/ContainerListParamsTest.kt | 2 +- .../openai/models/containers/ContainerListResponseTest.kt | 2 +- .../models/containers/ContainerRetrieveParamsTest.kt | 2 +- .../models/containers/ContainerRetrieveResponseTest.kt | 2 +- .../models/containers/files/FileCreateParamsTest.kt | 2 +- .../models/containers/files/FileCreateResponseTest.kt | 2 +- .../models/containers/files/FileDeleteParamsTest.kt | 2 +- .../models/containers/files/FileListPageResponseTest.kt | 2 +- .../openai/models/containers/files/FileListParamsTest.kt | 2 +- .../models/containers/files/FileListResponseTest.kt | 2 +- .../models/containers/files/FileRetrieveParamsTest.kt | 2 +- .../models/containers/files/FileRetrieveResponseTest.kt | 2 +- .../containers/files/content/ContentRetrieveParamsTest.kt | 2 +- .../ContentProvenanceCheckCreateParamsTest.kt | 2 +- .../contentprovenancechecks/ContentProvenanceCheckTest.kt | 2 +- .../models/conversations/ComputerScreenshotContentTest.kt | 2 +- .../models/conversations/ConversationCreateParamsTest.kt | 2 +- .../models/conversations/ConversationDeleteParamsTest.kt | 2 +- .../conversations/ConversationDeletedResourceTest.kt | 2 +- .../models/conversations/ConversationDeletedTest.kt | 2 +- .../conversations/ConversationRetrieveParamsTest.kt | 2 +- .../com/openai/models/conversations/ConversationTest.kt | 2 +- .../models/conversations/ConversationUpdateParamsTest.kt | 2 +- .../kotlin/com/openai/models/conversations/MessageTest.kt | 2 +- .../openai/models/conversations/SummaryTextContentTest.kt | 2 +- .../com/openai/models/conversations/TextContentTest.kt | 2 +- .../conversations/items/ConversationItemListTest.kt | 2 +- .../models/conversations/items/ConversationItemTest.kt | 2 +- .../models/conversations/items/ItemCreateParamsTest.kt | 2 +- .../models/conversations/items/ItemDeleteParamsTest.kt | 2 +- .../models/conversations/items/ItemListParamsTest.kt | 2 +- .../models/conversations/items/ItemRetrieveParamsTest.kt | 2 +- .../models/embeddings/CreateEmbeddingResponseTest.kt | 2 +- .../openai/models/embeddings/EmbeddingCreateParamsTest.kt | 2 +- .../kotlin/com/openai/models/embeddings/EmbeddingTest.kt | 2 +- .../com/openai/models/evals/EvalCreateParamsTest.kt | 2 +- .../com/openai/models/evals/EvalCreateResponseTest.kt | 2 +- .../openai/models/evals/EvalCustomDataSourceConfigTest.kt | 2 +- .../com/openai/models/evals/EvalDeleteParamsTest.kt | 2 +- .../com/openai/models/evals/EvalDeleteResponseTest.kt | 2 +- .../com/openai/models/evals/EvalListPageResponseTest.kt | 2 +- .../kotlin/com/openai/models/evals/EvalListParamsTest.kt | 2 +- .../com/openai/models/evals/EvalListResponseTest.kt | 2 +- .../com/openai/models/evals/EvalRetrieveParamsTest.kt | 2 +- .../com/openai/models/evals/EvalRetrieveResponseTest.kt | 2 +- .../evals/EvalStoredCompletionsDataSourceConfigTest.kt | 2 +- .../com/openai/models/evals/EvalUpdateParamsTest.kt | 2 +- .../com/openai/models/evals/EvalUpdateResponseTest.kt | 2 +- .../evals/runs/CreateEvalCompletionsRunDataSourceTest.kt | 2 +- .../models/evals/runs/CreateEvalJsonlRunDataSourceTest.kt | 2 +- .../com/openai/models/evals/runs/EvalApiErrorTest.kt | 2 +- .../com/openai/models/evals/runs/RunCancelParamsTest.kt | 2 +- .../com/openai/models/evals/runs/RunCancelResponseTest.kt | 2 +- .../com/openai/models/evals/runs/RunCreateParamsTest.kt | 2 +- .../com/openai/models/evals/runs/RunCreateResponseTest.kt | 2 +- .../com/openai/models/evals/runs/RunDeleteParamsTest.kt | 2 +- .../com/openai/models/evals/runs/RunDeleteResponseTest.kt | 2 +- .../openai/models/evals/runs/RunListPageResponseTest.kt | 2 +- .../com/openai/models/evals/runs/RunListParamsTest.kt | 2 +- .../com/openai/models/evals/runs/RunListResponseTest.kt | 2 +- .../com/openai/models/evals/runs/RunRetrieveParamsTest.kt | 2 +- .../openai/models/evals/runs/RunRetrieveResponseTest.kt | 2 +- .../runs/outputitems/OutputItemListPageResponseTest.kt | 2 +- .../evals/runs/outputitems/OutputItemListParamsTest.kt | 2 +- .../evals/runs/outputitems/OutputItemListResponseTest.kt | 2 +- .../runs/outputitems/OutputItemRetrieveParamsTest.kt | 2 +- .../runs/outputitems/OutputItemRetrieveResponseTest.kt | 2 +- .../com/openai/models/files/FileContentParamsTest.kt | 2 +- .../com/openai/models/files/FileCreateParamsTest.kt | 2 +- .../com/openai/models/files/FileDeleteParamsTest.kt | 2 +- .../kotlin/com/openai/models/files/FileDeletedTest.kt | 2 +- .../com/openai/models/files/FileListPageResponseTest.kt | 2 +- .../kotlin/com/openai/models/files/FileListParamsTest.kt | 2 +- .../test/kotlin/com/openai/models/files/FileObjectTest.kt | 2 +- .../com/openai/models/files/FileRetrieveParamsTest.kt | 2 +- .../finetuning/alpha/graders/GraderRunParamsTest.kt | 2 +- .../finetuning/alpha/graders/GraderRunResponseTest.kt | 2 +- .../finetuning/alpha/graders/GraderValidateParamsTest.kt | 2 +- .../alpha/graders/GraderValidateResponseTest.kt | 2 +- .../permissions/PermissionCreatePageResponseTest.kt | 2 +- .../checkpoints/permissions/PermissionCreateParamsTest.kt | 2 +- .../permissions/PermissionCreateResponseTest.kt | 2 +- .../checkpoints/permissions/PermissionDeleteParamsTest.kt | 2 +- .../permissions/PermissionDeleteResponseTest.kt | 2 +- .../permissions/PermissionListPageResponseTest.kt | 2 +- .../checkpoints/permissions/PermissionListParamsTest.kt | 2 +- .../checkpoints/permissions/PermissionListResponseTest.kt | 2 +- .../permissions/PermissionRetrieveParamsTest.kt | 2 +- .../permissions/PermissionRetrieveResponseTest.kt | 2 +- .../models/finetuning/jobs/FineTuningJobEventTest.kt | 2 +- .../openai/models/finetuning/jobs/FineTuningJobTest.kt | 2 +- .../jobs/FineTuningJobWandbIntegrationObjectTest.kt | 2 +- .../finetuning/jobs/FineTuningJobWandbIntegrationTest.kt | 2 +- .../openai/models/finetuning/jobs/JobCancelParamsTest.kt | 2 +- .../openai/models/finetuning/jobs/JobCreateParamsTest.kt | 2 +- .../finetuning/jobs/JobListEventsPageResponseTest.kt | 2 +- .../models/finetuning/jobs/JobListEventsParamsTest.kt | 2 +- .../models/finetuning/jobs/JobListPageResponseTest.kt | 2 +- .../openai/models/finetuning/jobs/JobListParamsTest.kt | 2 +- .../openai/models/finetuning/jobs/JobPauseParamsTest.kt | 2 +- .../openai/models/finetuning/jobs/JobResumeParamsTest.kt | 2 +- .../models/finetuning/jobs/JobRetrieveParamsTest.kt | 2 +- .../jobs/checkpoints/CheckpointListPageResponseTest.kt | 2 +- .../jobs/checkpoints/CheckpointListParamsTest.kt | 2 +- .../jobs/checkpoints/FineTuningJobCheckpointTest.kt | 2 +- .../models/finetuning/methods/DpoHyperparametersTest.kt | 2 +- .../com/openai/models/finetuning/methods/DpoMethodTest.kt | 2 +- .../methods/ReinforcementHyperparametersTest.kt | 2 +- .../models/finetuning/methods/ReinforcementMethodTest.kt | 2 +- .../finetuning/methods/SupervisedHyperparametersTest.kt | 2 +- .../models/finetuning/methods/SupervisedMethodTest.kt | 2 +- .../models/graders/gradermodels/EvalContentItemTest.kt | 2 +- .../models/graders/gradermodels/LabelModelGraderTest.kt | 2 +- .../openai/models/graders/gradermodels/MultiGraderTest.kt | 2 +- .../models/graders/gradermodels/PythonGraderTest.kt | 2 +- .../models/graders/gradermodels/ScoreModelGraderTest.kt | 2 +- .../models/graders/gradermodels/StringCheckGraderTest.kt | 2 +- .../graders/gradermodels/TextSimilarityGraderTest.kt | 2 +- .../models/images/ImageCreateVariationParamsTest.kt | 2 +- .../openai/models/images/ImageEditCompletedEventTest.kt | 2 +- .../com/openai/models/images/ImageEditParamsTest.kt | 2 +- .../models/images/ImageEditPartialImageEventTest.kt | 2 +- .../com/openai/models/images/ImageEditStreamEventTest.kt | 2 +- .../openai/models/images/ImageGenCompletedEventTest.kt | 2 +- .../openai/models/images/ImageGenPartialImageEventTest.kt | 2 +- .../com/openai/models/images/ImageGenStreamEventTest.kt | 2 +- .../com/openai/models/images/ImageGenerateParamsTest.kt | 2 +- .../src/test/kotlin/com/openai/models/images/ImageTest.kt | 2 +- .../kotlin/com/openai/models/images/ImagesResponseTest.kt | 2 +- .../com/openai/models/models/ModelDeleteParamsTest.kt | 2 +- .../kotlin/com/openai/models/models/ModelDeletedTest.kt | 2 +- .../com/openai/models/models/ModelListPageResponseTest.kt | 2 +- .../com/openai/models/models/ModelListParamsTest.kt | 2 +- .../com/openai/models/models/ModelRetrieveParamsTest.kt | 2 +- .../src/test/kotlin/com/openai/models/models/ModelTest.kt | 2 +- .../models/moderations/ModerationCreateParamsTest.kt | 2 +- .../models/moderations/ModerationCreateResponseTest.kt | 2 +- .../models/moderations/ModerationImageUrlInputTest.kt | 2 +- .../models/moderations/ModerationMultiModalInputTest.kt | 2 +- .../com/openai/models/moderations/ModerationTest.kt | 2 +- .../openai/models/moderations/ModerationTextInputTest.kt | 2 +- .../com/openai/models/realtime/AudioTranscriptionTest.kt | 2 +- .../models/realtime/ConversationCreatedEventTest.kt | 2 +- .../openai/models/realtime/ConversationItemAddedTest.kt | 2 +- .../models/realtime/ConversationItemCreateEventTest.kt | 2 +- .../models/realtime/ConversationItemCreatedEventTest.kt | 2 +- .../models/realtime/ConversationItemDeleteEventTest.kt | 2 +- .../models/realtime/ConversationItemDeletedEventTest.kt | 2 +- .../openai/models/realtime/ConversationItemDoneTest.kt | 2 +- ...sationItemInputAudioTranscriptionCompletedEventTest.kt | 2 +- ...nversationItemInputAudioTranscriptionDeltaEventTest.kt | 2 +- ...versationItemInputAudioTranscriptionFailedEventTest.kt | 2 +- .../ConversationItemInputAudioTranscriptionSegmentTest.kt | 2 +- .../models/realtime/ConversationItemRetrieveEventTest.kt | 2 +- .../com/openai/models/realtime/ConversationItemTest.kt | 2 +- .../models/realtime/ConversationItemTruncateEventTest.kt | 2 +- .../models/realtime/ConversationItemTruncatedEventTest.kt | 2 +- .../models/realtime/ConversationItemWithReferenceTest.kt | 2 +- .../models/realtime/InputAudioBufferAppendEventTest.kt | 2 +- .../models/realtime/InputAudioBufferClearEventTest.kt | 2 +- .../models/realtime/InputAudioBufferClearedEventTest.kt | 2 +- .../models/realtime/InputAudioBufferCommitEventTest.kt | 2 +- .../models/realtime/InputAudioBufferCommittedEventTest.kt | 2 +- .../InputAudioBufferDtmfEventReceivedEventTest.kt | 2 +- .../realtime/InputAudioBufferSpeechStartedEventTest.kt | 2 +- .../realtime/InputAudioBufferSpeechStoppedEventTest.kt | 2 +- .../realtime/InputAudioBufferTimeoutTriggeredTest.kt | 2 +- .../com/openai/models/realtime/LogProbPropertiesTest.kt | 2 +- .../openai/models/realtime/McpListToolsCompletedTest.kt | 2 +- .../com/openai/models/realtime/McpListToolsFailedTest.kt | 2 +- .../openai/models/realtime/McpListToolsInProgressTest.kt | 2 +- .../models/realtime/OutputAudioBufferClearEventTest.kt | 2 +- .../openai/models/realtime/RateLimitsUpdatedEventTest.kt | 2 +- .../models/realtime/RealtimeAudioConfigInputTest.kt | 2 +- .../models/realtime/RealtimeAudioConfigOutputTest.kt | 2 +- .../com/openai/models/realtime/RealtimeAudioConfigTest.kt | 2 +- .../openai/models/realtime/RealtimeAudioFormatsTest.kt | 2 +- .../realtime/RealtimeAudioInputTurnDetectionTest.kt | 2 +- .../com/openai/models/realtime/RealtimeClientEventTest.kt | 2 +- .../RealtimeConversationItemAssistantMessageTest.kt | 2 +- .../RealtimeConversationItemFunctionCallOutputTest.kt | 2 +- .../realtime/RealtimeConversationItemFunctionCallTest.kt | 2 +- .../realtime/RealtimeConversationItemSystemMessageTest.kt | 2 +- .../realtime/RealtimeConversationItemUserMessageTest.kt | 2 +- .../com/openai/models/realtime/RealtimeErrorEventTest.kt | 2 +- .../com/openai/models/realtime/RealtimeErrorTest.kt | 2 +- .../openai/models/realtime/RealtimeFunctionToolTest.kt | 2 +- .../models/realtime/RealtimeMcpApprovalRequestTest.kt | 2 +- .../models/realtime/RealtimeMcpApprovalResponseTest.kt | 2 +- .../openai/models/realtime/RealtimeMcpListToolsTest.kt | 2 +- .../models/realtime/RealtimeMcpProtocolErrorTest.kt | 2 +- .../com/openai/models/realtime/RealtimeMcpToolCallTest.kt | 2 +- .../models/realtime/RealtimeMcpToolExecutionErrorTest.kt | 2 +- .../openai/models/realtime/RealtimeMcphttpErrorTest.kt | 2 +- .../com/openai/models/realtime/RealtimeReasoningTest.kt | 2 +- .../realtime/RealtimeResponseCreateAudioOutputTest.kt | 2 +- .../models/realtime/RealtimeResponseCreateMcpToolTest.kt | 2 +- .../models/realtime/RealtimeResponseCreateParamsTest.kt | 2 +- .../openai/models/realtime/RealtimeResponseStatusTest.kt | 2 +- .../com/openai/models/realtime/RealtimeResponseTest.kt | 2 +- .../RealtimeResponseUsageInputTokenDetailsTest.kt | 2 +- .../RealtimeResponseUsageOutputTokenDetailsTest.kt | 2 +- .../openai/models/realtime/RealtimeResponseUsageTest.kt | 2 +- .../com/openai/models/realtime/RealtimeServerEventTest.kt | 2 +- .../models/realtime/RealtimeSessionCreateRequestTest.kt | 2 +- .../com/openai/models/realtime/RealtimeSessionTest.kt | 2 +- .../models/realtime/RealtimeToolChoiceConfigTest.kt | 2 +- .../models/realtime/RealtimeToolsConfigUnionTest.kt | 2 +- .../openai/models/realtime/RealtimeTracingConfigTest.kt | 2 +- .../RealtimeTranscriptionSessionAudioInputTest.kt | 2 +- ...timeTranscriptionSessionAudioInputTurnDetectionTest.kt | 2 +- .../realtime/RealtimeTranscriptionSessionAudioTest.kt | 2 +- .../RealtimeTranscriptionSessionCreateRequestTest.kt | 2 +- .../models/realtime/RealtimeTranslationClientEventTest.kt | 2 +- .../RealtimeTranslationClientSecretCreateRequestTest.kt | 2 +- .../RealtimeTranslationClientSecretCreateResponseTest.kt | 2 +- .../RealtimeTranslationInputAudioBufferAppendEventTest.kt | 2 +- .../RealtimeTranslationInputTranscriptDeltaEventTest.kt | 2 +- .../RealtimeTranslationOutputAudioDeltaEventTest.kt | 2 +- .../RealtimeTranslationOutputTranscriptDeltaEventTest.kt | 2 +- .../models/realtime/RealtimeTranslationServerEventTest.kt | 2 +- .../realtime/RealtimeTranslationSessionCloseEventTest.kt | 2 +- .../realtime/RealtimeTranslationSessionClosedEventTest.kt | 2 +- .../RealtimeTranslationSessionCreateRequestTest.kt | 2 +- .../RealtimeTranslationSessionCreatedEventTest.kt | 2 +- .../models/realtime/RealtimeTranslationSessionTest.kt | 2 +- .../realtime/RealtimeTranslationSessionUpdateEventTest.kt | 2 +- .../RealtimeTranslationSessionUpdateRequestTest.kt | 2 +- .../RealtimeTranslationSessionUpdatedEventTest.kt | 2 +- .../realtime/RealtimeTruncationRetentionRatioTest.kt | 2 +- .../com/openai/models/realtime/RealtimeTruncationTest.kt | 2 +- .../openai/models/realtime/ResponseAudioDeltaEventTest.kt | 2 +- .../openai/models/realtime/ResponseAudioDoneEventTest.kt | 2 +- .../realtime/ResponseAudioTranscriptDeltaEventTest.kt | 2 +- .../realtime/ResponseAudioTranscriptDoneEventTest.kt | 2 +- .../com/openai/models/realtime/ResponseCancelEventTest.kt | 2 +- .../models/realtime/ResponseContentPartAddedEventTest.kt | 2 +- .../models/realtime/ResponseContentPartDoneEventTest.kt | 2 +- .../com/openai/models/realtime/ResponseCreateEventTest.kt | 2 +- .../openai/models/realtime/ResponseCreatedEventTest.kt | 2 +- .../com/openai/models/realtime/ResponseDoneEventTest.kt | 2 +- .../ResponseFunctionCallArgumentsDeltaEventTest.kt | 2 +- .../ResponseFunctionCallArgumentsDoneEventTest.kt | 2 +- .../models/realtime/ResponseMcpCallArgumentsDeltaTest.kt | 2 +- .../models/realtime/ResponseMcpCallArgumentsDoneTest.kt | 2 +- .../models/realtime/ResponseMcpCallCompletedTest.kt | 2 +- .../openai/models/realtime/ResponseMcpCallFailedTest.kt | 2 +- .../models/realtime/ResponseMcpCallInProgressTest.kt | 2 +- .../models/realtime/ResponseOutputItemAddedEventTest.kt | 2 +- .../models/realtime/ResponseOutputItemDoneEventTest.kt | 2 +- .../openai/models/realtime/ResponseTextDeltaEventTest.kt | 2 +- .../openai/models/realtime/ResponseTextDoneEventTest.kt | 2 +- .../com/openai/models/realtime/SessionCreatedEventTest.kt | 2 +- .../com/openai/models/realtime/SessionUpdateEventTest.kt | 2 +- .../com/openai/models/realtime/SessionUpdatedEventTest.kt | 2 +- .../models/realtime/TranscriptionSessionUpdateTest.kt | 2 +- .../realtime/TranscriptionSessionUpdatedEventTest.kt | 2 +- .../openai/models/realtime/calls/CallAcceptParamsTest.kt | 2 +- .../openai/models/realtime/calls/CallHangupParamsTest.kt | 2 +- .../openai/models/realtime/calls/CallReferParamsTest.kt | 2 +- .../openai/models/realtime/calls/CallRejectParamsTest.kt | 2 +- .../clientsecrets/ClientSecretCreateParamsTest.kt | 2 +- .../clientsecrets/ClientSecretCreateResponseTest.kt | 2 +- .../clientsecrets/RealtimeSessionCreateResponseTest.kt | 2 +- .../RealtimeTranscriptionSessionCreateResponseTest.kt | 2 +- .../RealtimeTranscriptionSessionTurnDetectionTest.kt | 2 +- .../com/openai/models/responses/ApplyPatchToolTest.kt | 2 +- .../com/openai/models/responses/CompactedResponseTest.kt | 2 +- .../com/openai/models/responses/ComputerActionTest.kt | 2 +- .../com/openai/models/responses/ComputerToolTest.kt | 2 +- .../openai/models/responses/ComputerUsePreviewToolTest.kt | 2 +- .../com/openai/models/responses/ContainerAutoTest.kt | 2 +- .../responses/ContainerNetworkPolicyAllowlistTest.kt | 2 +- .../responses/ContainerNetworkPolicyDisabledTest.kt | 2 +- .../responses/ContainerNetworkPolicyDomainSecretTest.kt | 2 +- .../com/openai/models/responses/ContainerReferenceTest.kt | 2 +- .../kotlin/com/openai/models/responses/CustomToolTest.kt | 2 +- .../com/openai/models/responses/EasyInputMessageTest.kt | 2 +- .../com/openai/models/responses/FileSearchToolTest.kt | 2 +- .../com/openai/models/responses/FunctionShellToolTest.kt | 2 +- .../com/openai/models/responses/FunctionToolTest.kt | 2 +- .../com/openai/models/responses/InlineSkillSourceTest.kt | 2 +- .../kotlin/com/openai/models/responses/InlineSkillTest.kt | 2 +- .../com/openai/models/responses/LocalEnvironmentTest.kt | 2 +- .../kotlin/com/openai/models/responses/LocalSkillTest.kt | 2 +- .../com/openai/models/responses/NamespaceToolTest.kt | 8 ++++---- .../responses/ResponseApplyPatchToolCallOutputTest.kt | 2 +- .../models/responses/ResponseApplyPatchToolCallTest.kt | 2 +- .../models/responses/ResponseAudioDeltaEventTest.kt | 2 +- .../openai/models/responses/ResponseAudioDoneEventTest.kt | 2 +- .../responses/ResponseAudioTranscriptDeltaEventTest.kt | 2 +- .../responses/ResponseAudioTranscriptDoneEventTest.kt | 2 +- .../openai/models/responses/ResponseCancelParamsTest.kt | 2 +- .../ResponseCodeInterpreterCallCodeDeltaEventTest.kt | 2 +- .../ResponseCodeInterpreterCallCodeDoneEventTest.kt | 2 +- .../ResponseCodeInterpreterCallCompletedEventTest.kt | 2 +- .../ResponseCodeInterpreterCallInProgressEventTest.kt | 2 +- .../ResponseCodeInterpreterCallInterpretingEventTest.kt | 2 +- .../responses/ResponseCodeInterpreterToolCallTest.kt | 2 +- .../openai/models/responses/ResponseCompactParamsTest.kt | 2 +- .../models/responses/ResponseCompactionItemParamTest.kt | 2 +- .../openai/models/responses/ResponseCompactionItemTest.kt | 2 +- .../openai/models/responses/ResponseCompletedEventTest.kt | 2 +- .../responses/ResponseComputerToolCallOutputItemTest.kt | 2 +- .../ResponseComputerToolCallOutputScreenshotTest.kt | 2 +- .../models/responses/ResponseComputerToolCallTest.kt | 2 +- .../models/responses/ResponseContainerReferenceTest.kt | 2 +- .../models/responses/ResponseContentPartAddedEventTest.kt | 2 +- .../models/responses/ResponseContentPartDoneEventTest.kt | 2 +- .../com/openai/models/responses/ResponseContentTest.kt | 2 +- .../models/responses/ResponseConversationParamTest.kt | 2 +- .../openai/models/responses/ResponseCreateParamsTest.kt | 2 +- .../openai/models/responses/ResponseCreatedEventTest.kt | 2 +- .../ResponseCustomToolCallInputDeltaEventTest.kt | 2 +- .../responses/ResponseCustomToolCallInputDoneEventTest.kt | 2 +- .../models/responses/ResponseCustomToolCallItemTest.kt | 2 +- .../responses/ResponseCustomToolCallOutputItemTest.kt | 2 +- .../models/responses/ResponseCustomToolCallOutputTest.kt | 2 +- .../openai/models/responses/ResponseCustomToolCallTest.kt | 2 +- .../openai/models/responses/ResponseDeleteParamsTest.kt | 2 +- .../com/openai/models/responses/ResponseErrorEventTest.kt | 2 +- .../com/openai/models/responses/ResponseErrorTest.kt | 2 +- .../openai/models/responses/ResponseFailedEventTest.kt | 2 +- .../responses/ResponseFileSearchCallCompletedEventTest.kt | 2 +- .../ResponseFileSearchCallInProgressEventTest.kt | 2 +- .../responses/ResponseFileSearchCallSearchingEventTest.kt | 2 +- .../models/responses/ResponseFileSearchToolCallTest.kt | 2 +- .../models/responses/ResponseFormatTextConfigTest.kt | 2 +- .../responses/ResponseFormatTextJsonSchemaConfigTest.kt | 2 +- .../ResponseFunctionCallArgumentsDeltaEventTest.kt | 2 +- .../ResponseFunctionCallArgumentsDoneEventTest.kt | 2 +- .../responses/ResponseFunctionCallOutputItemTest.kt | 2 +- .../ResponseFunctionShellCallOutputContentTest.kt | 2 +- .../responses/ResponseFunctionShellToolCallOutputTest.kt | 2 +- .../models/responses/ResponseFunctionShellToolCallTest.kt | 2 +- .../models/responses/ResponseFunctionToolCallItemTest.kt | 2 +- .../responses/ResponseFunctionToolCallOutputItemTest.kt | 2 +- .../models/responses/ResponseFunctionToolCallTest.kt | 2 +- .../models/responses/ResponseFunctionWebSearchTest.kt | 2 +- .../responses/ResponseImageGenCallCompletedEventTest.kt | 2 +- .../responses/ResponseImageGenCallGeneratingEventTest.kt | 2 +- .../responses/ResponseImageGenCallInProgressEventTest.kt | 2 +- .../ResponseImageGenCallPartialImageEventTest.kt | 2 +- .../models/responses/ResponseInProgressEventTest.kt | 2 +- .../models/responses/ResponseIncompleteEventTest.kt | 2 +- .../com/openai/models/responses/ResponseInputAudioTest.kt | 2 +- .../openai/models/responses/ResponseInputContentTest.kt | 2 +- .../models/responses/ResponseInputFileContentTest.kt | 2 +- .../com/openai/models/responses/ResponseInputFileTest.kt | 2 +- .../models/responses/ResponseInputImageContentTest.kt | 2 +- .../com/openai/models/responses/ResponseInputImageTest.kt | 2 +- .../com/openai/models/responses/ResponseInputItemTest.kt | 2 +- .../models/responses/ResponseInputMessageItemTest.kt | 2 +- .../models/responses/ResponseInputTextContentTest.kt | 2 +- .../com/openai/models/responses/ResponseInputTextTest.kt | 2 +- .../com/openai/models/responses/ResponseItemTest.kt | 2 +- .../models/responses/ResponseLocalEnvironmentTest.kt | 2 +- .../responses/ResponseMcpCallArgumentsDeltaEventTest.kt | 2 +- .../responses/ResponseMcpCallArgumentsDoneEventTest.kt | 2 +- .../models/responses/ResponseMcpCallCompletedEventTest.kt | 2 +- .../models/responses/ResponseMcpCallFailedEventTest.kt | 2 +- .../responses/ResponseMcpCallInProgressEventTest.kt | 2 +- .../responses/ResponseMcpListToolsCompletedEventTest.kt | 2 +- .../responses/ResponseMcpListToolsFailedEventTest.kt | 2 +- .../responses/ResponseMcpListToolsInProgressEventTest.kt | 2 +- .../openai/models/responses/ResponseOutputAudioTest.kt | 2 +- .../models/responses/ResponseOutputItemAddedEventTest.kt | 2 +- .../models/responses/ResponseOutputItemDoneEventTest.kt | 2 +- .../com/openai/models/responses/ResponseOutputItemTest.kt | 2 +- .../openai/models/responses/ResponseOutputMessageTest.kt | 2 +- .../openai/models/responses/ResponseOutputRefusalTest.kt | 2 +- .../ResponseOutputTextAnnotationAddedEventTest.kt | 2 +- .../com/openai/models/responses/ResponseOutputTextTest.kt | 2 +- .../com/openai/models/responses/ResponsePromptTest.kt | 2 +- .../openai/models/responses/ResponseQueuedEventTest.kt | 2 +- .../openai/models/responses/ResponseReasoningItemTest.kt | 2 +- .../ResponseReasoningSummaryPartAddedEventTest.kt | 2 +- .../ResponseReasoningSummaryPartDoneEventTest.kt | 2 +- .../ResponseReasoningSummaryTextDeltaEventTest.kt | 2 +- .../ResponseReasoningSummaryTextDoneEventTest.kt | 2 +- .../responses/ResponseReasoningTextDeltaEventTest.kt | 2 +- .../responses/ResponseReasoningTextDoneEventTest.kt | 2 +- .../models/responses/ResponseRefusalDeltaEventTest.kt | 2 +- .../models/responses/ResponseRefusalDoneEventTest.kt | 2 +- .../openai/models/responses/ResponseRetrieveParamsTest.kt | 2 +- .../openai/models/responses/ResponseStreamEventTest.kt | 2 +- .../kotlin/com/openai/models/responses/ResponseTest.kt | 2 +- .../com/openai/models/responses/ResponseTextConfigTest.kt | 2 +- .../openai/models/responses/ResponseTextDeltaEventTest.kt | 2 +- .../openai/models/responses/ResponseTextDoneEventTest.kt | 2 +- .../openai/models/responses/ResponseToolSearchCallTest.kt | 2 +- .../responses/ResponseToolSearchOutputItemParamTest.kt | 2 +- .../models/responses/ResponseToolSearchOutputItemTest.kt | 2 +- .../com/openai/models/responses/ResponseUsageTest.kt | 2 +- .../responses/ResponseWebSearchCallCompletedEventTest.kt | 2 +- .../responses/ResponseWebSearchCallInProgressEventTest.kt | 2 +- .../responses/ResponseWebSearchCallSearchingEventTest.kt | 2 +- .../openai/models/responses/ResponsesClientEventTest.kt | 2 +- .../openai/models/responses/ResponsesServerEventTest.kt | 2 +- .../com/openai/models/responses/SkillReferenceTest.kt | 2 +- .../com/openai/models/responses/ToolChoiceAllowedTest.kt | 2 +- .../openai/models/responses/ToolChoiceApplyPatchTest.kt | 2 +- .../com/openai/models/responses/ToolChoiceCustomTest.kt | 2 +- .../com/openai/models/responses/ToolChoiceFunctionTest.kt | 2 +- .../com/openai/models/responses/ToolChoiceMcpTest.kt | 2 +- .../com/openai/models/responses/ToolChoiceShellTest.kt | 2 +- .../com/openai/models/responses/ToolChoiceTypesTest.kt | 2 +- .../com/openai/models/responses/ToolSearchToolTest.kt | 2 +- .../test/kotlin/com/openai/models/responses/ToolTest.kt | 6 +++--- .../openai/models/responses/WebSearchPreviewToolTest.kt | 2 +- .../com/openai/models/responses/WebSearchToolTest.kt | 2 +- .../responses/inputitems/InputItemListParamsTest.kt | 2 +- .../models/responses/inputitems/ResponseItemListTest.kt | 2 +- .../responses/inputtokens/InputTokenCountParamsTest.kt | 2 +- .../responses/inputtokens/InputTokenCountResponseTest.kt | 2 +- .../kotlin/com/openai/models/skills/DeletedSkillTest.kt | 2 +- .../com/openai/models/skills/SkillCreateParamsTest.kt | 2 +- .../com/openai/models/skills/SkillDeleteParamsTest.kt | 2 +- .../com/openai/models/skills/SkillListParamsTest.kt | 2 +- .../test/kotlin/com/openai/models/skills/SkillListTest.kt | 2 +- .../com/openai/models/skills/SkillRetrieveParamsTest.kt | 2 +- .../src/test/kotlin/com/openai/models/skills/SkillTest.kt | 2 +- .../com/openai/models/skills/SkillUpdateParamsTest.kt | 2 +- .../models/skills/content/ContentRetrieveParamsTest.kt | 2 +- .../models/skills/versions/DeletedSkillVersionTest.kt | 2 +- .../openai/models/skills/versions/SkillVersionListTest.kt | 2 +- .../com/openai/models/skills/versions/SkillVersionTest.kt | 2 +- .../models/skills/versions/VersionCreateParamsTest.kt | 2 +- .../models/skills/versions/VersionDeleteParamsTest.kt | 2 +- .../models/skills/versions/VersionListParamsTest.kt | 2 +- .../models/skills/versions/VersionRetrieveParamsTest.kt | 2 +- .../skills/versions/content/ContentRetrieveParamsTest.kt | 2 +- .../com/openai/models/uploads/UploadCancelParamsTest.kt | 2 +- .../com/openai/models/uploads/UploadCompleteParamsTest.kt | 2 +- .../com/openai/models/uploads/UploadCreateParamsTest.kt | 2 +- .../test/kotlin/com/openai/models/uploads/UploadTest.kt | 2 +- .../openai/models/uploads/parts/PartCreateParamsTest.kt | 2 +- .../com/openai/models/uploads/parts/UploadPartTest.kt | 2 +- .../vectorstores/AutoFileChunkingStrategyParamTest.kt | 2 +- .../models/vectorstores/FileChunkingStrategyParamTest.kt | 2 +- .../models/vectorstores/FileChunkingStrategyTest.kt | 2 +- .../vectorstores/OtherFileChunkingStrategyObjectTest.kt | 2 +- .../StaticFileChunkingStrategyObjectParamTest.kt | 2 +- .../vectorstores/StaticFileChunkingStrategyObjectTest.kt | 2 +- .../models/vectorstores/StaticFileChunkingStrategyTest.kt | 2 +- .../models/vectorstores/VectorStoreCreateParamsTest.kt | 2 +- .../models/vectorstores/VectorStoreDeleteParamsTest.kt | 2 +- .../openai/models/vectorstores/VectorStoreDeletedTest.kt | 2 +- .../vectorstores/VectorStoreListPageResponseTest.kt | 2 +- .../models/vectorstores/VectorStoreListParamsTest.kt | 2 +- .../models/vectorstores/VectorStoreRetrieveParamsTest.kt | 2 +- .../vectorstores/VectorStoreSearchPageResponseTest.kt | 2 +- .../models/vectorstores/VectorStoreSearchParamsTest.kt | 2 +- .../models/vectorstores/VectorStoreSearchResponseTest.kt | 2 +- .../com/openai/models/vectorstores/VectorStoreTest.kt | 2 +- .../models/vectorstores/VectorStoreUpdateParamsTest.kt | 2 +- .../vectorstores/filebatches/FileBatchCancelParamsTest.kt | 2 +- .../vectorstores/filebatches/FileBatchCreateParamsTest.kt | 2 +- .../filebatches/FileBatchListFilesPageResponseTest.kt | 2 +- .../filebatches/FileBatchListFilesParamsTest.kt | 2 +- .../filebatches/FileBatchRetrieveParamsTest.kt | 2 +- .../vectorstores/filebatches/VectorStoreFileBatchTest.kt | 2 +- .../vectorstores/files/FileContentPageResponseTest.kt | 2 +- .../models/vectorstores/files/FileContentParamsTest.kt | 2 +- .../models/vectorstores/files/FileContentResponseTest.kt | 2 +- .../models/vectorstores/files/FileCreateParamsTest.kt | 2 +- .../models/vectorstores/files/FileDeleteParamsTest.kt | 2 +- .../models/vectorstores/files/FileListPageResponseTest.kt | 2 +- .../models/vectorstores/files/FileListParamsTest.kt | 2 +- .../models/vectorstores/files/FileRetrieveParamsTest.kt | 2 +- .../models/vectorstores/files/FileUpdateParamsTest.kt | 2 +- .../vectorstores/files/VectorStoreFileDeletedTest.kt | 2 +- .../models/vectorstores/files/VectorStoreFileTest.kt | 2 +- .../openai/models/videos/ImageInputReferenceParamTest.kt | 2 +- .../models/videos/VideoCreateCharacterParamsTest.kt | 2 +- .../models/videos/VideoCreateCharacterResponseTest.kt | 2 +- .../com/openai/models/videos/VideoCreateErrorTest.kt | 2 +- .../com/openai/models/videos/VideoCreateParamsTest.kt | 2 +- .../com/openai/models/videos/VideoDeleteParamsTest.kt | 2 +- .../com/openai/models/videos/VideoDeleteResponseTest.kt | 2 +- .../models/videos/VideoDownloadContentParamsTest.kt | 2 +- .../com/openai/models/videos/VideoEditParamsTest.kt | 2 +- .../com/openai/models/videos/VideoExtendParamsTest.kt | 2 +- .../openai/models/videos/VideoGetCharacterParamsTest.kt | 2 +- .../openai/models/videos/VideoGetCharacterResponseTest.kt | 2 +- .../com/openai/models/videos/VideoListPageResponseTest.kt | 2 +- .../com/openai/models/videos/VideoListParamsTest.kt | 2 +- .../com/openai/models/videos/VideoRemixParamsTest.kt | 2 +- .../com/openai/models/videos/VideoRetrieveParamsTest.kt | 2 +- .../src/test/kotlin/com/openai/models/videos/VideoTest.kt | 2 +- .../models/webhooks/BatchCancelledWebhookEventTest.kt | 2 +- .../models/webhooks/BatchCompletedWebhookEventTest.kt | 2 +- .../models/webhooks/BatchExpiredWebhookEventTest.kt | 2 +- .../openai/models/webhooks/BatchFailedWebhookEventTest.kt | 2 +- .../models/webhooks/EvalRunCanceledWebhookEventTest.kt | 2 +- .../models/webhooks/EvalRunFailedWebhookEventTest.kt | 2 +- .../models/webhooks/EvalRunSucceededWebhookEventTest.kt | 2 +- .../webhooks/FineTuningJobCancelledWebhookEventTest.kt | 2 +- .../webhooks/FineTuningJobFailedWebhookEventTest.kt | 2 +- .../webhooks/FineTuningJobSucceededWebhookEventTest.kt | 2 +- .../models/webhooks/LiveCallIncomingWebhookEventTest.kt | 2 +- .../webhooks/RealtimeCallIncomingWebhookEventTest.kt | 2 +- .../models/webhooks/ResponseCancelledWebhookEventTest.kt | 2 +- .../models/webhooks/ResponseCompletedWebhookEventTest.kt | 2 +- .../models/webhooks/ResponseFailedWebhookEventTest.kt | 2 +- .../models/webhooks/ResponseIncompleteWebhookEventTest.kt | 2 +- .../com/openai/models/webhooks/UnwrapWebhookEventTest.kt | 2 +- .../test/kotlin/com/openai/services/ServiceParamsTest.kt | 2 +- .../com/openai/services/async/BatchServiceAsyncTest.kt | 2 +- .../openai/services/async/CompletionServiceAsyncTest.kt | 2 +- .../openai/services/async/ContainerServiceAsyncTest.kt | 2 +- .../async/ContentProvenanceCheckServiceAsyncTest.kt | 2 +- .../openai/services/async/ConversationServiceAsyncTest.kt | 2 +- .../openai/services/async/EmbeddingServiceAsyncTest.kt | 2 +- .../com/openai/services/async/EvalServiceAsyncTest.kt | 2 +- .../com/openai/services/async/FileServiceAsyncTest.kt | 2 +- .../com/openai/services/async/ImageServiceAsyncTest.kt | 2 +- .../com/openai/services/async/ModelServiceAsyncTest.kt | 2 +- .../openai/services/async/ModerationServiceAsyncTest.kt | 2 +- .../com/openai/services/async/ResponseServiceAsyncTest.kt | 2 +- .../com/openai/services/async/SkillServiceAsyncTest.kt | 2 +- .../com/openai/services/async/UploadServiceAsyncTest.kt | 2 +- .../openai/services/async/VectorStoreServiceAsyncTest.kt | 2 +- .../com/openai/services/async/VideoServiceAsyncTest.kt | 2 +- .../com/openai/services/async/WebhookServiceAsyncTest.kt | 2 +- .../admin/organization/AdminApiKeyServiceAsyncTest.kt | 2 +- .../async/admin/organization/AuditLogServiceAsyncTest.kt | 2 +- .../admin/organization/CertificateServiceAsyncTest.kt | 2 +- .../admin/organization/DataRetentionServiceAsyncTest.kt | 2 +- .../async/admin/organization/GroupServiceAsyncTest.kt | 2 +- .../async/admin/organization/InviteServiceAsyncTest.kt | 2 +- .../async/admin/organization/ProjectServiceAsyncTest.kt | 2 +- .../async/admin/organization/RoleServiceAsyncTest.kt | 2 +- .../admin/organization/SpendAlertServiceAsyncTest.kt | 2 +- .../admin/organization/SpendLimitServiceAsyncTest.kt | 2 +- .../async/admin/organization/UsageServiceAsyncTest.kt | 2 +- .../async/admin/organization/UserServiceAsyncTest.kt | 2 +- .../admin/organization/groups/RoleServiceAsyncTest.kt | 2 +- .../admin/organization/groups/UserServiceAsyncTest.kt | 2 +- .../admin/organization/projects/ApiKeyServiceAsyncTest.kt | 2 +- .../organization/projects/CertificateServiceAsyncTest.kt | 2 +- .../projects/DataRetentionServiceAsyncTest.kt | 2 +- .../admin/organization/projects/GroupServiceAsyncTest.kt | 2 +- .../projects/HostedToolPermissionServiceAsyncTest.kt | 2 +- .../projects/ModelPermissionServiceAsyncTest.kt | 2 +- .../organization/projects/RateLimitServiceAsyncTest.kt | 2 +- .../admin/organization/projects/RoleServiceAsyncTest.kt | 2 +- .../projects/ServiceAccountServiceAsyncTest.kt | 2 +- .../organization/projects/SpendAlertServiceAsyncTest.kt | 2 +- .../organization/projects/SpendLimitServiceAsyncTest.kt | 2 +- .../admin/organization/projects/UserServiceAsyncTest.kt | 2 +- .../organization/projects/groups/RoleServiceAsyncTest.kt | 2 +- .../projects/serviceaccounts/ApiKeyServiceAsyncTest.kt | 2 +- .../organization/projects/users/RoleServiceAsyncTest.kt | 2 +- .../admin/organization/users/RoleServiceAsyncTest.kt | 2 +- .../openai/services/async/audio/SpeechServiceAsyncTest.kt | 2 +- .../services/async/audio/TranscriptionServiceAsyncTest.kt | 2 +- .../services/async/audio/TranslationServiceAsyncTest.kt | 2 +- .../services/async/beta/AssistantServiceAsyncTest.kt | 2 +- .../services/async/beta/ResponseServiceAsyncTest.kt | 2 +- .../openai/services/async/beta/ThreadServiceAsyncTest.kt | 2 +- .../async/beta/chatkit/SessionServiceAsyncTest.kt | 2 +- .../services/async/beta/chatkit/ThreadServiceAsyncTest.kt | 2 +- .../async/beta/responses/InputItemServiceAsyncTest.kt | 2 +- .../async/beta/responses/InputTokenServiceAsyncTest.kt | 2 +- .../async/beta/threads/MessageServiceAsyncTest.kt | 2 +- .../services/async/beta/threads/RunServiceAsyncTest.kt | 2 +- .../async/beta/threads/runs/StepServiceAsyncTest.kt | 2 +- .../services/async/chat/ChatCompletionServiceAsyncTest.kt | 2 +- .../async/chat/completions/MessageServiceAsyncTest.kt | 2 +- .../services/async/containers/FileServiceAsyncTest.kt | 2 +- .../async/containers/files/ContentServiceAsyncTest.kt | 2 +- .../services/async/conversations/ItemServiceAsyncTest.kt | 2 +- .../openai/services/async/evals/RunServiceAsyncTest.kt | 2 +- .../async/evals/runs/OutputItemServiceAsyncTest.kt | 2 +- .../services/async/finetuning/JobServiceAsyncTest.kt | 2 +- .../async/finetuning/alpha/GraderServiceAsyncTest.kt | 2 +- .../finetuning/checkpoints/PermissionServiceAsyncTest.kt | 2 +- .../async/finetuning/jobs/CheckpointServiceAsyncTest.kt | 2 +- .../services/async/realtime/CallServiceAsyncTest.kt | 2 +- .../async/realtime/ClientSecretServiceAsyncTest.kt | 2 +- .../services/async/responses/InputItemServiceAsyncTest.kt | 2 +- .../async/responses/InputTokenServiceAsyncTest.kt | 2 +- .../services/async/skills/ContentServiceAsyncTest.kt | 2 +- .../services/async/skills/VersionServiceAsyncTest.kt | 2 +- .../async/skills/versions/ContentServiceAsyncTest.kt | 2 +- .../openai/services/async/uploads/PartServiceAsyncTest.kt | 2 +- .../async/vectorstores/FileBatchServiceAsyncTest.kt | 2 +- .../services/async/vectorstores/FileServiceAsyncTest.kt | 2 +- .../com/openai/services/blocking/BatchServiceTest.kt | 2 +- .../com/openai/services/blocking/CompletionServiceTest.kt | 2 +- .../com/openai/services/blocking/ContainerServiceTest.kt | 2 +- .../blocking/ContentProvenanceCheckServiceTest.kt | 2 +- .../openai/services/blocking/ConversationServiceTest.kt | 2 +- .../com/openai/services/blocking/EmbeddingServiceTest.kt | 2 +- .../com/openai/services/blocking/EvalServiceTest.kt | 2 +- .../com/openai/services/blocking/FileServiceTest.kt | 2 +- .../com/openai/services/blocking/ImageServiceTest.kt | 2 +- .../com/openai/services/blocking/ModelServiceTest.kt | 2 +- .../com/openai/services/blocking/ModerationServiceTest.kt | 2 +- .../com/openai/services/blocking/ResponseServiceTest.kt | 2 +- .../com/openai/services/blocking/SkillServiceTest.kt | 2 +- .../com/openai/services/blocking/UploadServiceTest.kt | 2 +- .../openai/services/blocking/VectorStoreServiceTest.kt | 2 +- .../com/openai/services/blocking/VideoServiceTest.kt | 2 +- .../com/openai/services/blocking/WebhookServiceTest.kt | 2 +- .../blocking/admin/organization/AdminApiKeyServiceTest.kt | 2 +- .../blocking/admin/organization/AuditLogServiceTest.kt | 2 +- .../blocking/admin/organization/CertificateServiceTest.kt | 2 +- .../admin/organization/DataRetentionServiceTest.kt | 2 +- .../blocking/admin/organization/GroupServiceTest.kt | 2 +- .../blocking/admin/organization/InviteServiceTest.kt | 2 +- .../blocking/admin/organization/ProjectServiceTest.kt | 2 +- .../blocking/admin/organization/RoleServiceTest.kt | 2 +- .../blocking/admin/organization/SpendAlertServiceTest.kt | 2 +- .../blocking/admin/organization/SpendLimitServiceTest.kt | 2 +- .../blocking/admin/organization/UsageServiceTest.kt | 2 +- .../blocking/admin/organization/UserServiceTest.kt | 2 +- .../blocking/admin/organization/groups/RoleServiceTest.kt | 2 +- .../blocking/admin/organization/groups/UserServiceTest.kt | 2 +- .../admin/organization/projects/ApiKeyServiceTest.kt | 2 +- .../admin/organization/projects/CertificateServiceTest.kt | 2 +- .../organization/projects/DataRetentionServiceTest.kt | 2 +- .../admin/organization/projects/GroupServiceTest.kt | 2 +- .../projects/HostedToolPermissionServiceTest.kt | 2 +- .../organization/projects/ModelPermissionServiceTest.kt | 2 +- .../admin/organization/projects/RateLimitServiceTest.kt | 2 +- .../admin/organization/projects/RoleServiceTest.kt | 2 +- .../organization/projects/ServiceAccountServiceTest.kt | 2 +- .../admin/organization/projects/SpendAlertServiceTest.kt | 2 +- .../admin/organization/projects/SpendLimitServiceTest.kt | 2 +- .../admin/organization/projects/UserServiceTest.kt | 2 +- .../admin/organization/projects/groups/RoleServiceTest.kt | 2 +- .../projects/serviceaccounts/ApiKeyServiceTest.kt | 2 +- .../admin/organization/projects/users/RoleServiceTest.kt | 2 +- .../blocking/admin/organization/users/RoleServiceTest.kt | 2 +- .../openai/services/blocking/audio/SpeechServiceTest.kt | 2 +- .../services/blocking/audio/TranscriptionServiceTest.kt | 2 +- .../services/blocking/audio/TranslationServiceTest.kt | 2 +- .../openai/services/blocking/beta/AssistantServiceTest.kt | 2 +- .../openai/services/blocking/beta/ResponseServiceTest.kt | 2 +- .../openai/services/blocking/beta/ThreadServiceTest.kt | 2 +- .../services/blocking/beta/chatkit/SessionServiceTest.kt | 2 +- .../services/blocking/beta/chatkit/ThreadServiceTest.kt | 2 +- .../blocking/beta/responses/InputItemServiceTest.kt | 2 +- .../blocking/beta/responses/InputTokenServiceTest.kt | 2 +- .../services/blocking/beta/threads/MessageServiceTest.kt | 2 +- .../services/blocking/beta/threads/RunServiceTest.kt | 2 +- .../blocking/beta/threads/runs/StepServiceTest.kt | 2 +- .../services/blocking/chat/ChatCompletionServiceTest.kt | 2 +- .../blocking/chat/completions/MessageServiceTest.kt | 2 +- .../services/blocking/containers/FileServiceTest.kt | 2 +- .../blocking/containers/files/ContentServiceTest.kt | 2 +- .../services/blocking/conversations/ItemServiceTest.kt | 2 +- .../com/openai/services/blocking/evals/RunServiceTest.kt | 2 +- .../services/blocking/evals/runs/OutputItemServiceTest.kt | 2 +- .../openai/services/blocking/finetuning/JobServiceTest.kt | 2 +- .../blocking/finetuning/alpha/GraderServiceTest.kt | 2 +- .../finetuning/checkpoints/PermissionServiceTest.kt | 2 +- .../blocking/finetuning/jobs/CheckpointServiceTest.kt | 2 +- .../openai/services/blocking/realtime/CallServiceTest.kt | 2 +- .../services/blocking/realtime/ClientSecretServiceTest.kt | 2 +- .../services/blocking/responses/InputItemServiceTest.kt | 2 +- .../services/blocking/responses/InputTokenServiceTest.kt | 2 +- .../openai/services/blocking/skills/ContentServiceTest.kt | 2 +- .../openai/services/blocking/skills/VersionServiceTest.kt | 2 +- .../blocking/skills/versions/ContentServiceTest.kt | 2 +- .../openai/services/blocking/uploads/PartServiceTest.kt | 2 +- .../blocking/vectorstores/FileBatchServiceTest.kt | 2 +- .../services/blocking/vectorstores/FileServiceTest.kt | 2 +- 2866 files changed, 2876 insertions(+), 2876 deletions(-) diff --git a/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClient.kt b/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClient.kt index f97b5f8ac..d2352b66f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClient.kt +++ b/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClient.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.client diff --git a/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsync.kt b/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsync.kt index cd53ee594..d4fb531ee 100644 --- a/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.client diff --git a/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsyncImpl.kt index 78c78f6aa..77c7ddeeb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.client diff --git a/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientImpl.kt b/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientImpl.kt index 52f28f315..d5e487234 100644 --- a/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/client/OpenAIClientImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.client diff --git a/openai-java-core/src/main/kotlin/com/openai/models/AllModels.kt b/openai-java-core/src/main/kotlin/com/openai/models/AllModels.kt index 60e555625..0ab3ae2e4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/AllModels.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/AllModels.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/ChatModel.kt b/openai-java-core/src/main/kotlin/com/openai/models/ChatModel.kt index 5b480c784..57c2ed127 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/ChatModel.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/ChatModel.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/ComparisonFilter.kt b/openai-java-core/src/main/kotlin/com/openai/models/ComparisonFilter.kt index a1ae2c333..f88cc913e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/ComparisonFilter.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/ComparisonFilter.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/CompoundFilter.kt b/openai-java-core/src/main/kotlin/com/openai/models/CompoundFilter.kt index 84f7ce186..b31398dba 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/CompoundFilter.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/CompoundFilter.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/CustomToolInputFormat.kt b/openai-java-core/src/main/kotlin/com/openai/models/CustomToolInputFormat.kt index 0d2d1170f..45cb3db82 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/CustomToolInputFormat.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/CustomToolInputFormat.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/ErrorObject.kt b/openai-java-core/src/main/kotlin/com/openai/models/ErrorObject.kt index 14773f348..a88950d5c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/ErrorObject.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/ErrorObject.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/FunctionDefinition.kt b/openai-java-core/src/main/kotlin/com/openai/models/FunctionDefinition.kt index 8087c7d3e..a1a2e178e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/FunctionDefinition.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/FunctionDefinition.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/FunctionParameters.kt b/openai-java-core/src/main/kotlin/com/openai/models/FunctionParameters.kt index 02ac1b915..c344d79b8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/FunctionParameters.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/FunctionParameters.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/OAuthErrorCode.kt b/openai-java-core/src/main/kotlin/com/openai/models/OAuthErrorCode.kt index ba07f450f..784bced35 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/OAuthErrorCode.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/OAuthErrorCode.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/Reasoning.kt b/openai-java-core/src/main/kotlin/com/openai/models/Reasoning.kt index 42a005147..99be47837 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/Reasoning.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/Reasoning.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/ReasoningEffort.kt b/openai-java-core/src/main/kotlin/com/openai/models/ReasoningEffort.kt index 24e86d596..d858e4de7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/ReasoningEffort.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/ReasoningEffort.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatJsonObject.kt b/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatJsonObject.kt index 78df68e0a..8c08f16fe 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatJsonObject.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatJsonObject.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatJsonSchema.kt b/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatJsonSchema.kt index be7db8d1c..d54b16f74 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatJsonSchema.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatJsonSchema.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatText.kt b/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatText.kt index b64967b33..45d3b9e32 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatText.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatText.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatTextGrammar.kt b/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatTextGrammar.kt index d40fd646b..2833d110c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatTextGrammar.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatTextGrammar.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatTextPython.kt b/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatTextPython.kt index 87116f2da..1f06226f0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatTextPython.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/ResponseFormatTextPython.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/ResponsesModel.kt b/openai-java-core/src/main/kotlin/com/openai/models/ResponsesModel.kt index cafdcc85e..102aeafa6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/ResponsesModel.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/ResponsesModel.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKey.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKey.kt index 4f7026898..2fb67f06e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKey.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKey.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateParams.kt index 655aa1d4d..8cad946eb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateResponse.kt index 5cd215793..a3769a497 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteParams.kt index 8fbcd2d5b..deb12e5bf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteResponse.kt index 5524cbe80..573c385b9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPage.kt index a50cf8455..35c2fce06 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPageAsync.kt index 08fb05b26..84540915d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPageResponse.kt index e03698123..d2bb87540 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListParams.kt index f5e5d5a5b..5b43eac4b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyRetrieveParams.kt index 592dca4a3..f7c5ef5b8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPage.kt index 0964b273e..6d30c81d2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.auditlogs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPageAsync.kt index db102399e..deb4bfdc2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.auditlogs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPageResponse.kt index 9e1d17adb..445411e59 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.auditlogs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListParams.kt index 18710092f..6a98e8a41 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.auditlogs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListResponse.kt index fe4eb8fed..c03fb576b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.auditlogs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/Certificate.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/Certificate.kt index 006b12dee..146ecb37b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/Certificate.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/Certificate.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePage.kt index 6c12e7ac7..dae997c6d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePageAsync.kt index 11f73fb82..9b9cbe2b5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePageResponse.kt index 81f58e6f6..d19969ba7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateParams.kt index 3b57b19d6..db8437324 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateResponse.kt index 47d41c0ac..3f9a17505 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateCreateParams.kt index 32ab58ff9..e7381c532 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePage.kt index 0feef26ca..5016cc866 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePageAsync.kt index 210d461d7..85f26e727 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePageResponse.kt index aee9f2cfc..62945703a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateParams.kt index 553388411..defb71422 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateResponse.kt index 0ae4ac038..230c986ef 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteParams.kt index 83cfcb496..6ec281649 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteResponse.kt index 4604f242c..aef0e22f8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListPage.kt index 9d9857eef..ce593cbbe 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListPageAsync.kt index 5c4117c57..8f02af1e6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListPageResponse.kt index 0366b1741..549bc5b9f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListParams.kt index ccbc9bfe6..977cb7db3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListResponse.kt index 2ae56e63c..c22a80909 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateListResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateRetrieveParams.kt index 6b3aea914..85be505f5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateUpdateParams.kt index 9233c6ead..b7d981914 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/certificates/CertificateUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionRetrieveParams.kt index 2633a9d80..4b0f5744e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.dataretention diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionUpdateParams.kt index 6da48966f..aaafaad43 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.dataretention diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/dataretention/OrganizationDataRetention.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/dataretention/OrganizationDataRetention.kt index e9da1e45c..f39402600 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/dataretention/OrganizationDataRetention.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/dataretention/OrganizationDataRetention.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.dataretention diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/Group.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/Group.kt index 6104f67ca..423747cf7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/Group.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/Group.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupCreateParams.kt index 3b9b41fdb..4a6363d64 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupDeleteParams.kt index 1edfb1a44..88e210140 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupDeleteResponse.kt index 93afb68f6..d3a117f38 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListPage.kt index c9a928980..9f24e12be 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListPageAsync.kt index f3270bf63..0ebe4ed11 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListPageResponse.kt index ae556e625..ee53f99bc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListParams.kt index 4ac584867..e59864380 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupRetrieveParams.kt index 551772730..b3135bb92 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupUpdateParams.kt index 89b9cc424..5eefd26fd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupUpdateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupUpdateResponse.kt index 7711fef7e..fb4d3b0b8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupUpdateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/GroupUpdateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateParams.kt index 7a7ba11b9..c573dd571 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateResponse.kt index b0efd3080..9892aac10 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteParams.kt index c84d536de..1afcba9bd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteResponse.kt index 5c9001a5b..bb3192ddc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPage.kt index 4b1030360..49a9b11a3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPageAsync.kt index 033c20e5f..53b0e2aca 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPageResponse.kt index 6cac445a5..52d8d9f42 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListParams.kt index 10b990602..82acc8d2d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListResponse.kt index abe7437ed..270fde0b2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleListResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveParams.kt index 522eb4d9e..ecf1e87c4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveResponse.kt index 2c7c7f22f..c7d95409b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/OrganizationGroupUser.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/OrganizationGroupUser.kt index df7543043..9e4fec66f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/OrganizationGroupUser.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/OrganizationGroupUser.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserCreateParams.kt index 15fd6abd0..7b32aba11 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserCreateResponse.kt index de4bc4a21..c7974db33 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteParams.kt index cb518f03a..3c6448190 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteResponse.kt index 4d47508a1..895fc8f6e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListPage.kt index 72f11c747..0aad8e213 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListPageAsync.kt index 5685f8e3c..cc56c3d12 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListPageResponse.kt index 6dca007e8..9a906e845 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListParams.kt index 4829ecb9a..6c9e75d01 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveParams.kt index 68e311bfb..32cb4c6fd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveResponse.kt index 154d9f03e..0f6244bdf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/Invite.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/Invite.kt index bf5923f77..46a52cbca 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/Invite.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/Invite.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteCreateParams.kt index 171918955..2fb1408f0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteDeleteParams.kt index 6fb967b2e..19e7b4fb7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteDeleteResponse.kt index 691e88ce5..9a570438c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListPage.kt index b1b94968c..bcc1bb7e2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListPageAsync.kt index 6b3b842b4..41c9e5df3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListPageResponse.kt index 762af682d..5b8485a0a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListParams.kt index 913cc2a0b..240cc82ac 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteRetrieveParams.kt index 712c9b354..795e6abf0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/invites/InviteRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/Project.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/Project.kt index 2bee5db8d..d2f37f884 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/Project.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/Project.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectArchiveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectArchiveParams.kt index a9d198722..5f656b86e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectArchiveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectArchiveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectCreateParams.kt index 4c75e2795..272e7b5ec 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListPage.kt index e39ebd7c5..2f9b51298 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListPageAsync.kt index 93c3fcda1..aebc58127 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListPageResponse.kt index 5d26f8d20..7f17fc9e6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListParams.kt index ecc2a7b57..be058adc9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectRetrieveParams.kt index 370398b64..85331c004 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectUpdateParams.kt index 61e6f3f05..c1c7cbbad 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ProjectUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteParams.kt index c120af755..738d0dd75 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteResponse.kt index f5a22b9e9..d714ba201 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPage.kt index 0a45500c4..f244ec258 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPageAsync.kt index 287ea5759..39966b2d2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPageResponse.kt index 9abbbc687..cf6a403d8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListParams.kt index c2f2a4b05..5a9f78172 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyRetrieveParams.kt index 2494b1757..fb8a34002 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ProjectApiKey.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ProjectApiKey.kt index 00380fe26..26df36a68 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ProjectApiKey.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/apikeys/ProjectApiKey.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePage.kt index 06b73140b..167370fc5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePageAsync.kt index c7776ef5f..b9269ca3b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePageResponse.kt index 59e1910f2..457737ad7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateParams.kt index 9b0b6f577..755c4004a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateResponse.kt index e7761291b..dee9dce5e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePage.kt index f4d84b145..614d96017 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePageAsync.kt index f1917370d..e7749e02f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePageResponse.kt index 937df49dc..27d984b72 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateParams.kt index 22484edea..1e85858e3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateResponse.kt index 37b912afc..385dc7468 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPage.kt index 71f22997f..37d7b3f77 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPageAsync.kt index 1991a6d49..597256d94 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPageResponse.kt index e501f84cb..db3a93114 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListParams.kt index 6e1422a64..121501ee5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListResponse.kt index ed4f1e593..6f1566124 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionRetrieveParams.kt index 44a2be796..1efd79a8d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.dataretention diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionUpdateParams.kt index 2abc75258..d38df3cb8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.dataretention diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/dataretention/ProjectDataRetention.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/dataretention/ProjectDataRetention.kt index 51be8c906..a188aa60c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/dataretention/ProjectDataRetention.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/dataretention/ProjectDataRetention.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.dataretention diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupCreateParams.kt index ad942b84a..f2cc9e465 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteParams.kt index f3b4de701..4e1416708 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteResponse.kt index 55f3fb9c9..e53cae392 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPage.kt index 520768502..a782f5327 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPageAsync.kt index 938aa3f28..e2c6aae38 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPageResponse.kt index c48ec1faf..e5b4f3893 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListParams.kt index 4ef505c27..f31898edf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupRetrieveParams.kt index 601c6dc78..0245dd022 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/GroupRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/ProjectGroup.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/ProjectGroup.kt index 347201479..266e00d58 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/ProjectGroup.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/ProjectGroup.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateParams.kt index c303f0e5d..505b1eeb8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateResponse.kt index 1b39b3703..61efb94cb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteParams.kt index 02958e4f8..eb8411c1f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteResponse.kt index 22cd6692f..c45acc328 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPage.kt index 124938d31..18ebbe897 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPageAsync.kt index a0198b73d..5e0a477cb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPageResponse.kt index b03e38470..e0e919f40 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListParams.kt index 45873c8ee..8969f47c2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListResponse.kt index f626700ad..b5baf9bfe 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveParams.kt index 8575221a5..2bdd6e957 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveResponse.kt index a75dcf63f..534faf4f4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionRetrieveParams.kt index dca181b66..8fb16df38 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.hostedtoolpermissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionUpdateParams.kt index 5f6b2be89..f8b46adeb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.hostedtoolpermissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/ProjectHostedToolPermissions.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/ProjectHostedToolPermissions.kt index a2c0ad08f..811a72779 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/ProjectHostedToolPermissions.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/ProjectHostedToolPermissions.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.hostedtoolpermissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionDeleteParams.kt index e44ad55e7..57cbbde02 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.modelpermissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionRetrieveParams.kt index 2b596a58a..432d85164 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.modelpermissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionUpdateParams.kt index 83e13e55d..5a87d1aa9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.modelpermissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissions.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissions.kt index 8173a18a5..3ecc76bca 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissions.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissions.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.modelpermissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissionsDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissionsDeleted.kt index 0e23b180e..7856a3d4a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissionsDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissionsDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.modelpermissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/ProjectRateLimit.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/ProjectRateLimit.kt index bb94290e8..d57e0b4b1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/ProjectRateLimit.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/ProjectRateLimit.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.ratelimits diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPage.kt index 3137b400b..702291451 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.ratelimits diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPageAsync.kt index 4fb144453..12fe844e8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.ratelimits diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPageResponse.kt index 826283c5b..493ea3b49 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.ratelimits diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsParams.kt index b65851004..306dc63e1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.ratelimits diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitUpdateRateLimitParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitUpdateRateLimitParams.kt index 28293716b..9c3ed0ce9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitUpdateRateLimitParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitUpdateRateLimitParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.ratelimits diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleCreateParams.kt index 0e822d193..1ea5d94a4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteParams.kt index 45c5e4d6d..8737b41a8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteResponse.kt index 3e84ac52d..635a926ff 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPage.kt index 5eb1bf31c..f2076c605 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPageAsync.kt index 54d45cfd5..92ed81efa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPageResponse.kt index ec64f0fe8..1069cbb0e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListParams.kt index bedf9e02c..3cc4328ba 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleRetrieveParams.kt index 1b76a9421..b7ef2dfe7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleUpdateParams.kt index 879a609b6..005fe8583 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/roles/RoleUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ProjectServiceAccount.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ProjectServiceAccount.kt index ced58e0a7..7104ea961 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ProjectServiceAccount.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ProjectServiceAccount.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateParams.kt index 574e25910..185971a43 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateResponse.kt index a628f82d1..3bb3f4789 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteParams.kt index 7339a9eca..f348e51b1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteResponse.kt index 62c43169d..ab8401f03 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPage.kt index 72c1f405d..74580ddef 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPageAsync.kt index 9d93af2ba..e0b748b81 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPageResponse.kt index 397924312..0be902496 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListParams.kt index fe9d98107..ca4eac9a0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountRetrieveParams.kt index a748ba043..6260d78b5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountUpdateParams.kt index a592bd02f..09a43fdbf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateParams.kt index 596474552..2a6e4face 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts.apikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateResponse.kt index b6a1fff06..7be887b44 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts.apikeys diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlert.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlert.kt index d8ca37a88..73a7842fd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlert.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlert.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlertDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlertDeleted.kt index a2d747860..a1e6916a6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlertDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlertDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertCreateParams.kt index 4de3d2edf..a709855c8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertDeleteParams.kt index 34d9eb805..da8200346 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPage.kt index c814be830..0f9aec14d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPageAsync.kt index 0c564df69..c1ec73a64 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPageResponse.kt index 563946bf7..1d408b20c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListParams.kt index f8b140cd6..d9814b048 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertRetrieveParams.kt index 5555ec0dc..a51745f4a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertUpdateParams.kt index e95d4a270..7288c7064 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimit.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimit.kt index 611a7a58e..c6db6b56c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimit.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimit.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendlimit diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimitDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimitDeleted.kt index 4efca0403..65795836b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimitDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimitDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendlimit diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitDeleteParams.kt index dc4cb60e5..a4db8b65b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendlimit diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitRetrieveParams.kt index 741e3745b..d5e2055fd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendlimit diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitUpdateParams.kt index 86ad934d5..591f29f8f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendlimit diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/ProjectUser.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/ProjectUser.kt index 01def33c1..c939a83f9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/ProjectUser.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/ProjectUser.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserCreateParams.kt index fb9531778..f0ff8b27e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteParams.kt index a5e0882f3..af7d3f3fa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteResponse.kt index 27b42c272..26c734ccd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListPage.kt index 9682c91a0..137fdf6ab 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListPageAsync.kt index 9191fa634..8ce3b1664 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListPageResponse.kt index 11f329ffd..e27ed9da5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListParams.kt index 1fc5962ce..951be32c1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserRetrieveParams.kt index 0a21e26ab..400b37864 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserUpdateParams.kt index 8a7042bea..3c5880dab 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/UserUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateParams.kt index 43f3368dd..2f963e896 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateResponse.kt index 0be3ef292..927c1167a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteParams.kt index d70e30ce2..90cf84a60 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteResponse.kt index 1250dac58..470c16e37 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPage.kt index a8ce30dd6..bd95d326f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPageAsync.kt index 847f50201..27fefc5c8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPageResponse.kt index 32c1d8c5b..39908adad 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListParams.kt index ed56f72a2..6f797ba91 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListResponse.kt index 4dcd76291..36633e663 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveParams.kt index d7ebda086..772b22789 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveResponse.kt index c49e1f801..2099f7c72 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/Role.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/Role.kt index d03717dba..551c7e746 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/Role.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/Role.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleCreateParams.kt index dc070b962..d1f828fed 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleDeleteParams.kt index 5c4e92b98..bd5d42883 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleDeleteResponse.kt index b92dd295a..7b160a45a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListPage.kt index 6183c70a5..a1c276dd5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListPageAsync.kt index d0c3574f8..355902a02 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListPageResponse.kt index 8499fc26d..95f4f4d43 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListParams.kt index 5fdb0fa62..57d3aa40d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleRetrieveParams.kt index 8c7baba07..831ac62ab 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleUpdateParams.kt index dae5bcc00..3a502d956 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/roles/RoleUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlert.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlert.kt index 4c0d5cc3a..fd84080a0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlert.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlert.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlertDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlertDeleted.kt index d8ec0995b..f30757288 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlertDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlertDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertCreateParams.kt index 42eae9230..6338a8bb1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertDeleteParams.kt index b36280f57..907886f8a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPage.kt index 534f41fcb..e40337a33 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPageAsync.kt index 2cf860763..65d60951d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPageResponse.kt index 475eb2412..854fbb952 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListParams.kt index 3b331634c..9fd46ed1a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertRetrieveParams.kt index 25c09f51a..bc9b9a81f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertUpdateParams.kt index c4b11a800..ffd7f311f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimit.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimit.kt index 8f146aeb4..d567b7df3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimit.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimit.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendlimit diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimitDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimitDeleted.kt index 68a87bcad..51f92ea94 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimitDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimitDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendlimit diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitDeleteParams.kt index bcbf1ad75..4230e6e03 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendlimit diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitRetrieveParams.kt index dcd6782ff..61e2bb182 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendlimit diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitUpdateParams.kt index 4cbda85bf..778fb8058 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendlimit diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesParams.kt index a7e99598c..f2ff69dc5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesResponse.kt index 71e9cf355..c376aa1c3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsParams.kt index a338e3c8b..eefeb82e3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsResponse.kt index a19a57103..c0a6004ac 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsParams.kt index be717480f..5dd6c66b8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsResponse.kt index 52c0f8f71..985b67e11 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsParams.kt index 8b262f689..31e699b69 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsResponse.kt index 6d5c6992d..7e696fba9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCostsParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCostsParams.kt index 58d8abf4f..2d384e6ae 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCostsParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCostsParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCostsResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCostsResponse.kt index 19dd63b37..7ba1479c7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCostsResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageCostsResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsParams.kt index a18f8810f..95064b43e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsResponse.kt index 7447c9387..2ae64b5f6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsParams.kt index 15fb02a02..984c951a2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsResponse.kt index 6277e308a..bc937dbb0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageImagesParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageImagesParams.kt index 575a40f01..5a34298e1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageImagesParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageImagesParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageImagesResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageImagesResponse.kt index 143b89f2f..a58c15ee0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageImagesResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageImagesResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageModerationsParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageModerationsParams.kt index eddd66967..28c6b3b3f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageModerationsParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageModerationsParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageModerationsResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageModerationsResponse.kt index 0d5dce938..5ddbd8166 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageModerationsResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageModerationsResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresParams.kt index 8d4ac6d7f..54507fff5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresResponse.kt index eb8a59a8d..335d3a1b4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsParams.kt index 9d756bd3d..0daa3ce70 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsResponse.kt index 31a110bd7..6939686e6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/OrganizationUser.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/OrganizationUser.kt index f93cddd0b..73340c9bb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/OrganizationUser.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/OrganizationUser.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserDeleteParams.kt index 06c41d484..9fdf1604d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserDeleteResponse.kt index a9ee7965c..e8b174f4a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListPage.kt index 295e28572..f22f34351 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListPageAsync.kt index a06f7b2db..a65c444a8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListPageResponse.kt index 8cfa6993a..9a9adae71 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListParams.kt index a00e11b85..135a09f97 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserRetrieveParams.kt index 9efea34a7..8032bffcc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserUpdateParams.kt index cf81ba4ce..f509c1058 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/UserUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateParams.kt index fb869b5b0..cc3b4cadb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateResponse.kt index f41a17181..9d130a329 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteParams.kt index 20997ce48..f46a64c2d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteResponse.kt index 685607c90..8c33b64ad 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListPage.kt index 073bcc1b9..1f133dc86 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListPageAsync.kt index 28cc6db8c..ac22130c5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListPageResponse.kt index df48519bc..d9db122c7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListParams.kt index 863d095c5..ca97d9a5a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListResponse.kt index 4cfea3661..4822af8ff 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleListResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveParams.kt index 87190d742..acdf6f38e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveResponse.kt index f618e3552..41e7550b5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/AudioModel.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/AudioModel.kt index 117e378d6..03eb81d56 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/AudioModel.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/AudioModel.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/AudioResponseFormat.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/AudioResponseFormat.kt index 3fa1e6a41..a28ad5eca 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/AudioResponseFormat.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/AudioResponseFormat.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/speech/SpeechCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/speech/SpeechCreateParams.kt index 72db5ffd2..dbc6b06f7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/speech/SpeechCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/speech/SpeechCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.speech diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/speech/SpeechModel.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/speech/SpeechModel.kt index 23e963f56..088cf1731 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/speech/SpeechModel.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/speech/SpeechModel.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.speech diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/Transcription.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/Transcription.kt index ccdd1fbe9..65067e840 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/Transcription.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/Transcription.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateParams.kt index 5a93f8c8a..ce62870e3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateResponse.kt index a935a9a7d..7cc7aa0fb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarized.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarized.kt index f8a368ef3..f63e03e84 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarized.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarized.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarizedSegment.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarizedSegment.kt index f76d9f829..f4d98871f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarizedSegment.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarizedSegment.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionInclude.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionInclude.kt index 3d33c1321..e41b18590 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionInclude.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionInclude.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionLanguage.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionLanguage.kt index b1ea969f6..1928d9f49 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionLanguage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionLanguage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionSegment.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionSegment.kt index 6a6f2c45b..e39a57f04 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionSegment.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionSegment.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionStreamEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionStreamEvent.kt index 7a7ebf584..c4b824223 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionStreamEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionStreamEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDeltaEvent.kt index 5273f10c8..9b3ebb489 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDoneEvent.kt index b6435a9a1..937044064 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextSegmentEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextSegmentEvent.kt index e723a65c3..03c88ce65 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextSegmentEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextSegmentEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionVerbose.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionVerbose.kt index 46980eaf9..59b81edbb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionVerbose.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionVerbose.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionWord.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionWord.kt index 71afaddbe..e41ccdfdc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionWord.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionWord.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/Translation.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/Translation.kt index dbdd26240..08af77c86 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/Translation.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/Translation.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.translations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationCreateParams.kt index a136e1cd0..3cc736f5f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.translations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationCreateResponse.kt index f4f8e002e..f0cf1b555 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.translations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationVerbose.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationVerbose.kt index e6f41007c..c82dfb87a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationVerbose.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationVerbose.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.translations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/batches/Batch.kt b/openai-java-core/src/main/kotlin/com/openai/models/batches/Batch.kt index 3d2c4c67f..428ab41a3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/batches/Batch.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/batches/Batch.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchCancelParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchCancelParams.kt index a722ffdab..2a504709e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchCancelParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchCancelParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchCreateParams.kt index 0806260f7..e204fbef1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchError.kt b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchError.kt index db33d1f52..3e25fcf1f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchError.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchError.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListPage.kt index 8d9362f83..e6649dc66 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListPageAsync.kt index 5fae6c046..b1f23a14d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListPageResponse.kt index 788c08cab..1f842d371 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListParams.kt index 9f1e062b4..071d10058 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchRequestCounts.kt b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchRequestCounts.kt index 790860097..fe47a91d2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchRequestCounts.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchRequestCounts.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchRetrieveParams.kt index 90969d402..86da36cdf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchUsage.kt b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchUsage.kt index d8f4bec54..bb1ece9a1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchUsage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/batches/BatchUsage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/Assistant.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/Assistant.kt index 3c4516f61..11c0eff5e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/Assistant.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/Assistant.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantCreateParams.kt index 4dc7723f5..6775505ef 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantDeleteParams.kt index 74afaabcf..959ed00cf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantDeleted.kt index 538c1cee7..837f862f7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListPage.kt index 56b7b3538..eb2949dcd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListPageAsync.kt index f223aff7a..3eb9df910 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListPageResponse.kt index 95fe99372..9f4cc4979 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListParams.kt index 3a388753b..e2b7d6cf6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantRetrieveParams.kt index 813091e3f..31b325512 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantStreamEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantStreamEvent.kt index 94747f623..ac520108a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantStreamEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantStreamEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantTool.kt index 4f7c98368..40137a0db 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantUpdateParams.kt index 4115e8f65..2ed61a606 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/AssistantUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/CodeInterpreterTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/CodeInterpreterTool.kt index 46765cc4d..6f0a69523 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/CodeInterpreterTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/CodeInterpreterTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/FileSearchTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/FileSearchTool.kt index 56275abfc..fd1c46e68 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/FileSearchTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/FileSearchTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/FunctionTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/FunctionTool.kt index 759d28d9c..d86009c3b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/FunctionTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/FunctionTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/MessageStreamEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/MessageStreamEvent.kt index b123466c2..a33b7158a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/MessageStreamEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/MessageStreamEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/RunStepStreamEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/RunStepStreamEvent.kt index 3ea6ed58e..d284b92c5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/RunStepStreamEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/RunStepStreamEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/RunStreamEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/RunStreamEvent.kt index 01e48fb91..bdfe1e6bd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/RunStreamEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/RunStreamEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/ThreadStreamEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/ThreadStreamEvent.kt index 323d245e0..7b23403ab 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/ThreadStreamEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/assistants/ThreadStreamEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/ChatKitWorkflow.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/ChatKitWorkflow.kt index 9ab97a831..29a917f7a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/ChatKitWorkflow.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/ChatKitWorkflow.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/sessions/SessionCancelParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/sessions/SessionCancelParams.kt index 7cf8abee7..f57857dc8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/sessions/SessionCancelParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/sessions/SessionCancelParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.sessions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/sessions/SessionCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/sessions/SessionCreateParams.kt index 12e66290f..7fcc80018 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/sessions/SessionCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/sessions/SessionCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.sessions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitAttachment.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitAttachment.kt index 96f21daaf..08d549f83 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitAttachment.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitAttachment.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitResponseOutputText.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitResponseOutputText.kt index 177d5de96..004b6fc0c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitResponseOutputText.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitResponseOutputText.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThread.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThread.kt index d17446d42..ef5c0a3dc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThread.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThread.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadAssistantMessageItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadAssistantMessageItem.kt index 22725278a..d01fe350b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadAssistantMessageItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadAssistantMessageItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadItemList.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadItemList.kt index 7f022f0d2..c8038b2fa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadItemList.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadItemList.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadUserMessageItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadUserMessageItem.kt index 19c9b7d78..130a7b803 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadUserMessageItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadUserMessageItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitWidgetItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitWidgetItem.kt index 3e3290b75..b9d9c3989 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitWidgetItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatKitWidgetItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSession.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSession.kt index 9509651a1..c8ed776b6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSession.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSession.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionAutomaticThreadTitling.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionAutomaticThreadTitling.kt index f64eb3bfe..dd8627a33 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionAutomaticThreadTitling.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionAutomaticThreadTitling.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfiguration.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfiguration.kt index 763c38765..d25ef4583 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfiguration.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfiguration.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfigurationParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfigurationParam.kt index f6d97f1ec..2cad79f17 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfigurationParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfigurationParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionExpiresAfterParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionExpiresAfterParam.kt index 85667dba2..12ed2035c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionExpiresAfterParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionExpiresAfterParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionFileUpload.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionFileUpload.kt index 0e48c1c99..2ead7cd57 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionFileUpload.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionFileUpload.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionHistory.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionHistory.kt index 5da3dcf69..b99e65220 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionHistory.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionHistory.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimits.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimits.kt index 0c2d3afea..54fa83faa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimits.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimits.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimitsParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimitsParam.kt index 66566d87e..4b2f59937 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimitsParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimitsParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionStatus.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionStatus.kt index 2cd206074..448fc133b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionStatus.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionStatus.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionWorkflowParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionWorkflowParam.kt index e3bee01a3..b4b529212 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionWorkflowParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionWorkflowParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteParams.kt index fdf90a7c6..1526a0014 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteResponse.kt index 055094102..31ecd9dc3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsPage.kt index 7d9c80e4f..ed1ee1c51 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsPageAsync.kt index 33af81101..f840e2cdb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsParams.kt index 99145fd74..f175f1222 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPage.kt index 4c1cb15ec..8a3227eb2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPageAsync.kt index ab9c6c863..4665fc671 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPageResponse.kt index d6a827179..a218352c3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListParams.kt index 481ae56f3..4ca1a1be0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadRetrieveParams.kt index e7d28fa0d..f1a1f1b35 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/chatkit/threads/ThreadRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaApplyPatchTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaApplyPatchTool.kt index c0b39c34e..a406463a0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaApplyPatchTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaApplyPatchTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaCompactedResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaCompactedResponse.kt index ddc58444a..6af5a69c8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaCompactedResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaCompactedResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaComputerAction.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaComputerAction.kt index b9585d360..787668c90 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaComputerAction.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaComputerAction.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaComputerTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaComputerTool.kt index 89e3a50a1..518edbf9f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaComputerTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaComputerTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaComputerUsePreviewTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaComputerUsePreviewTool.kt index 09769f2f8..533187d48 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaComputerUsePreviewTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaComputerUsePreviewTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerAuto.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerAuto.kt index caa49994f..f4151a44d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerAuto.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerAuto.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyAllowlist.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyAllowlist.kt index 60cc1b8f9..73396c248 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyAllowlist.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyAllowlist.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDisabled.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDisabled.kt index 19457c623..cf2681495 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDisabled.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDisabled.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDomainSecret.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDomainSecret.kt index 539a1e63d..28348b690 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDomainSecret.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDomainSecret.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerReference.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerReference.kt index 4c7c07f39..27683c76f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerReference.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaContainerReference.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaCustomTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaCustomTool.kt index 6cb3dd1af..56237cd82 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaCustomTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaCustomTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaEasyInputMessage.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaEasyInputMessage.kt index 370c194e2..7fcbb1c98 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaEasyInputMessage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaEasyInputMessage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaFileSearchTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaFileSearchTool.kt index 273bb439d..4d6bc416f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaFileSearchTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaFileSearchTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaFunctionShellTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaFunctionShellTool.kt index 355f51659..a9bfa3952 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaFunctionShellTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaFunctionShellTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaFunctionTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaFunctionTool.kt index 5919847f6..1d851850c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaFunctionTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaFunctionTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaInlineSkill.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaInlineSkill.kt index 8e3438b35..1d450762a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaInlineSkill.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaInlineSkill.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaInlineSkillSource.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaInlineSkillSource.kt index a2247d8ed..a4ff8e37c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaInlineSkillSource.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaInlineSkillSource.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaLocalEnvironment.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaLocalEnvironment.kt index d4409030b..3ce5e895b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaLocalEnvironment.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaLocalEnvironment.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaLocalSkill.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaLocalSkill.kt index db4ab9804..3a3e95eee 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaLocalSkill.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaLocalSkill.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaNamespaceTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaNamespaceTool.kt index 9f9b18713..d5385565c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaNamespaceTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaNamespaceTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponse.kt index ccc9f4f35..6e8f7e1df 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCall.kt index 2e60e727e..cae9fe436 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCallOutput.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCallOutput.kt index 19619f818..a9fb94c98 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCallOutput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCallOutput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioDeltaEvent.kt index 3bc5ec180..8f4b3ce84 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioDoneEvent.kt index e6dbd1131..761154c8f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDeltaEvent.kt index 590f84404..96dabe698 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDoneEvent.kt index 1a9997141..30c1e3906 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDeltaEvent.kt index 72ca8c0ba..fded5e2f4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDoneEvent.kt index 1c603e529..efa6cba1c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCompletedEvent.kt index d1cdca574..69bb4dedd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInProgressEvent.kt index 857c377e4..5f6a6ffb4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInterpretingEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInterpretingEvent.kt index 012f12f9a..9d33d0c31 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInterpretingEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInterpretingEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterToolCall.kt index 8656ba757..73ca7359e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItem.kt index 082a92b67..73b8bed3f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItemParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItemParam.kt index 988c07979..4d47f9e33 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItemParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItemParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCompletedEvent.kt index 04e1cfe2d..883f068f7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCall.kt index c36ce1a46..5a105e08d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputItem.kt index 48ffb7383..07628fe8a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputScreenshot.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputScreenshot.kt index 932707749..70b17b02c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputScreenshot.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputScreenshot.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContainerReference.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContainerReference.kt index c3c7c456e..b1ae5fdc1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContainerReference.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContainerReference.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContent.kt index 06983d841..dcc9c907d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContentPartAddedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContentPartAddedEvent.kt index cfd54e24f..920df3039 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContentPartAddedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContentPartAddedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContentPartDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContentPartDoneEvent.kt index ecabde794..b4818751e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContentPartDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseContentPartDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseConversationParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseConversationParam.kt index fce9b7f5e..c0b1ddf94 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseConversationParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseConversationParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCreatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCreatedEvent.kt index d722db927..7f1dae023 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCreatedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCreatedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCall.kt index 4a75c8dcb..7fbacb79b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDeltaEvent.kt index 209ea8c21..487522347 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDoneEvent.kt index d3ce502f0..549248021 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallItem.kt index 1f7e6de00..3adaea2ca 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutput.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutput.kt index 8b9dfeadf..bfd48a787 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutputItem.kt index dd11204bd..16a6380e6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseError.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseError.kt index bba2fcf10..420b92445 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseError.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseError.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseErrorEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseErrorEvent.kt index 7cb4761b7..694cdde57 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseErrorEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseErrorEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFailedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFailedEvent.kt index cce2f0376..62645b4c6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFailedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFailedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallCompletedEvent.kt index 960549c37..278417a9b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallInProgressEvent.kt index 5537f04b5..5641bf1e7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallSearchingEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallSearchingEvent.kt index abd83c22c..7dd263a62 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallSearchingEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallSearchingEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchToolCall.kt index 1e828219b..afc8405d8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextConfig.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextConfig.kt index 1a04add7a..7dc4526aa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextConfig.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextConfig.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextJsonSchemaConfig.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextJsonSchemaConfig.kt index 80a7bac0e..ab9402917 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextJsonSchemaConfig.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextJsonSchemaConfig.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDeltaEvent.kt index 8786309f9..6cbd6bde8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDoneEvent.kt index 0bff8ebe5..21d63f0ef 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallOutputItem.kt index 0c1ca265b..2edd582d1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallOutputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellCallOutputContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellCallOutputContent.kt index 426993ef9..2d7a7dc0e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellCallOutputContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellCallOutputContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCall.kt index 6c8940b88..8d9ae4a30 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCallOutput.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCallOutput.kt index efdaafad1..4cef555ba 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCallOutput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCallOutput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCall.kt index c11dc31e9..a6ce7640e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallItem.kt index 18e945181..d1f83b063 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItem.kt index 9d73f3320..20b6f10c2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionWebSearch.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionWebSearch.kt index 0bc1f6a8a..6399b1702 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionWebSearch.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseFunctionWebSearch.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallCompletedEvent.kt index d487818e2..5cdfd1c66 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallGeneratingEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallGeneratingEvent.kt index 817dd0ee9..bf025d45b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallGeneratingEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallGeneratingEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallInProgressEvent.kt index 0c8554ec1..dd7f6ac2d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallPartialImageEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallPartialImageEvent.kt index d25e3a156..a1670e5c7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallPartialImageEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallPartialImageEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInProgressEvent.kt index 2929ba3be..29fb1a442 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseIncludable.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseIncludable.kt index af7331b68..1ed8681de 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseIncludable.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseIncludable.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseIncompleteEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseIncompleteEvent.kt index 9be891f41..9206b452a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseIncompleteEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseIncompleteEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInjectCreatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInjectCreatedEvent.kt index c73b3cfed..914c271fc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInjectCreatedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInjectCreatedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInjectEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInjectEvent.kt index 85127e313..04740f6e8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInjectEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInjectEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInjectFailedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInjectFailedEvent.kt index c474452da..cfafe0b28 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInjectFailedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInjectFailedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputAudio.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputAudio.kt index b0463cf63..4e806eb15 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputAudio.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputAudio.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputContent.kt index 4f33fdc78..d938724c0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputFile.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputFile.kt index c4aad671e..c51a57a44 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputFile.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputFile.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputFileContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputFileContent.kt index e494c32a7..294ce29c9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputFileContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputFileContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputImage.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputImage.kt index 2905a065e..539d04eb1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputImage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputImage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputImageContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputImageContent.kt index 5b86be6b4..a8432a24e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputImageContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputImageContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputItem.kt index b13b77689..a8fe37523 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputMessageItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputMessageItem.kt index 6f9ffffef..c396d1795 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputMessageItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputMessageItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputText.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputText.kt index bd5f2343b..16a82d491 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputText.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputText.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputTextContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputTextContent.kt index 456131a9f..08d628e88 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputTextContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseInputTextContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseItem.kt index 0fff9dafb..c712c94d2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseLocalEnvironment.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseLocalEnvironment.kt index d96437d2a..e5bfd10d2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseLocalEnvironment.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseLocalEnvironment.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDeltaEvent.kt index ee45ab82c..d8603cb5c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDoneEvent.kt index 17a4440e4..c69fbf7d3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallCompletedEvent.kt index 3f0d3877d..0a928dcaf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallFailedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallFailedEvent.kt index 315b26915..d8a11a146 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallFailedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallFailedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallInProgressEvent.kt index 54b5ba87a..73a204fc1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsCompletedEvent.kt index 9ec0a7924..0d9c9d7d4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsFailedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsFailedEvent.kt index 5f2d731e4..de5773f9e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsFailedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsFailedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsInProgressEvent.kt index 1f00affb9..9eff1f571 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputAudio.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputAudio.kt index 5a8d3156d..6d093dab4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputAudio.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputAudio.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputItem.kt index a11abb7e2..111194521 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemAddedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemAddedEvent.kt index c658a526c..7f0a3bec3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemAddedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemAddedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemDoneEvent.kt index eeaed3271..27c8cf5e7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputMessage.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputMessage.kt index c8cbe2980..b1afc665a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputMessage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputMessage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputRefusal.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputRefusal.kt index 622525aa0..ecb38884d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputRefusal.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputRefusal.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputText.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputText.kt index 7cd386c59..10981edae 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputText.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputText.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputTextAnnotationAddedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputTextAnnotationAddedEvent.kt index 534cca632..27cfa5877 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputTextAnnotationAddedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseOutputTextAnnotationAddedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsePrompt.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsePrompt.kt index d5aaa8c15..ab4f8c582 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsePrompt.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsePrompt.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseQueuedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseQueuedEvent.kt index f2e089fa9..fba54dad1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseQueuedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseQueuedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningItem.kt index 3f4b02744..fbe3a3e51 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartAddedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartAddedEvent.kt index fca827a79..3634eb174 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartAddedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartAddedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartDoneEvent.kt index 971e8e3b7..e13d5b9b0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDeltaEvent.kt index 4ad794f71..1ad3b170c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDoneEvent.kt index 206ca87b8..3d02f30dc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDeltaEvent.kt index a37416299..807a6d581 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDoneEvent.kt index 16260ee6a..aa59ac23b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDeltaEvent.kt index 6abb7aec4..3cc718cce 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDoneEvent.kt index 4279fd163..0dd11a3d3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseStatus.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseStatus.kt index f86c94693..8f467028e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseStatus.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseStatus.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseStreamEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseStreamEvent.kt index 19fe8bbf4..fd53f4a64 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseStreamEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseStreamEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseTextConfig.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseTextConfig.kt index b1d2d6417..057032fb6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseTextConfig.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseTextConfig.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseTextDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseTextDeltaEvent.kt index 7459c6c18..e78064073 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseTextDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseTextDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseTextDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseTextDoneEvent.kt index e10ee45fd..2d3d8f19d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseTextDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseTextDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchCall.kt index c436b5597..baa0b7d84 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItem.kt index c7038ca8b..2dc043443 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItemParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItemParam.kt index 889eb0d78..0241cd2b4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItemParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItemParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseUsage.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseUsage.kt index 56dbe9c90..e5d774799 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseUsage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseUsage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallCompletedEvent.kt index 469b5436d..518ad59cd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallInProgressEvent.kt index b975ee658..b0a0e5652 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallSearchingEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallSearchingEvent.kt index f354be304..dcaebeac2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallSearchingEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallSearchingEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesClientEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesClientEvent.kt index 47d59415a..c99f7536a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesClientEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesClientEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesServerEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesServerEvent.kt index 59cc6b8ef..4009e4123 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesServerEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesServerEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaSkillReference.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaSkillReference.kt index e17e7cea5..0f82112e0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaSkillReference.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaSkillReference.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaTool.kt index 58a28573f..2a4065686 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceAllowed.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceAllowed.kt index 8a7c7f461..8f5dcd5a6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceAllowed.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceAllowed.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceApplyPatch.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceApplyPatch.kt index 34eaac269..1e627d2ba 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceApplyPatch.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceApplyPatch.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceCustom.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceCustom.kt index 6edc79056..66fc84b11 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceCustom.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceCustom.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceFunction.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceFunction.kt index 2cb9f8a09..94b227cc3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceFunction.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceFunction.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceMcp.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceMcp.kt index aca3c9d44..70e1eddd4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceMcp.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceMcp.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceOptions.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceOptions.kt index 5b8986c42..daafca68a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceOptions.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceOptions.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceShell.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceShell.kt index 4c5487763..e27a53a42 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceShell.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceShell.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceTypes.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceTypes.kt index fa6e6c00a..0f1fffe84 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceTypes.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolChoiceTypes.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolSearchTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolSearchTool.kt index a4b40d877..f8f0df475 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolSearchTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaToolSearchTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaWebSearchPreviewTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaWebSearchPreviewTool.kt index 5f85219f9..67e781715 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaWebSearchPreviewTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaWebSearchPreviewTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaWebSearchTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaWebSearchTool.kt index f27d52175..85f8e2fc0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaWebSearchTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaWebSearchTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCancelParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCancelParams.kt index be44a0b4f..dd2fdee62 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCancelParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCancelParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCompactParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCompactParams.kt index 1edb5e284..36aff79f4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCompactParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCompactParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCreateParams.kt index b1fdfaac2..cc88690ca 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseDeleteParams.kt index b6e5c095b..158c4e23b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseRetrieveParams.kt index 945041d06..fbed462ad 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/BetaResponseItemList.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/BetaResponseItemList.kt index 7f38979d8..c96c19377 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/BetaResponseItemList.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/BetaResponseItemList.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses.inputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/InputItemListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/InputItemListPage.kt index 924dd38a2..57abf2c49 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/InputItemListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/InputItemListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses.inputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/InputItemListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/InputItemListPageAsync.kt index c380356d3..ad2b70242 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/InputItemListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/InputItemListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses.inputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/InputItemListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/InputItemListParams.kt index c6cabfbe2..9f7ba4e1d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/InputItemListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputitems/InputItemListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses.inputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountParams.kt index 4ddfed099..1e40fb788 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses.inputtokens diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountResponse.kt index bc5b14163..63125ebe7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses.inputtokens diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantResponseFormatOption.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantResponseFormatOption.kt index 9e9f99d7b..ff64c084b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantResponseFormatOption.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantResponseFormatOption.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantToolChoice.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantToolChoice.kt index 203260a72..5fddbcde5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantToolChoice.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantToolChoice.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantToolChoiceFunction.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantToolChoiceFunction.kt index 691226534..41e4476f8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantToolChoiceFunction.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantToolChoiceFunction.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantToolChoiceOption.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantToolChoiceOption.kt index e1ec817dc..2ae32efe0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantToolChoiceOption.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/AssistantToolChoiceOption.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/Thread.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/Thread.kt index e0ed5140e..b48356aea 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/Thread.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/Thread.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadCreateAndRunParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadCreateAndRunParams.kt index 8d188c876..5d321d306 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadCreateAndRunParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadCreateAndRunParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadCreateParams.kt index f8f7c2395..de06c2e0d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadDeleteParams.kt index e20a574e6..a84583e92 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadDeleted.kt index 919dcd1d4..7326f93cf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadRetrieveParams.kt index e0eac7cca..6251bb61c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadUpdateParams.kt index 5be2c82cf..a4485ed6f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/ThreadUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/Annotation.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/Annotation.kt index c8472d7ee..e20c1e5ba 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/Annotation.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/Annotation.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/AnnotationDelta.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/AnnotationDelta.kt index dc6886166..fa0502c6f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/AnnotationDelta.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/AnnotationDelta.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FileCitationAnnotation.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FileCitationAnnotation.kt index c221249a5..6ee6e58c3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FileCitationAnnotation.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FileCitationAnnotation.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FileCitationDeltaAnnotation.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FileCitationDeltaAnnotation.kt index f51feb40a..1072645b6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FileCitationDeltaAnnotation.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FileCitationDeltaAnnotation.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FilePathAnnotation.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FilePathAnnotation.kt index 897043f5a..2944b72aa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FilePathAnnotation.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FilePathAnnotation.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FilePathDeltaAnnotation.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FilePathDeltaAnnotation.kt index ece6691d8..7796b8ed4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FilePathDeltaAnnotation.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/FilePathDeltaAnnotation.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFile.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFile.kt index 326aaa7d5..2890bec0d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFile.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFile.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFileContentBlock.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFileContentBlock.kt index 619076507..cf4efda76 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFileContentBlock.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFileContentBlock.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFileDelta.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFileDelta.kt index da1e05405..087d86340 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFileDelta.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFileDelta.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFileDeltaBlock.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFileDeltaBlock.kt index 224ec5067..185d23cd1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFileDeltaBlock.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageFileDeltaBlock.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrl.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrl.kt index 072c88675..b7a5e951d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrlContentBlock.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrlContentBlock.kt index fe5fe025c..1d49a51db 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrlContentBlock.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrlContentBlock.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrlDelta.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrlDelta.kt index e030074ff..5e7263eb3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrlDelta.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrlDelta.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrlDeltaBlock.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrlDeltaBlock.kt index 9723779d2..2021b6663 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrlDeltaBlock.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/ImageUrlDeltaBlock.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/Message.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/Message.kt index 06b4194cb..141f58f6f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/Message.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/Message.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageContent.kt index 101cbd8cc..8dde77a93 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageContentDelta.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageContentDelta.kt index a7b3113c2..12b26876e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageContentDelta.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageContentDelta.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageContentPartParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageContentPartParam.kt index 4890698c4..7cf3f4177 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageContentPartParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageContentPartParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageCreateParams.kt index 5f762e00a..754958e40 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDeleteParams.kt index 0d41c300c..b3957be4c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDeleted.kt index cd6b51e72..ca7cbf982 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDelta.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDelta.kt index 7415b75fa..65b74cf84 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDelta.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDelta.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDeltaEvent.kt index ebbe83b72..1acee6db9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListPage.kt index 22af8e6d9..71e1cfbb3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListPageAsync.kt index 7524cdce9..059767cb3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListPageResponse.kt index bffca9945..c278bb33a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListParams.kt index 476698863..cf05b1acc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageRetrieveParams.kt index bfb5fe310..edd111d60 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageUpdateParams.kt index 1dc34892c..7994316bc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/MessageUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/RefusalContentBlock.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/RefusalContentBlock.kt index 33406e5ca..4de9cf0e2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/RefusalContentBlock.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/RefusalContentBlock.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/RefusalDeltaBlock.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/RefusalDeltaBlock.kt index 36d3a7a65..fa45dc19d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/RefusalDeltaBlock.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/RefusalDeltaBlock.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/Text.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/Text.kt index 39272754e..a5143b1fa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/Text.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/Text.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextContentBlock.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextContentBlock.kt index 262510ae7..e24c112c3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextContentBlock.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextContentBlock.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextContentBlockParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextContentBlockParam.kt index 2e4168315..4a237ee33 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextContentBlockParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextContentBlockParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextDelta.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextDelta.kt index 540824e98..b7c91e5fa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextDelta.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextDelta.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextDeltaBlock.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextDeltaBlock.kt index 49678d901..d8d885d88 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextDeltaBlock.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/messages/TextDeltaBlock.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RequiredActionFunctionToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RequiredActionFunctionToolCall.kt index 06a0a86f6..b15a53aed 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RequiredActionFunctionToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RequiredActionFunctionToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/Run.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/Run.kt index b372cceb6..ee031eb21 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/Run.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/Run.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunCancelParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunCancelParams.kt index 5c90135e6..4c93dca2f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunCancelParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunCancelParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunCreateParams.kt index 2122900e4..18dab3202 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListPage.kt index 96f1ae19a..3e382f677 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListPageAsync.kt index ef49e6e27..52fb9bdca 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListPageResponse.kt index 78f78e893..33ea6f100 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListParams.kt index 1944ea092..510a4fdb6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunRetrieveParams.kt index 8950e3b15..416bd83a5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunStatus.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunStatus.kt index 0bcacd483..a22e68fba 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunStatus.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunStatus.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunSubmitToolOutputsParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunSubmitToolOutputsParams.kt index 9b6e2ded7..481c1448f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunSubmitToolOutputsParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunSubmitToolOutputsParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunUpdateParams.kt index fc825705c..365e42270 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/RunUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterLogs.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterLogs.kt index 4671f683f..b22663e9f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterLogs.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterLogs.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterOutputImage.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterOutputImage.kt index b23a1e7e0..cc2d4810f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterOutputImage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterOutputImage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCall.kt index 0c6ec8035..aa6ae2fed 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCallDelta.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCallDelta.kt index 44652ee9f..7297d6051 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCallDelta.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCallDelta.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCall.kt index 09a526e8e..85fddde0b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCallDelta.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCallDelta.kt index 64c05e59e..015f92d30 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCallDelta.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCallDelta.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCall.kt index 50d144806..da84be20f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCallDelta.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCallDelta.kt index 5698202da..e17c082d3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCallDelta.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCallDelta.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/MessageCreationStepDetails.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/MessageCreationStepDetails.kt index 1db485140..c2e953376 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/MessageCreationStepDetails.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/MessageCreationStepDetails.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStep.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStep.kt index 48ad4a436..3ba399b7c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStep.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStep.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDelta.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDelta.kt index dd58c97c6..220c1df8f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDelta.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDelta.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaEvent.kt index 53ab73b65..04f261c93 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaMessageDelta.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaMessageDelta.kt index dad1a3e86..91caa7934 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaMessageDelta.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaMessageDelta.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepInclude.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepInclude.kt index 6f25b7c53..31dd1f9db 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepInclude.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/RunStepInclude.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListPage.kt index 542b786df..d27b19860 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListPageAsync.kt index 9b3513c94..c2e7c2c6b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListPageResponse.kt index 3822683ac..268f262ae 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListParams.kt index 997e7f31a..b8b84f35f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepRetrieveParams.kt index 49c663303..04d5d24e8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/StepRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCall.kt index a7dddbe6a..6355b089a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDelta.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDelta.kt index 05de8fdf2..5a11bbe93 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDelta.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDelta.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDeltaObject.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDeltaObject.kt index f8f2d6d71..8033dd697 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDeltaObject.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDeltaObject.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallsStepDetails.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallsStepDetails.kt index d27e03b85..2c741d724 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallsStepDetails.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallsStepDetails.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletion.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletion.kt index fcfead93d..a99da0a67 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletion.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletion.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedToolChoice.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedToolChoice.kt index 5cea7098c..eb51c12ad 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedToolChoice.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedToolChoice.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedTools.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedTools.kt index f47dfa0ed..4427c2958 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedTools.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedTools.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAssistantMessageParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAssistantMessageParam.kt index 2667584cd..003009326 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAssistantMessageParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAssistantMessageParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAudio.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAudio.kt index 3bbd35ca3..4d87b984a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAudio.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAudio.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAudioParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAudioParam.kt index 306e53122..236f0edf0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAudioParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionAudioParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionChunk.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionChunk.kt index 1938f0f2b..a7fbe38a2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionChunk.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionChunk.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPart.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPart.kt index 8bd9ee3f6..6434fdab0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPart.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPart.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartImage.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartImage.kt index 37d444d30..92cf76468 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartImage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartImage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartInputAudio.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartInputAudio.kt index 96cf03fd0..293ccfca5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartInputAudio.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartInputAudio.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartRefusal.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartRefusal.kt index fa4debe0f..bd35d9e4e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartRefusal.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartRefusal.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartText.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartText.kt index cf1437ea4..4a9bad87f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartText.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartText.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParams.kt index 600a1400f..7c00926b9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCustomTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCustomTool.kt index 667a733df..8a2d8eed3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCustomTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCustomTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionDeleteParams.kt index fefa6d6fa..60fe29500 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionDeleted.kt index 48f00d035..267fc792a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionDeveloperMessageParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionDeveloperMessageParam.kt index c8641c322..94655b410 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionDeveloperMessageParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionDeveloperMessageParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionCallOption.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionCallOption.kt index defef2693..1d45dde43 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionCallOption.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionCallOption.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionMessageParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionMessageParam.kt index 846418cbc..8faca5915 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionMessageParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionMessageParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionTool.kt index 9803a0490..754989c0c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListPage.kt index dcaae3ab9..7f7693090 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListPageAsync.kt index 8bc8923cc..7d34e362c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListPageResponse.kt index e8c69e144..9dfe73c0c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListParams.kt index 56c3d7ccd..7b20a0904 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessage.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessage.kt index 76b39ac91..c2f02d6ba 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageCustomToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageCustomToolCall.kt index 25e2c9045..ab03e96fe 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageCustomToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageCustomToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageFunctionToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageFunctionToolCall.kt index 7dd878b13..685e8c6c3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageFunctionToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageFunctionToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageParam.kt index d5e0848ba..5eb4519e8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageToolCall.kt index 522746b89..9379b46ba 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionModality.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionModality.kt index 35f7b889c..6b707ad3b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionModality.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionModality.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoice.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoice.kt index 81a12f66e..91ba2531c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoice.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoice.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoiceCustom.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoiceCustom.kt index e01706a57..57972e24f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoiceCustom.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoiceCustom.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionPredictionContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionPredictionContent.kt index 52f5d2a96..b14132a2b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionPredictionContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionPredictionContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionRetrieveParams.kt index 7b82999d5..a4e1b78fe 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionRole.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionRole.kt index ac1ca0cd3..cca5c03a8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionRole.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionRole.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionStoreMessage.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionStoreMessage.kt index 50f2ed5e6..74d6bc56f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionStoreMessage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionStoreMessage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionStreamOptions.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionStreamOptions.kt index 7bfde6e27..8bd8fa4cb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionStreamOptions.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionStreamOptions.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionSystemMessageParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionSystemMessageParam.kt index bb871bb00..48acc0e14 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionSystemMessageParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionSystemMessageParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionTokenLogprob.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionTokenLogprob.kt index a70c96880..401803867 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionTokenLogprob.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionTokenLogprob.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionTool.kt index 6fd1a00b1..8980eb9af 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionToolChoiceOption.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionToolChoiceOption.kt index 2921ff310..778c00bf9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionToolChoiceOption.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionToolChoiceOption.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionToolMessageParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionToolMessageParam.kt index d00de5c34..386f4385e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionToolMessageParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionToolMessageParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionUpdateParams.kt index 674300252..e5e2b0234 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionUserMessageParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionUserMessageParam.kt index 6746c69b1..5a17982e8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionUserMessageParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionUserMessageParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListPage.kt index 6c5993ad6..c9b297af8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListPageAsync.kt index 539ac762b..b56d58c54 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListPageResponse.kt index 600edb9c9..05fddb045 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListParams.kt index c61578b6a..d2c65f59c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/chat/completions/messages/MessageListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions.messages diff --git a/openai-java-core/src/main/kotlin/com/openai/models/completions/Completion.kt b/openai-java-core/src/main/kotlin/com/openai/models/completions/Completion.kt index 69e3ad9b0..43ca9f74e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/completions/Completion.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/completions/Completion.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/completions/CompletionChoice.kt b/openai-java-core/src/main/kotlin/com/openai/models/completions/CompletionChoice.kt index 7ced7613b..74229912f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/completions/CompletionChoice.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/completions/CompletionChoice.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/completions/CompletionCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/completions/CompletionCreateParams.kt index b44336ddd..113ab958a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/completions/CompletionCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/completions/CompletionCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/completions/CompletionUsage.kt b/openai-java-core/src/main/kotlin/com/openai/models/completions/CompletionUsage.kt index f3821c74c..65366caa1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/completions/CompletionUsage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/completions/CompletionUsage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerCreateParams.kt index 148cab8ae..e7ac1cbc6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerCreateResponse.kt index 507a850a3..124820d1b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerDeleteParams.kt index 4551ac096..3902192f9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListPage.kt index 22666dfc1..6215ad993 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListPageAsync.kt index c6198bd15..ef1376215 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListPageResponse.kt index 0cb31d06c..6cfde7a38 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListParams.kt index ca2c15b6d..4b88118d9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListResponse.kt index ac1065d61..2691c46d5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerListResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerRetrieveParams.kt index e47a1711e..0af5c6206 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerRetrieveResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerRetrieveResponse.kt index 8d34bd90f..9042557c7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerRetrieveResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/ContainerRetrieveResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileCreateParams.kt index f3403d16b..ae188b041 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileCreateResponse.kt index a499364b2..44e81e04b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileDeleteParams.kt index 4b20cc354..b80d18cb6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListPage.kt index e96f41834..b62cb55d2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListPageAsync.kt index 8869f3ba3..f70132d6f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListPageResponse.kt index 84ec340f9..7ce3ed36c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListParams.kt index 22fcc0cdd..da8aa9e9b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListResponse.kt index e4904b1cb..965733176 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileListResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileRetrieveParams.kt index c88d24227..c6d541f9e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileRetrieveResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileRetrieveResponse.kt index 323a31ce7..c4c9eb5b6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileRetrieveResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/FileRetrieveResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/content/ContentRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/content/ContentRetrieveParams.kt index 2200e8792..a5de97830 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/containers/files/content/ContentRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/containers/files/content/ContentRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files.content diff --git a/openai-java-core/src/main/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheck.kt b/openai-java-core/src/main/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheck.kt index 04b1a7fa7..b936180fe 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheck.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheck.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.contentprovenancechecks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheckCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheckCreateParams.kt index 8367384ea..f5959ed8e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheckCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheckCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.contentprovenancechecks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ComputerScreenshotContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ComputerScreenshotContent.kt index b2092d334..89c61c8d6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ComputerScreenshotContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ComputerScreenshotContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/Conversation.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/Conversation.kt index 392330370..fc274945c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/Conversation.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/Conversation.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationCreateParams.kt index b56e683b3..0b59d97f2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationDeleteParams.kt index 19d748082..7f96f1b0a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationDeleted.kt index fb11b97ca..cccdce040 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationDeletedResource.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationDeletedResource.kt index d5b1e2df2..70f8bfcb4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationDeletedResource.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationDeletedResource.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationRetrieveParams.kt index 0ae4d7665..4bb45e11a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationUpdateParams.kt index 22ef906d7..827fe47cf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/ConversationUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/Message.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/Message.kt index b6fdd1907..2012373b8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/Message.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/Message.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/SummaryTextContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/SummaryTextContent.kt index fb96bc82e..58a5cb377 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/SummaryTextContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/SummaryTextContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/TextContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/TextContent.kt index f5afcd35e..bbbec4da9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/TextContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/TextContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ConversationItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ConversationItem.kt index c8bbb031d..e148e04ba 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ConversationItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ConversationItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ConversationItemList.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ConversationItemList.kt index c476e6259..cb95b146d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ConversationItemList.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ConversationItemList.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemCreateParams.kt index bcaa7a015..df200b6c4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemDeleteParams.kt index aa0ab50e5..b7d957729 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemListPage.kt index e8a278bce..f533871aa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemListPageAsync.kt index 7d9b61990..73a874f44 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemListParams.kt index 7fd883572..354f08642 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemRetrieveParams.kt index 6c2755989..db92549a9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/conversations/items/ItemRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/CreateEmbeddingResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/embeddings/CreateEmbeddingResponse.kt index 61f498e02..e216fe9e1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/CreateEmbeddingResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/embeddings/CreateEmbeddingResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.embeddings diff --git a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/Embedding.kt b/openai-java-core/src/main/kotlin/com/openai/models/embeddings/Embedding.kt index 84ed39ad8..ee8cecef1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/Embedding.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/embeddings/Embedding.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.embeddings diff --git a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingCreateParams.kt index 5c861f9a4..28a732753 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.embeddings diff --git a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingModel.kt b/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingModel.kt index 45fa23f08..74f5eece5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingModel.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingModel.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.embeddings diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalCreateParams.kt index 2ca46e6d7..0f9b9c102 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalCreateResponse.kt index fab8eb4cf..e81de5c2b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalCustomDataSourceConfig.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalCustomDataSourceConfig.kt index 903c4c797..ff117e64a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalCustomDataSourceConfig.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalCustomDataSourceConfig.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalDeleteParams.kt index d91e90429..052aff510 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalDeleteResponse.kt index d50d6da4d..cf5fd1045 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListPage.kt index 49147c7bd..038fef4e7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListPageAsync.kt index d28ce4db7..0f9ae35d1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListPageResponse.kt index 2b357d021..a05e008d2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListParams.kt index 2d5abef5f..2e4de5b90 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListResponse.kt index 27f57f2e6..ffc1fdb48 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalListResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalRetrieveParams.kt index 5a4c20ac9..96d6e5043 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalRetrieveResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalRetrieveResponse.kt index a611ed335..1d35278ed 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalRetrieveResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalRetrieveResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalStoredCompletionsDataSourceConfig.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalStoredCompletionsDataSourceConfig.kt index 3bd3b0823..43647a59a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalStoredCompletionsDataSourceConfig.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalStoredCompletionsDataSourceConfig.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalUpdateParams.kt index c46215444..d4afb5710 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalUpdateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalUpdateResponse.kt index 4fa25596f..e70575b32 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalUpdateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/EvalUpdateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/CreateEvalCompletionsRunDataSource.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/CreateEvalCompletionsRunDataSource.kt index c702a792e..e4c541b6a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/CreateEvalCompletionsRunDataSource.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/CreateEvalCompletionsRunDataSource.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/CreateEvalJsonlRunDataSource.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/CreateEvalJsonlRunDataSource.kt index 868d11e9a..f6bd6af13 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/CreateEvalJsonlRunDataSource.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/CreateEvalJsonlRunDataSource.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/EvalApiError.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/EvalApiError.kt index 8c7cdb174..b003f1d88 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/EvalApiError.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/EvalApiError.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCancelParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCancelParams.kt index 87770d54a..72df03d53 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCancelParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCancelParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCancelResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCancelResponse.kt index f94938799..3911796ba 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCancelResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCancelResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCreateParams.kt index adb3051ff..2aff497cd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCreateResponse.kt index 81c3e932f..34c8bd6a7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunDeleteParams.kt index 32b6f5d2d..d1f2313ff 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunDeleteResponse.kt index cd2f1f3e6..d2c0ae125 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListPage.kt index 52f14e7d2..c320c3d07 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListPageAsync.kt index 641149998..22434114c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListPageResponse.kt index 021cd833d..cd0a8e8fd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListParams.kt index a6876f1a4..b881e928c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListResponse.kt index f2a3e3f67..5019560d0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunListResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunRetrieveParams.kt index f38c72b6a..561977db2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunRetrieveResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunRetrieveResponse.kt index d06db9a26..87a62ca5b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunRetrieveResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/RunRetrieveResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPage.kt index 1e4af6f40..c0b382507 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs.outputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPageAsync.kt index 2e6a3e627..d98b6b009 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs.outputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPageResponse.kt index ca3eef1f9..d98c94493 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs.outputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListParams.kt index 244ae33cc..2fa93f24d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs.outputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListResponse.kt index b83219e4f..d4e79ec98 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs.outputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveParams.kt index 869e07d35..c37b3b7ce 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs.outputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveResponse.kt index 6f496b67a..81f573c48 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs.outputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/files/FileContentParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/files/FileContentParams.kt index d635a5896..1b2c52a25 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/files/FileContentParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/files/FileContentParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/files/FileCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/files/FileCreateParams.kt index 9f5bf9895..96e791f67 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/files/FileCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/files/FileCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/files/FileDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/files/FileDeleteParams.kt index 3fce55b46..f36403d9d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/files/FileDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/files/FileDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/files/FileDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/files/FileDeleted.kt index c7862d57d..b061e8794 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/files/FileDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/files/FileDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/files/FileListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/files/FileListPage.kt index 886b40bd2..985b82f7a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/files/FileListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/files/FileListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/files/FileListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/files/FileListPageAsync.kt index 9b28de06c..a62cab960 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/files/FileListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/files/FileListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/files/FileListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/files/FileListPageResponse.kt index e9b1d86b6..aabc8253b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/files/FileListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/files/FileListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/files/FileListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/files/FileListParams.kt index 43c0504e4..d08bb0719 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/files/FileListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/files/FileListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/files/FileObject.kt b/openai-java-core/src/main/kotlin/com/openai/models/files/FileObject.kt index 47a31fa35..22f4ef038 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/files/FileObject.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/files/FileObject.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/files/FilePurpose.kt b/openai-java-core/src/main/kotlin/com/openai/models/files/FilePurpose.kt index 9dd0f42c3..70cf4a73f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/files/FilePurpose.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/files/FilePurpose.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/files/FileRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/files/FileRetrieveParams.kt index 546e9bb12..8fb6f94cd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/files/FileRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/files/FileRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunParams.kt index 9b4aba1f1..904cb9755 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.alpha.graders diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunResponse.kt index ab6bb52f3..5061c55d3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.alpha.graders diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateParams.kt index 889eb314c..a669bb4b0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.alpha.graders diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateResponse.kt index 9f725f508..e92285e67 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.alpha.graders diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePage.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePage.kt index 92ac1ad84..48911d4dd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePageAsync.kt index fb4ecbbdb..0c5c1914b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePageResponse.kt index 5373545d9..f8b9cd84a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateParams.kt index d07953c8a..49ac10431 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateResponse.kt index 6c94fe102..711a8b455 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteParams.kt index fbbdd3725..10523da36 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteResponse.kt index 75c16cca1..fd1559825 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPage.kt index 517dce6fc..79d1adb5b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPageAsync.kt index 5482cb0d8..a0cb9472f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPageResponse.kt index 7656ca588..c420eaad6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListParams.kt index cbbb75b8a..199b5844c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListResponse.kt index 14787610d..421032c67 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveParams.kt index 9d2f2aa06..2d392ff68 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveResponse.kt index 73b82927d..34b95cf93 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJob.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJob.kt index 38c6b38f6..11ad8389d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJob.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJob.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJobEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJobEvent.kt index b2a4908d7..48ecd51bf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJobEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJobEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegration.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegration.kt index 68a3bee09..8acbeebd5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegration.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegration.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegrationObject.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegrationObject.kt index 486647234..2d14e30f6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegrationObject.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegrationObject.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobCancelParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobCancelParams.kt index e2fdf239e..d6bf6b580 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobCancelParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobCancelParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobCreateParams.kt index 205445e5b..541ba22ce 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsPage.kt index 66bd29bde..4ed20beab 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsPageAsync.kt index 87ac0170d..009257492 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsPageResponse.kt index 929489d54..17d7a9f5a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsParams.kt index 5c7943c0f..0b4d4cb59 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListEventsParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListPage.kt index cdea279e9..e9c8abe0a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListPageAsync.kt index 2373ae378..e2b9cf2e1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListPageResponse.kt index f9c0217b7..d306812a6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListParams.kt index 41a087cf3..e926667c4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobPauseParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobPauseParams.kt index 69b10fe8e..df67f8298 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobPauseParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobPauseParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobResumeParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobResumeParams.kt index f20cc02a3..93969aa92 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobResumeParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobResumeParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobRetrieveParams.kt index e56d90da8..699e0b9c0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/JobRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPage.kt index cf8e91c2f..f0d789fb6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs.checkpoints diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPageAsync.kt index c3fab67e2..d138fda62 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs.checkpoints diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPageResponse.kt index ba1af80a8..63d428e18 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs.checkpoints diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListParams.kt index 8aa504b13..acfca502c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs.checkpoints diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/FineTuningJobCheckpoint.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/FineTuningJobCheckpoint.kt index b8037d42b..693040d75 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/FineTuningJobCheckpoint.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/jobs/checkpoints/FineTuningJobCheckpoint.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs.checkpoints diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/DpoHyperparameters.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/DpoHyperparameters.kt index fd7e0a6fe..08c68d9a3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/DpoHyperparameters.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/DpoHyperparameters.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.methods diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/DpoMethod.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/DpoMethod.kt index 118431ca4..58a5a26f3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/DpoMethod.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/DpoMethod.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.methods diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/ReinforcementHyperparameters.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/ReinforcementHyperparameters.kt index 8d5ea07d9..842894309 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/ReinforcementHyperparameters.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/ReinforcementHyperparameters.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.methods diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/ReinforcementMethod.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/ReinforcementMethod.kt index 41a3f3e4c..7354f64a8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/ReinforcementMethod.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/ReinforcementMethod.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.methods diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/SupervisedHyperparameters.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/SupervisedHyperparameters.kt index 24a4dbfb7..2bc764bb9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/SupervisedHyperparameters.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/SupervisedHyperparameters.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.methods diff --git a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/SupervisedMethod.kt b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/SupervisedMethod.kt index 2c88cbd6f..74c30a43b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/SupervisedMethod.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/finetuning/methods/SupervisedMethod.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.methods diff --git a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/EvalContentItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/EvalContentItem.kt index 5f8e99b73..f17350e67 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/EvalContentItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/EvalContentItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/LabelModelGrader.kt b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/LabelModelGrader.kt index e61f5c4dc..e18b81f7b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/LabelModelGrader.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/LabelModelGrader.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/MultiGrader.kt b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/MultiGrader.kt index ae80f0bba..860a29ef9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/MultiGrader.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/MultiGrader.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/PythonGrader.kt b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/PythonGrader.kt index 232674b1f..8f925b7ea 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/PythonGrader.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/PythonGrader.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/ScoreModelGrader.kt b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/ScoreModelGrader.kt index 75ec72e55..88ed993ab 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/ScoreModelGrader.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/ScoreModelGrader.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/StringCheckGrader.kt b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/StringCheckGrader.kt index a9782bd99..1e3521bf2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/StringCheckGrader.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/StringCheckGrader.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/TextSimilarityGrader.kt b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/TextSimilarityGrader.kt index 1688175bc..91c4f3d92 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/TextSimilarityGrader.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/graders/gradermodels/TextSimilarityGrader.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/main/kotlin/com/openai/models/images/Image.kt b/openai-java-core/src/main/kotlin/com/openai/models/images/Image.kt index 7b3268b0a..d71df98b0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/images/Image.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/images/Image.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageCreateVariationParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageCreateVariationParams.kt index 28792f815..780acfcbc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageCreateVariationParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageCreateVariationParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditCompletedEvent.kt index c1417fac4..89fd0d349 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditParams.kt index e5834d8a9..507d6da68 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditPartialImageEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditPartialImageEvent.kt index 43dc1202e..cd435afe6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditPartialImageEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditPartialImageEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditStreamEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditStreamEvent.kt index a8301534e..acde0ab12 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditStreamEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageEditStreamEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenCompletedEvent.kt index 2de70515a..2fad14b26 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenPartialImageEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenPartialImageEvent.kt index 363f770a0..fd4f44f28 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenPartialImageEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenPartialImageEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenStreamEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenStreamEvent.kt index d47e47e23..6edf32bad 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenStreamEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenStreamEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenerateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenerateParams.kt index 3069756e2..9de6d7a4a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenerateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageGenerateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageModel.kt b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageModel.kt index b4603b6d1..6f35ca7c8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/images/ImageModel.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/images/ImageModel.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/main/kotlin/com/openai/models/images/ImagesResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/images/ImagesResponse.kt index 2b5f2c4e5..bb3fda25b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/images/ImagesResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/images/ImagesResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/main/kotlin/com/openai/models/models/Model.kt b/openai-java-core/src/main/kotlin/com/openai/models/models/Model.kt index f47738495..c9f9a27ee 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/models/Model.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/models/Model.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelDeleteParams.kt index df3f58d6c..caf45acd9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelDeleted.kt index c4cf71cb0..c60dcc5dc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListPage.kt index ae145b427..a8d82ec79 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListPageAsync.kt index ebd50ec53..a807401c3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListPageResponse.kt index ef6057416..c1d59c919 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListParams.kt index a7c8bf4b8..6a961bb4b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelRetrieveParams.kt index 6609e6bf4..3f644ce87 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/models/ModelRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/models/ModelRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/main/kotlin/com/openai/models/moderations/Moderation.kt b/openai-java-core/src/main/kotlin/com/openai/models/moderations/Moderation.kt index 086a21567..32e1e562c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/moderations/Moderation.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/moderations/Moderation.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.moderations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationCreateParams.kt index e22eb0bcd..a5b513bae 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.moderations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationCreateResponse.kt index d64c32ce4..405979229 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.moderations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationImageUrlInput.kt b/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationImageUrlInput.kt index 080bf0716..52fb88200 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationImageUrlInput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationImageUrlInput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.moderations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationModel.kt b/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationModel.kt index 8b30ab941..0e57d830d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationModel.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationModel.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.moderations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationMultiModalInput.kt b/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationMultiModalInput.kt index efa3f9cb8..8ae227afa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationMultiModalInput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationMultiModalInput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.moderations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationTextInput.kt b/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationTextInput.kt index d91bdf1fe..8621dcfd5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationTextInput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/moderations/ModerationTextInput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.moderations diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/AudioTranscription.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/AudioTranscription.kt index d4f787179..5d34fadef 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/AudioTranscription.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/AudioTranscription.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationCreatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationCreatedEvent.kt index d4323bec6..6b7350b4e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationCreatedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationCreatedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItem.kt index e91ca594e..f3a9f2083 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemAdded.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemAdded.kt index 9bf74701b..0393a3c8b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemAdded.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemAdded.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemCreateEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemCreateEvent.kt index 8116ae624..b3b5f6929 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemCreateEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemCreateEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemCreatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemCreatedEvent.kt index b73ae0532..3b45eaba3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemCreatedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemCreatedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemDeleteEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemDeleteEvent.kt index 8047a9bdb..d19c109a2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemDeleteEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemDeleteEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemDeletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemDeletedEvent.kt index e9c715313..b78da34c3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemDeletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemDeletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemDone.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemDone.kt index a51286cf0..f5754823a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemDone.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemDone.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionCompletedEvent.kt index 5a37828ed..6a00df185 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionDeltaEvent.kt index 5597e45c7..0df712d4e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionFailedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionFailedEvent.kt index 232962256..485183899 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionFailedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionFailedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionSegment.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionSegment.kt index b0dc237a6..1ce75502f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionSegment.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionSegment.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemRetrieveEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemRetrieveEvent.kt index b1c64823d..aace0e03f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemRetrieveEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemRetrieveEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemTruncateEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemTruncateEvent.kt index 77b888f9a..4e43326d5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemTruncateEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemTruncateEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemTruncatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemTruncatedEvent.kt index b9b9b6638..adc916aeb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemTruncatedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemTruncatedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemWithReference.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemWithReference.kt index 780c64d81..390977ce0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemWithReference.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ConversationItemWithReference.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferAppendEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferAppendEvent.kt index 2d5d0fb80..3b453054d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferAppendEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferAppendEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferClearEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferClearEvent.kt index 1951b485e..e3e17affa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferClearEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferClearEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferClearedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferClearedEvent.kt index 5f164911d..18a49f9e8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferClearedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferClearedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferCommitEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferCommitEvent.kt index 8f6834758..42f987a52 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferCommitEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferCommitEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferCommittedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferCommittedEvent.kt index 2ad51abaa..bb9695f30 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferCommittedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferCommittedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferDtmfEventReceivedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferDtmfEventReceivedEvent.kt index 369eb0153..cea616f30 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferDtmfEventReceivedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferDtmfEventReceivedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStartedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStartedEvent.kt index 434930586..acb2d128a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStartedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStartedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStoppedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStoppedEvent.kt index 059c299ad..5d6d266d2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStoppedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStoppedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferTimeoutTriggered.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferTimeoutTriggered.kt index 048e25d9e..309fd7f2b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferTimeoutTriggered.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/InputAudioBufferTimeoutTriggered.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/LogProbProperties.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/LogProbProperties.kt index 2bfe59576..4d38e6714 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/LogProbProperties.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/LogProbProperties.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/McpListToolsCompleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/McpListToolsCompleted.kt index b7234cc4c..7dbaad42f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/McpListToolsCompleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/McpListToolsCompleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/McpListToolsFailed.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/McpListToolsFailed.kt index 93fdf5573..ffe4639f4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/McpListToolsFailed.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/McpListToolsFailed.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/McpListToolsInProgress.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/McpListToolsInProgress.kt index 2a2dec032..067a08586 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/McpListToolsInProgress.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/McpListToolsInProgress.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/NoiseReductionType.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/NoiseReductionType.kt index c77521894..903ac9e9b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/NoiseReductionType.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/NoiseReductionType.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/OutputAudioBufferClearEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/OutputAudioBufferClearEvent.kt index 3a7c07af0..c0b28c7b2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/OutputAudioBufferClearEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/OutputAudioBufferClearEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RateLimitsUpdatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RateLimitsUpdatedEvent.kt index afcf97331..32c18777a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RateLimitsUpdatedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RateLimitsUpdatedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioConfig.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioConfig.kt index a54c24e0b..8c2207704 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioConfig.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioConfig.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioConfigInput.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioConfigInput.kt index 285bf9cce..a941f725f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioConfigInput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioConfigInput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioConfigOutput.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioConfigOutput.kt index 1959d3fac..16d399bb8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioConfigOutput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioConfigOutput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioFormats.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioFormats.kt index 9069d1aad..b90791150 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioFormats.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioFormats.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioInputTurnDetection.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioInputTurnDetection.kt index 2164fc2a8..2dd4262d5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioInputTurnDetection.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeAudioInputTurnDetection.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeClientEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeClientEvent.kt index dee76b952..14c5f32eb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeClientEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeClientEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemAssistantMessage.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemAssistantMessage.kt index 71b3f82f2..e776c7a3a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemAssistantMessage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemAssistantMessage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCall.kt index ec20253b4..15296ac72 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCallOutput.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCallOutput.kt index 0f03fa82d..efa9fcea5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCallOutput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCallOutput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemSystemMessage.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemSystemMessage.kt index d2607533e..73b1f9ea2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemSystemMessage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemSystemMessage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemUserMessage.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemUserMessage.kt index 2532f0703..5fe2a9baa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemUserMessage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeConversationItemUserMessage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeError.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeError.kt index f71204615..fe3678305 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeError.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeError.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeErrorEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeErrorEvent.kt index c1beb86a8..554d3e115 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeErrorEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeErrorEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeFunctionTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeFunctionTool.kt index afb58eafb..7c935776d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeFunctionTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeFunctionTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpApprovalRequest.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpApprovalRequest.kt index d3e727ff6..aaf5b804d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpApprovalRequest.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpApprovalRequest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpApprovalResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpApprovalResponse.kt index ff683c442..4a2645c77 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpApprovalResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpApprovalResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpListTools.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpListTools.kt index 641a5fce1..91fd28726 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpListTools.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpListTools.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpProtocolError.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpProtocolError.kt index 2177f6c1f..c7df54cd1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpProtocolError.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpProtocolError.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpToolCall.kt index 2d5a5a65c..7fecdc293 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpToolExecutionError.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpToolExecutionError.kt index d705195d4..6e8c04f5c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpToolExecutionError.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcpToolExecutionError.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcphttpError.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcphttpError.kt index 1e6e4297b..261243d50 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcphttpError.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeMcphttpError.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeReasoning.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeReasoning.kt index a5e8d7100..b69ba43dc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeReasoning.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeReasoning.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeReasoningEffort.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeReasoningEffort.kt index f7fc390f9..2df407295 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeReasoningEffort.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeReasoningEffort.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponse.kt index 5bf170892..fe5b3ab95 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseCreateAudioOutput.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseCreateAudioOutput.kt index 5c961e2b1..f173971c8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseCreateAudioOutput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseCreateAudioOutput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseCreateMcpTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseCreateMcpTool.kt index f6fbc7a63..c5b8ee424 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseCreateMcpTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseCreateMcpTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseCreateParams.kt index cf36c463a..e86fa51e0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseStatus.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseStatus.kt index 959971317..e7ff1846d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseStatus.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseStatus.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseUsage.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseUsage.kt index c9b3015e2..3bf839897 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseUsage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseUsage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseUsageInputTokenDetails.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseUsageInputTokenDetails.kt index cfced353b..704d81efe 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseUsageInputTokenDetails.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseUsageInputTokenDetails.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseUsageOutputTokenDetails.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseUsageOutputTokenDetails.kt index 3a5b5d3fc..9f02fc904 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseUsageOutputTokenDetails.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeResponseUsageOutputTokenDetails.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeServerEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeServerEvent.kt index 7c36c7f7b..d7c19951d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeServerEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeServerEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeSession.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeSession.kt index ff46ab439..d64fa1f29 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeSession.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeSession.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeSessionCreateRequest.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeSessionCreateRequest.kt index 02b18b6bc..0e587f744 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeSessionCreateRequest.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeSessionCreateRequest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeToolChoiceConfig.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeToolChoiceConfig.kt index b07ee6050..bb993be10 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeToolChoiceConfig.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeToolChoiceConfig.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeToolsConfigUnion.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeToolsConfigUnion.kt index 5a7986d25..ba6479e3d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeToolsConfigUnion.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeToolsConfigUnion.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTracingConfig.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTracingConfig.kt index 604fff36c..099d1708f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTracingConfig.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTracingConfig.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudio.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudio.kt index 7ff527594..c7a2a2e46 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudio.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudio.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInput.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInput.kt index 4122bc5ac..e6a4a22b2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInputTurnDetection.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInputTurnDetection.kt index a705437a5..b63d0cc1b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInputTurnDetection.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInputTurnDetection.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionCreateRequest.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionCreateRequest.kt index 0ce48ad02..1a3b2eebd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionCreateRequest.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionCreateRequest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationClientEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationClientEvent.kt index f06539a86..4e49974ff 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationClientEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationClientEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateRequest.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateRequest.kt index 388df8559..6b6fef39b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateRequest.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateRequest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateResponse.kt index e5a62d24b..38ca4c0c3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationInputAudioBufferAppendEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationInputAudioBufferAppendEvent.kt index 6cbb6175c..6d083d161 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationInputAudioBufferAppendEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationInputAudioBufferAppendEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationInputTranscriptDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationInputTranscriptDeltaEvent.kt index 5975ae668..4fb38e117 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationInputTranscriptDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationInputTranscriptDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationOutputAudioDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationOutputAudioDeltaEvent.kt index d2594c146..38c71a7b6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationOutputAudioDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationOutputAudioDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationOutputTranscriptDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationOutputTranscriptDeltaEvent.kt index 7c33cba83..3b247e46e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationOutputTranscriptDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationOutputTranscriptDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationServerEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationServerEvent.kt index 5529dbc87..b4f24db58 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationServerEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationServerEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSession.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSession.kt index 2fe613857..dcd4b0460 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSession.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSession.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCloseEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCloseEvent.kt index 789935e6d..ac5f690f0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCloseEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCloseEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionClosedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionClosedEvent.kt index 63ad9938c..057e246b3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionClosedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionClosedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreateRequest.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreateRequest.kt index 669bf2e67..ea6f10f92 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreateRequest.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreateRequest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreatedEvent.kt index 5787905e7..82a6c520b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreatedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreatedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateEvent.kt index 104bb4873..dcac73796 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateRequest.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateRequest.kt index f366082fb..e76d7f83b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateRequest.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateRequest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdatedEvent.kt index f5189586c..693e088c8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdatedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdatedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTruncation.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTruncation.kt index ff871571a..e75c29c74 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTruncation.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTruncation.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTruncationRetentionRatio.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTruncationRetentionRatio.kt index d621e7876..1acab6a84 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTruncationRetentionRatio.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/RealtimeTruncationRetentionRatio.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioDeltaEvent.kt index 3bbc8ad5a..9da50eefd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioDoneEvent.kt index 2a9789879..fc8b3b60c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDeltaEvent.kt index 464a31f84..25cad9c50 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDoneEvent.kt index 55a54bf46..29ccfc304 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseCancelEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseCancelEvent.kt index 71b987f6f..5af27bda9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseCancelEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseCancelEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseContentPartAddedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseContentPartAddedEvent.kt index b9fdf2902..2e1282e37 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseContentPartAddedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseContentPartAddedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseContentPartDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseContentPartDoneEvent.kt index f8e35c4ec..b4f3fa22d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseContentPartDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseContentPartDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseCreateEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseCreateEvent.kt index 145d05e10..526b1dfbf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseCreateEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseCreateEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseCreatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseCreatedEvent.kt index 8a4edb390..f3c89e160 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseCreatedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseCreatedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseDoneEvent.kt index 32e7c3f3f..3de2a44c8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDeltaEvent.kt index eb37f0f2f..0f5b6da2a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDoneEvent.kt index 407540153..1960884b1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDelta.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDelta.kt index 297085e43..8b551f405 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDelta.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDelta.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDone.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDone.kt index 261e57eec..301e94684 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDone.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDone.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallCompleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallCompleted.kt index 99ee2f178..e59372c0b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallCompleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallCompleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallFailed.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallFailed.kt index 921e93010..f29e1ff25 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallFailed.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallFailed.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallInProgress.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallInProgress.kt index 7fbfca590..c51b805fe 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallInProgress.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseMcpCallInProgress.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseOutputItemAddedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseOutputItemAddedEvent.kt index bcc414416..1e674c0f4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseOutputItemAddedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseOutputItemAddedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseOutputItemDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseOutputItemDoneEvent.kt index e67138100..d03542d7f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseOutputItemDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseOutputItemDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseTextDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseTextDeltaEvent.kt index 6c11c105a..51c6a0026 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseTextDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseTextDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseTextDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseTextDoneEvent.kt index 2753b5004..b74da6e6a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseTextDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/ResponseTextDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/SessionCreatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/SessionCreatedEvent.kt index 2b8672e60..2969722a5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/SessionCreatedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/SessionCreatedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/SessionUpdateEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/SessionUpdateEvent.kt index b3ebf6fd3..c62ab9716 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/SessionUpdateEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/SessionUpdateEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/SessionUpdatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/SessionUpdatedEvent.kt index ffe550807..0c9855f85 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/SessionUpdatedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/SessionUpdatedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/TranscriptionSessionUpdate.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/TranscriptionSessionUpdate.kt index f92390507..465cf04e2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/TranscriptionSessionUpdate.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/TranscriptionSessionUpdate.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/TranscriptionSessionUpdatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/TranscriptionSessionUpdatedEvent.kt index 5b123fab3..d3ac55112 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/TranscriptionSessionUpdatedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/TranscriptionSessionUpdatedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallAcceptParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallAcceptParams.kt index 53fbc5974..456ae37b4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallAcceptParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallAcceptParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.calls diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallHangupParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallHangupParams.kt index c62586a3d..e4a52a459 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallHangupParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallHangupParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.calls diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallReferParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallReferParams.kt index ca25dfd68..2376f07f4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallReferParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallReferParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.calls diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallRejectParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallRejectParams.kt index ff7394197..2a8fa8452 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallRejectParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/calls/CallRejectParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.calls diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateParams.kt index 1ca9b3361..8d948f07a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.clientsecrets diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateResponse.kt index 3f51fb359..9b635117a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.clientsecrets diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/RealtimeSessionCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/RealtimeSessionCreateResponse.kt index e5abdf255..c95ae01b5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/RealtimeSessionCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/RealtimeSessionCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.clientsecrets diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionCreateResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionCreateResponse.kt index 81f5c9d46..fee69d587 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionCreateResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionCreateResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.clientsecrets diff --git a/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionTurnDetection.kt b/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionTurnDetection.kt index 979c6b7d0..b95f5a629 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionTurnDetection.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionTurnDetection.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.clientsecrets diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ApplyPatchTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ApplyPatchTool.kt index caef0f64d..be50ce055 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ApplyPatchTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ApplyPatchTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/CompactedResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/CompactedResponse.kt index eec9af05f..dc62e15c2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/CompactedResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/CompactedResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ComputerAction.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ComputerAction.kt index 82df820fd..0901cd540 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ComputerAction.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ComputerAction.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ComputerTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ComputerTool.kt index 43360b860..298800efd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ComputerTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ComputerTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ComputerUsePreviewTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ComputerUsePreviewTool.kt index 17ef58164..7213f7e7b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ComputerUsePreviewTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ComputerUsePreviewTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerAuto.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerAuto.kt index 5ab2bb0c6..2b8ac8a74 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerAuto.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerAuto.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerNetworkPolicyAllowlist.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerNetworkPolicyAllowlist.kt index 62ed15055..3d87eaf1b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerNetworkPolicyAllowlist.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerNetworkPolicyAllowlist.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerNetworkPolicyDisabled.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerNetworkPolicyDisabled.kt index a3e14cd8d..8d5efd4e3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerNetworkPolicyDisabled.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerNetworkPolicyDisabled.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerNetworkPolicyDomainSecret.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerNetworkPolicyDomainSecret.kt index c46842248..8285fb8e8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerNetworkPolicyDomainSecret.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerNetworkPolicyDomainSecret.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerReference.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerReference.kt index 0d45d9150..ccf56f9a4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerReference.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ContainerReference.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/CustomTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/CustomTool.kt index 021503a6c..eed10d84d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/CustomTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/CustomTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/EasyInputMessage.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/EasyInputMessage.kt index 9a5d5ff5f..85cda3a97 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/EasyInputMessage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/EasyInputMessage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/FileSearchTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/FileSearchTool.kt index 2a224c701..42269110d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/FileSearchTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/FileSearchTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/FunctionShellTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/FunctionShellTool.kt index 680add11e..6e21599d8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/FunctionShellTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/FunctionShellTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/FunctionTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/FunctionTool.kt index ab7fc358e..7e1a48e55 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/FunctionTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/FunctionTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/InlineSkill.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/InlineSkill.kt index 194c9345c..b7743b9d9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/InlineSkill.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/InlineSkill.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/InlineSkillSource.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/InlineSkillSource.kt index 5abdcd7a0..e48b5be78 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/InlineSkillSource.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/InlineSkillSource.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/LocalEnvironment.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/LocalEnvironment.kt index e4395fb44..1b280e7f9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/LocalEnvironment.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/LocalEnvironment.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/LocalSkill.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/LocalSkill.kt index a03e8f0e4..885bc7c10 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/LocalSkill.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/LocalSkill.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/NamespaceTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/NamespaceTool.kt index f7aab6621..853833ea7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/NamespaceTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/NamespaceTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/Response.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/Response.kt index c78044b2e..6a1df2340 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/Response.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/Response.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseApplyPatchToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseApplyPatchToolCall.kt index 9302528bb..a57946d26 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseApplyPatchToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseApplyPatchToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseApplyPatchToolCallOutput.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseApplyPatchToolCallOutput.kt index 3e5b27e74..0353fcd66 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseApplyPatchToolCallOutput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseApplyPatchToolCallOutput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioDeltaEvent.kt index 7a0d71bdf..ddc10608c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioDoneEvent.kt index 631724afd..40b7463a1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioTranscriptDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioTranscriptDeltaEvent.kt index b7726220b..61ea1f9e8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioTranscriptDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioTranscriptDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioTranscriptDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioTranscriptDoneEvent.kt index 2601cad74..d210705ce 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioTranscriptDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseAudioTranscriptDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCancelParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCancelParams.kt index 05d3b788f..f23b9fd4e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCancelParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCancelParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDeltaEvent.kt index 1ed4dbcd2..53b1bdad5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDoneEvent.kt index 23a217db6..4491e5511 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCompletedEvent.kt index 9d81d5812..ce2987bb8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInProgressEvent.kt index b7ecdc7bc..52d790c70 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInterpretingEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInterpretingEvent.kt index 809dedb11..66f83d723 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInterpretingEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInterpretingEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterToolCall.kt index 84e7575c1..73644f716 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCodeInterpreterToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactParams.kt index 78f0f2d86..b339110a8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactionItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactionItem.kt index 4572f4c64..579c10ee5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactionItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactionItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactionItemParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactionItemParam.kt index c97e56c00..5074e40de 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactionItemParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactionItemParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompletedEvent.kt index 5c994b98c..34dedd948 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseComputerToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseComputerToolCall.kt index 365f6eeab..30c5b0820 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseComputerToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseComputerToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputItem.kt index 87f6f21a8..dfb7a311a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputScreenshot.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputScreenshot.kt index 2197468d1..7f2a3f05f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputScreenshot.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputScreenshot.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContainerReference.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContainerReference.kt index e8d23463c..1c7099c6d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContainerReference.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContainerReference.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContent.kt index 75e055cdf..f4ba1e655 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContentPartAddedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContentPartAddedEvent.kt index 716f63ef6..10229e839 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContentPartAddedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContentPartAddedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContentPartDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContentPartDoneEvent.kt index 52f7f2cf2..f9579fe9f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContentPartDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseContentPartDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseConversationParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseConversationParam.kt index b3f004127..381808f16 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseConversationParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseConversationParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreateParams.kt index bbc333d41..28709000d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreatedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreatedEvent.kt index a0c6f6e36..a84c280c7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreatedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreatedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCall.kt index de5c5b466..e8c158868 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDeltaEvent.kt index b06fb0eec..331db9600 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDoneEvent.kt index 22344daaf..9f92fdd0f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallItem.kt index fdca197d5..e23720cd2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallOutput.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallOutput.kt index 306e497a2..8b1f2a65f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallOutput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallOutput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallOutputItem.kt index cfb24cc0b..e8c5bd1ad 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCustomToolCallOutputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseDeleteParams.kt index 929789f84..0f315261a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseError.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseError.kt index e76c92dd1..96f5e0206 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseError.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseError.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseErrorEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseErrorEvent.kt index 190119a1a..ab7eec285 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseErrorEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseErrorEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFailedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFailedEvent.kt index 0bc1f67ec..7666e30d9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFailedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFailedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchCallCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchCallCompletedEvent.kt index 2c92fcfaf..960af1297 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchCallCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchCallCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchCallInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchCallInProgressEvent.kt index 4e2895900..994140584 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchCallInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchCallInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchCallSearchingEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchCallSearchingEvent.kt index 3d4f4ab3c..62a5e9acb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchCallSearchingEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchCallSearchingEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchToolCall.kt index 4dc2cfea5..c466b8463 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFileSearchToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFormatTextConfig.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFormatTextConfig.kt index 3c366c728..9e4f5b739 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFormatTextConfig.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFormatTextConfig.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFormatTextJsonSchemaConfig.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFormatTextJsonSchemaConfig.kt index 9f058e76f..6194603ce 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFormatTextJsonSchemaConfig.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFormatTextJsonSchemaConfig.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDeltaEvent.kt index b668cac92..0ceb7efb2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDoneEvent.kt index 3b367d1a1..7e1362090 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionCallOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionCallOutputItem.kt index 3ac7cd006..3738df6f1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionCallOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionCallOutputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionShellCallOutputContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionShellCallOutputContent.kt index feb1b2e0e..8fb8df204 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionShellCallOutputContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionShellCallOutputContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionShellToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionShellToolCall.kt index 02aa01d58..d74d5b688 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionShellToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionShellToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionShellToolCallOutput.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionShellToolCallOutput.kt index ce24e13e7..53391acea 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionShellToolCallOutput.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionShellToolCallOutput.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCall.kt index c2cf3d11f..9d29c9fd6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCallItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCallItem.kt index 6bdfc5fa1..44a0a691a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCallItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCallItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItem.kt index 599b5be04..848c9249c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionWebSearch.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionWebSearch.kt index 791112923..186dc5421 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionWebSearch.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionWebSearch.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallCompletedEvent.kt index ccb5bd92d..2a6b78e9f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallGeneratingEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallGeneratingEvent.kt index 0498bf957..ef054c27b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallGeneratingEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallGeneratingEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallInProgressEvent.kt index d0d01f93e..f0659d81b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallPartialImageEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallPartialImageEvent.kt index 9e835fec7..047a73f41 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallPartialImageEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseImageGenCallPartialImageEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInProgressEvent.kt index 087f6ae68..bd3d05668 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseIncludable.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseIncludable.kt index a520535ec..2337afa88 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseIncludable.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseIncludable.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseIncompleteEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseIncompleteEvent.kt index 8e1c66807..23aa47bec 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseIncompleteEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseIncompleteEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputAudio.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputAudio.kt index 666222f08..be2d37290 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputAudio.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputAudio.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputContent.kt index bc1823645..89b81e0ef 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputFile.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputFile.kt index b743ca1fd..be1d10752 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputFile.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputFile.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputFileContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputFileContent.kt index 4acb93714..7a55d5984 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputFileContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputFileContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputImage.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputImage.kt index 1a96b54a9..67b9e7599 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputImage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputImage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputImageContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputImageContent.kt index 29fd4a0da..0a1a489cb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputImageContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputImageContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputItem.kt index f6fa78941..45620c297 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputMessageItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputMessageItem.kt index 3543a67c8..5f144d0f4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputMessageItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputMessageItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputText.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputText.kt index dbaea2cf4..66e0da4c1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputText.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputText.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputTextContent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputTextContent.kt index 9088c06d3..f304c7fc9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputTextContent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputTextContent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseItem.kt index 29235369d..fe3c03be9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseLocalEnvironment.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseLocalEnvironment.kt index bb8b76956..45e590244 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseLocalEnvironment.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseLocalEnvironment.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDeltaEvent.kt index 6e865eb34..04defdc2b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDoneEvent.kt index d96ebb73a..1cbf6d5b2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallCompletedEvent.kt index ba79633d6..1158ba2d7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallFailedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallFailedEvent.kt index c80b91176..fc0567475 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallFailedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallFailedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallInProgressEvent.kt index 96dab0b32..11a1d2613 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpCallInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpListToolsCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpListToolsCompletedEvent.kt index e652fa00d..254a648e6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpListToolsCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpListToolsCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpListToolsFailedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpListToolsFailedEvent.kt index 44f77741d..5a9b303db 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpListToolsFailedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpListToolsFailedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpListToolsInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpListToolsInProgressEvent.kt index fc9081af8..8b0c5264b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpListToolsInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseMcpListToolsInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputAudio.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputAudio.kt index 94c10132d..65033041b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputAudio.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputAudio.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputItem.kt index df8cbcaf6..947f041cf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputItemAddedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputItemAddedEvent.kt index de58f6986..138ccbcdd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputItemAddedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputItemAddedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputItemDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputItemDoneEvent.kt index d6f4a72a6..82fd700a9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputItemDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputItemDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputMessage.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputMessage.kt index dee374f89..489419fa7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputMessage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputMessage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputRefusal.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputRefusal.kt index 83cd9b1a0..2c4caaefb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputRefusal.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputRefusal.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputText.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputText.kt index 5a5771c1d..020b611ff 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputText.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputText.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputTextAnnotationAddedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputTextAnnotationAddedEvent.kt index 4c2cb3e13..a869e2dd3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputTextAnnotationAddedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseOutputTextAnnotationAddedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponsePrompt.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponsePrompt.kt index 2525daec8..a34bb6a29 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponsePrompt.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponsePrompt.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseQueuedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseQueuedEvent.kt index 995cacab5..7ac7bc793 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseQueuedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseQueuedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningItem.kt index a25761360..f7444baae 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartAddedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartAddedEvent.kt index 54a2df2d1..c533e374f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartAddedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartAddedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartDoneEvent.kt index 3f7a342b1..4b87bd0a1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDeltaEvent.kt index 01329102b..fd6667a75 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDoneEvent.kt index ee85eeac2..846a1753e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningTextDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningTextDeltaEvent.kt index 397d1289a..b58f09823 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningTextDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningTextDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningTextDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningTextDoneEvent.kt index 888a5b7a3..7af11548b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningTextDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseReasoningTextDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseRefusalDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseRefusalDeltaEvent.kt index 87261cc57..d77594e1a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseRefusalDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseRefusalDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseRefusalDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseRefusalDoneEvent.kt index 03047167d..5254dde21 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseRefusalDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseRefusalDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseRetrieveParams.kt index eb5238a40..90fc0e71e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseStatus.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseStatus.kt index ac9815e30..683d42848 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseStatus.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseStatus.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseStreamEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseStreamEvent.kt index 2b1477f89..fc8a22c7c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseStreamEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseStreamEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextConfig.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextConfig.kt index d15a1a1dc..18de0b4f2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextConfig.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextConfig.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextDeltaEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextDeltaEvent.kt index ae874ed77..38eb53f0f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextDeltaEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextDeltaEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextDoneEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextDoneEvent.kt index 4591737a4..45223d7dd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextDoneEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextDoneEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseToolSearchCall.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseToolSearchCall.kt index 598cbfa05..06880d6b7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseToolSearchCall.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseToolSearchCall.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseToolSearchOutputItem.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseToolSearchOutputItem.kt index 09cc927f1..a17ff4c63 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseToolSearchOutputItem.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseToolSearchOutputItem.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseToolSearchOutputItemParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseToolSearchOutputItemParam.kt index 134bf468d..f6d444909 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseToolSearchOutputItemParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseToolSearchOutputItemParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseUsage.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseUsage.kt index 3913d74a5..be76e585b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseUsage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseUsage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseWebSearchCallCompletedEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseWebSearchCallCompletedEvent.kt index 9bcb212be..911bf994a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseWebSearchCallCompletedEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseWebSearchCallCompletedEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseWebSearchCallInProgressEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseWebSearchCallInProgressEvent.kt index 7f9a76f71..9a33e0cdd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseWebSearchCallInProgressEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseWebSearchCallInProgressEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseWebSearchCallSearchingEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseWebSearchCallSearchingEvent.kt index c9bd875ae..1599ac768 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseWebSearchCallSearchingEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseWebSearchCallSearchingEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponsesClientEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponsesClientEvent.kt index 4f6f7365c..71455f47f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponsesClientEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponsesClientEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponsesServerEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponsesServerEvent.kt index d20376985..071c16500 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponsesServerEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponsesServerEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/SkillReference.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/SkillReference.kt index 267f76712..0daf679bf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/SkillReference.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/SkillReference.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/Tool.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/Tool.kt index da0ea494b..a2435e98a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/Tool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/Tool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceAllowed.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceAllowed.kt index 63d41cedf..338230419 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceAllowed.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceAllowed.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceApplyPatch.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceApplyPatch.kt index 019aed5c8..6992540a7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceApplyPatch.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceApplyPatch.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceCustom.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceCustom.kt index 18590a035..650d7002d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceCustom.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceCustom.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceFunction.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceFunction.kt index f4941217f..70a0cbbe4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceFunction.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceFunction.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceMcp.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceMcp.kt index a6add462c..1d6353176 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceMcp.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceMcp.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceOptions.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceOptions.kt index 8ee449ec1..a5155d7b1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceOptions.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceOptions.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceShell.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceShell.kt index b876d118f..124083e9f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceShell.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceShell.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceTypes.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceTypes.kt index bd26b7ee5..2771540dd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceTypes.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolChoiceTypes.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolSearchTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolSearchTool.kt index bde06d2c3..59a9a961f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolSearchTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ToolSearchTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/WebSearchPreviewTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/WebSearchPreviewTool.kt index 8c836e9bb..8557202c0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/WebSearchPreviewTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/WebSearchPreviewTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/WebSearchTool.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/WebSearchTool.kt index 47c003967..0c84af3b6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/WebSearchTool.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/WebSearchTool.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/InputItemListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/InputItemListPage.kt index e957029c1..20ed7a940 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/InputItemListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/InputItemListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses.inputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/InputItemListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/InputItemListPageAsync.kt index 93054a45e..9454f0803 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/InputItemListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/InputItemListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses.inputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/InputItemListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/InputItemListParams.kt index 2ec50d04e..657a3ec76 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/InputItemListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/InputItemListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses.inputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/ResponseItemList.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/ResponseItemList.kt index bab68444f..ab2ed4bb8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/ResponseItemList.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/inputitems/ResponseItemList.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses.inputitems diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/inputtokens/InputTokenCountParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/inputtokens/InputTokenCountParams.kt index 5dc54ca33..10e95ed10 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/inputtokens/InputTokenCountParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/inputtokens/InputTokenCountParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses.inputtokens diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/inputtokens/InputTokenCountResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/inputtokens/InputTokenCountResponse.kt index 8909c88f6..63d7ed66e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/inputtokens/InputTokenCountResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/inputtokens/InputTokenCountResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses.inputtokens diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/DeletedSkill.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/DeletedSkill.kt index 1ff1d8219..6e847d770 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/DeletedSkill.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/DeletedSkill.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/Skill.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/Skill.kt index ee2dd5b97..240240184 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/Skill.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/Skill.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillCreateParams.kt index 82958a3a3..b621e5f0f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillDeleteParams.kt index 8fb1915e4..18dfff1f3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillList.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillList.kt index 8a4b78876..124dcd642 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillList.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillList.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillListPage.kt index c7390133b..de463c567 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillListPageAsync.kt index 6631e3dc8..dd5d0cace 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillListParams.kt index 3f2bf9a85..f2b40267b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillRetrieveParams.kt index 52e504241..b45301055 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillUpdateParams.kt index 82c9e896d..9d3a0043b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/SkillUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/content/ContentRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/content/ContentRetrieveParams.kt index 856b2735f..d2d17b628 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/content/ContentRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/content/ContentRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.content diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/DeletedSkillVersion.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/DeletedSkillVersion.kt index 4149e1be8..9f0068d64 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/DeletedSkillVersion.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/DeletedSkillVersion.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/SkillVersion.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/SkillVersion.kt index 1f6c7f9c4..4cee440f7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/SkillVersion.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/SkillVersion.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/SkillVersionList.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/SkillVersionList.kt index 66e583cbe..984c7f2a6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/SkillVersionList.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/SkillVersionList.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionCreateParams.kt index 7c772b2f7..d24872966 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionDeleteParams.kt index 2f6f26f1b..e00d542e6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionListPage.kt index aaf2a6364..9718a41d8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionListPageAsync.kt index a78c9e2a3..1f2f5ea21 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionListParams.kt index 23fec2d49..dc9afda62 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionRetrieveParams.kt index d5088e16e..00bbca2c1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/VersionRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/content/ContentRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/content/ContentRetrieveParams.kt index 5adfa611d..a30ceb4ea 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/content/ContentRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/skills/versions/content/ContentRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions.content diff --git a/openai-java-core/src/main/kotlin/com/openai/models/uploads/Upload.kt b/openai-java-core/src/main/kotlin/com/openai/models/uploads/Upload.kt index d8aba4d47..266783e8b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/uploads/Upload.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/uploads/Upload.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.uploads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/uploads/UploadCancelParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/uploads/UploadCancelParams.kt index 4bdd76b54..1648ba3fa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/uploads/UploadCancelParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/uploads/UploadCancelParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.uploads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/uploads/UploadCompleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/uploads/UploadCompleteParams.kt index 0387a8302..fcdf7e3a4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/uploads/UploadCompleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/uploads/UploadCompleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.uploads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/uploads/UploadCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/uploads/UploadCreateParams.kt index feb4aa95a..3499f4d76 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/uploads/UploadCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/uploads/UploadCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.uploads diff --git a/openai-java-core/src/main/kotlin/com/openai/models/uploads/parts/PartCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/uploads/parts/PartCreateParams.kt index 599b744e3..30495f942 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/uploads/parts/PartCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/uploads/parts/PartCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.uploads.parts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/uploads/parts/UploadPart.kt b/openai-java-core/src/main/kotlin/com/openai/models/uploads/parts/UploadPart.kt index 32859a98d..fe02ec103 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/uploads/parts/UploadPart.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/uploads/parts/UploadPart.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.uploads.parts diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/AutoFileChunkingStrategyParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/AutoFileChunkingStrategyParam.kt index 31c61c28b..249f97caa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/AutoFileChunkingStrategyParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/AutoFileChunkingStrategyParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/FileChunkingStrategy.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/FileChunkingStrategy.kt index b2e09411a..a3183f634 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/FileChunkingStrategy.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/FileChunkingStrategy.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/FileChunkingStrategyParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/FileChunkingStrategyParam.kt index 7d0672698..df558cecd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/FileChunkingStrategyParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/FileChunkingStrategyParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/OtherFileChunkingStrategyObject.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/OtherFileChunkingStrategyObject.kt index 68436a031..37d1385c2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/OtherFileChunkingStrategyObject.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/OtherFileChunkingStrategyObject.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategy.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategy.kt index 1abd2b2bf..759a6c7e7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategy.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategy.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObject.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObject.kt index 26d3b9519..e7c3c2633 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObject.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObject.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObjectParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObjectParam.kt index 7e3871228..2e79b9e71 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObjectParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObjectParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStore.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStore.kt index 15d5efbd5..f001e9b15 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStore.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStore.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreCreateParams.kt index 8ce548dca..16824f425 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreDeleteParams.kt index 7d55e3074..31d18e112 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreDeleted.kt index 007b07462..2814090fc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListPage.kt index b4ebc2388..1e57d33d1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListPageAsync.kt index abbefadf3..56c3c20c2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListPageResponse.kt index 1bc7f5779..b0c627685 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListParams.kt index e487bc5fb..a8a823911 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreRetrieveParams.kt index e269b2519..970ea28a6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchPage.kt index 3089623e8..99e7c7594 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchPageAsync.kt index 0356e3fa0..df291c0be 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchPageResponse.kt index caeee6509..80dc171af 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchParams.kt index 44dfc6ed3..ff2c412cf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchResponse.kt index 84d04b3e6..e4befdb11 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreSearchResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreUpdateParams.kt index fca133cf4..b4192df42 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/VectorStoreUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCancelParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCancelParams.kt index 5a7756c5b..9e56f908f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCancelParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCancelParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCreateParams.kt index 8271b3a81..06fd8a2b8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPage.kt index 4aeec8709..194766003 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPageAsync.kt index e60958997..85dce1a84 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPageResponse.kt index e0e54a5bd..2e5406cc2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesParams.kt index c54aa1b57..c3c1d5a0c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchRetrieveParams.kt index d3f10d1c3..c661026c5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/FileBatchRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/VectorStoreFileBatch.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/VectorStoreFileBatch.kt index e4162a7b7..db0085266 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/VectorStoreFileBatch.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/filebatches/VectorStoreFileBatch.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentPage.kt index 8eb33ec61..2d16bc29a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentPageAsync.kt index d8bb6edb0..e7ea12203 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentPageResponse.kt index 239b43ea2..a15730187 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentParams.kt index 35af4905a..d8d8da1aa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentResponse.kt index 405ab77b9..6243f4cee 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileContentResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileCreateParams.kt index 34bb7c996..092530f3d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileDeleteParams.kt index 2b356e0c6..6af2684f9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListPage.kt index b80554f28..320dc9341 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListPageAsync.kt index 258701a43..c1391c710 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListPageResponse.kt index 68ab16c95..6b6e325f2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListParams.kt index b2cf9b600..8ef9be46f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileRetrieveParams.kt index 46ef5cf9d..40b517233 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileUpdateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileUpdateParams.kt index 5d23329d0..095265f6f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileUpdateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/FileUpdateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/VectorStoreFile.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/VectorStoreFile.kt index 16e8f4653..ed01d15f4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/VectorStoreFile.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/VectorStoreFile.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/VectorStoreFileDeleted.kt b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/VectorStoreFileDeleted.kt index 2f4d2c613..e191ae3a5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/VectorStoreFileDeleted.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/vectorstores/files/VectorStoreFileDeleted.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/ImageInputReferenceParam.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/ImageInputReferenceParam.kt index 47bf6bf84..7401f066e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/ImageInputReferenceParam.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/ImageInputReferenceParam.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/Video.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/Video.kt index 7edfb398d..07f00b948 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/Video.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/Video.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateCharacterParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateCharacterParams.kt index 51bb26513..79669a8a1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateCharacterParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateCharacterParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateCharacterResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateCharacterResponse.kt index a0dabae67..b64c8a3d6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateCharacterResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateCharacterResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateError.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateError.kt index 1e8d9f850..99eb3b31d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateError.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateError.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateParams.kt index f9f43fa3b..62718747c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoCreateParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoDeleteParams.kt index f9c53fa53..4434da835 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoDeleteParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoDeleteParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoDeleteResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoDeleteResponse.kt index ca1b3bce4..6d0e79593 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoDeleteResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoDeleteResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoDownloadContentParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoDownloadContentParams.kt index 5e831eca7..abe23c12c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoDownloadContentParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoDownloadContentParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoEditParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoEditParams.kt index e04ecd653..81a43872b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoEditParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoEditParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoExtendParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoExtendParams.kt index d16e486c4..421a7e9e3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoExtendParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoExtendParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoGetCharacterParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoGetCharacterParams.kt index 5ba43ac63..310f43cc1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoGetCharacterParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoGetCharacterParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoGetCharacterResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoGetCharacterResponse.kt index 56e226972..f3aa13836 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoGetCharacterResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoGetCharacterResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListPage.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListPage.kt index c82994bac..7094bd7f9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListPage.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListPage.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListPageAsync.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListPageAsync.kt index 3de3f90dd..8521ebe74 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListPageAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListPageAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListPageResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListPageResponse.kt index dbbe60445..380ab7544 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListPageResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListPageResponse.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListParams.kt index 09f6daf3a..b431860a8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoListParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoModel.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoModel.kt index 49e11c28c..794bf4452 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoModel.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoModel.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoRemixParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoRemixParams.kt index 9ba95c1af..18d5d8031 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoRemixParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoRemixParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoRetrieveParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoRetrieveParams.kt index cc40e8f0a..3e6baecc2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoRetrieveParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoRetrieveParams.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoSeconds.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoSeconds.kt index ae000e506..eec329580 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoSeconds.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoSeconds.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoSize.kt b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoSize.kt index 870cf94ce..891061378 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoSize.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/videos/VideoSize.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchCancelledWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchCancelledWebhookEvent.kt index 142563d90..b99f54bc7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchCancelledWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchCancelledWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchCompletedWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchCompletedWebhookEvent.kt index 28d1413ff..54d4982c9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchCompletedWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchCompletedWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchExpiredWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchExpiredWebhookEvent.kt index 1a9c917c6..3d143b922 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchExpiredWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchExpiredWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchFailedWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchFailedWebhookEvent.kt index 1db350c24..449e4f134 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchFailedWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/BatchFailedWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/EvalRunCanceledWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/EvalRunCanceledWebhookEvent.kt index 49f4befdf..d5c4c6f85 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/EvalRunCanceledWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/EvalRunCanceledWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/EvalRunFailedWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/EvalRunFailedWebhookEvent.kt index 7205def59..7aa38ce11 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/EvalRunFailedWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/EvalRunFailedWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/EvalRunSucceededWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/EvalRunSucceededWebhookEvent.kt index dcf13aa5c..063846439 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/EvalRunSucceededWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/EvalRunSucceededWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/FineTuningJobCancelledWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/FineTuningJobCancelledWebhookEvent.kt index 580706b64..ef21dbf54 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/FineTuningJobCancelledWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/FineTuningJobCancelledWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/FineTuningJobFailedWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/FineTuningJobFailedWebhookEvent.kt index ff7a80db8..dea923a88 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/FineTuningJobFailedWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/FineTuningJobFailedWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/FineTuningJobSucceededWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/FineTuningJobSucceededWebhookEvent.kt index e7416fab8..1df43067d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/FineTuningJobSucceededWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/FineTuningJobSucceededWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/LiveCallIncomingWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/LiveCallIncomingWebhookEvent.kt index a8de15e1f..a9b5ffa0e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/LiveCallIncomingWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/LiveCallIncomingWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/RealtimeCallIncomingWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/RealtimeCallIncomingWebhookEvent.kt index 2d2aa635a..2d76fcf91 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/RealtimeCallIncomingWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/RealtimeCallIncomingWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseCancelledWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseCancelledWebhookEvent.kt index af4ca0a09..fc5080bf4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseCancelledWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseCancelledWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseCompletedWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseCompletedWebhookEvent.kt index f57ac3280..ea0899b8b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseCompletedWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseCompletedWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseFailedWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseFailedWebhookEvent.kt index 8c72a7adc..0360d0b30 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseFailedWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseFailedWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseIncompleteWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseIncompleteWebhookEvent.kt index 31095de70..e73858b8a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseIncompleteWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/ResponseIncompleteWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/UnwrapWebhookEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/UnwrapWebhookEvent.kt index dbb3201cd..5ec183e51 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/webhooks/UnwrapWebhookEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/webhooks/UnwrapWebhookEvent.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/AdminServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/AdminServiceAsync.kt index 4388da431..9226de177 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/AdminServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/AdminServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/AdminServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/AdminServiceAsyncImpl.kt index 8efea367c..1f35d45a9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/AdminServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/AdminServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/AudioServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/AudioServiceAsync.kt index ac1a49a3f..65f16f8b6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/AudioServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/AudioServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/AudioServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/AudioServiceAsyncImpl.kt index deadcd491..7c1789bdc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/AudioServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/AudioServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/BatchServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/BatchServiceAsync.kt index a7fd6505b..5cd029c41 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/BatchServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/BatchServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/BatchServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/BatchServiceAsyncImpl.kt index b9725411d..2c1f1dfb5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/BatchServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/BatchServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsync.kt index 761616917..7cf75db3b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsyncImpl.kt index 3d1aa3887..5086f1585 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ChatServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ChatServiceAsync.kt index 5a8a2e379..d23a8a18d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ChatServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ChatServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ChatServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ChatServiceAsyncImpl.kt index d2b3e8356..ca67191db 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ChatServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ChatServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/CompletionServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/CompletionServiceAsync.kt index 0794751d7..89f45978a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/CompletionServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/CompletionServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/CompletionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/CompletionServiceAsyncImpl.kt index 6b3f3bd66..4c20cd1cb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/CompletionServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/CompletionServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ContainerServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ContainerServiceAsync.kt index f7667b7b0..e8ec7f806 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ContainerServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ContainerServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ContainerServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ContainerServiceAsyncImpl.kt index 38e95900c..614268207 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ContainerServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ContainerServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ContentProvenanceCheckServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ContentProvenanceCheckServiceAsync.kt index 4431d7e66..2d4ecd716 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ContentProvenanceCheckServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ContentProvenanceCheckServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ContentProvenanceCheckServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ContentProvenanceCheckServiceAsyncImpl.kt index 5985d0eb7..2acdd7962 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ContentProvenanceCheckServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ContentProvenanceCheckServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ConversationServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ConversationServiceAsync.kt index 021da2c25..a358b766c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ConversationServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ConversationServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ConversationServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ConversationServiceAsyncImpl.kt index 44377ff5d..0f90995ac 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ConversationServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ConversationServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/EmbeddingServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/EmbeddingServiceAsync.kt index 7f1d4997d..da7386533 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/EmbeddingServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/EmbeddingServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/EmbeddingServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/EmbeddingServiceAsyncImpl.kt index daeb9988a..9a77cdc06 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/EmbeddingServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/EmbeddingServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/EvalServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/EvalServiceAsync.kt index d19c8aaf1..a05ff2453 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/EvalServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/EvalServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/EvalServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/EvalServiceAsyncImpl.kt index 2daa8405e..a09af60fc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/EvalServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/EvalServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/FileServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/FileServiceAsync.kt index 63efe23a5..4ccbb14fc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/FileServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/FileServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/FileServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/FileServiceAsyncImpl.kt index 254acc07a..6e24a5624 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/FileServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/FileServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/FineTuningServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/FineTuningServiceAsync.kt index a2f61ed2a..16fcb107e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/FineTuningServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/FineTuningServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/FineTuningServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/FineTuningServiceAsyncImpl.kt index e546ca6e4..4e6b848b4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/FineTuningServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/FineTuningServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/GraderServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/GraderServiceAsync.kt index 3ea099a87..1798c88ae 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/GraderServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/GraderServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/GraderServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/GraderServiceAsyncImpl.kt index 2acfb9dae..1c31a4c0b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/GraderServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/GraderServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ImageServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ImageServiceAsync.kt index 8dcbd0e0d..4eb32f1ec 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ImageServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ImageServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ImageServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ImageServiceAsyncImpl.kt index e57b91809..2049cc35c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ImageServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ImageServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ModelServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ModelServiceAsync.kt index ea70d8c06..c317dbea8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ModelServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ModelServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ModelServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ModelServiceAsyncImpl.kt index 7e572d6b7..06c8cb0ff 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ModelServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ModelServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ModerationServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ModerationServiceAsync.kt index 0f8767002..a282cc67b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ModerationServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ModerationServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ModerationServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ModerationServiceAsyncImpl.kt index 7a18a9122..a3a99206e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ModerationServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ModerationServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/RealtimeServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/RealtimeServiceAsync.kt index 8595c99a5..b965e3f07 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/RealtimeServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/RealtimeServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/RealtimeServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/RealtimeServiceAsyncImpl.kt index 4b2443bfc..32fa944dd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/RealtimeServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/RealtimeServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsync.kt index 0cccc981e..249e50eb4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsyncImpl.kt index 8a38b0adb..7a50e0d41 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/SkillServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/SkillServiceAsync.kt index 7659e1d31..6fca4e98b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/SkillServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/SkillServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/SkillServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/SkillServiceAsyncImpl.kt index 6494d9319..463a595b9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/SkillServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/SkillServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/UploadServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/UploadServiceAsync.kt index 950c2ebd0..481aec1b1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/UploadServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/UploadServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/UploadServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/UploadServiceAsyncImpl.kt index 7e8569f06..3f7f8af60 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/UploadServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/UploadServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/VectorStoreServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/VectorStoreServiceAsync.kt index 864f01a93..5355bd60d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/VectorStoreServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/VectorStoreServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/VectorStoreServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/VectorStoreServiceAsyncImpl.kt index 129bd047d..2faac4d8a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/VectorStoreServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/VectorStoreServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/VideoServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/VideoServiceAsync.kt index b7f8f85e6..f82370701 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/VideoServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/VideoServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/VideoServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/VideoServiceAsyncImpl.kt index 2cfe8c891..616b3786c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/VideoServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/VideoServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsync.kt index df2cfc17e..32113be5b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsyncImpl.kt index b351ebd4b..373d69eab 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/OrganizationServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/OrganizationServiceAsync.kt index 7bf991a36..47d3dfb4b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/OrganizationServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/OrganizationServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/OrganizationServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/OrganizationServiceAsyncImpl.kt index 84f9bbbbd..666d71e85 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/OrganizationServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/OrganizationServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AdminApiKeyServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AdminApiKeyServiceAsync.kt index 6bac7e883..19707111a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AdminApiKeyServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AdminApiKeyServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AdminApiKeyServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AdminApiKeyServiceAsyncImpl.kt index 8a930af06..209526d3c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AdminApiKeyServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AdminApiKeyServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AuditLogServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AuditLogServiceAsync.kt index f89aa377b..929e364f1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AuditLogServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AuditLogServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AuditLogServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AuditLogServiceAsyncImpl.kt index b6e416537..7320335a6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AuditLogServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/AuditLogServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/CertificateServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/CertificateServiceAsync.kt index ff66803e9..d8aa4703d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/CertificateServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/CertificateServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/CertificateServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/CertificateServiceAsyncImpl.kt index 0797e67e3..1a3aafcf2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/CertificateServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/CertificateServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/DataRetentionServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/DataRetentionServiceAsync.kt index 0ebd422f2..caf139afe 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/DataRetentionServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/DataRetentionServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/DataRetentionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/DataRetentionServiceAsyncImpl.kt index 2dd958822..60836a454 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/DataRetentionServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/DataRetentionServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/GroupServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/GroupServiceAsync.kt index ef7c31ba1..ccfe58006 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/GroupServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/GroupServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/GroupServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/GroupServiceAsyncImpl.kt index 898f2d721..8986b449e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/GroupServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/GroupServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/InviteServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/InviteServiceAsync.kt index ef8e5b406..cdd361710 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/InviteServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/InviteServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/InviteServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/InviteServiceAsyncImpl.kt index 87d03bf87..3142d8ece 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/InviteServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/InviteServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/ProjectServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/ProjectServiceAsync.kt index 36d35dcf7..184592aa3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/ProjectServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/ProjectServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/ProjectServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/ProjectServiceAsyncImpl.kt index b6e6a584b..ea821b429 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/ProjectServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/ProjectServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/RoleServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/RoleServiceAsync.kt index 06177ed9e..3ba26f635 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/RoleServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/RoleServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/RoleServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/RoleServiceAsyncImpl.kt index 0baa8ae60..1f6b25d24 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/RoleServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/RoleServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendAlertServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendAlertServiceAsync.kt index 2a63a343c..e3e31ca89 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendAlertServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendAlertServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendAlertServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendAlertServiceAsyncImpl.kt index 9da956a46..5134bebf2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendAlertServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendAlertServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendLimitServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendLimitServiceAsync.kt index d4aef3435..cddc6171c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendLimitServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendLimitServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendLimitServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendLimitServiceAsyncImpl.kt index 50669b810..0b7ebbac8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendLimitServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/SpendLimitServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UsageServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UsageServiceAsync.kt index 5ec1e60fa..755400ca0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UsageServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UsageServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UsageServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UsageServiceAsyncImpl.kt index 076e81e1a..6b8f063f6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UsageServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UsageServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UserServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UserServiceAsync.kt index b43f58336..51b4b9774 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UserServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UserServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UserServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UserServiceAsyncImpl.kt index b5d564eff..917ba6ab9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UserServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/UserServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/RoleServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/RoleServiceAsync.kt index abaa4905a..c7e045b63 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/RoleServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/RoleServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/RoleServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/RoleServiceAsyncImpl.kt index 62b61d094..5dbf22227 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/RoleServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/RoleServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/UserServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/UserServiceAsync.kt index 7c0a2089f..04c73618d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/UserServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/UserServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/UserServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/UserServiceAsyncImpl.kt index e431b78e5..4a4aaf96f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/UserServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/groups/UserServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ApiKeyServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ApiKeyServiceAsync.kt index b8c45e55c..c293062a6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ApiKeyServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ApiKeyServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ApiKeyServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ApiKeyServiceAsyncImpl.kt index 0ad9e3851..9a3d1409a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ApiKeyServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ApiKeyServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/CertificateServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/CertificateServiceAsync.kt index 895686974..b9617aafb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/CertificateServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/CertificateServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/CertificateServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/CertificateServiceAsyncImpl.kt index 8705218bb..1efabf406 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/CertificateServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/CertificateServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/DataRetentionServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/DataRetentionServiceAsync.kt index 4dfeba7a8..526d7e670 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/DataRetentionServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/DataRetentionServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/DataRetentionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/DataRetentionServiceAsyncImpl.kt index 92e6497a4..868c5f9f9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/DataRetentionServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/DataRetentionServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/GroupServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/GroupServiceAsync.kt index be59fa2cb..6788e698e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/GroupServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/GroupServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/GroupServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/GroupServiceAsyncImpl.kt index e84d2968f..01def70f4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/GroupServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/GroupServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/HostedToolPermissionServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/HostedToolPermissionServiceAsync.kt index cc79b93ab..369835491 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/HostedToolPermissionServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/HostedToolPermissionServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/HostedToolPermissionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/HostedToolPermissionServiceAsyncImpl.kt index b8f60b830..e6c4060d2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/HostedToolPermissionServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/HostedToolPermissionServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ModelPermissionServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ModelPermissionServiceAsync.kt index c3f78e55a..d038990a9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ModelPermissionServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ModelPermissionServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ModelPermissionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ModelPermissionServiceAsyncImpl.kt index 52427b9af..add8103c8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ModelPermissionServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ModelPermissionServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RateLimitServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RateLimitServiceAsync.kt index b1803f177..9581e7456 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RateLimitServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RateLimitServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RateLimitServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RateLimitServiceAsyncImpl.kt index f335e9e56..34c2d1750 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RateLimitServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RateLimitServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RoleServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RoleServiceAsync.kt index 8d9d6c704..488964219 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RoleServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RoleServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RoleServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RoleServiceAsyncImpl.kt index 20fd771ba..2d46deb35 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RoleServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/RoleServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ServiceAccountServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ServiceAccountServiceAsync.kt index b1259f0cc..629129d5e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ServiceAccountServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ServiceAccountServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ServiceAccountServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ServiceAccountServiceAsyncImpl.kt index ab4e9d9d3..2232772d7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ServiceAccountServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/ServiceAccountServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendAlertServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendAlertServiceAsync.kt index 95b762cdf..1bd574c00 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendAlertServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendAlertServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendAlertServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendAlertServiceAsyncImpl.kt index d94d64ece..9d16201fb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendAlertServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendAlertServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendLimitServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendLimitServiceAsync.kt index 213da0709..1961e7bcd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendLimitServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendLimitServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendLimitServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendLimitServiceAsyncImpl.kt index 57556d7ca..26262bb4d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendLimitServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/SpendLimitServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/UserServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/UserServiceAsync.kt index dce870df0..6c4e5514b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/UserServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/UserServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/UserServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/UserServiceAsyncImpl.kt index a1c244160..34983f6f3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/UserServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/UserServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/groups/RoleServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/groups/RoleServiceAsync.kt index 139b9de5e..afa782d8b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/groups/RoleServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/groups/RoleServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/groups/RoleServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/groups/RoleServiceAsyncImpl.kt index 7f5399c7f..4a562dcb0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/groups/RoleServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/groups/RoleServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/serviceaccounts/ApiKeyServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/serviceaccounts/ApiKeyServiceAsync.kt index 5ed8ef44c..9d440e735 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/serviceaccounts/ApiKeyServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/serviceaccounts/ApiKeyServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/serviceaccounts/ApiKeyServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/serviceaccounts/ApiKeyServiceAsyncImpl.kt index ed835208a..d5d9c882a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/serviceaccounts/ApiKeyServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/serviceaccounts/ApiKeyServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/users/RoleServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/users/RoleServiceAsync.kt index 72f3caff3..90f73e565 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/users/RoleServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/users/RoleServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/users/RoleServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/users/RoleServiceAsyncImpl.kt index 5e637d191..ac411eb60 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/users/RoleServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/projects/users/RoleServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/users/RoleServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/users/RoleServiceAsync.kt index b15b5b6d7..dccc7f763 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/users/RoleServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/users/RoleServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.users diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/users/RoleServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/users/RoleServiceAsyncImpl.kt index 8c3526bdc..b528ee563 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/users/RoleServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/admin/organization/users/RoleServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.users diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/SpeechServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/SpeechServiceAsync.kt index 322f5fbf1..48d2cfff9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/SpeechServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/SpeechServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/SpeechServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/SpeechServiceAsyncImpl.kt index 84c04b7b2..6da642182 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/SpeechServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/SpeechServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranscriptionServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranscriptionServiceAsync.kt index fddaabc28..d570926f7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranscriptionServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranscriptionServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncImpl.kt index 7a30b9761..707e599fd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranslationServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranslationServiceAsync.kt index 28001da67..2c8653442 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranslationServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranslationServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranslationServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranslationServiceAsyncImpl.kt index 7573095a8..c0c6d605a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranslationServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranslationServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/AssistantServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/AssistantServiceAsync.kt index 68c297bbf..51a774064 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/AssistantServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/AssistantServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/AssistantServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/AssistantServiceAsyncImpl.kt index f6b5eeecf..8a279a3d6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/AssistantServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/AssistantServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ChatKitServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ChatKitServiceAsync.kt index f2fd48c62..5633d1c82 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ChatKitServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ChatKitServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ChatKitServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ChatKitServiceAsyncImpl.kt index df50de0de..12db435e1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ChatKitServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ChatKitServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ResponseServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ResponseServiceAsync.kt index a44b764fd..c71a9f36b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ResponseServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ResponseServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ResponseServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ResponseServiceAsyncImpl.kt index 9ac4eb375..a5c13e835 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ResponseServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ResponseServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ThreadServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ThreadServiceAsync.kt index 2a55ee13d..f60a1f878 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ThreadServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ThreadServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ThreadServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ThreadServiceAsyncImpl.kt index 589eed687..e55f7cd1e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ThreadServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/ThreadServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/SessionServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/SessionServiceAsync.kt index c824c6134..7e4cb62b7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/SessionServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/SessionServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.chatkit diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/SessionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/SessionServiceAsyncImpl.kt index 0240cd5b2..bab85904e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/SessionServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/SessionServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.chatkit diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/ThreadServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/ThreadServiceAsync.kt index 5d3235611..8aa9a90e9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/ThreadServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/ThreadServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.chatkit diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/ThreadServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/ThreadServiceAsyncImpl.kt index b52014877..316039766 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/ThreadServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/chatkit/ThreadServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.chatkit diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputItemServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputItemServiceAsync.kt index 80b422488..151943461 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputItemServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputItemServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputItemServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputItemServiceAsyncImpl.kt index d379173f7..4a6e08ab2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputItemServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputItemServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputTokenServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputTokenServiceAsync.kt index a18e2baea..533947334 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputTokenServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputTokenServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputTokenServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputTokenServiceAsyncImpl.kt index 199c2f47d..55d486089 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputTokenServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/responses/InputTokenServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/MessageServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/MessageServiceAsync.kt index 742435e2d..c61cc33fc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/MessageServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/MessageServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/MessageServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/MessageServiceAsyncImpl.kt index 9a136725d..fe7dd9acb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/MessageServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/MessageServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/RunServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/RunServiceAsync.kt index 567b1c648..ffa2ae5cf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/RunServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/RunServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/RunServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/RunServiceAsyncImpl.kt index 9d8695c72..807ddf9d7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/RunServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/RunServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/runs/StepServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/runs/StepServiceAsync.kt index 30803a4d7..c4f1dde15 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/runs/StepServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/runs/StepServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/runs/StepServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/runs/StepServiceAsyncImpl.kt index 81fecadb9..9773f8527 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/runs/StepServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/beta/threads/runs/StepServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsync.kt index 4d5c729f4..f64280f72 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.chat diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsyncImpl.kt index df4baef6c..720075d3f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.chat diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/chat/completions/MessageServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/chat/completions/MessageServiceAsync.kt index a1b9e0a3d..ac1c09bf6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/chat/completions/MessageServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/chat/completions/MessageServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/chat/completions/MessageServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/chat/completions/MessageServiceAsyncImpl.kt index ab6ab808b..50dee1358 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/chat/completions/MessageServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/chat/completions/MessageServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/containers/FileServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/containers/FileServiceAsync.kt index 40a8343ad..212db23fc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/containers/FileServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/containers/FileServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/containers/FileServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/containers/FileServiceAsyncImpl.kt index f68071ed5..6671cd08a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/containers/FileServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/containers/FileServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/containers/files/ContentServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/containers/files/ContentServiceAsync.kt index f67248a9e..fdbfc354b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/containers/files/ContentServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/containers/files/ContentServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/containers/files/ContentServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/containers/files/ContentServiceAsyncImpl.kt index 31283228e..48f4985b8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/containers/files/ContentServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/containers/files/ContentServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/conversations/ItemServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/conversations/ItemServiceAsync.kt index 04db88cd0..dd1edce92 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/conversations/ItemServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/conversations/ItemServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/conversations/ItemServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/conversations/ItemServiceAsyncImpl.kt index 2857d023b..0a4870880 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/conversations/ItemServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/conversations/ItemServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/evals/RunServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/evals/RunServiceAsync.kt index 526360f87..651c4d7ae 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/evals/RunServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/evals/RunServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/evals/RunServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/evals/RunServiceAsyncImpl.kt index 12e552727..67f57f144 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/evals/RunServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/evals/RunServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/evals/runs/OutputItemServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/evals/runs/OutputItemServiceAsync.kt index f9215b1ca..b478bd921 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/evals/runs/OutputItemServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/evals/runs/OutputItemServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/evals/runs/OutputItemServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/evals/runs/OutputItemServiceAsyncImpl.kt index db40500f1..783e93924 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/evals/runs/OutputItemServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/evals/runs/OutputItemServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/AlphaServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/AlphaServiceAsync.kt index b43834da1..41fcae261 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/AlphaServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/AlphaServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/AlphaServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/AlphaServiceAsyncImpl.kt index 53a2434cb..06e8480e6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/AlphaServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/AlphaServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/CheckpointServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/CheckpointServiceAsync.kt index 5a13a1703..728ea158f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/CheckpointServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/CheckpointServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/CheckpointServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/CheckpointServiceAsyncImpl.kt index 876f566eb..bfcca2f15 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/CheckpointServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/CheckpointServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/JobServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/JobServiceAsync.kt index 3be110d3c..8746e6c40 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/JobServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/JobServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/JobServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/JobServiceAsyncImpl.kt index ef0d99281..ecdac83e7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/JobServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/JobServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/MethodServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/MethodServiceAsync.kt index d414ac504..ac880ec5d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/MethodServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/MethodServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/MethodServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/MethodServiceAsyncImpl.kt index 908985a4e..a4022cdc6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/MethodServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/MethodServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/alpha/GraderServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/alpha/GraderServiceAsync.kt index 6632a616e..375a4a148 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/alpha/GraderServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/alpha/GraderServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning.alpha diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/alpha/GraderServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/alpha/GraderServiceAsyncImpl.kt index d69d90bd7..6751bd12b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/alpha/GraderServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/alpha/GraderServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning.alpha diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsync.kt index 75105aa9b..80eb16ca3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning.checkpoints diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsyncImpl.kt index 6cbcca412..3db8e6db6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning.checkpoints diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/jobs/CheckpointServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/jobs/CheckpointServiceAsync.kt index 95fe8b5b4..1b5440d6a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/jobs/CheckpointServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/jobs/CheckpointServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/jobs/CheckpointServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/jobs/CheckpointServiceAsyncImpl.kt index edb446cf1..6dca96561 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/jobs/CheckpointServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/jobs/CheckpointServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/graders/GraderModelServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/graders/GraderModelServiceAsync.kt index c66e1978e..57a501a33 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/graders/GraderModelServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/graders/GraderModelServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.graders diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/graders/GraderModelServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/graders/GraderModelServiceAsyncImpl.kt index 58c21cbf8..16133bc06 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/graders/GraderModelServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/graders/GraderModelServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.graders diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/CallServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/CallServiceAsync.kt index 16fe3831b..570b013cc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/CallServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/CallServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/CallServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/CallServiceAsyncImpl.kt index a06552be7..d1f29bf9d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/CallServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/CallServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/ClientSecretServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/ClientSecretServiceAsync.kt index b71a20abe..9cb595980 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/ClientSecretServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/ClientSecretServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/ClientSecretServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/ClientSecretServiceAsyncImpl.kt index 6744268ff..f6922f924 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/ClientSecretServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/realtime/ClientSecretServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputItemServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputItemServiceAsync.kt index d56790c5e..a6e7c4135 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputItemServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputItemServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputItemServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputItemServiceAsyncImpl.kt index b749fb4d5..8feecdbac 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputItemServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputItemServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputTokenServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputTokenServiceAsync.kt index d507f5cf0..cafeff73b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputTokenServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputTokenServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputTokenServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputTokenServiceAsyncImpl.kt index 4774fb3e5..2e640cbc9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputTokenServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/responses/InputTokenServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/skills/ContentServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/skills/ContentServiceAsync.kt index 4f00f5566..ff987a30b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/skills/ContentServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/skills/ContentServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/skills/ContentServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/skills/ContentServiceAsyncImpl.kt index ebb893e8b..fac050dbf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/skills/ContentServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/skills/ContentServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/skills/VersionServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/skills/VersionServiceAsync.kt index 2ce054aab..6d3ea228e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/skills/VersionServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/skills/VersionServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/skills/VersionServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/skills/VersionServiceAsyncImpl.kt index 14af11748..784ef45bd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/skills/VersionServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/skills/VersionServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/skills/versions/ContentServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/skills/versions/ContentServiceAsync.kt index 2217ab056..23dd56d7a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/skills/versions/ContentServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/skills/versions/ContentServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.skills.versions diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/skills/versions/ContentServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/skills/versions/ContentServiceAsyncImpl.kt index aac744d88..0bad80dc5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/skills/versions/ContentServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/skills/versions/ContentServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.skills.versions diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/uploads/PartServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/uploads/PartServiceAsync.kt index 0568899a3..49cf2da8a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/uploads/PartServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/uploads/PartServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.uploads diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/uploads/PartServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/uploads/PartServiceAsyncImpl.kt index 28c13c129..e0485f201 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/uploads/PartServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/uploads/PartServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.uploads diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileBatchServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileBatchServiceAsync.kt index 0c80d8e7d..aabc09c1a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileBatchServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileBatchServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileBatchServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileBatchServiceAsyncImpl.kt index 7c8545b65..cee446daf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileBatchServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileBatchServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileServiceAsync.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileServiceAsync.kt index 3f3a063b4..625de41dd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileServiceAsync.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileServiceAsync.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileServiceAsyncImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileServiceAsyncImpl.kt index d89967559..7ab1a0f34 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileServiceAsyncImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/async/vectorstores/FileServiceAsyncImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/AdminService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/AdminService.kt index d6324e3cf..277eb4e31 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/AdminService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/AdminService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/AdminServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/AdminServiceImpl.kt index 6c3dcdf6f..a1830e531 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/AdminServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/AdminServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/AudioService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/AudioService.kt index d7e98226d..7a8bb93ae 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/AudioService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/AudioService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/AudioServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/AudioServiceImpl.kt index 1006134f6..b9670dadd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/AudioServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/AudioServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/BatchService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/BatchService.kt index e24788a18..99540132b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/BatchService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/BatchService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/BatchServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/BatchServiceImpl.kt index 7067e4979..a67a86b50 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/BatchServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/BatchServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaService.kt index c8d55b74a..d21c95893 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaServiceImpl.kt index 6d43821f1..e333d735c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ChatService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ChatService.kt index 3d7f40b7e..1a51916dd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ChatService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ChatService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ChatServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ChatServiceImpl.kt index 4387eeef3..dfcd83c86 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ChatServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ChatServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/CompletionService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/CompletionService.kt index e50fd570b..0f9882c36 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/CompletionService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/CompletionService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/CompletionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/CompletionServiceImpl.kt index 515626768..89373b977 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/CompletionServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/CompletionServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContainerService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContainerService.kt index faffa865a..c0544f6a9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContainerService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContainerService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContainerServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContainerServiceImpl.kt index f1f839ac0..8ac54b28c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContainerServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContainerServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContentProvenanceCheckService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContentProvenanceCheckService.kt index 7781bd53b..b6856d77f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContentProvenanceCheckService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContentProvenanceCheckService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContentProvenanceCheckServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContentProvenanceCheckServiceImpl.kt index 93363bc1d..80eb127f1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContentProvenanceCheckServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ContentProvenanceCheckServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ConversationService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ConversationService.kt index 4a76d2279..1c056806d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ConversationService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ConversationService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ConversationServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ConversationServiceImpl.kt index 433fa21ef..7e9a09008 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ConversationServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ConversationServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/EmbeddingService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/EmbeddingService.kt index 3ae44d352..3517b7482 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/EmbeddingService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/EmbeddingService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/EmbeddingServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/EmbeddingServiceImpl.kt index aac7bcafa..6cfd4a90d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/EmbeddingServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/EmbeddingServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/EvalService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/EvalService.kt index e3ff11510..27eeb1273 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/EvalService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/EvalService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/EvalServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/EvalServiceImpl.kt index ea2f0ee38..739157ee6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/EvalServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/EvalServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/FileService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/FileService.kt index fb03d95c8..3acb40dd5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/FileService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/FileService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/FileServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/FileServiceImpl.kt index f8d81ebdb..aa5b023bf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/FileServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/FileServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/FineTuningService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/FineTuningService.kt index c278b8315..c74e403f4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/FineTuningService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/FineTuningService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/FineTuningServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/FineTuningServiceImpl.kt index c59770669..c6d68d321 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/FineTuningServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/FineTuningServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/GraderService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/GraderService.kt index 66a534607..a04214ae3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/GraderService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/GraderService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/GraderServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/GraderServiceImpl.kt index 3ed1a141f..fa9d7c4d2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/GraderServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/GraderServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ImageService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ImageService.kt index af13a13f9..b2beff053 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ImageService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ImageService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ImageServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ImageServiceImpl.kt index 6d59457c1..f1988f6f3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ImageServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ImageServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModelService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModelService.kt index 1e1febd96..d47bec0c1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModelService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModelService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModelServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModelServiceImpl.kt index bbccd5bf9..00d3594a0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModelServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModelServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModerationService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModerationService.kt index 02aab22ec..20a7cb738 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModerationService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModerationService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModerationServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModerationServiceImpl.kt index b3165d1d9..fc802de6e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModerationServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ModerationServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/RealtimeService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/RealtimeService.kt index b776aa494..e36c05aad 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/RealtimeService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/RealtimeService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/RealtimeServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/RealtimeServiceImpl.kt index aa4301263..0e1377739 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/RealtimeServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/RealtimeServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseService.kt index 9a738760f..a820aea1d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseServiceImpl.kt index 6fd9eda32..4e97c7bd3 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/SkillService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/SkillService.kt index f26a7949b..a33f9fb22 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/SkillService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/SkillService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/SkillServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/SkillServiceImpl.kt index 130a18ad8..842bc3804 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/SkillServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/SkillServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/UploadService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/UploadService.kt index dbc9d2177..f988d74c6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/UploadService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/UploadService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/UploadServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/UploadServiceImpl.kt index c8aceaa87..2ae4db6e6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/UploadServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/UploadServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/VectorStoreService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/VectorStoreService.kt index 8705e8582..28515f723 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/VectorStoreService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/VectorStoreService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/VectorStoreServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/VectorStoreServiceImpl.kt index 107acf0db..8b705410c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/VectorStoreServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/VectorStoreServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/VideoService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/VideoService.kt index ed0e8ed74..518c50087 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/VideoService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/VideoService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/VideoServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/VideoServiceImpl.kt index 53a9b80cf..842db298d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/VideoServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/VideoServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookService.kt index 81886d7b3..6c34ba22d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookServiceImpl.kt index 63d019c38..594a14b77 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/OrganizationService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/OrganizationService.kt index 8e83ed759..12452b3a9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/OrganizationService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/OrganizationService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/OrganizationServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/OrganizationServiceImpl.kt index 199351e83..65454b90c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/OrganizationServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/OrganizationServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AdminApiKeyService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AdminApiKeyService.kt index 8d09206b2..1a5b1a12c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AdminApiKeyService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AdminApiKeyService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AdminApiKeyServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AdminApiKeyServiceImpl.kt index ae6a8d59b..be653b87f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AdminApiKeyServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AdminApiKeyServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AuditLogService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AuditLogService.kt index 0df144905..f14982a4c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AuditLogService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AuditLogService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AuditLogServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AuditLogServiceImpl.kt index 77ce44ad5..e430caaba 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AuditLogServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/AuditLogServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/CertificateService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/CertificateService.kt index a65c30469..3577ce9e4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/CertificateService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/CertificateService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/CertificateServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/CertificateServiceImpl.kt index 1b845c99d..df612864f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/CertificateServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/CertificateServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/DataRetentionService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/DataRetentionService.kt index 06cf86216..29a358056 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/DataRetentionService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/DataRetentionService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/DataRetentionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/DataRetentionServiceImpl.kt index cb67260e3..49583b9e0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/DataRetentionServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/DataRetentionServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/GroupService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/GroupService.kt index 54daa79d5..9ebaaea58 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/GroupService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/GroupService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/GroupServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/GroupServiceImpl.kt index 121e2835e..39863f2f8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/GroupServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/GroupServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/InviteService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/InviteService.kt index 90d9c2cc1..2ad92bd93 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/InviteService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/InviteService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/InviteServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/InviteServiceImpl.kt index 251356a62..a5ca9ae3f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/InviteServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/InviteServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/ProjectService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/ProjectService.kt index 35214e749..d2a8559ed 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/ProjectService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/ProjectService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/ProjectServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/ProjectServiceImpl.kt index 0a37aa90d..7937b84f5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/ProjectServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/ProjectServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/RoleService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/RoleService.kt index 90ac66c03..13d00249c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/RoleService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/RoleService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/RoleServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/RoleServiceImpl.kt index 7a64dcffa..f625f0021 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/RoleServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/RoleServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendAlertService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendAlertService.kt index e5e52ffd4..d79975ebe 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendAlertService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendAlertService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendAlertServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendAlertServiceImpl.kt index 3ad432189..2b600dcb9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendAlertServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendAlertServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendLimitService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendLimitService.kt index c76d14cb2..1d3c5dc6d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendLimitService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendLimitService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendLimitServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendLimitServiceImpl.kt index 9ce193fc4..e9ebbf3f2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendLimitServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/SpendLimitServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UsageService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UsageService.kt index 6bde4d519..6350cd43c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UsageService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UsageService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UsageServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UsageServiceImpl.kt index a3f3f8f4e..1bb192e03 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UsageServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UsageServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UserService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UserService.kt index f4e856426..fe7c5ef7c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UserService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UserService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UserServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UserServiceImpl.kt index 6c3a69143..d398741fa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UserServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/UserServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/RoleService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/RoleService.kt index 00c3a91e6..37d004900 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/RoleService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/RoleService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/RoleServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/RoleServiceImpl.kt index df41fe9e6..6754d210f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/RoleServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/RoleServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/UserService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/UserService.kt index 917b9b4d9..996853356 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/UserService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/UserService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/UserServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/UserServiceImpl.kt index 0409950fd..240d70101 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/UserServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/groups/UserServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ApiKeyService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ApiKeyService.kt index 0e4834762..d0da8cf7b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ApiKeyService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ApiKeyService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ApiKeyServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ApiKeyServiceImpl.kt index d0abc2bc0..bfcacc11e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ApiKeyServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ApiKeyServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/CertificateService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/CertificateService.kt index 1c595d020..fd996f97b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/CertificateService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/CertificateService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/CertificateServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/CertificateServiceImpl.kt index e2fcfa6d6..c42d1540e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/CertificateServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/CertificateServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/DataRetentionService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/DataRetentionService.kt index d98e08f2b..0b7916b19 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/DataRetentionService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/DataRetentionService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/DataRetentionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/DataRetentionServiceImpl.kt index 4470d20f2..00f1779cc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/DataRetentionServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/DataRetentionServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/GroupService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/GroupService.kt index 1c624076c..e7dd85fef 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/GroupService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/GroupService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/GroupServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/GroupServiceImpl.kt index a8416b924..6e7df9a85 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/GroupServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/GroupServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/HostedToolPermissionService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/HostedToolPermissionService.kt index 5e6db074c..b1b68897c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/HostedToolPermissionService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/HostedToolPermissionService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/HostedToolPermissionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/HostedToolPermissionServiceImpl.kt index 95408d56f..8c27cb42a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/HostedToolPermissionServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/HostedToolPermissionServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ModelPermissionService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ModelPermissionService.kt index 1284d7093..d750bee47 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ModelPermissionService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ModelPermissionService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ModelPermissionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ModelPermissionServiceImpl.kt index d4708751a..1c804230a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ModelPermissionServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ModelPermissionServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RateLimitService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RateLimitService.kt index de70ccf1d..652543e6c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RateLimitService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RateLimitService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RateLimitServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RateLimitServiceImpl.kt index 6c4255698..0bdef8e87 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RateLimitServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RateLimitServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RoleService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RoleService.kt index 63f23fab8..16e3cd6bf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RoleService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RoleService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RoleServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RoleServiceImpl.kt index bb492031f..261107e41 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RoleServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/RoleServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ServiceAccountService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ServiceAccountService.kt index b30d500b3..f535abdbb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ServiceAccountService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ServiceAccountService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ServiceAccountServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ServiceAccountServiceImpl.kt index 92e79334d..9caad151c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ServiceAccountServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/ServiceAccountServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendAlertService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendAlertService.kt index 0e6595beb..9b4d51329 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendAlertService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendAlertService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendAlertServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendAlertServiceImpl.kt index ba64a035e..46cfc3931 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendAlertServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendAlertServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendLimitService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendLimitService.kt index 8148055f4..985ecf61a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendLimitService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendLimitService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendLimitServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendLimitServiceImpl.kt index 89500dea7..e44259a3d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendLimitServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/SpendLimitServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/UserService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/UserService.kt index 3f543f339..4eef536e0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/UserService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/UserService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/UserServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/UserServiceImpl.kt index 1e6c96c3c..bfa8824c8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/UserServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/UserServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/groups/RoleService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/groups/RoleService.kt index ff1e8719b..793708900 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/groups/RoleService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/groups/RoleService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/groups/RoleServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/groups/RoleServiceImpl.kt index efa38b8cc..b387c1944 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/groups/RoleServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/groups/RoleServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects.groups diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/serviceaccounts/ApiKeyService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/serviceaccounts/ApiKeyService.kt index 6ded38ee5..abfd48c92 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/serviceaccounts/ApiKeyService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/serviceaccounts/ApiKeyService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/serviceaccounts/ApiKeyServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/serviceaccounts/ApiKeyServiceImpl.kt index a0e661061..8b7a0c606 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/serviceaccounts/ApiKeyServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/serviceaccounts/ApiKeyServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/users/RoleService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/users/RoleService.kt index 111edf432..d27da4bc5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/users/RoleService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/users/RoleService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/users/RoleServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/users/RoleServiceImpl.kt index f36918e5a..8e41532d0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/users/RoleServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/projects/users/RoleServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects.users diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/users/RoleService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/users/RoleService.kt index bff8b40bc..fe4dfd054 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/users/RoleService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/users/RoleService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.users diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/users/RoleServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/users/RoleServiceImpl.kt index ff92984ea..5e509816c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/users/RoleServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/admin/organization/users/RoleServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.users diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/SpeechService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/SpeechService.kt index 342feb452..119a65fff 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/SpeechService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/SpeechService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/SpeechServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/SpeechServiceImpl.kt index 7f3d7a80d..c55c65540 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/SpeechServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/SpeechServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranscriptionService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranscriptionService.kt index 441b76124..6efcf4205 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranscriptionService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranscriptionService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranscriptionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranscriptionServiceImpl.kt index bb5ea2d05..abd25b032 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranscriptionServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranscriptionServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranslationService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranslationService.kt index 0b453c3e9..56c991e8b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranslationService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranslationService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranslationServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranslationServiceImpl.kt index 300ed980b..94c6456dd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranslationServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranslationServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.audio diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/AssistantService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/AssistantService.kt index 610bc300a..3ec94e71b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/AssistantService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/AssistantService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/AssistantServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/AssistantServiceImpl.kt index 95a45a048..3508ed5fe 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/AssistantServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/AssistantServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ChatKitService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ChatKitService.kt index 358f3d12d..936d3cbce 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ChatKitService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ChatKitService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ChatKitServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ChatKitServiceImpl.kt index f75f45a0c..97b7fcd9b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ChatKitServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ChatKitServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ResponseService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ResponseService.kt index 93de14a15..fb348896e 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ResponseService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ResponseService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ResponseServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ResponseServiceImpl.kt index 98a378825..947fb53d6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ResponseServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ResponseServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ThreadService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ThreadService.kt index f904e4eff..3af4637ff 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ThreadService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ThreadService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ThreadServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ThreadServiceImpl.kt index 97373c3c6..471fcbb78 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ThreadServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/ThreadServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/SessionService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/SessionService.kt index 9fd879f65..bba03b732 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/SessionService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/SessionService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.chatkit diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/SessionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/SessionServiceImpl.kt index 1eecc4882..3fed99d86 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/SessionServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/SessionServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.chatkit diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/ThreadService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/ThreadService.kt index 23d01cb0b..7da22bc66 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/ThreadService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/ThreadService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.chatkit diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/ThreadServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/ThreadServiceImpl.kt index 4e696745a..b662ef9ff 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/ThreadServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/chatkit/ThreadServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.chatkit diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputItemService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputItemService.kt index 14fddb75a..e51e712f6 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputItemService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputItemService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputItemServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputItemServiceImpl.kt index b5e2a9ce1..bb38a3e56 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputItemServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputItemServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputTokenService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputTokenService.kt index edab010b0..34eb22d3a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputTokenService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputTokenService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputTokenServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputTokenServiceImpl.kt index 10c8b1ef0..1b4679eae 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputTokenServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/responses/InputTokenServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/MessageService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/MessageService.kt index 0c199afe4..d6798ede9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/MessageService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/MessageService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/MessageServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/MessageServiceImpl.kt index f033795fe..3b311951a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/MessageServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/MessageServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/RunService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/RunService.kt index 83ef2f379..fd63bdff5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/RunService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/RunService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/RunServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/RunServiceImpl.kt index 19c79d48e..436eb31bd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/RunServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/RunServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.threads diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/runs/StepService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/runs/StepService.kt index 500323287..d96b3d3bf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/runs/StepService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/runs/StepService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/runs/StepServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/runs/StepServiceImpl.kt index 6f2b5fc5f..882ed1d97 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/runs/StepServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/beta/threads/runs/StepServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.threads.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/ChatCompletionService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/ChatCompletionService.kt index 0c74406c1..a6e5aff63 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/ChatCompletionService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/ChatCompletionService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.chat diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/ChatCompletionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/ChatCompletionServiceImpl.kt index 1c02de6a0..29c3e24c8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/ChatCompletionServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/ChatCompletionServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.chat diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/completions/MessageService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/completions/MessageService.kt index b4706ff06..dd906df06 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/completions/MessageService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/completions/MessageService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/completions/MessageServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/completions/MessageServiceImpl.kt index 150022db8..0f859a68c 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/completions/MessageServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/completions/MessageServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.chat.completions diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/FileService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/FileService.kt index 3a4adc42c..31e609988 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/FileService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/FileService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/FileServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/FileServiceImpl.kt index 682db828e..23529fa96 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/FileServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/FileServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.containers diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/files/ContentService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/files/ContentService.kt index 9db02956e..e7eef16fa 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/files/ContentService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/files/ContentService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/files/ContentServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/files/ContentServiceImpl.kt index 538c2c538..8d1509a2a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/files/ContentServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/files/ContentServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.containers.files diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/conversations/ItemService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/conversations/ItemService.kt index 4e5463a0a..66678b595 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/conversations/ItemService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/conversations/ItemService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/conversations/ItemServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/conversations/ItemServiceImpl.kt index 93c1fd54e..859f2c279 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/conversations/ItemServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/conversations/ItemServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.conversations diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/RunService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/RunService.kt index 9e1a4584b..08a9aa4c9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/RunService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/RunService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/RunServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/RunServiceImpl.kt index 2fb7ce131..94b593929 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/RunServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/RunServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.evals diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/runs/OutputItemService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/runs/OutputItemService.kt index e9804d26c..38829f4d8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/runs/OutputItemService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/runs/OutputItemService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/runs/OutputItemServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/runs/OutputItemServiceImpl.kt index 46a394be2..8e9033df7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/runs/OutputItemServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/evals/runs/OutputItemServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.evals.runs diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/AlphaService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/AlphaService.kt index 667ae0a6c..df333424f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/AlphaService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/AlphaService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/AlphaServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/AlphaServiceImpl.kt index 7e299839d..cfa964cc7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/AlphaServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/AlphaServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/CheckpointService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/CheckpointService.kt index cd25cd59e..dbc847c95 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/CheckpointService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/CheckpointService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/CheckpointServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/CheckpointServiceImpl.kt index fc49a20a7..af946f18d 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/CheckpointServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/CheckpointServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/JobService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/JobService.kt index cd927e85e..3d846e20b 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/JobService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/JobService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/JobServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/JobServiceImpl.kt index 508d61371..17a56a08a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/JobServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/JobServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/MethodService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/MethodService.kt index acee9546d..043782d52 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/MethodService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/MethodService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/MethodServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/MethodServiceImpl.kt index d7b1437e5..4b6267ffe 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/MethodServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/MethodServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/alpha/GraderService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/alpha/GraderService.kt index ecbf1b30f..50ee27e94 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/alpha/GraderService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/alpha/GraderService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning.alpha diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/alpha/GraderServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/alpha/GraderServiceImpl.kt index efd926699..6a8490382 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/alpha/GraderServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/alpha/GraderServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning.alpha diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionService.kt index 2a4106279..bfb08f161 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning.checkpoints diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionServiceImpl.kt index 1fbd02cf7..3c00ab1bb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning.checkpoints diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/jobs/CheckpointService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/jobs/CheckpointService.kt index 25c75f296..18529c1b0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/jobs/CheckpointService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/jobs/CheckpointService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/jobs/CheckpointServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/jobs/CheckpointServiceImpl.kt index 2a797ad79..51e33529a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/jobs/CheckpointServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/jobs/CheckpointServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning.jobs diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/graders/GraderModelService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/graders/GraderModelService.kt index 9a303bf41..8bd67c0ed 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/graders/GraderModelService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/graders/GraderModelService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.graders diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/graders/GraderModelServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/graders/GraderModelServiceImpl.kt index be6f584f7..1c02d39ca 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/graders/GraderModelServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/graders/GraderModelServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.graders diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/CallService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/CallService.kt index f2754cf3e..30fa26846 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/CallService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/CallService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/CallServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/CallServiceImpl.kt index 213d1afec..df8e0acaf 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/CallServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/CallServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/ClientSecretService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/ClientSecretService.kt index 6527d67d7..552b5f7c2 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/ClientSecretService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/ClientSecretService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/ClientSecretServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/ClientSecretServiceImpl.kt index 1d9f1a73c..b299c0d2a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/ClientSecretServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/realtime/ClientSecretServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.realtime diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputItemService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputItemService.kt index 9c8a62b62..b889540d8 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputItemService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputItemService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputItemServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputItemServiceImpl.kt index ca61d7036..260145857 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputItemServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputItemServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputTokenService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputTokenService.kt index a09d1628c..0a50a4ad1 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputTokenService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputTokenService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputTokenServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputTokenServiceImpl.kt index 408c2eea8..22957013f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputTokenServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/responses/InputTokenServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.responses diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/ContentService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/ContentService.kt index bd6b3f0e4..121f0b09f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/ContentService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/ContentService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/ContentServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/ContentServiceImpl.kt index ec06db6bf..d0274314a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/ContentServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/ContentServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/VersionService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/VersionService.kt index 27ef342c1..0e9354d1f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/VersionService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/VersionService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/VersionServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/VersionServiceImpl.kt index 8416f363a..515fa29d9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/VersionServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/VersionServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.skills diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/versions/ContentService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/versions/ContentService.kt index 2040a0889..dc9a00a82 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/versions/ContentService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/versions/ContentService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.skills.versions diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/versions/ContentServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/versions/ContentServiceImpl.kt index 0c19059e8..c80d9158a 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/versions/ContentServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/skills/versions/ContentServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.skills.versions diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/uploads/PartService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/uploads/PartService.kt index 7d9e96064..fdbfd3129 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/uploads/PartService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/uploads/PartService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.uploads diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/uploads/PartServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/uploads/PartServiceImpl.kt index 2073c5464..897e2f4bb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/uploads/PartServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/uploads/PartServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.uploads diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileBatchService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileBatchService.kt index 32b63f4d2..59c8dbccb 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileBatchService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileBatchService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileBatchServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileBatchServiceImpl.kt index 43b477d63..56596f6ed 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileBatchServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileBatchServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileService.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileService.kt index a85e85b3a..30f25b6c4 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileService.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileService.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.vectorstores diff --git a/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileServiceImpl.kt b/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileServiceImpl.kt index cc30e7dca..fbc768de5 100644 --- a/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileServiceImpl.kt +++ b/openai-java-core/src/main/kotlin/com/openai/services/blocking/vectorstores/FileServiceImpl.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/AllModelsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/AllModelsTest.kt index 717284f4a..53611a94f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/AllModelsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/AllModelsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/ComparisonFilterTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/ComparisonFilterTest.kt index 07f469205..8ee2956d3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/ComparisonFilterTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/ComparisonFilterTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/CompoundFilterTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/CompoundFilterTest.kt index 0f8ecf710..39a8279eb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/CompoundFilterTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/CompoundFilterTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/CustomToolInputFormatTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/CustomToolInputFormatTest.kt index 149140faa..4071f1ca3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/CustomToolInputFormatTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/CustomToolInputFormatTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/ErrorObjectTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/ErrorObjectTest.kt index 92d999536..24b736f67 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/ErrorObjectTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/ErrorObjectTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/FunctionDefinitionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/FunctionDefinitionTest.kt index 5ac722e48..428513dbd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/FunctionDefinitionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/FunctionDefinitionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/FunctionParametersTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/FunctionParametersTest.kt index bd96cc44d..5e93d4179 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/FunctionParametersTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/FunctionParametersTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/ReasoningTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/ReasoningTest.kt index 0b1fd6f1a..80b1427e0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/ReasoningTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/ReasoningTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatJsonObjectTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatJsonObjectTest.kt index 0e38beb4b..8cf979907 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatJsonObjectTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatJsonObjectTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatJsonSchemaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatJsonSchemaTest.kt index b7edce10d..be53a40c9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatJsonSchemaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatJsonSchemaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatTextGrammarTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatTextGrammarTest.kt index 565cedec5..b8d0fc6dc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatTextGrammarTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatTextGrammarTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatTextPythonTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatTextPythonTest.kt index 3b04cbdcb..5379be240 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatTextPythonTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatTextPythonTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatTextTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatTextTest.kt index 89350ecaf..45c3480ed 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatTextTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/ResponseFormatTextTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/ResponsesModelTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/ResponsesModelTest.kt index ca3a2e3b1..30ab58da9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/ResponsesModelTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/ResponsesModelTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateParamsTest.kt index ef7bf486c..dc8c5bd79 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateResponseTest.kt index ef8235a27..a13e3b1bb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteParamsTest.kt index ca90d1e8b..9347b876b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteResponseTest.kt index e857e03a7..e87a9195d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPageResponseTest.kt index 7d81915d6..9aa086b7c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListParamsTest.kt index a52b940f0..c66aa3eca 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyRetrieveParamsTest.kt index b5706945f..fa1df2f78 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyTest.kt index cb48000ae..ca1aadd85 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/adminapikeys/AdminApiKeyTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.adminapikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPageResponseTest.kt index b0fc84453..35265e44d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.auditlogs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListParamsTest.kt index 9f15fc803..e666a3968 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.auditlogs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListResponseTest.kt index 233eecc5c..41829d6ec 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.auditlogs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePageResponseTest.kt index 093043733..f47b57e7b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateActivatePageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateParamsTest.kt index 4124a4a7a..3429fb3f2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateResponseTest.kt index 1ce07038f..0eea2017a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateActivateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateCreateParamsTest.kt index fb6fac63a..21b17ad99 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePageResponseTest.kt index 324423364..4d0a7b81d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivatePageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateParamsTest.kt index 825de4a26..7841db5bf 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateResponseTest.kt index 66afce705..917a315a8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeactivateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteParamsTest.kt index cdf165674..446bcc062 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteResponseTest.kt index 816be2b2a..89d59cf41 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateListPageResponseTest.kt index c5c58aee7..70e4c9536 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateListParamsTest.kt index d67ab27ac..7615471a3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateListResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateListResponseTest.kt index 5054ed3a0..37c54b80d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateListResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateListResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateRetrieveParamsTest.kt index 69dc23d24..52dffd443 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateTest.kt index 89eb5dd8b..e1d18bd64 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateUpdateParamsTest.kt index f2033de6c..951b12535 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/certificates/CertificateUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionRetrieveParamsTest.kt index f38ffcfcb..bde143cb6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.dataretention diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionUpdateParamsTest.kt index 69973a0a4..b571a9007 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/dataretention/DataRetentionUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.dataretention diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/dataretention/OrganizationDataRetentionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/dataretention/OrganizationDataRetentionTest.kt index 7d522bdd0..c0eaec131 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/dataretention/OrganizationDataRetentionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/dataretention/OrganizationDataRetentionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.dataretention diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupCreateParamsTest.kt index 4de5676cd..b3774f222 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupDeleteParamsTest.kt index 445cd637c..e32bfc045 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupDeleteResponseTest.kt index 9c9d1248e..b11b96d08 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupListPageResponseTest.kt index 3371a933c..56fc03a58 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupListParamsTest.kt index 1240a8239..fc283a29b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupRetrieveParamsTest.kt index bbac05267..f8954402b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupTest.kt index 4d8551760..f5c91e4e9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupUpdateParamsTest.kt index 9a1f40fe2..d3a746c9e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupUpdateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupUpdateResponseTest.kt index d3ceacfc8..f64968aca 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupUpdateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/GroupUpdateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateParamsTest.kt index c401dcee6..7c572bc0a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateResponseTest.kt index 250d5c417..1e87cf884 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteParamsTest.kt index f9069d28a..f0958530c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteResponseTest.kt index bf063b8b5..9f46fac20 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPageResponseTest.kt index 2fec8f7e8..17cf041ea 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleListParamsTest.kt index 50e14432c..50b3c5942 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleListResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleListResponseTest.kt index e58cdfdf1..2807680ab 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleListResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleListResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveParamsTest.kt index 845c79d9b..3640bde46 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveResponseTest.kt index a81e13faf..d98a6b3e7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/roles/RoleRetrieveResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/OrganizationGroupUserTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/OrganizationGroupUserTest.kt index f7da8c8ad..127265007 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/OrganizationGroupUserTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/OrganizationGroupUserTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserCreateParamsTest.kt index e05c41676..0f0a6bdd2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserCreateResponseTest.kt index e08fe155a..2565278ea 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteParamsTest.kt index 3d67a0a18..d286ebf2c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteResponseTest.kt index 5425bf419..cf20771bb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserListPageResponseTest.kt index d18f92fd7..b35f75bcd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserListParamsTest.kt index 3e49eff5e..fd0bc7f01 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveParamsTest.kt index 34509cea8..32afd526f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveResponseTest.kt index 64ebee7fc..70473be2c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/groups/users/UserRetrieveResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.groups.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteCreateParamsTest.kt index e1bc29e71..b00182dd8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteDeleteParamsTest.kt index 2cc79bdd7..a11952303 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteDeleteResponseTest.kt index 9ad8665ab..18c95e77d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteListPageResponseTest.kt index 5089f1c2c..cc2bb84a9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteListParamsTest.kt index 5ecf7c4e2..7b4a25e09 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteRetrieveParamsTest.kt index 336f0b771..ea8153ead 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteTest.kt index b5ffead81..f9a04045a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/invites/InviteTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.invites diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectArchiveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectArchiveParamsTest.kt index cee6922b9..0ad57c0c2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectArchiveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectArchiveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectCreateParamsTest.kt index 41eefd323..573cd8a0a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectListPageResponseTest.kt index d494a0dec..c001f2fd5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectListParamsTest.kt index d2251fdf8..b42748130 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectRetrieveParamsTest.kt index 6ec366869..1be65b65c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectTest.kt index 202c97dac..7471c8080 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectUpdateParamsTest.kt index f731b684f..41c1e31da 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ProjectUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteParamsTest.kt index f72bbac4c..48affb898 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteResponseTest.kt index 60d713140..d33892296 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPageResponseTest.kt index cb0fbd04e..cc811ebbe 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListParamsTest.kt index 741bc7d85..89a2f4043 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyRetrieveParamsTest.kt index d2ec9816e..d5e31d518 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ApiKeyRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ProjectApiKeyTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ProjectApiKeyTest.kt index f9b5cedae..fde7b6201 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ProjectApiKeyTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/apikeys/ProjectApiKeyTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.apikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePageResponseTest.kt index 47164c451..bcccac50c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivatePageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateParamsTest.kt index 5e0b375f9..394dcc0e5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateResponseTest.kt index fb6eff430..e63358199 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateActivateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePageResponseTest.kt index 316110e43..3cd356664 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivatePageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateParamsTest.kt index c95b3b5cf..e8e741a6c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateResponseTest.kt index d796147d2..af08e06b1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateDeactivateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPageResponseTest.kt index 9bef8bdf5..463a0c772 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListParamsTest.kt index f07e670ef..1dc8d20fa 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListResponseTest.kt index 6496d5bc9..96f4104b8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/certificates/CertificateListResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.certificates diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionRetrieveParamsTest.kt index c823faac2..3f87005bb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.dataretention diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionUpdateParamsTest.kt index bcdbddec3..c1b370b4e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/dataretention/DataRetentionUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.dataretention diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/dataretention/ProjectDataRetentionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/dataretention/ProjectDataRetentionTest.kt index c40108cc8..aee0a5a3b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/dataretention/ProjectDataRetentionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/dataretention/ProjectDataRetentionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.dataretention diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupCreateParamsTest.kt index 135510e02..7fda51268 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteParamsTest.kt index 977923bb5..811da7142 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteResponseTest.kt index 8a212e3d5..996f294f8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPageResponseTest.kt index df0cae553..0cbd8e3a6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupListParamsTest.kt index e9410678c..78d2100aa 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupRetrieveParamsTest.kt index 7eb6cb239..5e5afccf7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/GroupRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/ProjectGroupTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/ProjectGroupTest.kt index 9cbd9cfdc..4dfcdba4c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/ProjectGroupTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/ProjectGroupTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateParamsTest.kt index 76edd5b28..ae4c0612c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateResponseTest.kt index 6840b0425..cf28e1cb0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteParamsTest.kt index 6e0a68d51..b71fe6888 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteResponseTest.kt index ebd22709e..31fb49d3b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPageResponseTest.kt index c2bc2e90e..28f697784 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListParamsTest.kt index 4795463fd..53d6afc36 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListResponseTest.kt index 4f2155da7..7eb31b1d8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleListResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveParamsTest.kt index ad882d60c..c9090bfc9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveResponseTest.kt index 1f45ee8de..91529a7a3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/groups/roles/RoleRetrieveResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.groups.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionRetrieveParamsTest.kt index 44ea903cd..8be27f76a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.hostedtoolpermissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionUpdateParamsTest.kt index 68b376399..130f08666 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/HostedToolPermissionUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.hostedtoolpermissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/ProjectHostedToolPermissionsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/ProjectHostedToolPermissionsTest.kt index 8ad603e99..237e2b228 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/ProjectHostedToolPermissionsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/hostedtoolpermissions/ProjectHostedToolPermissionsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.hostedtoolpermissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionDeleteParamsTest.kt index bb2540446..969559bea 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.modelpermissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionRetrieveParamsTest.kt index aa6438efa..a3c4f88f2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.modelpermissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionUpdateParamsTest.kt index f78c463c8..ee655edf6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ModelPermissionUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.modelpermissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissionsDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissionsDeletedTest.kt index c149fa09b..3a0ca4e14 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissionsDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissionsDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.modelpermissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissionsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissionsTest.kt index 46f4ffc66..795a6fa47 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissionsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/modelpermissions/ProjectModelPermissionsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.modelpermissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/ProjectRateLimitTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/ProjectRateLimitTest.kt index cdf4c37ea..499a9dcfe 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/ProjectRateLimitTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/ProjectRateLimitTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.ratelimits diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPageResponseTest.kt index 0b41fe76d..aa880e327 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.ratelimits diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsParamsTest.kt index c5815f949..cfff72e81 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitListRateLimitsParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.ratelimits diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitUpdateRateLimitParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitUpdateRateLimitParamsTest.kt index ec00a2300..1c5f06307 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitUpdateRateLimitParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/ratelimits/RateLimitUpdateRateLimitParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.ratelimits diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleCreateParamsTest.kt index acc619437..9f7ddf78e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteParamsTest.kt index 8d56ac886..6287c1812 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteResponseTest.kt index 29f0928ed..bd368967c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPageResponseTest.kt index 0db3a4530..6664d8b18 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleListParamsTest.kt index 146d3d470..fbf506798 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleRetrieveParamsTest.kt index 6df7b3e63..4fb5a90f0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleUpdateParamsTest.kt index 1936f62ff..a59c91ff6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/roles/RoleUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ProjectServiceAccountTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ProjectServiceAccountTest.kt index d12d1d143..958af27d4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ProjectServiceAccountTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ProjectServiceAccountTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateParamsTest.kt index ad8c0928b..4bcd050aa 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateResponseTest.kt index 3e6efbd39..e95460e9e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteParamsTest.kt index ef11b398b..138ae8f0c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteResponseTest.kt index 114ea247c..fccd5133b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPageResponseTest.kt index 4e97b8a10..086d4a974 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListParamsTest.kt index 26c112bbf..1f5337e74 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountRetrieveParamsTest.kt index 5b4338b86..8368fc1ca 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountUpdateParamsTest.kt index 4228ffa27..7325475c2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/ServiceAccountUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateParamsTest.kt index a4d226544..747b68497 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts.apikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateResponseTest.kt index 9559a9554..63e17ff5d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/serviceaccounts/apikeys/ApiKeyCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.serviceaccounts.apikeys diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlertDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlertDeletedTest.kt index 6e83780cb..82479210a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlertDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlertDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlertTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlertTest.kt index e8b5cdfaf..c0b0de5fd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlertTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/ProjectSpendAlertTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertCreateParamsTest.kt index a72151fc7..865a532da 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertDeleteParamsTest.kt index 117a32132..39849bf2a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPageResponseTest.kt index 5e91d0019..0483a3766 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListParamsTest.kt index 6b6c2577d..cd629bf3a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertRetrieveParamsTest.kt index ca373b47e..b131b4ef3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertUpdateParamsTest.kt index e653eec10..50ec26133 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendalerts/SpendAlertUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimitDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimitDeletedTest.kt index 0f26f2983..3eeea9b79 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimitDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimitDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendlimit diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimitTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimitTest.kt index d5d9f573d..c5d0b3985 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimitTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/ProjectSpendLimitTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendlimit diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitDeleteParamsTest.kt index 83f4553f1..e0add578f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendlimit diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitRetrieveParamsTest.kt index 7d93efae7..ece42c904 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendlimit diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitUpdateParamsTest.kt index acd1c59e5..c5fceaf08 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/spendlimit/SpendLimitUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.spendlimit diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/ProjectUserTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/ProjectUserTest.kt index ef28ed9db..c6a0f67b8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/ProjectUserTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/ProjectUserTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserCreateParamsTest.kt index dc60c1fce..41bc1d657 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteParamsTest.kt index 7df2c6da4..5539711b5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteResponseTest.kt index ba21f5b76..c4e75e648 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserListPageResponseTest.kt index 7fe9de13b..2e2d5f1fb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserListParamsTest.kt index a4396409f..94c23af8f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserRetrieveParamsTest.kt index 40f7dd74d..a5db43754 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserUpdateParamsTest.kt index c8db8b400..a94f4db76 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/UserUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateParamsTest.kt index a186c7508..27e9b05cf 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateResponseTest.kt index ef95680e0..c6452d5e5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteParamsTest.kt index 4fbed782f..073a4ffc4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteResponseTest.kt index 9959562b7..0ff56a18c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPageResponseTest.kt index cde0b7c0d..7469ca724 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListParamsTest.kt index bf7bb9934..a6503d012 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListResponseTest.kt index f408857be..cd1cdbc0a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleListResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveParamsTest.kt index 9bddd41bd..99671e8b0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveResponseTest.kt index 711a69799..fe8d4b4ed 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/projects/users/roles/RoleRetrieveResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.projects.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleCreateParamsTest.kt index 094f4c4b0..5e4e2abca 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleDeleteParamsTest.kt index d76811d2b..8bae73ae1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleDeleteResponseTest.kt index c931bba34..5af59fe79 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleListPageResponseTest.kt index 7a38c44a8..80bfa1b0b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleListParamsTest.kt index 0ef11112f..d969c38d0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleRetrieveParamsTest.kt index a1f3a0e17..061420d16 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleTest.kt index e90ddd3a3..5b8fcb753 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleUpdateParamsTest.kt index 55aff7aaa..bfc2563f9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/roles/RoleUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlertDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlertDeletedTest.kt index c57728514..b457d0e50 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlertDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlertDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlertTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlertTest.kt index a7735e4b0..4354a7828 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlertTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/OrganizationSpendAlertTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertCreateParamsTest.kt index f2e2fef57..f80308979 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertDeleteParamsTest.kt index 54ce4e380..fef6af6a3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPageResponseTest.kt index aabfff94a..38353528d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListParamsTest.kt index c650b5cdf..f8d8ce5c3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertRetrieveParamsTest.kt index 48aac2899..1138e5395 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertUpdateParamsTest.kt index 98e2ee92f..262ed3314 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendalerts/SpendAlertUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendalerts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimitDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimitDeletedTest.kt index d538635f2..3cbf827ac 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimitDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimitDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendlimit diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimitTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimitTest.kt index 9908ee138..243d43444 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimitTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/OrganizationSpendLimitTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendlimit diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitDeleteParamsTest.kt index a4d1605a9..90ad8a881 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendlimit diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitRetrieveParamsTest.kt index 4b608bfe6..453f119a9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendlimit diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitUpdateParamsTest.kt index 4b5689caa..d0d0ce03d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/spendlimit/SpendLimitUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.spendlimit diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesParamsTest.kt index 7a0aa5f64..39771d37d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesResponseTest.kt index 0c7a000cc..a7c003e80 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioSpeechesResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsParamsTest.kt index eb5958b99..ca94789fb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsResponseTest.kt index 8ea73e04b..219471ddc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageAudioTranscriptionsResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsParamsTest.kt index 14a6bbe49..39b87b698 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsResponseTest.kt index 9f744b792..a549b4aa9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCodeInterpreterSessionsResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsParamsTest.kt index 8e275331b..abbff712b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsResponseTest.kt index c85872006..36f90170d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCompletionsResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCostsParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCostsParamsTest.kt index 7570d93df..1830338b3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCostsParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCostsParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCostsResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCostsResponseTest.kt index ba2f20641..9af9c3a9d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCostsResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageCostsResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsParamsTest.kt index 5d78c1b89..f472f02eb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsResponseTest.kt index 7073d60c7..84421684b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageEmbeddingsResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsParamsTest.kt index c02b23724..da42221e3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsResponseTest.kt index d5878abee..00e65fdfc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageFileSearchCallsResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageImagesParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageImagesParamsTest.kt index 5cdf709f7..11a43a641 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageImagesParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageImagesParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageImagesResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageImagesResponseTest.kt index 9825290f0..cb70f9ce0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageImagesResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageImagesResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageModerationsParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageModerationsParamsTest.kt index 449b62503..50601938d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageModerationsParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageModerationsParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageModerationsResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageModerationsResponseTest.kt index 5bac27144..531a02c56 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageModerationsResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageModerationsResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresParamsTest.kt index c3a123332..d1a40b1ec 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresResponseTest.kt index 374a5499e..0fc66db6f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageVectorStoresResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsParamsTest.kt index 05763666d..d1cfe9441 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsResponseTest.kt index 4302a1c98..1c889cf44 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/usage/UsageWebSearchCallsResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.usage diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/OrganizationUserTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/OrganizationUserTest.kt index 3d1be7ae7..32b7aa3b3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/OrganizationUserTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/OrganizationUserTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserDeleteParamsTest.kt index ef71be77a..79c5586c1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserDeleteResponseTest.kt index bb022be04..ce8b56a0a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserListPageResponseTest.kt index def1423b3..5872c30e8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserListParamsTest.kt index 5a6db440a..5e4298173 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserRetrieveParamsTest.kt index 069c79890..bbc8124cd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserUpdateParamsTest.kt index d6e9072af..7e37d2372 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/UserUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateParamsTest.kt index 96a2a04bd..39404351c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateResponseTest.kt index 884b4e178..dcd62a1ca 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteParamsTest.kt index c21b3f087..b4dc28532 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteResponseTest.kt index 54756b8f3..45861f9e5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleListPageResponseTest.kt index b4a9d80df..69f23f2ee 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleListParamsTest.kt index 8212eaa6f..c67b3fe3e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleListResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleListResponseTest.kt index 84f863457..b4143698e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleListResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleListResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveParamsTest.kt index ae6570473..7e372c1de 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveResponseTest.kt index 00dd4a0b7..6da62f6a9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/admin/organization/users/roles/RoleRetrieveResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.admin.organization.users.roles diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/speech/SpeechCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/speech/SpeechCreateParamsTest.kt index 84ed2187c..d05e7c647 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/speech/SpeechCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/speech/SpeechCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.speech diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateParamsTest.kt index 52c23bfe9..02f28d414 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateResponseTest.kt index f45fdb3d5..9497723b8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarizedSegmentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarizedSegmentTest.kt index d096a68ad..1a3c9a2b3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarizedSegmentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarizedSegmentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarizedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarizedTest.kt index 0d0dfd851..cdf47f67f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarizedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionDiarizedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionLanguageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionLanguageTest.kt index 6e4bf2d7e..49f4eb89b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionLanguageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionLanguageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionSegmentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionSegmentTest.kt index 2e9c2bd36..cec167d56 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionSegmentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionSegmentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionStreamEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionStreamEventTest.kt index 5a523f555..9f516f256 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionStreamEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionStreamEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTest.kt index 6bdfa9dd3..c57c7e478 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDeltaEventTest.kt index 063cc0a90..afd5aa80f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDoneEventTest.kt index 6e2bf5541..86578fbb2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextSegmentEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextSegmentEventTest.kt index f440e29e6..a534bd42d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextSegmentEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionTextSegmentEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionVerboseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionVerboseTest.kt index 80966753d..e3945d7d7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionVerboseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionVerboseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionWordTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionWordTest.kt index 0bf1311aa..3a4039e3a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionWordTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/transcriptions/TranscriptionWordTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.transcriptions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationCreateParamsTest.kt index db5355184..0324826b6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.translations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationCreateResponseTest.kt index beda20642..5f8ffc122 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.translations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationTest.kt index 030930f6f..614f84457 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.translations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationVerboseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationVerboseTest.kt index a8a72b880..614005e03 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationVerboseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/audio/translations/TranslationVerboseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.audio.translations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchCancelParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchCancelParamsTest.kt index 838a543ce..8506503ed 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchCancelParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchCancelParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchCreateParamsTest.kt index 266ad5eb7..3d7dfdf9b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchErrorTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchErrorTest.kt index bc34ad5ef..d2beb114c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchErrorTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchErrorTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchListPageResponseTest.kt index eb32b5762..e73bd07b9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchListParamsTest.kt index 05f941243..585f301c4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchRequestCountsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchRequestCountsTest.kt index 78ec8b3f3..a21698152 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchRequestCountsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchRequestCountsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchRetrieveParamsTest.kt index 38d311c0e..94ae96525 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchTest.kt index c4a7229fe..10c27eb9e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchUsageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchUsageTest.kt index c021e8bb0..3ed722ba0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchUsageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/batches/BatchUsageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.batches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantCreateParamsTest.kt index fb5b24aab..3cd6cc5bd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantDeleteParamsTest.kt index 6a5c30010..a5ff6a1f7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantDeletedTest.kt index 27dc7ea3b..9a32da991 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantListPageResponseTest.kt index cc0e1fc09..8041b938f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantListParamsTest.kt index abe34c27e..aa5dc336d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantRetrieveParamsTest.kt index 5ccf04cd8..6078506f5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantStreamEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantStreamEventTest.kt index 29bb10c9f..3d13045f8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantStreamEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantStreamEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantTest.kt index 9c1852965..a7255000b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantToolTest.kt index 5a6bedfea..53b70f5e7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantUpdateParamsTest.kt index 95efe8520..1788a43cc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/AssistantUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/CodeInterpreterToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/CodeInterpreterToolTest.kt index 18ce77a97..64b8aa361 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/CodeInterpreterToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/CodeInterpreterToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/FileSearchToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/FileSearchToolTest.kt index 01c71c22b..6d5c769a5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/FileSearchToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/FileSearchToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/FunctionToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/FunctionToolTest.kt index d9c90280f..cbb9dc2f9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/FunctionToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/FunctionToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/MessageStreamEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/MessageStreamEventTest.kt index 811820f88..3e42302f1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/MessageStreamEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/MessageStreamEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/RunStepStreamEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/RunStepStreamEventTest.kt index a35ab365b..5a962cd98 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/RunStepStreamEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/RunStepStreamEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/RunStreamEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/RunStreamEventTest.kt index eff518063..961590971 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/RunStreamEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/RunStreamEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/ThreadStreamEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/ThreadStreamEventTest.kt index e41100911..c87063df1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/ThreadStreamEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/assistants/ThreadStreamEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.assistants diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/ChatKitWorkflowTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/ChatKitWorkflowTest.kt index 4b2d6b14f..f90a39988 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/ChatKitWorkflowTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/ChatKitWorkflowTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/sessions/SessionCancelParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/sessions/SessionCancelParamsTest.kt index f2a3b0074..7db93b410 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/sessions/SessionCancelParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/sessions/SessionCancelParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.sessions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/sessions/SessionCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/sessions/SessionCreateParamsTest.kt index dec2f7f68..a155538fe 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/sessions/SessionCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/sessions/SessionCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.sessions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitAttachmentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitAttachmentTest.kt index 4558b3b5d..9d79e1e02 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitAttachmentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitAttachmentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitResponseOutputTextTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitResponseOutputTextTest.kt index cf336d835..1d4d2e0ce 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitResponseOutputTextTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitResponseOutputTextTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadAssistantMessageItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadAssistantMessageItemTest.kt index b2a9fcdc7..8aaa10594 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadAssistantMessageItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadAssistantMessageItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadItemListTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadItemListTest.kt index 1b6782b52..26ea08cd0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadItemListTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadItemListTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadTest.kt index b68354dcb..abf65b8dc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadUserMessageItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadUserMessageItemTest.kt index e87581e5b..8884c291a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadUserMessageItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitThreadUserMessageItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitWidgetItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitWidgetItemTest.kt index 3854a5a1b..d542648f9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitWidgetItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatKitWidgetItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionAutomaticThreadTitlingTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionAutomaticThreadTitlingTest.kt index 11ac415a5..fd0b5b73c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionAutomaticThreadTitlingTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionAutomaticThreadTitlingTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfigurationParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfigurationParamTest.kt index 242b227c8..d6549c518 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfigurationParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfigurationParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfigurationTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfigurationTest.kt index 4b5699349..2b837eab8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfigurationTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionChatKitConfigurationTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionExpiresAfterParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionExpiresAfterParamTest.kt index 69bcb456e..c97635a48 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionExpiresAfterParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionExpiresAfterParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionFileUploadTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionFileUploadTest.kt index 4e8d6fcbd..839f9b360 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionFileUploadTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionFileUploadTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionHistoryTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionHistoryTest.kt index 1dd64ccf7..e1c5a344c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionHistoryTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionHistoryTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimitsParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimitsParamTest.kt index 435f0a389..c0f0de916 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimitsParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimitsParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimitsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimitsTest.kt index 27ffb1aff..87aa5d010 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimitsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionRateLimitsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionTest.kt index f96c8cbb5..44944c4f4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionWorkflowParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionWorkflowParamTest.kt index 3906d7bd3..87b76a3d5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionWorkflowParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ChatSessionWorkflowParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteParamsTest.kt index f533c5c6e..edafa6808 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteResponseTest.kt index fb6738ddd..6fc1343e2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsParamsTest.kt index 8e3690771..eb9413bb7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadListItemsParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPageResponseTest.kt index 71f305267..bbbb0fa1d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadListParamsTest.kt index cf7a5a375..19f7d7c82 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadRetrieveParamsTest.kt index 37bffea74..bc770a58a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/chatkit/threads/ThreadRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.chatkit.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaApplyPatchToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaApplyPatchToolTest.kt index c88dd17b2..9456429c9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaApplyPatchToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaApplyPatchToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaCompactedResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaCompactedResponseTest.kt index 4c724ca8b..5e2a38674 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaCompactedResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaCompactedResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaComputerActionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaComputerActionTest.kt index 7226f24ca..3dc6aad04 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaComputerActionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaComputerActionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaComputerToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaComputerToolTest.kt index f84116274..0f832344e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaComputerToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaComputerToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaComputerUsePreviewToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaComputerUsePreviewToolTest.kt index b80536e10..b881022e1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaComputerUsePreviewToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaComputerUsePreviewToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerAutoTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerAutoTest.kt index 8a3f5d448..75683d54e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerAutoTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerAutoTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyAllowlistTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyAllowlistTest.kt index ee38ed578..981a947d7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyAllowlistTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyAllowlistTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDisabledTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDisabledTest.kt index 027ea5006..b3778826e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDisabledTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDisabledTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDomainSecretTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDomainSecretTest.kt index 6dfe17064..2b0e3ba43 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDomainSecretTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerNetworkPolicyDomainSecretTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerReferenceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerReferenceTest.kt index dc9a5f841..bdd012a12 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerReferenceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaContainerReferenceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaCustomToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaCustomToolTest.kt index 24de70b1c..674833330 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaCustomToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaCustomToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaEasyInputMessageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaEasyInputMessageTest.kt index b134d0318..9b7d58bef 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaEasyInputMessageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaEasyInputMessageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaFileSearchToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaFileSearchToolTest.kt index 92589f284..3b3a4312a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaFileSearchToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaFileSearchToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaFunctionShellToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaFunctionShellToolTest.kt index f449c2599..f009bda42 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaFunctionShellToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaFunctionShellToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaFunctionToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaFunctionToolTest.kt index 74b888e08..a660d6f25 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaFunctionToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaFunctionToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaInlineSkillSourceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaInlineSkillSourceTest.kt index 276693e40..4f614e75c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaInlineSkillSourceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaInlineSkillSourceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaInlineSkillTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaInlineSkillTest.kt index 26d437e0c..1506429fd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaInlineSkillTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaInlineSkillTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaLocalEnvironmentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaLocalEnvironmentTest.kt index 0af007229..d8f57a346 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaLocalEnvironmentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaLocalEnvironmentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaLocalSkillTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaLocalSkillTest.kt index fb0258385..cf10a5e88 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaLocalSkillTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaLocalSkillTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaNamespaceToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaNamespaceToolTest.kt index d3c38ef86..84c49d1b6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaNamespaceToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaNamespaceToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses @@ -14,7 +14,7 @@ internal class BetaNamespaceToolTest { fun create() { val betaNamespaceTool = BetaNamespaceTool.builder() - .description("x") + .description("description") .name("x") .addTool( BetaNamespaceTool.Tool.Function.builder() @@ -33,7 +33,7 @@ internal class BetaNamespaceToolTest { ) .build() - assertThat(betaNamespaceTool.description()).isEqualTo("x") + assertThat(betaNamespaceTool.description()).isEqualTo("description") assertThat(betaNamespaceTool.name()).isEqualTo("x") assertThat(betaNamespaceTool.tools()) .containsExactly( @@ -60,7 +60,7 @@ internal class BetaNamespaceToolTest { val jsonMapper = jsonMapper() val betaNamespaceTool = BetaNamespaceTool.builder() - .description("x") + .description("description") .name("x") .addTool( BetaNamespaceTool.Tool.Function.builder() diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCallOutputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCallOutputTest.kt index cb14bcf5d..e650b06ac 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCallOutputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCallOutputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCallTest.kt index 9ffff7747..c80ca77f6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseApplyPatchToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioDeltaEventTest.kt index 2b6bf66e3..93721c033 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioDoneEventTest.kt index dc98330e9..fe053680a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDeltaEventTest.kt index 634eabdd8..4f6d5ce67 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDoneEventTest.kt index 397b4dfdf..b12067f41 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseAudioTranscriptDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDeltaEventTest.kt index 33bfd7945..d52f2d813 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDoneEventTest.kt index e6ca92676..142727cba 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCodeDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCompletedEventTest.kt index 5e86249fe..9f480c356 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInProgressEventTest.kt index 1a36f09e3..727df09fb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInterpretingEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInterpretingEventTest.kt index 74a049469..b283291a0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInterpretingEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterCallInterpretingEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterToolCallTest.kt index eae57ea30..86fefe319 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCodeInterpreterToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItemParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItemParamTest.kt index 6bd7d52e2..f69e7b60c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItemParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItemParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItemTest.kt index 046c254a4..d49a1c683 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCompactionItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCompletedEventTest.kt index 6dd94b5fc..95beeaee8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputItemTest.kt index 0af1999e9..3535cde6b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputScreenshotTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputScreenshotTest.kt index 81242974f..eea15cb46 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputScreenshotTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallOutputScreenshotTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallTest.kt index d0d1d0697..8172f2362 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseComputerToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContainerReferenceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContainerReferenceTest.kt index cd163bd04..4fd34cf84 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContainerReferenceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContainerReferenceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContentPartAddedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContentPartAddedEventTest.kt index 9b6bc09bb..469a380dd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContentPartAddedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContentPartAddedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContentPartDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContentPartDoneEventTest.kt index c41438c25..757b1cb69 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContentPartDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContentPartDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContentTest.kt index 1bd156058..d2349b41f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseConversationParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseConversationParamTest.kt index 11954711e..fa86e5a78 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseConversationParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseConversationParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCreatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCreatedEventTest.kt index 08f9742c6..880d7f26e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCreatedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCreatedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDeltaEventTest.kt index af6d672d7..1be27fd14 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDoneEventTest.kt index a243a0a03..491c89107 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallInputDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallItemTest.kt index 15b69d4fe..5f0e233e6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutputItemTest.kt index 3aaf3f964..2467fc763 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutputTest.kt index f6f9c5ee8..fe058cf18 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallOutputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallTest.kt index e63f37fa6..877a0e60a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseCustomToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseErrorEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseErrorEventTest.kt index 78b25ef36..16cef8383 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseErrorEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseErrorEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseErrorTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseErrorTest.kt index 4dc6271a4..87f3241d2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseErrorTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseErrorTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFailedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFailedEventTest.kt index ddc83f66f..af1870f63 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFailedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFailedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallCompletedEventTest.kt index 4eeb1bd45..db6f286a3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallInProgressEventTest.kt index 6afdba7f9..a02daf4ad 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallSearchingEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallSearchingEventTest.kt index f4f71bf82..458cc3579 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallSearchingEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchCallSearchingEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchToolCallTest.kt index ec5894cf3..af327097d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFileSearchToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextConfigTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextConfigTest.kt index 02b475b63..4a0997ff3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextConfigTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextConfigTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextJsonSchemaConfigTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextJsonSchemaConfigTest.kt index 1741dadcc..062aa57f4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextJsonSchemaConfigTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFormatTextJsonSchemaConfigTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDeltaEventTest.kt index db8971c04..7cc423224 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDoneEventTest.kt index 82c6f95a1..757cb520b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallArgumentsDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallOutputItemTest.kt index 5861e772b..1842ff30f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionCallOutputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellCallOutputContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellCallOutputContentTest.kt index 88328ad66..658606e62 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellCallOutputContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellCallOutputContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCallOutputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCallOutputTest.kt index 5a7bc7d02..6a2aaac16 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCallOutputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCallOutputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCallTest.kt index c43868cb0..b36db1c0a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionShellToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallItemTest.kt index 19e415741..6a53e2174 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItemTest.kt index 1d4389800..7c0245bab 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallOutputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallTest.kt index 880abb1c7..1633dd948 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionWebSearchTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionWebSearchTest.kt index 994787a7e..b0bcffe47 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionWebSearchTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseFunctionWebSearchTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallCompletedEventTest.kt index 10e56ddfd..e376c466e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallGeneratingEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallGeneratingEventTest.kt index 1f8598b80..6cc2370a3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallGeneratingEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallGeneratingEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallInProgressEventTest.kt index 0ddc01133..d64af46f6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallPartialImageEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallPartialImageEventTest.kt index c88d679b0..43ebc518b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallPartialImageEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseImageGenCallPartialImageEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInProgressEventTest.kt index ddda07e1f..861818bba 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseIncompleteEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseIncompleteEventTest.kt index be3f37fcf..2169b0073 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseIncompleteEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseIncompleteEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInjectCreatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInjectCreatedEventTest.kt index de4f4983f..f0198aea2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInjectCreatedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInjectCreatedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInjectEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInjectEventTest.kt index 2c8570884..d1cf9b348 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInjectEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInjectEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInjectFailedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInjectFailedEventTest.kt index 20ff8ac99..a4ddfc1fd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInjectFailedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInjectFailedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputAudioTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputAudioTest.kt index fc4804ac3..f2a9a6d05 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputAudioTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputAudioTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputContentTest.kt index 8b88ff18d..d2f8013fb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputFileContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputFileContentTest.kt index 87a2cbc47..1d4253f2f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputFileContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputFileContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputFileTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputFileTest.kt index 4f8def863..d4aa09c85 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputFileTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputFileTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputImageContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputImageContentTest.kt index d0d3a7889..fc7c5782d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputImageContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputImageContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputImageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputImageTest.kt index 66f9477f3..7cf310dde 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputImageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputImageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputItemTest.kt index 83fc5e54b..d403429dd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputMessageItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputMessageItemTest.kt index 8597bd81c..c0fec1e6d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputMessageItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputMessageItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputTextContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputTextContentTest.kt index 654b2c511..a84e644cf 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputTextContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputTextContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputTextTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputTextTest.kt index 81e21fb98..4c5168432 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputTextTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseInputTextTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseItemTest.kt index 5efe2befc..f9eaeeecd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseLocalEnvironmentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseLocalEnvironmentTest.kt index eff9ba22f..968337e0e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseLocalEnvironmentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseLocalEnvironmentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDeltaEventTest.kt index 5dc112e46..a2adaa851 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDoneEventTest.kt index 7e02eb3a7..148657895 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallArgumentsDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallCompletedEventTest.kt index a1444a84d..30acdcca8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallFailedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallFailedEventTest.kt index 3aa4ab21e..0e63585fd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallFailedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallFailedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallInProgressEventTest.kt index 4acb6b6b2..8fcde8bf4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpCallInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsCompletedEventTest.kt index d15f77e1b..9c7901e56 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsFailedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsFailedEventTest.kt index cec83d7c5..cdf7696be 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsFailedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsFailedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsInProgressEventTest.kt index 9002e0a46..3bbfb7b89 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseMcpListToolsInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputAudioTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputAudioTest.kt index 4c943272a..17978ed5f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputAudioTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputAudioTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemAddedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemAddedEventTest.kt index ed7715961..be296a811 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemAddedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemAddedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemDoneEventTest.kt index a5c235d2c..2a9fe3707 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemTest.kt index 17c690604..e211d1a6a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputMessageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputMessageTest.kt index ff2ba6a88..f4c21302d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputMessageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputMessageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputRefusalTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputRefusalTest.kt index e4a885e15..97ac7c862 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputRefusalTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputRefusalTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputTextAnnotationAddedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputTextAnnotationAddedEventTest.kt index afec36cbc..a299e788e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputTextAnnotationAddedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputTextAnnotationAddedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputTextTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputTextTest.kt index cbd4e2460..6e94f5373 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputTextTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseOutputTextTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponsePromptTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponsePromptTest.kt index bc9db70eb..3ce5163a4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponsePromptTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponsePromptTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseQueuedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseQueuedEventTest.kt index 595aa8830..fe43f383a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseQueuedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseQueuedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningItemTest.kt index 9e5e008b3..1133a4d11 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartAddedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartAddedEventTest.kt index c5be651d4..5965063f0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartAddedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartAddedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartDoneEventTest.kt index b0425eb0d..15d0bcb47 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryPartDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDeltaEventTest.kt index 79183d8ba..1ba0516d7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDoneEventTest.kt index 9c51f0599..3389a2504 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningSummaryTextDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDeltaEventTest.kt index ef3c4a45f..e8a5946a1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDoneEventTest.kt index 2aa527656..67b496aa4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseReasoningTextDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDeltaEventTest.kt index 8248c7ac2..7b49c3975 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDoneEventTest.kt index dec53dd34..e4b4da4e1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseRefusalDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseStreamEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseStreamEventTest.kt index 92b983e49..36197cc3e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseStreamEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseStreamEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTest.kt index dc6127f63..251700a2c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTextConfigTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTextConfigTest.kt index acfa5abca..5befde160 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTextConfigTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTextConfigTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTextDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTextDeltaEventTest.kt index 89a3c9b56..51c92875b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTextDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTextDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTextDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTextDoneEventTest.kt index 436cdaa35..b04c64c85 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTextDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseTextDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchCallTest.kt index ddfc1be22..5baf41b88 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItemParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItemParamTest.kt index e651463cd..e32504c43 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItemParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItemParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItemTest.kt index f2640bd52..31f2de119 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseToolSearchOutputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseUsageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseUsageTest.kt index c829b0b1c..b809a9e73 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseUsageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseUsageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallCompletedEventTest.kt index de433c69c..1ca0761d9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallInProgressEventTest.kt index ede23b600..3ff4f7d11 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallSearchingEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallSearchingEventTest.kt index 648b58dac..5306724dc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallSearchingEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponseWebSearchCallSearchingEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponsesClientEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponsesClientEventTest.kt index ec0fd1c69..daf984f0d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponsesClientEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponsesClientEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponsesServerEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponsesServerEventTest.kt index c896d5ba4..6b6a01487 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponsesServerEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponsesServerEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaSkillReferenceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaSkillReferenceTest.kt index 931100ef1..9669f62ab 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaSkillReferenceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaSkillReferenceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceAllowedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceAllowedTest.kt index a813ba69d..d3eab75e0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceAllowedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceAllowedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceApplyPatchTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceApplyPatchTest.kt index ee653b67c..d16779c03 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceApplyPatchTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceApplyPatchTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceCustomTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceCustomTest.kt index a2f460508..a4e725fb2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceCustomTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceCustomTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceFunctionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceFunctionTest.kt index af236f1a9..d960795dc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceFunctionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceFunctionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceMcpTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceMcpTest.kt index 30cbca84f..e25ccfd13 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceMcpTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceMcpTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceShellTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceShellTest.kt index 03c9fd187..76e269ce8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceShellTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceShellTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceTypesTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceTypesTest.kt index 7e677c1bf..d08219072 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceTypesTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolChoiceTypesTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolSearchToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolSearchToolTest.kt index acb5a09aa..e48316972 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolSearchToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolSearchToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolTest.kt index b2b387951..6869a21cb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses @@ -725,7 +725,7 @@ internal class BetaToolTest { fun ofNamespace() { val namespace = BetaNamespaceTool.builder() - .description("x") + .description("description") .name("x") .addTool( BetaNamespaceTool.Tool.Function.builder() @@ -770,7 +770,7 @@ internal class BetaToolTest { val betaTool = BetaTool.ofNamespace( BetaNamespaceTool.builder() - .description("x") + .description("description") .name("x") .addTool( BetaNamespaceTool.Tool.Function.builder() diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaWebSearchPreviewToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaWebSearchPreviewToolTest.kt index e23938934..a7920104a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaWebSearchPreviewToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaWebSearchPreviewToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaWebSearchToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaWebSearchToolTest.kt index 5fe921778..2215ddb7d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaWebSearchToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaWebSearchToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseCancelParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseCancelParamsTest.kt index c275e5436..7a3cd7bdf 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseCancelParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseCancelParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseCompactParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseCompactParamsTest.kt index 2739248d9..121b5b776 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseCompactParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseCompactParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseCreateParamsTest.kt index b32c45006..a5593aeb9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseDeleteParamsTest.kt index 7c91749f5..e7cc84d9a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseRetrieveParamsTest.kt index f81f8a19c..3b16f676e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/ResponseRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputitems/BetaResponseItemListTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputitems/BetaResponseItemListTest.kt index 709b2efb7..ca5f2b861 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputitems/BetaResponseItemListTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputitems/BetaResponseItemListTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses.inputitems diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputitems/InputItemListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputitems/InputItemListParamsTest.kt index 898919c37..43d642f91 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputitems/InputItemListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputitems/InputItemListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses.inputitems diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountParamsTest.kt index 3f39c97ef..95a3a0896 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses.inputtokens diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountResponseTest.kt index 0b91e6681..4d5b4bcf3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/responses/inputtokens/InputTokenCountResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.responses.inputtokens diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantResponseFormatOptionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantResponseFormatOptionTest.kt index cb068e74d..f6829adc4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantResponseFormatOptionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantResponseFormatOptionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantToolChoiceFunctionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantToolChoiceFunctionTest.kt index 48d8e616e..81bd6f039 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantToolChoiceFunctionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantToolChoiceFunctionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantToolChoiceOptionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantToolChoiceOptionTest.kt index 4d2fedc00..4f638c52e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantToolChoiceOptionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantToolChoiceOptionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantToolChoiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantToolChoiceTest.kt index 014d3cac5..b2466c017 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantToolChoiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/AssistantToolChoiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadCreateAndRunParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadCreateAndRunParamsTest.kt index 9d0b6e413..1df6742e3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadCreateAndRunParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadCreateAndRunParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadCreateParamsTest.kt index 86965ee5d..fd5b48d47 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadDeleteParamsTest.kt index dce81a07a..3e98dd700 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadDeletedTest.kt index 6bc4351c3..ef48278f9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadRetrieveParamsTest.kt index bbdff2e01..92483c853 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadTest.kt index e98c42b4f..2b5e8fe83 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadUpdateParamsTest.kt index 0ed6824a0..9a06e763f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/ThreadUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/AnnotationDeltaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/AnnotationDeltaTest.kt index d2723e517..628062a5c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/AnnotationDeltaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/AnnotationDeltaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/AnnotationTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/AnnotationTest.kt index 370e765dd..56e09abac 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/AnnotationTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/AnnotationTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FileCitationAnnotationTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FileCitationAnnotationTest.kt index 6d0507bc2..ae796197a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FileCitationAnnotationTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FileCitationAnnotationTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FileCitationDeltaAnnotationTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FileCitationDeltaAnnotationTest.kt index 0264f4c62..9a74cd573 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FileCitationDeltaAnnotationTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FileCitationDeltaAnnotationTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FilePathAnnotationTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FilePathAnnotationTest.kt index 56041ee6b..b2c37f108 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FilePathAnnotationTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FilePathAnnotationTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FilePathDeltaAnnotationTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FilePathDeltaAnnotationTest.kt index bac46bcc3..8d202316f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FilePathDeltaAnnotationTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/FilePathDeltaAnnotationTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileContentBlockTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileContentBlockTest.kt index 5be6fe23f..2371dfea7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileContentBlockTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileContentBlockTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileDeltaBlockTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileDeltaBlockTest.kt index 95c1ce88c..2831f4801 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileDeltaBlockTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileDeltaBlockTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileDeltaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileDeltaTest.kt index 3d9482013..5b5955615 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileDeltaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileDeltaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileTest.kt index 87799d0ec..160797f09 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageFileTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlContentBlockTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlContentBlockTest.kt index 7ac3494fa..e41db89f9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlContentBlockTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlContentBlockTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlDeltaBlockTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlDeltaBlockTest.kt index ce539cf2a..094757881 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlDeltaBlockTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlDeltaBlockTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlDeltaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlDeltaTest.kt index d0f0691c7..bb237cd3c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlDeltaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlDeltaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlTest.kt index d2e8424e8..085ce16f7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/ImageUrlTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageContentDeltaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageContentDeltaTest.kt index 5b1f7e91e..ccd81740e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageContentDeltaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageContentDeltaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageContentPartParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageContentPartParamTest.kt index 3975b6620..3b3193631 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageContentPartParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageContentPartParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageContentTest.kt index c690b0fed..440721d98 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageCreateParamsTest.kt index edbac2659..71999b35b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeleteParamsTest.kt index 8f5634999..2ccf11827 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeletedTest.kt index fe930497c..229935492 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeltaEventTest.kt index e86267120..084ea2c74 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeltaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeltaTest.kt index 43bd4fe39..808878952 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeltaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageDeltaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageListPageResponseTest.kt index 5efdc0962..138cbebfd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageListParamsTest.kt index 3b266b58f..14b140e50 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageRetrieveParamsTest.kt index cb8cdf5ab..653f55394 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageTest.kt index b64ca0bf2..e6616d0ad 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageUpdateParamsTest.kt index e340640bb..47f4c8a53 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/MessageUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/RefusalContentBlockTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/RefusalContentBlockTest.kt index 9b2602750..845d8e066 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/RefusalContentBlockTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/RefusalContentBlockTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/RefusalDeltaBlockTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/RefusalDeltaBlockTest.kt index 0e80f815f..317b3fe5b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/RefusalDeltaBlockTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/RefusalDeltaBlockTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextContentBlockParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextContentBlockParamTest.kt index c4f39e257..dd8b2d7e3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextContentBlockParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextContentBlockParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextContentBlockTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextContentBlockTest.kt index fa2f1ae0f..615379f7f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextContentBlockTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextContentBlockTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextDeltaBlockTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextDeltaBlockTest.kt index 73f4293d9..74fb05a73 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextDeltaBlockTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextDeltaBlockTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextDeltaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextDeltaTest.kt index f4af32bf7..bd1087082 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextDeltaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextDeltaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextTest.kt index 06d3e0284..97169f942 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/messages/TextTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RequiredActionFunctionToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RequiredActionFunctionToolCallTest.kt index 03d08169e..f9922a3bb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RequiredActionFunctionToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RequiredActionFunctionToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunCancelParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunCancelParamsTest.kt index 4ad0aba8b..596c8561b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunCancelParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunCancelParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunCreateParamsTest.kt index 4337f75af..e3916ea3a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunListPageResponseTest.kt index 0b370711c..f8369c88c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunListParamsTest.kt index a89fd6ef9..a92422152 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunRetrieveParamsTest.kt index 229fe8f73..1ecbb3ffb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunSubmitToolOutputsParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunSubmitToolOutputsParamsTest.kt index f0de1685e..39ab7a5fe 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunSubmitToolOutputsParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunSubmitToolOutputsParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunTest.kt index 479ba8380..5979651c5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunUpdateParamsTest.kt index 343520020..24123c6db 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/RunUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterLogsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterLogsTest.kt index bfb38cc4d..675c64de5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterLogsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterLogsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterOutputImageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterOutputImageTest.kt index 0b869f498..da97787fa 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterOutputImageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterOutputImageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCallDeltaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCallDeltaTest.kt index 52c758c77..d0e893606 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCallDeltaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCallDeltaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCallTest.kt index 9f9aded0c..c861c9149 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/CodeInterpreterToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCallDeltaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCallDeltaTest.kt index bf5308b79..a54025236 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCallDeltaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCallDeltaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCallTest.kt index fa57a2d0a..adf29723f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FileSearchToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCallDeltaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCallDeltaTest.kt index 5cbdc50f3..91421f357 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCallDeltaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCallDeltaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCallTest.kt index 05dc41d38..0780ee36f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/FunctionToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/MessageCreationStepDetailsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/MessageCreationStepDetailsTest.kt index d4bf10822..d40912d28 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/MessageCreationStepDetailsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/MessageCreationStepDetailsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaEventTest.kt index 10ccd1d11..9a7b1f605 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaMessageDeltaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaMessageDeltaTest.kt index 8b1aa7220..12d81e053 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaMessageDeltaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaMessageDeltaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaTest.kt index db89ad662..7db6002e0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepDeltaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepTest.kt index 5676de463..9abd0c989 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/RunStepTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/StepListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/StepListPageResponseTest.kt index 5e0a2ef8e..ddac2f5d6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/StepListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/StepListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/StepListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/StepListParamsTest.kt index 3a23bf89c..c1ef36654 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/StepListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/StepListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/StepRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/StepRetrieveParamsTest.kt index 7961ff239..853632d6f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/StepRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/StepRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDeltaObjectTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDeltaObjectTest.kt index f385e0197..bfd964a2e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDeltaObjectTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDeltaObjectTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDeltaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDeltaTest.kt index aff6ab59e..0d7b3596b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDeltaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallDeltaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallTest.kt index 6cb958877..3b91878c6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallsStepDetailsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallsStepDetailsTest.kt index 8dff216e3..e1c9f5471 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallsStepDetailsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/beta/threads/runs/steps/ToolCallsStepDetailsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.beta.threads.runs.steps diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedToolChoiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedToolChoiceTest.kt index 590af2728..2e12f6f68 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedToolChoiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedToolChoiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedToolsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedToolsTest.kt index 7409797aa..f2acea343 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedToolsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAllowedToolsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAssistantMessageParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAssistantMessageParamTest.kt index a30d4326c..446ed91e3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAssistantMessageParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAssistantMessageParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAudioParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAudioParamTest.kt index 8464144fb..949f319c9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAudioParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAudioParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAudioTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAudioTest.kt index 92ba98c9f..ac0284ed5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAudioTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionAudioTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionChunkTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionChunkTest.kt index eeca8ff46..0dc6fb007 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionChunkTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionChunkTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartImageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartImageTest.kt index 15dc097eb..0e2b616db 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartImageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartImageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartInputAudioTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartInputAudioTest.kt index c8e9edfa2..b7384544e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartInputAudioTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartInputAudioTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartRefusalTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartRefusalTest.kt index b5459ce19..4c65c252a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartRefusalTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartRefusalTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartTest.kt index 96ac85e96..fdcf08c3e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartTextTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartTextTest.kt index 997db5105..bc28c9f9c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartTextTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionContentPartTextTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParamsTest.kt index 17e739223..c560bb0ce 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionCustomToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionCustomToolTest.kt index ad525f20b..72afa0ba9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionCustomToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionCustomToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionDeleteParamsTest.kt index e0a35f5c3..aecfe86b7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionDeletedTest.kt index 9c5c64dec..8fca411d9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionDeveloperMessageParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionDeveloperMessageParamTest.kt index fb6f24872..1a6d65afe 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionDeveloperMessageParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionDeveloperMessageParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionCallOptionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionCallOptionTest.kt index 17ce87806..9781c58cb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionCallOptionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionCallOptionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionMessageParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionMessageParamTest.kt index 82d0dffb8..597ffb46e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionMessageParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionMessageParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionToolTest.kt index 63ac57eb4..0ab1ea101 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionFunctionToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionListPageResponseTest.kt index 57830dab5..1b66bb240 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionListParamsTest.kt index 7e9764824..bb6e8375e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageCustomToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageCustomToolCallTest.kt index 633f27849..dc2e555cb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageCustomToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageCustomToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageFunctionToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageFunctionToolCallTest.kt index c8b1c555a..bca87f09c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageFunctionToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageFunctionToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageParamTest.kt index 231fe5153..bf89d5d27 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageTest.kt index 67ccd7a21..2f1dc20d8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageToolCallTest.kt index 0231e1f1f..849e70f92 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionMessageToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoiceCustomTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoiceCustomTest.kt index abe51f9f0..bb1e253aa 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoiceCustomTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoiceCustomTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoiceTest.kt index 951de8646..8e0696893 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionNamedToolChoiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionPredictionContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionPredictionContentTest.kt index 74357a3d2..263983185 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionPredictionContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionPredictionContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionRetrieveParamsTest.kt index 5420d0e66..82e06bf13 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionStoreMessageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionStoreMessageTest.kt index daec836ea..fd0bcf60e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionStoreMessageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionStoreMessageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionStreamOptionsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionStreamOptionsTest.kt index 253e8aa00..5c910e963 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionStreamOptionsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionStreamOptionsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionSystemMessageParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionSystemMessageParamTest.kt index c0a8f1e7e..9979f01f8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionSystemMessageParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionSystemMessageParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionTest.kt index 3481f8beb..286002ac1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionTokenLogprobTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionTokenLogprobTest.kt index 6fc961221..0ca38db22 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionTokenLogprobTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionTokenLogprobTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionToolChoiceOptionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionToolChoiceOptionTest.kt index a1c96d568..8e80c8001 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionToolChoiceOptionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionToolChoiceOptionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionToolMessageParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionToolMessageParamTest.kt index 007f7b458..1ad66095a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionToolMessageParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionToolMessageParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionToolTest.kt index b34c3cadd..4090213a6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionUpdateParamsTest.kt index 4333eb3c5..d264dddd1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionUserMessageParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionUserMessageParamTest.kt index 2027b08bd..c068e92bc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionUserMessageParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/ChatCompletionUserMessageParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/messages/MessageListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/messages/MessageListPageResponseTest.kt index 34ba80597..d5c90e4ab 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/messages/MessageListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/messages/MessageListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/messages/MessageListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/messages/MessageListParamsTest.kt index de1ce4df1..fc81afca3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/messages/MessageListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/chat/completions/messages/MessageListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.chat.completions.messages diff --git a/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionChoiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionChoiceTest.kt index ada0854b4..b882080a1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionChoiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionChoiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionCreateParamsTest.kt index 09768fe95..857ec1c01 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionTest.kt index 81e2f2154..9ff8f0a5f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionUsageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionUsageTest.kt index 9feecc4c5..b8cf14d17 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionUsageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/completions/CompletionUsageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerCreateParamsTest.kt index 4c89f914a..151272d08 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerCreateResponseTest.kt index c67fea5d8..59f6a8218 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerDeleteParamsTest.kt index 989cb8a01..180c05174 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerListPageResponseTest.kt index d69adec4e..58c2fdf47 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerListParamsTest.kt index 103450162..7f557ab8b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerListResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerListResponseTest.kt index cad6d2497..166bd8ec5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerListResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerListResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerRetrieveParamsTest.kt index 1d7e02a66..fc18a5544 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerRetrieveResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerRetrieveResponseTest.kt index 9870e6f6e..d564c68d5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerRetrieveResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/ContainerRetrieveResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileCreateParamsTest.kt index 8e2ae4167..3dc53bb8e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileCreateResponseTest.kt index 4f883f24c..719566432 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileDeleteParamsTest.kt index c83808fcd..451cd5bec 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileListPageResponseTest.kt index 7985f9f6f..a79aaa252 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileListParamsTest.kt index 298ba8b9a..159e88886 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileListResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileListResponseTest.kt index 8fbda9ce9..6e3250a96 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileListResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileListResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileRetrieveParamsTest.kt index 093612da4..3151be4b9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileRetrieveResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileRetrieveResponseTest.kt index e336a3f33..2efe40bd3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileRetrieveResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/FileRetrieveResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/content/ContentRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/content/ContentRetrieveParamsTest.kt index 260e95032..9a9dfd35d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/containers/files/content/ContentRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/containers/files/content/ContentRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.containers.files.content diff --git a/openai-java-core/src/test/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheckCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheckCreateParamsTest.kt index e4e98420c..083afe292 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheckCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheckCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.contentprovenancechecks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheckTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheckTest.kt index 97ecce7c3..b7489f50f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheckTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/contentprovenancechecks/ContentProvenanceCheckTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.contentprovenancechecks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ComputerScreenshotContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ComputerScreenshotContentTest.kt index 906eac84a..3d5fc8daa 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ComputerScreenshotContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ComputerScreenshotContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationCreateParamsTest.kt index dd0ed5f86..d4ff2e7e7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationDeleteParamsTest.kt index fce29d249..6dce191ca 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationDeletedResourceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationDeletedResourceTest.kt index 5a57b5ebe..148ee8129 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationDeletedResourceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationDeletedResourceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationDeletedTest.kt index c3d083eb4..3b453da36 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationRetrieveParamsTest.kt index 3e7bf7fd6..32f5f649e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationTest.kt index ed86aac97..ff59fc4a3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationUpdateParamsTest.kt index 4d1acfb64..5efeed08d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/ConversationUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/MessageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/MessageTest.kt index 04bbd06bb..2cdd038e9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/MessageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/MessageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/SummaryTextContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/SummaryTextContentTest.kt index c4bcd3cc7..67fdb3181 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/SummaryTextContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/SummaryTextContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/TextContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/TextContentTest.kt index 67b008293..03bffa7b0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/TextContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/TextContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ConversationItemListTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ConversationItemListTest.kt index 5a4b4d014..38df7790c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ConversationItemListTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ConversationItemListTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ConversationItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ConversationItemTest.kt index 5d9ade110..2598ce339 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ConversationItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ConversationItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemCreateParamsTest.kt index fc66f32b4..59d8f00a0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemDeleteParamsTest.kt index 28deac02a..3983b733f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemListParamsTest.kt index 562d300eb..0f10b32bc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemRetrieveParamsTest.kt index 3aeebf0ec..1a8723610 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/conversations/items/ItemRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.conversations.items diff --git a/openai-java-core/src/test/kotlin/com/openai/models/embeddings/CreateEmbeddingResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/embeddings/CreateEmbeddingResponseTest.kt index 43b58f12a..371738d9f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/embeddings/CreateEmbeddingResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/embeddings/CreateEmbeddingResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.embeddings diff --git a/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingCreateParamsTest.kt index 8f2a5d300..6cff738aa 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.embeddings diff --git a/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingTest.kt index 393c05cd4..079ffeff8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/embeddings/EmbeddingTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.embeddings diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalCreateParamsTest.kt index 4568b2f61..688e0bc4f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalCreateResponseTest.kt index 208c7d652..fbaebb7da 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalCustomDataSourceConfigTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalCustomDataSourceConfigTest.kt index e0de86b18..a7e35ae2d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalCustomDataSourceConfigTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalCustomDataSourceConfigTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalDeleteParamsTest.kt index 6cf51a820..4e9c6bdf9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalDeleteResponseTest.kt index d8e57d0c6..6fe168a02 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalListPageResponseTest.kt index 10d5eddbd..747d289dd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalListParamsTest.kt index 69bd1218d..c46701772 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalListResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalListResponseTest.kt index 11f418a8d..876a06da1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalListResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalListResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalRetrieveParamsTest.kt index bcebd0186..67f669012 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalRetrieveResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalRetrieveResponseTest.kt index 3838a4d01..22f68b6ef 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalRetrieveResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalRetrieveResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalStoredCompletionsDataSourceConfigTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalStoredCompletionsDataSourceConfigTest.kt index 076add935..7206d87a3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalStoredCompletionsDataSourceConfigTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalStoredCompletionsDataSourceConfigTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalUpdateParamsTest.kt index 2b36b5094..4fb4fb811 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalUpdateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalUpdateResponseTest.kt index e4632e7c0..690d5b93f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalUpdateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/EvalUpdateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/CreateEvalCompletionsRunDataSourceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/CreateEvalCompletionsRunDataSourceTest.kt index 1e4593e5a..081e19c2c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/CreateEvalCompletionsRunDataSourceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/CreateEvalCompletionsRunDataSourceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/CreateEvalJsonlRunDataSourceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/CreateEvalJsonlRunDataSourceTest.kt index 74517b876..200a4ffc0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/CreateEvalJsonlRunDataSourceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/CreateEvalJsonlRunDataSourceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/EvalApiErrorTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/EvalApiErrorTest.kt index 50b0f34da..bcb19aa4b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/EvalApiErrorTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/EvalApiErrorTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCancelParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCancelParamsTest.kt index 8cab71156..980fe8cb5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCancelParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCancelParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCancelResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCancelResponseTest.kt index a27cc00d7..aa088cf0d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCancelResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCancelResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCreateParamsTest.kt index 9ddce2141..dcab1afa6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCreateResponseTest.kt index be43773dc..e5147b24f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunDeleteParamsTest.kt index 55415f792..d1b5d6448 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunDeleteResponseTest.kt index cf65bf888..962a477cf 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunListPageResponseTest.kt index 6cab7d411..96903ec1b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunListParamsTest.kt index 0fc340c73..0b5ff4c8b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunListResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunListResponseTest.kt index d49044a43..3e9f39da6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunListResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunListResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunRetrieveParamsTest.kt index e18140dcf..c5440a31b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunRetrieveResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunRetrieveResponseTest.kt index 4b995c077..228ab1dc8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunRetrieveResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/RunRetrieveResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPageResponseTest.kt index 14b6d74f7..f56f3358d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs.outputitems diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListParamsTest.kt index 0f3796ba5..3dcb77797 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs.outputitems diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListResponseTest.kt index 61429b20b..41793eddd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemListResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs.outputitems diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveParamsTest.kt index 01e59554d..9f4a61215 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs.outputitems diff --git a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveResponseTest.kt index 9b94e6dd7..3498b0b87 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/evals/runs/outputitems/OutputItemRetrieveResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.evals.runs.outputitems diff --git a/openai-java-core/src/test/kotlin/com/openai/models/files/FileContentParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/files/FileContentParamsTest.kt index 9c93a9c3d..1377202fe 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/files/FileContentParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/files/FileContentParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/files/FileCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/files/FileCreateParamsTest.kt index d0e25ed1b..90aeda72f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/files/FileCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/files/FileCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/files/FileDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/files/FileDeleteParamsTest.kt index 3cd8a13df..359546236 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/files/FileDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/files/FileDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/files/FileDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/files/FileDeletedTest.kt index 399759d98..5808c042a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/files/FileDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/files/FileDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/files/FileListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/files/FileListPageResponseTest.kt index b5da4e92a..deeee01a2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/files/FileListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/files/FileListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/files/FileListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/files/FileListParamsTest.kt index b5de83607..a5e16d111 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/files/FileListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/files/FileListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/files/FileObjectTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/files/FileObjectTest.kt index fbd36c4de..7f0016e2d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/files/FileObjectTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/files/FileObjectTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/files/FileRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/files/FileRetrieveParamsTest.kt index 4643e87cb..d16836cc8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/files/FileRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/files/FileRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunParamsTest.kt index b153d0168..f3ae868fc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.alpha.graders diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunResponseTest.kt index ee806aba7..55ef665f6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderRunResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.alpha.graders diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateParamsTest.kt index 214773004..9f82fa74d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.alpha.graders diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateResponseTest.kt index 7fc0a06d4..f8b480fb9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/alpha/graders/GraderValidateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.alpha.graders diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePageResponseTest.kt index 65ca9e316..f4c8fa8a6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreatePageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateParamsTest.kt index f58dc932c..9ab4aea66 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateResponseTest.kt index e0acc4e21..d8dc0fea6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteParamsTest.kt index 9cc7e5ee8..4aeac586f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteResponseTest.kt index 3f12e0313..c0635e723 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPageResponseTest.kt index 7de96ada7..ac4f6418a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListParamsTest.kt index 2f363314d..b36b37a64 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListResponseTest.kt index a1c6ee120..9f1573d2d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionListResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveParamsTest.kt index cc6df4839..539b454fb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveResponseTest.kt index a1a0eaa5d..0b649f487 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/checkpoints/permissions/PermissionRetrieveResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.checkpoints.permissions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobEventTest.kt index 336f21824..86b54c233 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobTest.kt index 5d1f8f919..3226d2f4a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegrationObjectTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegrationObjectTest.kt index b46ff3521..0d38ab9f9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegrationObjectTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegrationObjectTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegrationTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegrationTest.kt index c3cac9272..63b83d978 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegrationTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/FineTuningJobWandbIntegrationTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobCancelParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobCancelParamsTest.kt index c401625b8..70f59de8a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobCancelParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobCancelParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobCreateParamsTest.kt index 3b74ae142..58ffb9969 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListEventsPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListEventsPageResponseTest.kt index b468b8524..95f040e77 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListEventsPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListEventsPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListEventsParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListEventsParamsTest.kt index 144baa7ed..a7faf1ef1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListEventsParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListEventsParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListPageResponseTest.kt index 169aad89d..678696c0a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListParamsTest.kt index 1d50344e9..bb0b3d7e7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobPauseParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobPauseParamsTest.kt index 052bab3e2..7ae52e041 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobPauseParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobPauseParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobResumeParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobResumeParamsTest.kt index e3f90315e..932ff0580 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobResumeParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobResumeParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobRetrieveParamsTest.kt index d44e517c5..fb50b3f85 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/JobRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPageResponseTest.kt index 4397f3e0f..a950df9c0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs.checkpoints diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListParamsTest.kt index 2593d0324..f90c4cf98 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/checkpoints/CheckpointListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs.checkpoints diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/checkpoints/FineTuningJobCheckpointTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/checkpoints/FineTuningJobCheckpointTest.kt index 9e13e45fe..96e261152 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/checkpoints/FineTuningJobCheckpointTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/jobs/checkpoints/FineTuningJobCheckpointTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.jobs.checkpoints diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/DpoHyperparametersTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/DpoHyperparametersTest.kt index d220c3c7c..53b573346 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/DpoHyperparametersTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/DpoHyperparametersTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.methods diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/DpoMethodTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/DpoMethodTest.kt index 58ef87317..41e15a6bf 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/DpoMethodTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/DpoMethodTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.methods diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/ReinforcementHyperparametersTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/ReinforcementHyperparametersTest.kt index c72042346..52b77085a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/ReinforcementHyperparametersTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/ReinforcementHyperparametersTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.methods diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/ReinforcementMethodTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/ReinforcementMethodTest.kt index 271a02bee..383c4e092 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/ReinforcementMethodTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/ReinforcementMethodTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.methods diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/SupervisedHyperparametersTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/SupervisedHyperparametersTest.kt index 99b9ec04d..1ee6147c8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/SupervisedHyperparametersTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/SupervisedHyperparametersTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.methods diff --git a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/SupervisedMethodTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/SupervisedMethodTest.kt index 93769d44f..97fdb6121 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/SupervisedMethodTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/finetuning/methods/SupervisedMethodTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.finetuning.methods diff --git a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/EvalContentItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/EvalContentItemTest.kt index fec339aed..4a14e2982 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/EvalContentItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/EvalContentItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/LabelModelGraderTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/LabelModelGraderTest.kt index 8243d7362..7db523a4b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/LabelModelGraderTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/LabelModelGraderTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/MultiGraderTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/MultiGraderTest.kt index 3f8c748d4..22b9c2ec6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/MultiGraderTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/MultiGraderTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/PythonGraderTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/PythonGraderTest.kt index 3ac30afbc..ca28b00e1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/PythonGraderTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/PythonGraderTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/ScoreModelGraderTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/ScoreModelGraderTest.kt index 1e67ef386..8ee81acd5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/ScoreModelGraderTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/ScoreModelGraderTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/StringCheckGraderTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/StringCheckGraderTest.kt index 6eb0c92b9..70179e354 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/StringCheckGraderTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/StringCheckGraderTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/TextSimilarityGraderTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/TextSimilarityGraderTest.kt index 6c60c99b2..2f07f0d1b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/TextSimilarityGraderTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/graders/gradermodels/TextSimilarityGraderTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.graders.gradermodels diff --git a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageCreateVariationParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageCreateVariationParamsTest.kt index b5c637ec9..21fe4220d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageCreateVariationParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageCreateVariationParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditCompletedEventTest.kt index 18cae519e..7c1f27ef3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditParamsTest.kt index 6b47af584..f07fd657d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditPartialImageEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditPartialImageEventTest.kt index a636f6b1f..894f3810e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditPartialImageEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditPartialImageEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditStreamEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditStreamEventTest.kt index 19fedaa00..02dcd5bfb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditStreamEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageEditStreamEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenCompletedEventTest.kt index 25368338d..103330340 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenPartialImageEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenPartialImageEventTest.kt index 2ff6a261f..03aa7ca64 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenPartialImageEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenPartialImageEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenStreamEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenStreamEventTest.kt index a5996e8f6..d2125e0c9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenStreamEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenStreamEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenerateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenerateParamsTest.kt index d96714e1c..3a8709945 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenerateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageGenerateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageTest.kt index bfc7b8078..6ddbf47c5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/images/ImageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/images/ImageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/test/kotlin/com/openai/models/images/ImagesResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/images/ImagesResponseTest.kt index 93a3e5934..a69e6dccf 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/images/ImagesResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/images/ImagesResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.images diff --git a/openai-java-core/src/test/kotlin/com/openai/models/models/ModelDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/models/ModelDeleteParamsTest.kt index 4b2f11ba4..6188c6985 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/models/ModelDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/models/ModelDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/models/ModelDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/models/ModelDeletedTest.kt index 5836f8079..668243763 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/models/ModelDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/models/ModelDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/models/ModelListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/models/ModelListPageResponseTest.kt index b66115bed..8d61bdfdf 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/models/ModelListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/models/ModelListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/models/ModelListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/models/ModelListParamsTest.kt index c49c885e6..3dfb5a6d8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/models/ModelListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/models/ModelListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/models/ModelRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/models/ModelRetrieveParamsTest.kt index 7e8ceba80..9245f15e6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/models/ModelRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/models/ModelRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/models/ModelTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/models/ModelTest.kt index 456d9fa9a..ceb00ce25 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/models/ModelTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/models/ModelTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.models diff --git a/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationCreateParamsTest.kt index d9365fd0f..e7c141012 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.moderations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationCreateResponseTest.kt index 903824ac2..02543eaa8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.moderations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationImageUrlInputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationImageUrlInputTest.kt index 1398c6ab6..b5a4a86dc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationImageUrlInputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationImageUrlInputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.moderations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationMultiModalInputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationMultiModalInputTest.kt index b47b114f2..4ada6992e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationMultiModalInputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationMultiModalInputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.moderations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationTest.kt index ec9f85c0b..7a8fc3e2f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.moderations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationTextInputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationTextInputTest.kt index cde1b8d55..e7490a27e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationTextInputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/moderations/ModerationTextInputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.moderations diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/AudioTranscriptionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/AudioTranscriptionTest.kt index 28ded87ec..d4ea5ae5b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/AudioTranscriptionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/AudioTranscriptionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationCreatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationCreatedEventTest.kt index 085287095..07363236c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationCreatedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationCreatedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemAddedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemAddedTest.kt index a81d0cb15..877654121 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemAddedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemAddedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemCreateEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemCreateEventTest.kt index 0e2018fc5..303309b88 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemCreateEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemCreateEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemCreatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemCreatedEventTest.kt index 4d3532123..3dde591a5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemCreatedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemCreatedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemDeleteEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemDeleteEventTest.kt index a48f5c5df..8341a7754 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemDeleteEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemDeleteEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemDeletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemDeletedEventTest.kt index 9b194521f..5e96a1e27 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemDeletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemDeletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemDoneTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemDoneTest.kt index 0980d613b..86e3d9e6d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemDoneTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemDoneTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionCompletedEventTest.kt index 362c08aaf..bc40fb1a5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionDeltaEventTest.kt index 7cac0fb13..30ef4cb1b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionFailedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionFailedEventTest.kt index 08095cf7c..40b06651e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionFailedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionFailedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionSegmentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionSegmentTest.kt index dd3ccfc33..81e4ae564 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionSegmentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemInputAudioTranscriptionSegmentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemRetrieveEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemRetrieveEventTest.kt index 06360b607..f28d47949 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemRetrieveEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemRetrieveEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemTest.kt index ab853cc63..a08761ee0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemTruncateEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemTruncateEventTest.kt index 08a1f5a27..42a625a47 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemTruncateEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemTruncateEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemTruncatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemTruncatedEventTest.kt index 53efaac98..7b335b60f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemTruncatedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemTruncatedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemWithReferenceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemWithReferenceTest.kt index da5eb0ced..00ffce8d7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemWithReferenceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ConversationItemWithReferenceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferAppendEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferAppendEventTest.kt index d5a8023f8..76e376e6a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferAppendEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferAppendEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferClearEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferClearEventTest.kt index 5e0115095..1301b184b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferClearEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferClearEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferClearedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferClearedEventTest.kt index 9b14f7c76..740ce806e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferClearedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferClearedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferCommitEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferCommitEventTest.kt index ccb9de229..42d55b514 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferCommitEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferCommitEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferCommittedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferCommittedEventTest.kt index 4df4b746a..a2948153e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferCommittedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferCommittedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferDtmfEventReceivedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferDtmfEventReceivedEventTest.kt index 5782d968b..2db465698 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferDtmfEventReceivedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferDtmfEventReceivedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStartedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStartedEventTest.kt index e597d94d3..4fe29f620 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStartedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStartedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStoppedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStoppedEventTest.kt index 9a1c80e2b..dd47d34d6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStoppedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferSpeechStoppedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferTimeoutTriggeredTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferTimeoutTriggeredTest.kt index d3ae1afd9..c97534677 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferTimeoutTriggeredTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/InputAudioBufferTimeoutTriggeredTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/LogProbPropertiesTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/LogProbPropertiesTest.kt index a0f4be6e8..c8aedc22e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/LogProbPropertiesTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/LogProbPropertiesTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/McpListToolsCompletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/McpListToolsCompletedTest.kt index 6ff8299e3..0fa52add7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/McpListToolsCompletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/McpListToolsCompletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/McpListToolsFailedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/McpListToolsFailedTest.kt index 58fe47afc..d20f4bd12 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/McpListToolsFailedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/McpListToolsFailedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/McpListToolsInProgressTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/McpListToolsInProgressTest.kt index cbeef9e4d..66a36f83d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/McpListToolsInProgressTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/McpListToolsInProgressTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/OutputAudioBufferClearEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/OutputAudioBufferClearEventTest.kt index 5df231d2a..e80855b89 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/OutputAudioBufferClearEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/OutputAudioBufferClearEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RateLimitsUpdatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RateLimitsUpdatedEventTest.kt index 8fa85e02e..7a3ba893a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RateLimitsUpdatedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RateLimitsUpdatedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioConfigInputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioConfigInputTest.kt index 9dfffaa90..7b08bd23b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioConfigInputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioConfigInputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioConfigOutputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioConfigOutputTest.kt index c2efa1d8c..3643108c7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioConfigOutputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioConfigOutputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioConfigTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioConfigTest.kt index 91639166d..affbc91a4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioConfigTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioConfigTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioFormatsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioFormatsTest.kt index fc2f20143..11ea3b164 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioFormatsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioFormatsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioInputTurnDetectionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioInputTurnDetectionTest.kt index cb8b26dd5..926ec80f7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioInputTurnDetectionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeAudioInputTurnDetectionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeClientEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeClientEventTest.kt index 2637b0415..39fcd3be9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeClientEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeClientEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemAssistantMessageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemAssistantMessageTest.kt index 1bd1a049b..bd21487ff 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemAssistantMessageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemAssistantMessageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCallOutputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCallOutputTest.kt index 1fc08f5f4..26df32584 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCallOutputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCallOutputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCallTest.kt index df67f1508..503baf2c9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemFunctionCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemSystemMessageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemSystemMessageTest.kt index 31c21bfca..343261340 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemSystemMessageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemSystemMessageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemUserMessageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemUserMessageTest.kt index f835398cd..4c467c38b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemUserMessageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeConversationItemUserMessageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeErrorEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeErrorEventTest.kt index 38429a309..c37482e70 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeErrorEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeErrorEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeErrorTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeErrorTest.kt index 4bfbc3814..c2e990c72 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeErrorTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeErrorTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeFunctionToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeFunctionToolTest.kt index f5bbc560d..003f6a848 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeFunctionToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeFunctionToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpApprovalRequestTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpApprovalRequestTest.kt index edbd1cf10..0b8161c0d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpApprovalRequestTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpApprovalRequestTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpApprovalResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpApprovalResponseTest.kt index a532f1b2d..6e82f3a4a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpApprovalResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpApprovalResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpListToolsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpListToolsTest.kt index 6e149e456..20ca316fd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpListToolsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpListToolsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpProtocolErrorTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpProtocolErrorTest.kt index afe8293d7..604aae8b0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpProtocolErrorTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpProtocolErrorTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpToolCallTest.kt index 60728c8e4..b63d8941d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpToolExecutionErrorTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpToolExecutionErrorTest.kt index cceff1a1b..efbdc6011 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpToolExecutionErrorTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcpToolExecutionErrorTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcphttpErrorTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcphttpErrorTest.kt index c7e19acf3..358535fb7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcphttpErrorTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeMcphttpErrorTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeReasoningTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeReasoningTest.kt index 6d67d27ad..5a4203122 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeReasoningTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeReasoningTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseCreateAudioOutputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseCreateAudioOutputTest.kt index d850acf84..8ff252771 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseCreateAudioOutputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseCreateAudioOutputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseCreateMcpToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseCreateMcpToolTest.kt index 225fd02d4..a86516553 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseCreateMcpToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseCreateMcpToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseCreateParamsTest.kt index a2664098e..1265c9aac 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseStatusTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseStatusTest.kt index e94d113df..6cb8c8a82 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseStatusTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseStatusTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseTest.kt index 85150970c..e5d795e35 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseUsageInputTokenDetailsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseUsageInputTokenDetailsTest.kt index 10934609d..c3614c585 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseUsageInputTokenDetailsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseUsageInputTokenDetailsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseUsageOutputTokenDetailsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseUsageOutputTokenDetailsTest.kt index 19ebb75d2..232cff196 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseUsageOutputTokenDetailsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseUsageOutputTokenDetailsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseUsageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseUsageTest.kt index cc0f429b9..c63ff2317 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseUsageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeResponseUsageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeServerEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeServerEventTest.kt index fcc8ddd75..75935f668 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeServerEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeServerEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeSessionCreateRequestTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeSessionCreateRequestTest.kt index b86c45bf9..5bcb73bcc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeSessionCreateRequestTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeSessionCreateRequestTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeSessionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeSessionTest.kt index d35afbd8e..f9184d7cb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeSessionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeSessionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeToolChoiceConfigTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeToolChoiceConfigTest.kt index 80864d3be..29873157a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeToolChoiceConfigTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeToolChoiceConfigTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeToolsConfigUnionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeToolsConfigUnionTest.kt index cd6668bc3..56eea0e9d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeToolsConfigUnionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeToolsConfigUnionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTracingConfigTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTracingConfigTest.kt index 90902cb6e..3e033b58e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTracingConfigTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTracingConfigTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInputTest.kt index f025e8ff4..76ec69885 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInputTurnDetectionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInputTurnDetectionTest.kt index e5e5835a7..253b7daba 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInputTurnDetectionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioInputTurnDetectionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioTest.kt index 5d4aa54ad..9e9e2d948 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionAudioTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionCreateRequestTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionCreateRequestTest.kt index 4176a51bc..1c442435b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionCreateRequestTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranscriptionSessionCreateRequestTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationClientEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationClientEventTest.kt index 825d63c2d..884b7b985 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationClientEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationClientEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateRequestTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateRequestTest.kt index 60624e9b7..5c5a5924d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateRequestTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateRequestTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateResponseTest.kt index f25ef2821..0222377dd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationClientSecretCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationInputAudioBufferAppendEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationInputAudioBufferAppendEventTest.kt index 9d3edeb99..07c96e0fe 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationInputAudioBufferAppendEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationInputAudioBufferAppendEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationInputTranscriptDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationInputTranscriptDeltaEventTest.kt index cf5a2b6c6..386ff195c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationInputTranscriptDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationInputTranscriptDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationOutputAudioDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationOutputAudioDeltaEventTest.kt index 2d1458246..7a9f2919c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationOutputAudioDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationOutputAudioDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationOutputTranscriptDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationOutputTranscriptDeltaEventTest.kt index f0157efc6..60c489690 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationOutputTranscriptDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationOutputTranscriptDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationServerEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationServerEventTest.kt index 27c6037a5..ce9968c96 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationServerEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationServerEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCloseEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCloseEventTest.kt index 35a009e38..fef06f8a0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCloseEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCloseEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionClosedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionClosedEventTest.kt index 7df2fd341..cee01e26c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionClosedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionClosedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreateRequestTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreateRequestTest.kt index 01f917b92..3b6a99d91 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreateRequestTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreateRequestTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreatedEventTest.kt index a934eb5c9..6d225a33d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreatedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionCreatedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionTest.kt index a969bcc94..ad5abab4b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateEventTest.kt index f300ef46d..f0771a99e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateRequestTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateRequestTest.kt index 830a1bf34..75a173c01 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateRequestTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdateRequestTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdatedEventTest.kt index b3321cf3e..f7a0f8c2d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdatedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTranslationSessionUpdatedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTruncationRetentionRatioTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTruncationRetentionRatioTest.kt index 6f835dbde..5476fb3cd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTruncationRetentionRatioTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTruncationRetentionRatioTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTruncationTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTruncationTest.kt index 08b0fa546..9cb5bbcf0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTruncationTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/RealtimeTruncationTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioDeltaEventTest.kt index ad0d42025..dd6eeea37 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioDoneEventTest.kt index 4141049ff..360b4e24f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDeltaEventTest.kt index c37e7ac69..aa84700c3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDoneEventTest.kt index 91fc635b6..3f05d7ac9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseAudioTranscriptDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseCancelEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseCancelEventTest.kt index 63ddfff50..664b9d676 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseCancelEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseCancelEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseContentPartAddedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseContentPartAddedEventTest.kt index a46b3e757..fe6a61d60 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseContentPartAddedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseContentPartAddedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseContentPartDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseContentPartDoneEventTest.kt index 1ce054fba..12eea3bc3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseContentPartDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseContentPartDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseCreateEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseCreateEventTest.kt index d344e47c6..0d93bc7cb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseCreateEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseCreateEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseCreatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseCreatedEventTest.kt index d938ddaf0..9e6454922 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseCreatedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseCreatedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseDoneEventTest.kt index f90868a48..4482c431e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDeltaEventTest.kt index 277bd36fc..97fda55d0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDoneEventTest.kt index 46bc8a9be..120b97dde 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseFunctionCallArgumentsDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDeltaTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDeltaTest.kt index 408a7dc55..51e015ed0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDeltaTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDeltaTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDoneTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDoneTest.kt index 87bed9336..a9e6fb7f4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDoneTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallArgumentsDoneTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallCompletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallCompletedTest.kt index 103c0f79c..1c5b8799f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallCompletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallCompletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallFailedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallFailedTest.kt index e1cbbd6a5..b5132e300 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallFailedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallFailedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallInProgressTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallInProgressTest.kt index 91292cdcb..c090c9d61 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallInProgressTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseMcpCallInProgressTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseOutputItemAddedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseOutputItemAddedEventTest.kt index 99f04ada8..ce872ff39 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseOutputItemAddedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseOutputItemAddedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseOutputItemDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseOutputItemDoneEventTest.kt index 17d8161b2..ae5b6915c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseOutputItemDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseOutputItemDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseTextDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseTextDeltaEventTest.kt index ea138e8da..5217b264f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseTextDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseTextDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseTextDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseTextDoneEventTest.kt index d33ee4bd6..945ece86c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseTextDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/ResponseTextDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/SessionCreatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/SessionCreatedEventTest.kt index b2f87526d..39db18f82 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/SessionCreatedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/SessionCreatedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/SessionUpdateEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/SessionUpdateEventTest.kt index 60c5641fb..c8980ed92 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/SessionUpdateEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/SessionUpdateEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/SessionUpdatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/SessionUpdatedEventTest.kt index 737c412fc..3f531e726 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/SessionUpdatedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/SessionUpdatedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/TranscriptionSessionUpdateTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/TranscriptionSessionUpdateTest.kt index 5c9b52255..3399f05e8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/TranscriptionSessionUpdateTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/TranscriptionSessionUpdateTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/TranscriptionSessionUpdatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/TranscriptionSessionUpdatedEventTest.kt index a6d052321..2753d2502 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/TranscriptionSessionUpdatedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/TranscriptionSessionUpdatedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallAcceptParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallAcceptParamsTest.kt index 6ef0a6add..6863cada0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallAcceptParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallAcceptParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.calls diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallHangupParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallHangupParamsTest.kt index aa5c43494..79a81d79c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallHangupParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallHangupParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.calls diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallReferParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallReferParamsTest.kt index 567e3c7d2..a3e47ff15 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallReferParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallReferParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.calls diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallRejectParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallRejectParamsTest.kt index c569662a8..aa505448f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallRejectParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/calls/CallRejectParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.calls diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateParamsTest.kt index 78480d611..20f892506 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.clientsecrets diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateResponseTest.kt index 39ef4fbb1..bac4ea6a5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/ClientSecretCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.clientsecrets diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/RealtimeSessionCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/RealtimeSessionCreateResponseTest.kt index 95ed3b396..4ba5feaa7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/RealtimeSessionCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/RealtimeSessionCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.clientsecrets diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionCreateResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionCreateResponseTest.kt index d83b62e45..32ffe87ce 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionCreateResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionCreateResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.clientsecrets diff --git a/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionTurnDetectionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionTurnDetectionTest.kt index 7b786a211..77214f134 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionTurnDetectionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/realtime/clientsecrets/RealtimeTranscriptionSessionTurnDetectionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.realtime.clientsecrets diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ApplyPatchToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ApplyPatchToolTest.kt index def922a66..b5e80fb33 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ApplyPatchToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ApplyPatchToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/CompactedResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/CompactedResponseTest.kt index 177fa8175..79316596b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/CompactedResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/CompactedResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ComputerActionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ComputerActionTest.kt index 7989e1100..4d906bb5f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ComputerActionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ComputerActionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ComputerToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ComputerToolTest.kt index c354647c6..61cc58d28 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ComputerToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ComputerToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ComputerUsePreviewToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ComputerUsePreviewToolTest.kt index e47a85134..8654f02a0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ComputerUsePreviewToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ComputerUsePreviewToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerAutoTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerAutoTest.kt index 995b13955..a6e4cf94e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerAutoTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerAutoTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerNetworkPolicyAllowlistTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerNetworkPolicyAllowlistTest.kt index 1c215e847..2efdd1d4b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerNetworkPolicyAllowlistTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerNetworkPolicyAllowlistTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerNetworkPolicyDisabledTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerNetworkPolicyDisabledTest.kt index 0885d2853..c0a3c40b7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerNetworkPolicyDisabledTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerNetworkPolicyDisabledTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerNetworkPolicyDomainSecretTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerNetworkPolicyDomainSecretTest.kt index 408b535b7..3b389338f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerNetworkPolicyDomainSecretTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerNetworkPolicyDomainSecretTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerReferenceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerReferenceTest.kt index e584d734f..796d411b5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerReferenceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ContainerReferenceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/CustomToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/CustomToolTest.kt index 2288a5fa8..0125265dc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/CustomToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/CustomToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/EasyInputMessageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/EasyInputMessageTest.kt index 977b2b9cb..c0a9e58a8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/EasyInputMessageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/EasyInputMessageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/FileSearchToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/FileSearchToolTest.kt index 5a5a7a150..ac0eabd6e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/FileSearchToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/FileSearchToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/FunctionShellToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/FunctionShellToolTest.kt index 6addacccd..7caaa4e65 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/FunctionShellToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/FunctionShellToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/FunctionToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/FunctionToolTest.kt index a5dbf4d12..e28b389c2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/FunctionToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/FunctionToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/InlineSkillSourceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/InlineSkillSourceTest.kt index 9b8d03609..d33e49d96 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/InlineSkillSourceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/InlineSkillSourceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/InlineSkillTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/InlineSkillTest.kt index 91e925ac5..d78824964 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/InlineSkillTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/InlineSkillTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/LocalEnvironmentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/LocalEnvironmentTest.kt index 7dd1d266a..30c3e907a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/LocalEnvironmentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/LocalEnvironmentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/LocalSkillTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/LocalSkillTest.kt index a832f5fc2..8d5954e7f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/LocalSkillTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/LocalSkillTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/NamespaceToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/NamespaceToolTest.kt index 1f5022e87..050ba8c7c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/NamespaceToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/NamespaceToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses @@ -14,7 +14,7 @@ internal class NamespaceToolTest { fun create() { val namespaceTool = NamespaceTool.builder() - .description("x") + .description("description") .name("x") .addTool( NamespaceTool.Tool.Function.builder() @@ -33,7 +33,7 @@ internal class NamespaceToolTest { ) .build() - assertThat(namespaceTool.description()).isEqualTo("x") + assertThat(namespaceTool.description()).isEqualTo("description") assertThat(namespaceTool.name()).isEqualTo("x") assertThat(namespaceTool.tools()) .containsExactly( @@ -60,7 +60,7 @@ internal class NamespaceToolTest { val jsonMapper = jsonMapper() val namespaceTool = NamespaceTool.builder() - .description("x") + .description("description") .name("x") .addTool( NamespaceTool.Tool.Function.builder() diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseApplyPatchToolCallOutputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseApplyPatchToolCallOutputTest.kt index d0281961a..e0cae8fec 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseApplyPatchToolCallOutputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseApplyPatchToolCallOutputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseApplyPatchToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseApplyPatchToolCallTest.kt index 3291c5db5..3e046699e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseApplyPatchToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseApplyPatchToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioDeltaEventTest.kt index aa8e75729..2847f8c65 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioDoneEventTest.kt index aef69b43d..190db6db8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioTranscriptDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioTranscriptDeltaEventTest.kt index 4b3214e53..028ca5e43 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioTranscriptDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioTranscriptDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioTranscriptDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioTranscriptDoneEventTest.kt index da06d8720..fa1d007c6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioTranscriptDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseAudioTranscriptDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCancelParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCancelParamsTest.kt index 53186ba35..14392d19b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCancelParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCancelParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDeltaEventTest.kt index cbe011ad1..07222bb11 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDoneEventTest.kt index 5a2054d67..5a3a308c1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCodeDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCompletedEventTest.kt index f2052a3a3..ff929146e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInProgressEventTest.kt index 3f93cb78c..c5e4913a8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInterpretingEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInterpretingEventTest.kt index 17603de13..3ca553b0b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInterpretingEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterCallInterpretingEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterToolCallTest.kt index 20c97faf4..cb711644e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCodeInterpreterToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompactParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompactParamsTest.kt index 4cf740f56..0f45f90a6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompactParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompactParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompactionItemParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompactionItemParamTest.kt index 8d4f68d75..0c10413f6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompactionItemParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompactionItemParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompactionItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompactionItemTest.kt index 51bf4cd9b..ad9f68099 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompactionItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompactionItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompletedEventTest.kt index 2f5d6e24a..0f581db60 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputItemTest.kt index ea9b7f8d9..2cfc7e55b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputScreenshotTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputScreenshotTest.kt index 3c7eee95d..34614e433 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputScreenshotTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseComputerToolCallOutputScreenshotTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseComputerToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseComputerToolCallTest.kt index eae2adb24..98b493edb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseComputerToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseComputerToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContainerReferenceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContainerReferenceTest.kt index 87de0882a..662330bca 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContainerReferenceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContainerReferenceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContentPartAddedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContentPartAddedEventTest.kt index cb7901c4e..52e1bc8f9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContentPartAddedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContentPartAddedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContentPartDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContentPartDoneEventTest.kt index d292a5594..1fc5aec90 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContentPartDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContentPartDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContentTest.kt index fcef86c9c..f63b61278 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseConversationParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseConversationParamTest.kt index e27ded8b7..a280c6234 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseConversationParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseConversationParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCreateParamsTest.kt index b7c56a3c2..3083041af 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCreatedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCreatedEventTest.kt index dabcfcdcf..6518f21bb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCreatedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCreatedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDeltaEventTest.kt index 2c4367df9..728db0f20 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDoneEventTest.kt index daa92ae60..b5b96e28a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallInputDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallItemTest.kt index 22f004616..baa9b02d7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallOutputItemTest.kt index 495ffe61a..34a61d38f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallOutputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallOutputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallOutputTest.kt index 338af89cc..825ab387d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallOutputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallOutputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallTest.kt index 70ede7c73..9e494b9fb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseCustomToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseDeleteParamsTest.kt index 28ec11458..6e5efd237 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseErrorEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseErrorEventTest.kt index 0b7d78f15..cd435c887 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseErrorEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseErrorEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseErrorTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseErrorTest.kt index 61131a59d..927f0d252 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseErrorTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseErrorTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFailedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFailedEventTest.kt index 04d6aa15c..1d9d895dd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFailedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFailedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchCallCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchCallCompletedEventTest.kt index 1e14113f8..ce8cdbb83 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchCallCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchCallCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchCallInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchCallInProgressEventTest.kt index 2687df821..75870265a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchCallInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchCallInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchCallSearchingEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchCallSearchingEventTest.kt index 48500a0ef..3bc4eb8f5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchCallSearchingEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchCallSearchingEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchToolCallTest.kt index 414ef927c..f162a6b2d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFileSearchToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFormatTextConfigTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFormatTextConfigTest.kt index e427c6381..e89ca9a17 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFormatTextConfigTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFormatTextConfigTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFormatTextJsonSchemaConfigTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFormatTextJsonSchemaConfigTest.kt index a0841defd..e7ad5bba5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFormatTextJsonSchemaConfigTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFormatTextJsonSchemaConfigTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDeltaEventTest.kt index a360ac2d3..02ba1cdc1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDoneEventTest.kt index 7e64cf974..3e4d33008 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionCallArgumentsDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionCallOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionCallOutputItemTest.kt index 3fe079380..46d18da3c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionCallOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionCallOutputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionShellCallOutputContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionShellCallOutputContentTest.kt index d17c96fea..5dd9321cc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionShellCallOutputContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionShellCallOutputContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionShellToolCallOutputTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionShellToolCallOutputTest.kt index de5c3339c..c03aae290 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionShellToolCallOutputTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionShellToolCallOutputTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionShellToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionShellToolCallTest.kt index c3af011b3..7aa2cfcc4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionShellToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionShellToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallItemTest.kt index 965f1b930..1a87fcd9f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItemTest.kt index 46b9ceec4..fc616fc5e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallOutputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallTest.kt index 0d8061061..3d8c26c29 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionToolCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionWebSearchTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionWebSearchTest.kt index 6b75c0559..93d404c60 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionWebSearchTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseFunctionWebSearchTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallCompletedEventTest.kt index ffa72c694..0198bf3d2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallGeneratingEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallGeneratingEventTest.kt index e51d8312f..3d4300043 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallGeneratingEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallGeneratingEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallInProgressEventTest.kt index d00d52f65..e7e105782 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallPartialImageEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallPartialImageEventTest.kt index 6573f9280..49dca3ef5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallPartialImageEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseImageGenCallPartialImageEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInProgressEventTest.kt index 7699f928e..4d5bd85eb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseIncompleteEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseIncompleteEventTest.kt index 3af877263..7892847c2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseIncompleteEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseIncompleteEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputAudioTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputAudioTest.kt index cc8497e59..dd76f62e2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputAudioTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputAudioTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputContentTest.kt index 2b6bdcf1d..664af4ca5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputFileContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputFileContentTest.kt index b68dd2966..9afaa2e15 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputFileContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputFileContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputFileTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputFileTest.kt index 814e56f24..9cf145b94 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputFileTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputFileTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputImageContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputImageContentTest.kt index db6c45315..f6ec7d5a9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputImageContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputImageContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputImageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputImageTest.kt index 8a43ca273..33b3c23a6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputImageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputImageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputItemTest.kt index 3e74c2239..60ee4ff21 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputMessageItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputMessageItemTest.kt index cb64906d2..05db9dfed 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputMessageItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputMessageItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputTextContentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputTextContentTest.kt index 1b757b828..e5ced390c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputTextContentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputTextContentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputTextTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputTextTest.kt index 7f5c4adad..1e3359821 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputTextTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseInputTextTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseItemTest.kt index d014ec44d..da31f1833 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseLocalEnvironmentTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseLocalEnvironmentTest.kt index b765e9c94..edd233929 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseLocalEnvironmentTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseLocalEnvironmentTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDeltaEventTest.kt index 9abab829c..d12eadcb6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDoneEventTest.kt index d0ede38b0..3dd9d806d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallArgumentsDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallCompletedEventTest.kt index 3c72eccb4..2ef2b7ab4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallFailedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallFailedEventTest.kt index c6319b6b3..a5211583a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallFailedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallFailedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallInProgressEventTest.kt index 60c458b11..4c29a4cb1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpCallInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpListToolsCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpListToolsCompletedEventTest.kt index 3ecf75b15..b830c66e1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpListToolsCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpListToolsCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpListToolsFailedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpListToolsFailedEventTest.kt index 9889efa2f..42053f794 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpListToolsFailedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpListToolsFailedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpListToolsInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpListToolsInProgressEventTest.kt index 9dc90f086..cbb7acf98 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpListToolsInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseMcpListToolsInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputAudioTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputAudioTest.kt index 312692f99..12de58f3b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputAudioTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputAudioTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemAddedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemAddedEventTest.kt index 145d89301..954306084 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemAddedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemAddedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemDoneEventTest.kt index 5c891be3f..d08bbcd84 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemTest.kt index f520b64fd..25e29b043 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputMessageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputMessageTest.kt index 0e46fc66e..57f2d323a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputMessageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputMessageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputRefusalTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputRefusalTest.kt index 70f32382d..b095c8c1e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputRefusalTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputRefusalTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputTextAnnotationAddedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputTextAnnotationAddedEventTest.kt index c4b443fca..4bd73a0ec 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputTextAnnotationAddedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputTextAnnotationAddedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputTextTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputTextTest.kt index a8d2cccac..89793e26f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputTextTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseOutputTextTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponsePromptTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponsePromptTest.kt index 7665607e0..eaf238c69 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponsePromptTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponsePromptTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseQueuedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseQueuedEventTest.kt index 685a5b46c..076993447 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseQueuedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseQueuedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningItemTest.kt index 2d775df94..5b6f3c161 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartAddedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartAddedEventTest.kt index b3c666df3..5d4733b9b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartAddedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartAddedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartDoneEventTest.kt index 2887256d0..b1057a30a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryPartDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDeltaEventTest.kt index 2efc422e8..c3a2e714f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDoneEventTest.kt index 81ab6256d..883ddb71e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningSummaryTextDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningTextDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningTextDeltaEventTest.kt index c8e658c74..1da00d03b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningTextDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningTextDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningTextDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningTextDoneEventTest.kt index 16dfcb4f4..86da962df 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningTextDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseReasoningTextDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseRefusalDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseRefusalDeltaEventTest.kt index 5b1a0dad4..2e0e5d556 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseRefusalDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseRefusalDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseRefusalDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseRefusalDoneEventTest.kt index feaf96808..885645998 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseRefusalDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseRefusalDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseRetrieveParamsTest.kt index dde80e758..d932eb829 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseStreamEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseStreamEventTest.kt index 4eb632757..598c72f24 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseStreamEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseStreamEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTest.kt index 4e262bf8e..2983e08e3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTextConfigTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTextConfigTest.kt index 60cb93ff8..b9a552230 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTextConfigTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTextConfigTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTextDeltaEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTextDeltaEventTest.kt index de196137c..bbd3775e9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTextDeltaEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTextDeltaEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTextDoneEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTextDoneEventTest.kt index e5220b1d8..210bd99b9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTextDoneEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseTextDoneEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseToolSearchCallTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseToolSearchCallTest.kt index 8a56dae8b..094343ea8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseToolSearchCallTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseToolSearchCallTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseToolSearchOutputItemParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseToolSearchOutputItemParamTest.kt index 487bafbf9..5d67fc30b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseToolSearchOutputItemParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseToolSearchOutputItemParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseToolSearchOutputItemTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseToolSearchOutputItemTest.kt index fda9f9163..7025919a3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseToolSearchOutputItemTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseToolSearchOutputItemTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseUsageTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseUsageTest.kt index a8036ae70..4537707a4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseUsageTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseUsageTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseWebSearchCallCompletedEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseWebSearchCallCompletedEventTest.kt index 64de6943d..37c7c98e2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseWebSearchCallCompletedEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseWebSearchCallCompletedEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseWebSearchCallInProgressEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseWebSearchCallInProgressEventTest.kt index ffda310cb..fa43ce007 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseWebSearchCallInProgressEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseWebSearchCallInProgressEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseWebSearchCallSearchingEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseWebSearchCallSearchingEventTest.kt index 6c94709bc..2ea792866 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseWebSearchCallSearchingEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponseWebSearchCallSearchingEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponsesClientEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponsesClientEventTest.kt index 435628276..e77af5e4f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponsesClientEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponsesClientEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponsesServerEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponsesServerEventTest.kt index b62065f35..8c0b9871f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponsesServerEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ResponsesServerEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/SkillReferenceTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/SkillReferenceTest.kt index dd31fa922..99995af55 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/SkillReferenceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/SkillReferenceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceAllowedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceAllowedTest.kt index 8b054b612..77ce12fab 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceAllowedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceAllowedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceApplyPatchTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceApplyPatchTest.kt index f2384a46f..bca171515 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceApplyPatchTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceApplyPatchTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceCustomTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceCustomTest.kt index 151dac498..d198992ca 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceCustomTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceCustomTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceFunctionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceFunctionTest.kt index b167fbd99..37b476c93 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceFunctionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceFunctionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceMcpTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceMcpTest.kt index 741fe4d58..ecf7b8ca5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceMcpTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceMcpTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceShellTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceShellTest.kt index 22fc28df7..242423b9e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceShellTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceShellTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceTypesTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceTypesTest.kt index 9b842e3e0..bc506902b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceTypesTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolChoiceTypesTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolSearchToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolSearchToolTest.kt index 25c92c03c..fcd61080a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolSearchToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolSearchToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolTest.kt index 450e5eeba..7214f891f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/ToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses @@ -688,7 +688,7 @@ internal class ToolTest { fun ofNamespace() { val namespace = NamespaceTool.builder() - .description("x") + .description("description") .name("x") .addTool( NamespaceTool.Tool.Function.builder() @@ -733,7 +733,7 @@ internal class ToolTest { val tool = Tool.ofNamespace( NamespaceTool.builder() - .description("x") + .description("description") .name("x") .addTool( NamespaceTool.Tool.Function.builder() diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/WebSearchPreviewToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/WebSearchPreviewToolTest.kt index 177f2b62a..f48cf13d1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/WebSearchPreviewToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/WebSearchPreviewToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/WebSearchToolTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/WebSearchToolTest.kt index 5d587b539..bfc7aaa37 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/WebSearchToolTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/WebSearchToolTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/inputitems/InputItemListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/inputitems/InputItemListParamsTest.kt index 72cb337f8..12b7311e3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/inputitems/InputItemListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/inputitems/InputItemListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses.inputitems diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/inputitems/ResponseItemListTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/inputitems/ResponseItemListTest.kt index 3f05a9fe4..363b485db 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/inputitems/ResponseItemListTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/inputitems/ResponseItemListTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses.inputitems diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/inputtokens/InputTokenCountParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/inputtokens/InputTokenCountParamsTest.kt index e026d3ea3..2019219d3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/inputtokens/InputTokenCountParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/inputtokens/InputTokenCountParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses.inputtokens diff --git a/openai-java-core/src/test/kotlin/com/openai/models/responses/inputtokens/InputTokenCountResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/responses/inputtokens/InputTokenCountResponseTest.kt index d0ead6669..519a4f0d9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/responses/inputtokens/InputTokenCountResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/responses/inputtokens/InputTokenCountResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.responses.inputtokens diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/DeletedSkillTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/DeletedSkillTest.kt index 57f7fcbe5..fe033f568 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/DeletedSkillTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/DeletedSkillTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillCreateParamsTest.kt index 121da703f..28cbd26ed 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillDeleteParamsTest.kt index cc0ea7ba9..9159af011 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillListParamsTest.kt index 857be1226..438e40756 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillListTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillListTest.kt index e2b71b58d..96696f0fd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillListTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillListTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillRetrieveParamsTest.kt index e19cae244..917261b5f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillTest.kt index fd6c349bd..238155f32 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillUpdateParamsTest.kt index e5216b37c..3c6b93c39 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/SkillUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/content/ContentRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/content/ContentRetrieveParamsTest.kt index 61756a392..bc465dd6d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/content/ContentRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/content/ContentRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.content diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/DeletedSkillVersionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/DeletedSkillVersionTest.kt index 94f11edb2..3a7717ae8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/DeletedSkillVersionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/DeletedSkillVersionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/SkillVersionListTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/SkillVersionListTest.kt index a8574647d..d6abdd0d6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/SkillVersionListTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/SkillVersionListTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/SkillVersionTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/SkillVersionTest.kt index 6e3af037f..0f6154e3b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/SkillVersionTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/SkillVersionTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionCreateParamsTest.kt index 5e53022ae..9e4f89c79 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionDeleteParamsTest.kt index 469d7dc3b..d9594061e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionListParamsTest.kt index 235c2a78e..a3aa31792 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionRetrieveParamsTest.kt index 2e775cf17..7f46b59f6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/VersionRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions diff --git a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/content/ContentRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/content/ContentRetrieveParamsTest.kt index 276568610..75c9a34fc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/content/ContentRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/skills/versions/content/ContentRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.skills.versions.content diff --git a/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadCancelParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadCancelParamsTest.kt index 0ac427a70..757eda619 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadCancelParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadCancelParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.uploads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadCompleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadCompleteParamsTest.kt index acbc186c1..cbe5abf80 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadCompleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadCompleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.uploads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadCreateParamsTest.kt index fa75cb9c3..489fabc80 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.uploads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadTest.kt index 218d52b1c..95a98b812 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/uploads/UploadTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.uploads diff --git a/openai-java-core/src/test/kotlin/com/openai/models/uploads/parts/PartCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/uploads/parts/PartCreateParamsTest.kt index 6e10a31ef..04c1b3826 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/uploads/parts/PartCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/uploads/parts/PartCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.uploads.parts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/uploads/parts/UploadPartTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/uploads/parts/UploadPartTest.kt index 54d6f5f35..3c6ff3da1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/uploads/parts/UploadPartTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/uploads/parts/UploadPartTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.uploads.parts diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/AutoFileChunkingStrategyParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/AutoFileChunkingStrategyParamTest.kt index f66f61956..5b8eb3aeb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/AutoFileChunkingStrategyParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/AutoFileChunkingStrategyParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/FileChunkingStrategyParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/FileChunkingStrategyParamTest.kt index 66f08ddd0..6bc0b6f36 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/FileChunkingStrategyParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/FileChunkingStrategyParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/FileChunkingStrategyTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/FileChunkingStrategyTest.kt index 31d0fc541..de38f4458 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/FileChunkingStrategyTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/FileChunkingStrategyTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/OtherFileChunkingStrategyObjectTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/OtherFileChunkingStrategyObjectTest.kt index 36f15b61e..5a9b73250 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/OtherFileChunkingStrategyObjectTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/OtherFileChunkingStrategyObjectTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObjectParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObjectParamTest.kt index 88a38f68f..37205321c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObjectParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObjectParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObjectTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObjectTest.kt index 4f4e5c15b..be3513fed 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObjectTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyObjectTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyTest.kt index 461cb20a4..38c040037 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/StaticFileChunkingStrategyTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreCreateParamsTest.kt index 0c8a50c1c..842d04f23 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreDeleteParamsTest.kt index 414deea49..9f155ba02 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreDeletedTest.kt index a3c86c8a2..76ca578d4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreListPageResponseTest.kt index fce95de7c..b146bde2e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreListParamsTest.kt index 2d1fd74f1..275ad9f49 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreRetrieveParamsTest.kt index 17988fc4a..cf6a3679b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreSearchPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreSearchPageResponseTest.kt index 8093bf4b9..4eab6916f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreSearchPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreSearchPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreSearchParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreSearchParamsTest.kt index bb1593147..9cf2e4157 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreSearchParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreSearchParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreSearchResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreSearchResponseTest.kt index 0d896e1ad..dfdeea16f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreSearchResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreSearchResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreTest.kt index 8dd20a14c..01882d6d6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreUpdateParamsTest.kt index 04bc318c6..acd655af2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/VectorStoreUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCancelParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCancelParamsTest.kt index db5e003b7..19d93c4d2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCancelParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCancelParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCreateParamsTest.kt index 655b71d28..850a82a71 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPageResponseTest.kt index 13b9b20df..738016374 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesParamsTest.kt index f110235c5..eb94cf83d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchListFilesParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchRetrieveParamsTest.kt index 8a1f12be2..553080667 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/FileBatchRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/VectorStoreFileBatchTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/VectorStoreFileBatchTest.kt index 8275818ca..ab192aaff 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/VectorStoreFileBatchTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/filebatches/VectorStoreFileBatchTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.filebatches diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileContentPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileContentPageResponseTest.kt index a97d8252d..f7d284473 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileContentPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileContentPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileContentParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileContentParamsTest.kt index e0eb8a28f..4fe1d4b61 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileContentParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileContentParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileContentResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileContentResponseTest.kt index 8629b74ee..ae1ddc85a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileContentResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileContentResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileCreateParamsTest.kt index 6094f1d23..eb704a91b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileDeleteParamsTest.kt index eb00237ac..04b1f6479 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileListPageResponseTest.kt index 971648d21..e97b442aa 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileListParamsTest.kt index 314e23b84..9a2611e95 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileRetrieveParamsTest.kt index 04e36156f..ddc645571 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileUpdateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileUpdateParamsTest.kt index dfffe3355..25a876c8d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileUpdateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/FileUpdateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/VectorStoreFileDeletedTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/VectorStoreFileDeletedTest.kt index 520dc030f..5859493a5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/VectorStoreFileDeletedTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/VectorStoreFileDeletedTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/VectorStoreFileTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/VectorStoreFileTest.kt index 6889fc7b0..ec9bda683 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/VectorStoreFileTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/vectorstores/files/VectorStoreFileTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.vectorstores.files diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/ImageInputReferenceParamTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/ImageInputReferenceParamTest.kt index 2d8945604..aa17cd16d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/ImageInputReferenceParamTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/ImageInputReferenceParamTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateCharacterParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateCharacterParamsTest.kt index ad1cae85d..e26dc4cf8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateCharacterParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateCharacterParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateCharacterResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateCharacterResponseTest.kt index c0df5737a..2caddb674 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateCharacterResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateCharacterResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateErrorTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateErrorTest.kt index 4a0c42910..692b3e47b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateErrorTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateErrorTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateParamsTest.kt index 70c3eca32..e09a59ad2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoCreateParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoDeleteParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoDeleteParamsTest.kt index 23460585e..11e3e4b75 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoDeleteParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoDeleteParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoDeleteResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoDeleteResponseTest.kt index 593236edb..0838107e7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoDeleteResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoDeleteResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoDownloadContentParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoDownloadContentParamsTest.kt index eb68c8968..e2183719b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoDownloadContentParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoDownloadContentParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoEditParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoEditParamsTest.kt index 4afc36d63..043528e8a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoEditParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoEditParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoExtendParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoExtendParamsTest.kt index b3c94319f..a7eea134e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoExtendParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoExtendParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoGetCharacterParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoGetCharacterParamsTest.kt index a156c24b3..b07a357ab 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoGetCharacterParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoGetCharacterParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoGetCharacterResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoGetCharacterResponseTest.kt index 61bb6dcfb..81da3da0c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoGetCharacterResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoGetCharacterResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoListPageResponseTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoListPageResponseTest.kt index f83345b0b..c5731e3e7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoListPageResponseTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoListPageResponseTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoListParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoListParamsTest.kt index accf7b95c..7182ec1e6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoListParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoListParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoRemixParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoRemixParamsTest.kt index 8d57830e5..a7f949ea1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoRemixParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoRemixParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoRetrieveParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoRetrieveParamsTest.kt index d1864f85e..eb215e859 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoRetrieveParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoRetrieveParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoTest.kt index f071abb4f..530cd1e7b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/videos/VideoTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.videos diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchCancelledWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchCancelledWebhookEventTest.kt index 38cc4fff8..4cab1f9a9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchCancelledWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchCancelledWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchCompletedWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchCompletedWebhookEventTest.kt index ea6c35a7c..357a4ddb8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchCompletedWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchCompletedWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchExpiredWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchExpiredWebhookEventTest.kt index 67b3523dd..39df66978 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchExpiredWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchExpiredWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchFailedWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchFailedWebhookEventTest.kt index 7f37f0f79..75878e883 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchFailedWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/BatchFailedWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/EvalRunCanceledWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/EvalRunCanceledWebhookEventTest.kt index ffd57eb9a..38a94b2e2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/EvalRunCanceledWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/EvalRunCanceledWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/EvalRunFailedWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/EvalRunFailedWebhookEventTest.kt index 0f3341467..973c481e6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/EvalRunFailedWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/EvalRunFailedWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/EvalRunSucceededWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/EvalRunSucceededWebhookEventTest.kt index aaab48119..3b679e3ba 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/EvalRunSucceededWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/EvalRunSucceededWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/FineTuningJobCancelledWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/FineTuningJobCancelledWebhookEventTest.kt index f642d5702..a5c411e9d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/FineTuningJobCancelledWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/FineTuningJobCancelledWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/FineTuningJobFailedWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/FineTuningJobFailedWebhookEventTest.kt index aa06eb446..fd7d0a303 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/FineTuningJobFailedWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/FineTuningJobFailedWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/FineTuningJobSucceededWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/FineTuningJobSucceededWebhookEventTest.kt index abd3e2856..d0fdf1572 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/FineTuningJobSucceededWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/FineTuningJobSucceededWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/LiveCallIncomingWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/LiveCallIncomingWebhookEventTest.kt index a85205b9f..470af1e6a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/LiveCallIncomingWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/LiveCallIncomingWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/RealtimeCallIncomingWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/RealtimeCallIncomingWebhookEventTest.kt index 82c73ad20..9f45aeeb5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/RealtimeCallIncomingWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/RealtimeCallIncomingWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseCancelledWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseCancelledWebhookEventTest.kt index 9e24d70af..175cf1f5e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseCancelledWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseCancelledWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseCompletedWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseCompletedWebhookEventTest.kt index 796372a5f..3c639eefd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseCompletedWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseCompletedWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseFailedWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseFailedWebhookEventTest.kt index 4443a3729..78d515e3f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseFailedWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseFailedWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseIncompleteWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseIncompleteWebhookEventTest.kt index 946dbc425..ee50746d6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseIncompleteWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/ResponseIncompleteWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/UnwrapWebhookEventTest.kt b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/UnwrapWebhookEventTest.kt index 76fd6134b..747cbbf5b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/models/webhooks/UnwrapWebhookEventTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/models/webhooks/UnwrapWebhookEventTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.models.webhooks diff --git a/openai-java-core/src/test/kotlin/com/openai/services/ServiceParamsTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/ServiceParamsTest.kt index a9bd9b0ce..b139c3c8a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/ServiceParamsTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/ServiceParamsTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/BatchServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/BatchServiceAsyncTest.kt index 19c34eb1a..5b9711cb2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/BatchServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/BatchServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/CompletionServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/CompletionServiceAsyncTest.kt index 4d17c2efe..5b84d7ec7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/CompletionServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/CompletionServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/ContainerServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/ContainerServiceAsyncTest.kt index 1f2cd484c..3ff79dfd9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/ContainerServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/ContainerServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/ContentProvenanceCheckServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/ContentProvenanceCheckServiceAsyncTest.kt index 40077ea6d..28daa2d2d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/ContentProvenanceCheckServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/ContentProvenanceCheckServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/ConversationServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/ConversationServiceAsyncTest.kt index 215fb52bc..016ad4fc9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/ConversationServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/ConversationServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/EmbeddingServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/EmbeddingServiceAsyncTest.kt index 0c73932eb..25817bc4a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/EmbeddingServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/EmbeddingServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/EvalServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/EvalServiceAsyncTest.kt index 61c36d34c..cccfecf13 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/EvalServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/EvalServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/FileServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/FileServiceAsyncTest.kt index 20a89df2f..198cbbd47 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/FileServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/FileServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/ImageServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/ImageServiceAsyncTest.kt index a26647da5..9f02c9f34 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/ImageServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/ImageServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/ModelServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/ModelServiceAsyncTest.kt index 3424b3b5c..20148afa0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/ModelServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/ModelServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/ModerationServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/ModerationServiceAsyncTest.kt index e753daf9a..fdac84397 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/ModerationServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/ModerationServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/ResponseServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/ResponseServiceAsyncTest.kt index ccd7aa286..8603d0adc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/ResponseServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/ResponseServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/SkillServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/SkillServiceAsyncTest.kt index 82f7c5f24..ed8952047 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/SkillServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/SkillServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/UploadServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/UploadServiceAsyncTest.kt index 1d35611b7..08bb90e30 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/UploadServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/UploadServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/VectorStoreServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/VectorStoreServiceAsyncTest.kt index efbed7cf7..9ac2ea2d1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/VectorStoreServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/VectorStoreServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/VideoServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/VideoServiceAsyncTest.kt index 0960afcfd..9ddc9a61f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/VideoServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/VideoServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/WebhookServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/WebhookServiceAsyncTest.kt index aca67e9ac..11f2fc378 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/WebhookServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/WebhookServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/AdminApiKeyServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/AdminApiKeyServiceAsyncTest.kt index 8b555a77c..03599164f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/AdminApiKeyServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/AdminApiKeyServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/AuditLogServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/AuditLogServiceAsyncTest.kt index b8a57fcf4..48207b33c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/AuditLogServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/AuditLogServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/CertificateServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/CertificateServiceAsyncTest.kt index 66ab13d85..e9c558adc 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/CertificateServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/CertificateServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/DataRetentionServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/DataRetentionServiceAsyncTest.kt index 8f64929c9..a874c0987 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/DataRetentionServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/DataRetentionServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/GroupServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/GroupServiceAsyncTest.kt index 7518a9ca2..c788cc0c8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/GroupServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/GroupServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/InviteServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/InviteServiceAsyncTest.kt index b08cddf7c..89491d501 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/InviteServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/InviteServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/ProjectServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/ProjectServiceAsyncTest.kt index 1a00322f9..d5f05a281 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/ProjectServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/ProjectServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/RoleServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/RoleServiceAsyncTest.kt index a09e2c0e5..4dc849ca6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/RoleServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/RoleServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/SpendAlertServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/SpendAlertServiceAsyncTest.kt index b6bbf10a3..c7a7f482f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/SpendAlertServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/SpendAlertServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/SpendLimitServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/SpendLimitServiceAsyncTest.kt index 1dcf1ca2b..1c206a7b9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/SpendLimitServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/SpendLimitServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/UsageServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/UsageServiceAsyncTest.kt index 8cd3394ad..5dc1f884b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/UsageServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/UsageServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/UserServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/UserServiceAsyncTest.kt index db9e2025e..77ecae88c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/UserServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/UserServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/groups/RoleServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/groups/RoleServiceAsyncTest.kt index 436c8ac2e..5aa1250f5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/groups/RoleServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/groups/RoleServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/groups/UserServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/groups/UserServiceAsyncTest.kt index d5756d780..376b5187c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/groups/UserServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/groups/UserServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/ApiKeyServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/ApiKeyServiceAsyncTest.kt index da4e9d532..eeefc251f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/ApiKeyServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/ApiKeyServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/CertificateServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/CertificateServiceAsyncTest.kt index 090293207..1b7109390 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/CertificateServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/CertificateServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/DataRetentionServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/DataRetentionServiceAsyncTest.kt index 851f8b085..c52ea5c86 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/DataRetentionServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/DataRetentionServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/GroupServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/GroupServiceAsyncTest.kt index 0225a7286..02d6f27e9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/GroupServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/GroupServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/HostedToolPermissionServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/HostedToolPermissionServiceAsyncTest.kt index 1a8fe1a6e..529696b66 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/HostedToolPermissionServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/HostedToolPermissionServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/ModelPermissionServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/ModelPermissionServiceAsyncTest.kt index 4c3915653..06c6d4c92 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/ModelPermissionServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/ModelPermissionServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/RateLimitServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/RateLimitServiceAsyncTest.kt index e3a41eb0e..1df5c2e66 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/RateLimitServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/RateLimitServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/RoleServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/RoleServiceAsyncTest.kt index 6d87731fd..7af56293b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/RoleServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/RoleServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/ServiceAccountServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/ServiceAccountServiceAsyncTest.kt index 0531e6a93..7c369c236 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/ServiceAccountServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/ServiceAccountServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/SpendAlertServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/SpendAlertServiceAsyncTest.kt index f02f16936..3544c5926 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/SpendAlertServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/SpendAlertServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/SpendLimitServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/SpendLimitServiceAsyncTest.kt index 078f71339..7e2739a07 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/SpendLimitServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/SpendLimitServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/UserServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/UserServiceAsyncTest.kt index d61a6ac6d..705a52fe5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/UserServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/UserServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/groups/RoleServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/groups/RoleServiceAsyncTest.kt index 18201aa8a..1240f2ae6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/groups/RoleServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/groups/RoleServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/serviceaccounts/ApiKeyServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/serviceaccounts/ApiKeyServiceAsyncTest.kt index 9ab36df3a..d32e6918f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/serviceaccounts/ApiKeyServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/serviceaccounts/ApiKeyServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/users/RoleServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/users/RoleServiceAsyncTest.kt index 4de8a2fd3..5e79516b2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/users/RoleServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/projects/users/RoleServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.projects.users diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/users/RoleServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/users/RoleServiceAsyncTest.kt index 4f42d560a..fdc7cb916 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/users/RoleServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/admin/organization/users/RoleServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.admin.organization.users diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/audio/SpeechServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/audio/SpeechServiceAsyncTest.kt index 5dbc31818..6c6fc14ed 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/audio/SpeechServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/audio/SpeechServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.audio diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncTest.kt index f97da51cf..66c1df412 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.audio diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/audio/TranslationServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/audio/TranslationServiceAsyncTest.kt index 166482ffe..40eb1bd3e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/audio/TranslationServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/audio/TranslationServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.audio diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/AssistantServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/AssistantServiceAsyncTest.kt index f5e3d3e2e..59f340ec0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/AssistantServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/AssistantServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ResponseServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ResponseServiceAsyncTest.kt index fe6fcdd94..af45cdc44 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ResponseServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ResponseServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ThreadServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ThreadServiceAsyncTest.kt index 979920fe1..ffee35b5d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ThreadServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/ThreadServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/chatkit/SessionServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/chatkit/SessionServiceAsyncTest.kt index 2e6ce8463..2e75616af 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/chatkit/SessionServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/chatkit/SessionServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.chatkit diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/chatkit/ThreadServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/chatkit/ThreadServiceAsyncTest.kt index 60ee9a7a0..f8b54710c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/chatkit/ThreadServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/chatkit/ThreadServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.chatkit diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/responses/InputItemServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/responses/InputItemServiceAsyncTest.kt index c064753bd..9ae8dcaeb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/responses/InputItemServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/responses/InputItemServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/responses/InputTokenServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/responses/InputTokenServiceAsyncTest.kt index 85b732016..9eca1b5eb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/responses/InputTokenServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/responses/InputTokenServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/MessageServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/MessageServiceAsyncTest.kt index 56e368849..d067f8931 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/MessageServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/MessageServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/RunServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/RunServiceAsyncTest.kt index 979807d1b..6ef7f1a4d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/RunServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/RunServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/runs/StepServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/runs/StepServiceAsyncTest.kt index 9d64ece1d..4e84f0c2e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/runs/StepServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/runs/StepServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.beta.threads.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsyncTest.kt index 8caa8bc12..354b38235 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.chat diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/chat/completions/MessageServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/chat/completions/MessageServiceAsyncTest.kt index 7a6cb9fba..ba13380d1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/chat/completions/MessageServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/chat/completions/MessageServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/containers/FileServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/containers/FileServiceAsyncTest.kt index d7ac6cbde..b9d5705ba 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/containers/FileServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/containers/FileServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.containers diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/containers/files/ContentServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/containers/files/ContentServiceAsyncTest.kt index 0cccc19a8..9ea601d2b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/containers/files/ContentServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/containers/files/ContentServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.containers.files diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/conversations/ItemServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/conversations/ItemServiceAsyncTest.kt index dc533641e..9f11debbf 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/conversations/ItemServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/conversations/ItemServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.conversations diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/evals/RunServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/evals/RunServiceAsyncTest.kt index 36fa12376..f85da0b20 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/evals/RunServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/evals/RunServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/evals/runs/OutputItemServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/evals/runs/OutputItemServiceAsyncTest.kt index e80818d89..0ae757f5e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/evals/runs/OutputItemServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/evals/runs/OutputItemServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/JobServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/JobServiceAsyncTest.kt index d38379d8d..dd11b348c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/JobServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/JobServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/alpha/GraderServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/alpha/GraderServiceAsyncTest.kt index 6b427e374..676887723 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/alpha/GraderServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/alpha/GraderServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning.alpha diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsyncTest.kt index 6f7af0c0a..94740bee3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning.checkpoints diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/jobs/CheckpointServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/jobs/CheckpointServiceAsyncTest.kt index ba9e05a12..dcf447733 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/jobs/CheckpointServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/finetuning/jobs/CheckpointServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/realtime/CallServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/realtime/CallServiceAsyncTest.kt index f26d76362..94a460792 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/realtime/CallServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/realtime/CallServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/realtime/ClientSecretServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/realtime/ClientSecretServiceAsyncTest.kt index 470730eca..c19a76669 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/realtime/ClientSecretServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/realtime/ClientSecretServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/responses/InputItemServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/responses/InputItemServiceAsyncTest.kt index 6170b1ccf..f4e149f88 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/responses/InputItemServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/responses/InputItemServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/responses/InputTokenServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/responses/InputTokenServiceAsyncTest.kt index ce430f975..db3f75111 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/responses/InputTokenServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/responses/InputTokenServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/skills/ContentServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/skills/ContentServiceAsyncTest.kt index e3f1deebe..3386f8faa 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/skills/ContentServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/skills/ContentServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.skills diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/skills/VersionServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/skills/VersionServiceAsyncTest.kt index 1e9f62261..2c733cf77 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/skills/VersionServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/skills/VersionServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.skills diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/skills/versions/ContentServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/skills/versions/ContentServiceAsyncTest.kt index 44625603a..11afd666c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/skills/versions/ContentServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/skills/versions/ContentServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.skills.versions diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/uploads/PartServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/uploads/PartServiceAsyncTest.kt index fc6e7c3d0..c5f8e3e17 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/uploads/PartServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/uploads/PartServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.uploads diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/vectorstores/FileBatchServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/vectorstores/FileBatchServiceAsyncTest.kt index 82ece79f0..146bcd004 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/vectorstores/FileBatchServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/vectorstores/FileBatchServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/services/async/vectorstores/FileServiceAsyncTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/async/vectorstores/FileServiceAsyncTest.kt index 0b2bdde5c..4c938ceba 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/async/vectorstores/FileServiceAsyncTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/async/vectorstores/FileServiceAsyncTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.async.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/BatchServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/BatchServiceTest.kt index ef6d3b941..8249db19c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/BatchServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/BatchServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/CompletionServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/CompletionServiceTest.kt index 48511deda..ef0687f3f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/CompletionServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/CompletionServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ContainerServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ContainerServiceTest.kt index eaf4d826e..75d834cbd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ContainerServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ContainerServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ContentProvenanceCheckServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ContentProvenanceCheckServiceTest.kt index 5f5ebfa7a..8b637f978 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ContentProvenanceCheckServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ContentProvenanceCheckServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ConversationServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ConversationServiceTest.kt index be5da5f4e..42624f5ea 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ConversationServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ConversationServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/EmbeddingServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/EmbeddingServiceTest.kt index 42d3ac477..7fe4ddf5a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/EmbeddingServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/EmbeddingServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/EvalServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/EvalServiceTest.kt index 7de428adb..fb5fdba86 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/EvalServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/EvalServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/FileServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/FileServiceTest.kt index 8d6385905..d4b822fb7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/FileServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/FileServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ImageServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ImageServiceTest.kt index 5b60e40b1..0f52f132d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ImageServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ImageServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ModelServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ModelServiceTest.kt index 0e2d583f7..257c9cb9f 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ModelServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ModelServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ModerationServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ModerationServiceTest.kt index a545dcbc9..acdeb015d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ModerationServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ModerationServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ResponseServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ResponseServiceTest.kt index ecadfd57d..31af08b7c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/ResponseServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/ResponseServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/SkillServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/SkillServiceTest.kt index 8329e55b9..d4921d7c4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/SkillServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/SkillServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/UploadServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/UploadServiceTest.kt index 4c2b40f5f..8d975ecd9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/UploadServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/UploadServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/VectorStoreServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/VectorStoreServiceTest.kt index c1a5c9cbd..7a81b48e5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/VectorStoreServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/VectorStoreServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/VideoServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/VideoServiceTest.kt index be2a55d2f..bc66fd868 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/VideoServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/VideoServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/WebhookServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/WebhookServiceTest.kt index 9985d161a..41f07bce8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/WebhookServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/WebhookServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/AdminApiKeyServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/AdminApiKeyServiceTest.kt index f719683bc..f5efb91af 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/AdminApiKeyServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/AdminApiKeyServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/AuditLogServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/AuditLogServiceTest.kt index c173159b2..1b3d71210 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/AuditLogServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/AuditLogServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/CertificateServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/CertificateServiceTest.kt index 7e1d1e1df..51495426b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/CertificateServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/CertificateServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/DataRetentionServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/DataRetentionServiceTest.kt index 1f0369ef3..b7dae9e2a 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/DataRetentionServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/DataRetentionServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/GroupServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/GroupServiceTest.kt index 3eb4ca9f2..a80063822 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/GroupServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/GroupServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/InviteServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/InviteServiceTest.kt index d16a52d24..e2a94bbd1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/InviteServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/InviteServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/ProjectServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/ProjectServiceTest.kt index c60865531..b902ad968 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/ProjectServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/ProjectServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/RoleServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/RoleServiceTest.kt index 842760111..8b8f973cf 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/RoleServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/RoleServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/SpendAlertServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/SpendAlertServiceTest.kt index 87bfc7557..f3423c33d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/SpendAlertServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/SpendAlertServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/SpendLimitServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/SpendLimitServiceTest.kt index 985bb5092..54897666d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/SpendLimitServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/SpendLimitServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/UsageServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/UsageServiceTest.kt index b598e44c1..bcd64f374 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/UsageServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/UsageServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/UserServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/UserServiceTest.kt index 826548458..24810b0d3 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/UserServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/UserServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/groups/RoleServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/groups/RoleServiceTest.kt index d4e71a7b8..5739f4255 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/groups/RoleServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/groups/RoleServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/groups/UserServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/groups/UserServiceTest.kt index 9c59d6e14..f4a85c959 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/groups/UserServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/groups/UserServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/ApiKeyServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/ApiKeyServiceTest.kt index f41e13114..b1953c9b8 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/ApiKeyServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/ApiKeyServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/CertificateServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/CertificateServiceTest.kt index cd5fa24e7..127cb09a5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/CertificateServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/CertificateServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/DataRetentionServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/DataRetentionServiceTest.kt index 207104a02..13cbaeb17 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/DataRetentionServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/DataRetentionServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/GroupServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/GroupServiceTest.kt index 505aaa218..de0e079f4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/GroupServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/GroupServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/HostedToolPermissionServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/HostedToolPermissionServiceTest.kt index 41f486e8a..94cf2796e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/HostedToolPermissionServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/HostedToolPermissionServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/ModelPermissionServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/ModelPermissionServiceTest.kt index 5b02f6743..eb76a7f11 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/ModelPermissionServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/ModelPermissionServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/RateLimitServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/RateLimitServiceTest.kt index 4de8f2a83..96d7dc2e7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/RateLimitServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/RateLimitServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/RoleServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/RoleServiceTest.kt index cd7653d7f..890617f21 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/RoleServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/RoleServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/ServiceAccountServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/ServiceAccountServiceTest.kt index 4ebd7929b..41194f747 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/ServiceAccountServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/ServiceAccountServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/SpendAlertServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/SpendAlertServiceTest.kt index 8047947cf..b091ec9ac 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/SpendAlertServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/SpendAlertServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/SpendLimitServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/SpendLimitServiceTest.kt index dc2a429f4..5c45157cb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/SpendLimitServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/SpendLimitServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/UserServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/UserServiceTest.kt index c9adba8b4..3f0686a8e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/UserServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/UserServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/groups/RoleServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/groups/RoleServiceTest.kt index ca4e945be..239b6d104 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/groups/RoleServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/groups/RoleServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects.groups diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/serviceaccounts/ApiKeyServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/serviceaccounts/ApiKeyServiceTest.kt index 5bc1fb380..29428e8fb 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/serviceaccounts/ApiKeyServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/serviceaccounts/ApiKeyServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects.serviceaccounts diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/users/RoleServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/users/RoleServiceTest.kt index 8569e5428..72d8e99fd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/users/RoleServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/projects/users/RoleServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.projects.users diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/users/RoleServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/users/RoleServiceTest.kt index 084c2418f..dafbbb121 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/users/RoleServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/admin/organization/users/RoleServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.admin.organization.users diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/SpeechServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/SpeechServiceTest.kt index 2ecec6ec6..def8566d7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/SpeechServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/SpeechServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.audio diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/TranscriptionServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/TranscriptionServiceTest.kt index 0e1c796f4..67f908ee5 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/TranscriptionServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/TranscriptionServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.audio diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/TranslationServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/TranslationServiceTest.kt index d44710735..79aa96472 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/TranslationServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/audio/TranslationServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.audio diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/AssistantServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/AssistantServiceTest.kt index 1a7b4c030..f4360d234 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/AssistantServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/AssistantServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ResponseServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ResponseServiceTest.kt index 100013e41..ccdfd7b38 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ResponseServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ResponseServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ThreadServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ThreadServiceTest.kt index 4b49e9df8..8cb523d01 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ThreadServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/ThreadServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/chatkit/SessionServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/chatkit/SessionServiceTest.kt index 5fa0d9bc5..01612f3c7 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/chatkit/SessionServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/chatkit/SessionServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.chatkit diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/chatkit/ThreadServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/chatkit/ThreadServiceTest.kt index 2aa64c81d..086da8886 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/chatkit/ThreadServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/chatkit/ThreadServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.chatkit diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/responses/InputItemServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/responses/InputItemServiceTest.kt index e503a88b4..a8546079c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/responses/InputItemServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/responses/InputItemServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/responses/InputTokenServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/responses/InputTokenServiceTest.kt index c11e0cfde..c9a052bea 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/responses/InputTokenServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/responses/InputTokenServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/MessageServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/MessageServiceTest.kt index 042314f87..767cb46a2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/MessageServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/MessageServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/RunServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/RunServiceTest.kt index df826d484..4f01039e4 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/RunServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/RunServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.threads diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/runs/StepServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/runs/StepServiceTest.kt index bc229a293..038bffa32 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/runs/StepServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/beta/threads/runs/StepServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.beta.threads.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/chat/ChatCompletionServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/chat/ChatCompletionServiceTest.kt index ce98d3b6e..3cba9aed9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/chat/ChatCompletionServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/chat/ChatCompletionServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.chat diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/chat/completions/MessageServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/chat/completions/MessageServiceTest.kt index 1fd9e120e..6ae529312 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/chat/completions/MessageServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/chat/completions/MessageServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.chat.completions diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/containers/FileServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/containers/FileServiceTest.kt index bd2bed0b9..6d7a2de4d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/containers/FileServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/containers/FileServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.containers diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/containers/files/ContentServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/containers/files/ContentServiceTest.kt index 26aa5515c..ce6a3f0bd 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/containers/files/ContentServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/containers/files/ContentServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.containers.files diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/conversations/ItemServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/conversations/ItemServiceTest.kt index 4489ee0f1..19db63106 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/conversations/ItemServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/conversations/ItemServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.conversations diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/evals/RunServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/evals/RunServiceTest.kt index 303769c9c..cf26d848b 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/evals/RunServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/evals/RunServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.evals diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/evals/runs/OutputItemServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/evals/runs/OutputItemServiceTest.kt index 7efb70efd..230014979 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/evals/runs/OutputItemServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/evals/runs/OutputItemServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.evals.runs diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/JobServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/JobServiceTest.kt index 2edd14133..c652be6de 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/JobServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/JobServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/alpha/GraderServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/alpha/GraderServiceTest.kt index bb6d1bb99..6502aa9ab 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/alpha/GraderServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/alpha/GraderServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning.alpha diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionServiceTest.kt index 8983cda11..f92332ea1 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning.checkpoints diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/jobs/CheckpointServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/jobs/CheckpointServiceTest.kt index 4edd1414d..7d87ea71c 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/jobs/CheckpointServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/finetuning/jobs/CheckpointServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.finetuning.jobs diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/realtime/CallServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/realtime/CallServiceTest.kt index cc4d63a05..4add89077 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/realtime/CallServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/realtime/CallServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/realtime/ClientSecretServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/realtime/ClientSecretServiceTest.kt index b21277c19..8ce982045 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/realtime/ClientSecretServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/realtime/ClientSecretServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.realtime diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/responses/InputItemServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/responses/InputItemServiceTest.kt index 88c832bfb..43787fe2d 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/responses/InputItemServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/responses/InputItemServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/responses/InputTokenServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/responses/InputTokenServiceTest.kt index 2afe02e5f..33e76b776 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/responses/InputTokenServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/responses/InputTokenServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.responses diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/skills/ContentServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/skills/ContentServiceTest.kt index 8320c5064..c6eae1c0e 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/skills/ContentServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/skills/ContentServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.skills diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/skills/VersionServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/skills/VersionServiceTest.kt index 69598d03c..7bd19de70 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/skills/VersionServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/skills/VersionServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.skills diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/skills/versions/ContentServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/skills/versions/ContentServiceTest.kt index d0d108e17..d52e0e4f2 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/skills/versions/ContentServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/skills/versions/ContentServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.skills.versions diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/uploads/PartServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/uploads/PartServiceTest.kt index cb42dda1f..7e0f4e2e0 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/uploads/PartServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/uploads/PartServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.uploads diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/vectorstores/FileBatchServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/vectorstores/FileBatchServiceTest.kt index f7970636b..000c968c9 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/vectorstores/FileBatchServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/vectorstores/FileBatchServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.vectorstores diff --git a/openai-java-core/src/test/kotlin/com/openai/services/blocking/vectorstores/FileServiceTest.kt b/openai-java-core/src/test/kotlin/com/openai/services/blocking/vectorstores/FileServiceTest.kt index efa63ebca..d813819c6 100644 --- a/openai-java-core/src/test/kotlin/com/openai/services/blocking/vectorstores/FileServiceTest.kt +++ b/openai-java-core/src/test/kotlin/com/openai/services/blocking/vectorstores/FileServiceTest.kt @@ -1,4 +1,4 @@ -// File generated from our OpenAPI spec by Stainless. +// File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. package com.openai.services.blocking.vectorstores From dd2f9827bb2d421d8a4599a221810f35651e1bc9 Mon Sep 17 00:00:00 2001 From: Castiron Bot Date: Mon, 10 Aug 2026 22:00:43 -0700 Subject: [PATCH 4/5] [castiron] SDK codegen checkpoint 8e78be37-d321-40c4-8a75-6a8d344f7616 Generation metadata: ewogICJjb25maWd1cmF0aW9uX2NoZWNrcG9pbnRfc2hhIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAogICJnZW5lcmF0ZWRfYmFzZWxpbmVfc2hhMjU2IjogImFkNmJlMDkyMDg1NTM3N2E5NTdmNjYyNjYxYzIwYmE5ZTU4ZDc2ODkyMmFhNjU5YjI3MjVlNGU5YmRkOTU2Y2QiLAogICJnZW5lcmF0aW9uX2lkIjogIjhlNzhiZTM3LWQzMjEtNDBjNC04YTc1LTZhOGQzNDRmNzYxNiIsCiAgImlucHV0X2J1bmRsZV9kaWdlc3QiOiAiZDUzNDY2ZWZkZWZmOWQ5NDQ2ODE1YTI5NTY5ODE5M2ZlYjIxMWVjNDYyNjkxOTMxYzQyNWE0MzI2ZDQ1NGRjZSIsCiAgImxhbmd1YWdlIjogImphdmEiLAogICJwcmV2aW91c19nZW5lcmF0aW9uX2lkIjogIjNkNTY0NDM3LTc3NDEtNDcxOC1hYzE0LWQxMzZmMGRkYmI4MCIsCiAgInB1YmxpY19iYXNlbGluZV9jb21taXQiOiAiZDExYTM1N2FlYTQ2OWE3ODQwMDMzNGJlYWRlZWFjMTdjYTI0ZmQ2OSIsCiAgInNvdXJjZV9icmFuY2giOiAiamJlY2t3aXRoL2Nhc3Rpcm9uLW9wZW5hcGktNTc3ZmE5MjIiLAogICJ0YXJnZXQiOiAib3BlbmFpLWphdmEiCn0K --- .../kotlin/com/openai/models/AllModels.kt | 18 +++++++++++ .../com/openai/models/ResponsesModel.kt | 18 +++++++++++ .../TranscriptionCreateParams.kt | 32 ++++++++++++++----- .../translations/TranslationCreateParams.kt | 32 ++++++++++++++----- .../models/beta/responses/BetaResponse.kt | 18 +++++++++++ .../responses/BetaResponsesClientEvent.kt | 18 +++++++++++ .../beta/responses/ResponseCompactParams.kt | 18 +++++++++++ .../beta/responses/ResponseCreateParams.kt | 18 +++++++++++ .../models/responses/ResponseCompactParams.kt | 18 +++++++++++ 9 files changed, 174 insertions(+), 16 deletions(-) diff --git a/openai-java-core/src/main/kotlin/com/openai/models/AllModels.kt b/openai-java-core/src/main/kotlin/com/openai/models/AllModels.kt index 0ab3ae2e4..8235aa1f9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/AllModels.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/AllModels.kt @@ -297,6 +297,12 @@ private constructor( @JvmField val GPT_5_1_CODEX_MAX = of("gpt-5.1-codex-max") + @JvmField val GPT_DAYBREAK_BLUE_LATEST = of("gpt-daybreak-blue-latest") + + @JvmField val GPT_DAYBREAK_RED_LATEST = of("gpt-daybreak-red-latest") + + @JvmField val GPT_5_6_CYBER = of("gpt-5.6-cyber") + @JvmStatic fun of(value: String) = ResponsesOnlyModel(JsonField.of(value)) } @@ -316,6 +322,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, } /** @@ -342,6 +351,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, /** * An enum member indicating that [ResponsesOnlyModel] was instantiated with an unknown * value. @@ -372,6 +384,9 @@ private constructor( GPT_5_PRO -> Value.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Value.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Value.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Value.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Value.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Value.GPT_5_6_CYBER else -> Value._UNKNOWN } @@ -400,6 +415,9 @@ private constructor( GPT_5_PRO -> Known.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Known.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Known.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Known.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Known.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Known.GPT_5_6_CYBER else -> throw OpenAIInvalidDataException("Unknown ResponsesOnlyModel: $value") } diff --git a/openai-java-core/src/main/kotlin/com/openai/models/ResponsesModel.kt b/openai-java-core/src/main/kotlin/com/openai/models/ResponsesModel.kt index 102aeafa6..566aadcd9 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/ResponsesModel.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/ResponsesModel.kt @@ -296,6 +296,12 @@ private constructor( @JvmField val GPT_5_1_CODEX_MAX = of("gpt-5.1-codex-max") + @JvmField val GPT_DAYBREAK_BLUE_LATEST = of("gpt-daybreak-blue-latest") + + @JvmField val GPT_DAYBREAK_RED_LATEST = of("gpt-daybreak-red-latest") + + @JvmField val GPT_5_6_CYBER = of("gpt-5.6-cyber") + @JvmStatic fun of(value: String) = ResponsesOnlyModel(JsonField.of(value)) } @@ -315,6 +321,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, } /** @@ -341,6 +350,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, /** * An enum member indicating that [ResponsesOnlyModel] was instantiated with an unknown * value. @@ -371,6 +383,9 @@ private constructor( GPT_5_PRO -> Value.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Value.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Value.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Value.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Value.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Value.GPT_5_6_CYBER else -> Value._UNKNOWN } @@ -399,6 +414,9 @@ private constructor( GPT_5_PRO -> Known.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Known.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Known.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Known.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Known.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Known.GPT_5_6_CYBER else -> throw OpenAIInvalidDataException("Unknown ResponsesOnlyModel: $value") } diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateParams.kt index ce62870e3..21594148f 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/transcriptions/TranscriptionCreateParams.kt @@ -49,7 +49,9 @@ private constructor( /** * The audio file object (not file name) to transcribe, in one of these formats: flac, mp3, mp4, - * mpeg, mpga, m4a, ogg, wav, or webm. + * mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format metadata for the + * file to be identified. We recommend an extension-bearing filename and an appropriate content + * type. * * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is * unexpectedly missing or null (e.g. if the server responded with an unexpected value). @@ -339,7 +341,9 @@ private constructor( /** * The audio file object (not file name) to transcribe, in one of these formats: flac, mp3, - * mp4, mpeg, mpga, m4a, ogg, wav, or webm. + * mp4, mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format metadata + * for the file to be identified. We recommend an extension-bearing filename and an + * appropriate content type. */ fun file(file: InputStream) = apply { body.file(file) } @@ -354,13 +358,17 @@ private constructor( /** * The audio file object (not file name) to transcribe, in one of these formats: flac, mp3, - * mp4, mpeg, mpga, m4a, ogg, wav, or webm. + * mp4, mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format metadata + * for the file to be identified. We recommend an extension-bearing filename and an + * appropriate content type. */ fun file(file: ByteArray) = apply { body.file(file) } /** * The audio file object (not file name) to transcribe, in one of these formats: flac, mp3, - * mp4, mpeg, mpga, m4a, ogg, wav, or webm. + * mp4, mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format metadata + * for the file to be identified. We recommend an extension-bearing filename and an + * appropriate content type. */ fun file(path: Path) = apply { body.file(path) } @@ -838,7 +846,9 @@ private constructor( /** * The audio file object (not file name) to transcribe, in one of these formats: flac, mp3, - * mp4, mpeg, mpga, m4a, ogg, wav, or webm. + * mp4, mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format metadata + * for the file to be identified. We recommend an extension-bearing filename and an + * appropriate content type. * * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is * unexpectedly missing or null (e.g. if the server responded with an unexpected value). @@ -1168,7 +1178,9 @@ private constructor( /** * The audio file object (not file name) to transcribe, in one of these formats: flac, - * mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm. + * mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format + * metadata for the file to be identified. We recommend an extension-bearing filename + * and an appropriate content type. */ fun file(file: InputStream) = file(MultipartField.of(file)) @@ -1183,13 +1195,17 @@ private constructor( /** * The audio file object (not file name) to transcribe, in one of these formats: flac, - * mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm. + * mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format + * metadata for the file to be identified. We recommend an extension-bearing filename + * and an appropriate content type. */ fun file(file: ByteArray) = file(file.inputStream()) /** * The audio file object (not file name) to transcribe, in one of these formats: flac, - * mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm. + * mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format + * metadata for the file to be identified. We recommend an extension-bearing filename + * and an appropriate content type. */ fun file(path: Path) = file( diff --git a/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationCreateParams.kt index 3cc736f5f..a4f47e9a0 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/audio/translations/TranslationCreateParams.kt @@ -36,7 +36,9 @@ private constructor( /** * The audio file object (not file name) translate, in one of these formats: flac, mp3, mp4, - * mpeg, mpga, m4a, ogg, wav, or webm. + * mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format metadata for the + * file to be identified. We recommend an extension-bearing filename and an appropriate content + * type. * * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is * unexpectedly missing or null (e.g. if the server responded with an unexpected value). @@ -173,7 +175,9 @@ private constructor( /** * The audio file object (not file name) translate, in one of these formats: flac, mp3, mp4, - * mpeg, mpga, m4a, ogg, wav, or webm. + * mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format metadata for + * the file to be identified. We recommend an extension-bearing filename and an appropriate + * content type. */ fun file(file: InputStream) = apply { body.file(file) } @@ -188,13 +192,17 @@ private constructor( /** * The audio file object (not file name) translate, in one of these formats: flac, mp3, mp4, - * mpeg, mpga, m4a, ogg, wav, or webm. + * mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format metadata for + * the file to be identified. We recommend an extension-bearing filename and an appropriate + * content type. */ fun file(file: ByteArray) = apply { body.file(file) } /** * The audio file object (not file name) translate, in one of these formats: flac, mp3, mp4, - * mpeg, mpga, m4a, ogg, wav, or webm. + * mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format metadata for + * the file to be identified. We recommend an extension-bearing filename and an appropriate + * content type. */ fun file(path: Path) = apply { body.file(path) } @@ -439,7 +447,9 @@ private constructor( /** * The audio file object (not file name) translate, in one of these formats: flac, mp3, mp4, - * mpeg, mpga, m4a, ogg, wav, or webm. + * mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format metadata for + * the file to be identified. We recommend an extension-bearing filename and an appropriate + * content type. * * @throws OpenAIInvalidDataException if the JSON field has an unexpected type or is * unexpectedly missing or null (e.g. if the server responded with an unexpected value). @@ -576,7 +586,9 @@ private constructor( /** * The audio file object (not file name) translate, in one of these formats: flac, mp3, - * mp4, mpeg, mpga, m4a, ogg, wav, or webm. + * mp4, mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format + * metadata for the file to be identified. We recommend an extension-bearing filename + * and an appropriate content type. */ fun file(file: InputStream) = file(MultipartField.of(file)) @@ -591,13 +603,17 @@ private constructor( /** * The audio file object (not file name) translate, in one of these formats: flac, mp3, - * mp4, mpeg, mpga, m4a, ogg, wav, or webm. + * mp4, mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format + * metadata for the file to be identified. We recommend an extension-bearing filename + * and an appropriate content type. */ fun file(file: ByteArray) = file(file.inputStream()) /** * The audio file object (not file name) translate, in one of these formats: flac, mp3, - * mp4, mpeg, mpga, m4a, ogg, wav, or webm. + * mp4, mpeg, mpga, m4a, ogg, wav, or webm. The request must include enough format + * metadata for the file to be identified. We recommend an extension-bearing filename + * and an appropriate content type. */ fun file(path: Path) = file( diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponse.kt index 6e8f7e1df..352293e62 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponse.kt @@ -3158,6 +3158,12 @@ private constructor( @JvmField val GPT_5_1_CODEX_MAX = of("gpt-5.1-codex-max") + @JvmField val GPT_DAYBREAK_BLUE_LATEST = of("gpt-daybreak-blue-latest") + + @JvmField val GPT_DAYBREAK_RED_LATEST = of("gpt-daybreak-red-latest") + + @JvmField val GPT_5_6_CYBER = of("gpt-5.6-cyber") + @JvmStatic fun of(value: String) = Model(JsonField.of(value)) } @@ -3259,6 +3265,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, } /** @@ -3367,6 +3376,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, /** An enum member indicating that [Model] was instantiated with an unknown value. */ _UNKNOWN, } @@ -3476,6 +3488,9 @@ private constructor( GPT_5_PRO -> Value.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Value.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Value.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Value.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Value.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Value.GPT_5_6_CYBER else -> Value._UNKNOWN } @@ -3586,6 +3601,9 @@ private constructor( GPT_5_PRO -> Known.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Known.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Known.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Known.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Known.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Known.GPT_5_6_CYBER else -> throw OpenAIInvalidDataException("Unknown Model: $value") } diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesClientEvent.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesClientEvent.kt index c99f7536a..c660d2bdd 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesClientEvent.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/BetaResponsesClientEvent.kt @@ -3543,6 +3543,12 @@ private constructor( @JvmField val GPT_5_1_CODEX_MAX = of("gpt-5.1-codex-max") + @JvmField val GPT_DAYBREAK_BLUE_LATEST = of("gpt-daybreak-blue-latest") + + @JvmField val GPT_DAYBREAK_RED_LATEST = of("gpt-daybreak-red-latest") + + @JvmField val GPT_5_6_CYBER = of("gpt-5.6-cyber") + @JvmStatic fun of(value: String) = Model(JsonField.of(value)) } @@ -3644,6 +3650,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, } /** @@ -3752,6 +3761,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, /** * An enum member indicating that [Model] was instantiated with an unknown value. */ @@ -3865,6 +3877,9 @@ private constructor( GPT_5_PRO -> Value.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Value.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Value.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Value.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Value.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Value.GPT_5_6_CYBER else -> Value._UNKNOWN } @@ -3977,6 +3992,9 @@ private constructor( GPT_5_PRO -> Known.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Known.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Known.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Known.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Known.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Known.GPT_5_6_CYBER else -> throw OpenAIInvalidDataException("Unknown Model: $value") } diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCompactParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCompactParams.kt index 36aff79f4..e6915c4ac 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCompactParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCompactParams.kt @@ -1462,6 +1462,12 @@ private constructor( @JvmField val GPT_5_1_CODEX_MAX = of("gpt-5.1-codex-max") + @JvmField val GPT_DAYBREAK_BLUE_LATEST = of("gpt-daybreak-blue-latest") + + @JvmField val GPT_DAYBREAK_RED_LATEST = of("gpt-daybreak-red-latest") + + @JvmField val GPT_5_6_CYBER = of("gpt-5.6-cyber") + @JvmStatic fun of(value: String) = Model(JsonField.of(value)) } @@ -1563,6 +1569,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, } /** @@ -1671,6 +1680,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, /** An enum member indicating that [Model] was instantiated with an unknown value. */ _UNKNOWN, } @@ -1780,6 +1792,9 @@ private constructor( GPT_5_PRO -> Value.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Value.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Value.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Value.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Value.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Value.GPT_5_6_CYBER else -> Value._UNKNOWN } @@ -1890,6 +1905,9 @@ private constructor( GPT_5_PRO -> Known.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Known.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Known.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Known.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Known.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Known.GPT_5_6_CYBER else -> throw OpenAIInvalidDataException("Unknown Model: $value") } diff --git a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCreateParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCreateParams.kt index cc88690ca..9bf5ef5a7 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCreateParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/beta/responses/ResponseCreateParams.kt @@ -5008,6 +5008,12 @@ private constructor( @JvmField val GPT_5_1_CODEX_MAX = of("gpt-5.1-codex-max") + @JvmField val GPT_DAYBREAK_BLUE_LATEST = of("gpt-daybreak-blue-latest") + + @JvmField val GPT_DAYBREAK_RED_LATEST = of("gpt-daybreak-red-latest") + + @JvmField val GPT_5_6_CYBER = of("gpt-5.6-cyber") + @JvmStatic fun of(value: String) = Model(JsonField.of(value)) } @@ -5109,6 +5115,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, } /** @@ -5217,6 +5226,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, /** An enum member indicating that [Model] was instantiated with an unknown value. */ _UNKNOWN, } @@ -5326,6 +5338,9 @@ private constructor( GPT_5_PRO -> Value.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Value.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Value.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Value.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Value.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Value.GPT_5_6_CYBER else -> Value._UNKNOWN } @@ -5436,6 +5451,9 @@ private constructor( GPT_5_PRO -> Known.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Known.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Known.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Known.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Known.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Known.GPT_5_6_CYBER else -> throw OpenAIInvalidDataException("Unknown Model: $value") } diff --git a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactParams.kt index b339110a8..d26b12685 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCompactParams.kt @@ -1432,6 +1432,12 @@ private constructor( @JvmField val GPT_5_1_CODEX_MAX = of("gpt-5.1-codex-max") + @JvmField val GPT_DAYBREAK_BLUE_LATEST = of("gpt-daybreak-blue-latest") + + @JvmField val GPT_DAYBREAK_RED_LATEST = of("gpt-daybreak-red-latest") + + @JvmField val GPT_5_6_CYBER = of("gpt-5.6-cyber") + @JvmStatic fun of(value: String) = Model(JsonField.of(value)) } @@ -1533,6 +1539,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, } /** @@ -1641,6 +1650,9 @@ private constructor( GPT_5_PRO, GPT_5_PRO_2025_10_06, GPT_5_1_CODEX_MAX, + GPT_DAYBREAK_BLUE_LATEST, + GPT_DAYBREAK_RED_LATEST, + GPT_5_6_CYBER, /** An enum member indicating that [Model] was instantiated with an unknown value. */ _UNKNOWN, } @@ -1750,6 +1762,9 @@ private constructor( GPT_5_PRO -> Value.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Value.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Value.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Value.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Value.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Value.GPT_5_6_CYBER else -> Value._UNKNOWN } @@ -1860,6 +1875,9 @@ private constructor( GPT_5_PRO -> Known.GPT_5_PRO GPT_5_PRO_2025_10_06 -> Known.GPT_5_PRO_2025_10_06 GPT_5_1_CODEX_MAX -> Known.GPT_5_1_CODEX_MAX + GPT_DAYBREAK_BLUE_LATEST -> Known.GPT_DAYBREAK_BLUE_LATEST + GPT_DAYBREAK_RED_LATEST -> Known.GPT_DAYBREAK_RED_LATEST + GPT_5_6_CYBER -> Known.GPT_5_6_CYBER else -> throw OpenAIInvalidDataException("Unknown Model: $value") } From e71489db896131dba12be47832148e47019ed8f0 Mon Sep 17 00:00:00 2001 From: Castiron Bot Date: Wed, 12 Aug 2026 09:42:25 -0700 Subject: [PATCH 5/5] [castiron] SDK codegen checkpoint ed0e6480-0247-4427-9e17-b071f0c730d5 Generation metadata: ewogICJjb25maWd1cmF0aW9uX2NoZWNrcG9pbnRfc2hhIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAogICJnZW5lcmF0ZWRfYmFzZWxpbmVfc2hhMjU2IjogImQ5ZTg2YjZiOThlN2Y3MzZmMjQwYmY3ZjA4MDJhN2RkMzZhYmUxMDNlNjVhN2M0MDBjNDcyZGQ4YjA0M2E5MDAiLAogICJnZW5lcmF0aW9uX2lkIjogImVkMGU2NDgwLTAyNDctNDQyNy05ZTE3LWIwNzFmMGM3MzBkNSIsCiAgImlucHV0X2J1bmRsZV9kaWdlc3QiOiAiMDhjZjQzNDJlY2E5ZTdiYWFjMzBmZDNlYTVjNTZkODQ0OWY3ZGRjMGEwMzNiNWE4NWZhNzQ1NTc2M2IxZDAwZSIsCiAgImxhbmd1YWdlIjogImphdmEiLAogICJwcmV2aW91c19nZW5lcmF0aW9uX2lkIjogIjhlNzhiZTM3LWQzMjEtNDBjNC04YTc1LTZhOGQzNDRmNzYxNiIsCiAgInB1YmxpY19iYXNlbGluZV9jb21taXQiOiAiOTQyYTA5NzlkZmI4OTVjMTNiYzEyNzQ1ZDY5ZTAwNmJjNGY3Y2UyYyIsCiAgInNvdXJjZV9icmFuY2giOiAiY29kZXgvY2FzdGlyb24tb3BlbmFwaS0xMTg1NGFlZiIsCiAgInRhcmdldCI6ICJvcGVuYWktamF2YSIKfQo= --- .../admin/organization/auditlogs/AuditLogListParams.kt | 10 ++++++++++ .../organization/auditlogs/AuditLogListResponse.kt | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListParams.kt index 6a98e8a41..a196dc958 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListParams.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListParams.kt @@ -818,6 +818,10 @@ private constructor( val TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED = of("tenant.workload_identity.principal.provisioned") + @JvmField + val TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED = + of("tenant.workload_identity.access_token.issued") + @JvmField val TENANT_ADMIN_API_KEY_CREATED = of("tenant.admin_api_key.created") @JvmField val TENANT_ADMIN_API_KEY_UPDATED = of("tenant.admin_api_key.updated") @@ -1074,6 +1078,7 @@ private constructor( TENANT_WORKLOAD_IDENTITY_MAPPING_ARCHIVED, TENANT_WORKLOAD_IDENTITY_BINDING_CREATED, TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED, + TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED, TENANT_ADMIN_API_KEY_CREATED, TENANT_ADMIN_API_KEY_UPDATED, TENANT_ADMIN_API_KEY_DELETED, @@ -1229,6 +1234,7 @@ private constructor( TENANT_WORKLOAD_IDENTITY_MAPPING_ARCHIVED, TENANT_WORKLOAD_IDENTITY_BINDING_CREATED, TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED, + TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED, TENANT_ADMIN_API_KEY_CREATED, TENANT_ADMIN_API_KEY_UPDATED, TENANT_ADMIN_API_KEY_DELETED, @@ -1400,6 +1406,8 @@ private constructor( Value.TENANT_WORKLOAD_IDENTITY_BINDING_CREATED TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED -> Value.TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED + TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED -> + Value.TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED TENANT_ADMIN_API_KEY_CREATED -> Value.TENANT_ADMIN_API_KEY_CREATED TENANT_ADMIN_API_KEY_UPDATED -> Value.TENANT_ADMIN_API_KEY_UPDATED TENANT_ADMIN_API_KEY_DELETED -> Value.TENANT_ADMIN_API_KEY_DELETED @@ -1580,6 +1588,8 @@ private constructor( Known.TENANT_WORKLOAD_IDENTITY_BINDING_CREATED TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED -> Known.TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED + TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED -> + Known.TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED TENANT_ADMIN_API_KEY_CREATED -> Known.TENANT_ADMIN_API_KEY_CREATED TENANT_ADMIN_API_KEY_UPDATED -> Known.TENANT_ADMIN_API_KEY_UPDATED TENANT_ADMIN_API_KEY_DELETED -> Known.TENANT_ADMIN_API_KEY_DELETED diff --git a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListResponse.kt b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListResponse.kt index c03fb576b..b979094fc 100644 --- a/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListResponse.kt +++ b/openai-java-core/src/main/kotlin/com/openai/models/admin/organization/auditlogs/AuditLogListResponse.kt @@ -2892,6 +2892,10 @@ private constructor( val TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED = of("tenant.workload_identity.principal.provisioned") + @JvmField + val TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED = + of("tenant.workload_identity.access_token.issued") + @JvmField val TENANT_ADMIN_API_KEY_CREATED = of("tenant.admin_api_key.created") @JvmField val TENANT_ADMIN_API_KEY_UPDATED = of("tenant.admin_api_key.updated") @@ -3148,6 +3152,7 @@ private constructor( TENANT_WORKLOAD_IDENTITY_MAPPING_ARCHIVED, TENANT_WORKLOAD_IDENTITY_BINDING_CREATED, TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED, + TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED, TENANT_ADMIN_API_KEY_CREATED, TENANT_ADMIN_API_KEY_UPDATED, TENANT_ADMIN_API_KEY_DELETED, @@ -3303,6 +3308,7 @@ private constructor( TENANT_WORKLOAD_IDENTITY_MAPPING_ARCHIVED, TENANT_WORKLOAD_IDENTITY_BINDING_CREATED, TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED, + TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED, TENANT_ADMIN_API_KEY_CREATED, TENANT_ADMIN_API_KEY_UPDATED, TENANT_ADMIN_API_KEY_DELETED, @@ -3472,6 +3478,8 @@ private constructor( Value.TENANT_WORKLOAD_IDENTITY_BINDING_CREATED TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED -> Value.TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED + TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED -> + Value.TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED TENANT_ADMIN_API_KEY_CREATED -> Value.TENANT_ADMIN_API_KEY_CREATED TENANT_ADMIN_API_KEY_UPDATED -> Value.TENANT_ADMIN_API_KEY_UPDATED TENANT_ADMIN_API_KEY_DELETED -> Value.TENANT_ADMIN_API_KEY_DELETED @@ -3652,6 +3660,8 @@ private constructor( Known.TENANT_WORKLOAD_IDENTITY_BINDING_CREATED TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED -> Known.TENANT_WORKLOAD_IDENTITY_PRINCIPAL_PROVISIONED + TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED -> + Known.TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED TENANT_ADMIN_API_KEY_CREATED -> Known.TENANT_ADMIN_API_KEY_CREATED TENANT_ADMIN_API_KEY_UPDATED -> Known.TENANT_ADMIN_API_KEY_UPDATED TENANT_ADMIN_API_KEY_DELETED -> Known.TENANT_ADMIN_API_KEY_DELETED