Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

OpenAI Responses support #44616

Merged
merged 60 commits into from
Mar 14, 2025
Merged
Changes from 1 commit
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
a37f90d
Added responses as a subpackage
jpalvarezl Feb 27, 2025
dad5eec
Added test and sample
jpalvarezl Feb 27, 2025
251c3b3
Streaming works
jpalvarezl Feb 27, 2025
bfee8df
not sure why this file gets constantly modified
jpalvarezl Mar 3, 2025
46ffa70
Added tests for SSE implementation
jpalvarezl Mar 4, 2025
3c8846d
Added more convenience methods
jpalvarezl Mar 4, 2025
4b250a8
Added more convenience methods
jpalvarezl Mar 4, 2025
2763b11
Adding customization for service version add when necessary
jpalvarezl Mar 4, 2025
2fa86ee
Fixed wrongfully named variant
jpalvarezl Mar 4, 2025
7bdf9e2
Added sync test file for non-Azure OpenAI
jpalvarezl Mar 4, 2025
f3b6f33
WIP: adding support for non-Azure OpenAI
jpalvarezl Mar 5, 2025
8e4c52e
Code gen responses latest
jpalvarezl Mar 5, 2025
64f2b03
Codegen for inference, still ok
jpalvarezl Mar 5, 2025
50d1572
Merge branch 'main' into jpalvarezl/responses
jpalvarezl Mar 5, 2025
903945f
fixed client impl and sample returns 200
jpalvarezl Mar 5, 2025
10e8d16
Added azure/non-azure mode
jpalvarezl Mar 6, 2025
215643c
Compiling again with latest TSP definitions
jpalvarezl Mar 6, 2025
a852497
Up to date with PR with feedback
jpalvarezl Mar 6, 2025
9cd5a35
Cleanup
jpalvarezl Mar 7, 2025
427bf6b
Models updated
jpalvarezl Mar 7, 2025
9f3475a
Added custom constructor for request object and adjusted tests and sa…
jpalvarezl Mar 7, 2025
ed9dcf3
Some class renaming
jpalvarezl Mar 7, 2025
9ef48f3
Added unit tests for OAI and added spell check ex
jpalvarezl Mar 7, 2025
a1ab4d9
Added missing async convenience methods and added full test coverage …
jpalvarezl Mar 7, 2025
5e9ae00
Added async tests
jpalvarezl Mar 7, 2025
f45686c
style and bug checks passing
jpalvarezl Mar 7, 2025
4692477
Test cleanup and re-enabled azure
jpalvarezl Mar 7, 2025
daed899
Refreshed spec
jpalvarezl Mar 11, 2025
50b96f2
PR feedback
jpalvarezl Mar 11, 2025
dd2802d
Style checks
jpalvarezl Mar 11, 2025
b697774
Renamed stream classes
jpalvarezl Mar 11, 2025
3d7f2ad
Latest spec
jpalvarezl Mar 12, 2025
3289614
Project compiles, fixed imports
jpalvarezl Mar 12, 2025
8799f3d
Corrected type for ResponsesComputerTool
jpalvarezl Mar 12, 2025
495339a
Added tests
jpalvarezl Mar 12, 2025
177d80a
Cleanup and regen
jpalvarezl Mar 12, 2025
0380178
Refactored test base, added test recordings
jpalvarezl Mar 12, 2025
0afd10f
style checks
jpalvarezl Mar 12, 2025
32ebc54
small correction in indentation
jpalvarezl Mar 12, 2025
19c4807
Reverted assistants changes
jpalvarezl Mar 12, 2025
2940a34
Revert "not sure why this file gets constantly modified"
jpalvarezl Mar 12, 2025
3e9c67d
Restored file
jpalvarezl Mar 12, 2025
156e42a
Merge branch 'main' into jpalvarezl/responses
jpalvarezl Mar 12, 2025
c9ddae3
Style checks and new word
jpalvarezl Mar 13, 2025
ae5ad19
spec regen
jpalvarezl Mar 13, 2025
bdac814
reverted tsp-location.yaml changes
jpalvarezl Mar 13, 2025
11c9537
Code cleanup
jpalvarezl Mar 13, 2025
8c07aab
README, changelog
jpalvarezl Mar 13, 2025
e27eefa
Added async sample
jpalvarezl Mar 13, 2025
2d65e8e
Added PagedFlux and PagedIterable usage
jpalvarezl Mar 13, 2025
4ff0aa7
Moved changelog entry to correct section
jpalvarezl Mar 13, 2025
548f9ca
PLAYBACK mode working
mssfang Mar 13, 2025
852cfa7
Fixed tests
jpalvarezl Mar 13, 2025
91d62bb
Comments in progress
jpalvarezl Mar 13, 2025
2a62f59
PR comments and final test recordings
jpalvarezl Mar 13, 2025
f10d9ab
Adding agentic to repo dictionary
jpalvarezl Mar 13, 2025
d47a5f3
reverted
jpalvarezl Mar 14, 2025
b3b8758
code regen and made methods private
jpalvarezl Mar 14, 2025
a4f6088
Corrected SSE impl breaking tests
jpalvarezl Mar 14, 2025
ea0216f
Added missing docs
jpalvarezl Mar 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Code gen responses latest
jpalvarezl committed Mar 5, 2025
commit 8e4c52e87f5b57334906b32a7b7d8a7a494aeb6e
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
package com.azure.ai.openai.implementation;

import com.azure.ai.openai.OpenAIServiceVersion;
import com.azure.ai.openai.responses.AzureOpenAIServiceVersion;
import com.azure.ai.openai.responses.AzureResponsesServiceVersion;
import com.azure.core.http.rest.RequestOptions;

/**
@@ -33,7 +33,7 @@ public static void addAzureVersionToRequestOptions(String endpoint, RequestOptio
* Add the version query parameter to the request options if the service is not Azure OpenAI service.
*/
public static void addAzureVersionToRequestOptions(String endpoint, RequestOptions requestOptions,
AzureOpenAIServiceVersion serviceVersion) {
AzureResponsesServiceVersion serviceVersion) {
if (useAzureOpenAIService(endpoint)) {
requestOptions.addQueryParam("api-version", serviceVersion.getVersion());
}
Original file line number Diff line number Diff line change
@@ -7,9 +7,9 @@
import com.azure.core.util.ServiceVersion;

/**
* Service version of AzureOpenAIClient.
* Service version of AzureResponsesClient.
*/
public enum AzureOpenAIServiceVersion implements ServiceVersion {
public enum AzureResponsesServiceVersion implements ServiceVersion {
/**
* Enum value 2024-02-15-preview.
*/
@@ -57,7 +57,7 @@ public enum AzureOpenAIServiceVersion implements ServiceVersion {

private final String version;

AzureOpenAIServiceVersion(String version) {
AzureResponsesServiceVersion(String version) {
this.version = version;
}

@@ -72,9 +72,9 @@ public String getVersion() {
/**
* Gets the latest service version supported by this client library.
*
* @return The latest {@link AzureOpenAIServiceVersion}.
* @return The latest {@link AzureResponsesServiceVersion}.
*/
public static AzureOpenAIServiceVersion getLatest() {
public static AzureResponsesServiceVersion getLatest() {
return V2025_01_01_PREVIEW;
}
}
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@
// Code generated by Microsoft (R) TypeSpec Code Generator.
package com.azure.ai.openai.responses;

import com.azure.ai.openai.responses.implementation.AzureResponsesImpl;
import com.azure.ai.openai.responses.implementation.ResponsesClientImpl;
import com.azure.ai.openai.responses.implementation.streaming.OpenAIServerSentEvents;
import com.azure.ai.openai.responses.models.CreateResponseRequestAccept;
import com.azure.ai.openai.responses.models.CreateResponsesRequest;
@@ -24,31 +24,29 @@
import com.azure.core.http.rest.Response;
import com.azure.core.util.BinaryData;
import com.azure.core.util.FluxUtil;

import java.nio.ByteBuffer;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/**
* Initializes a new instance of the asynchronous AzureOpenAIClient type.
* Initializes a new instance of the asynchronous ResponsesClient type.
*/
@ServiceClient(builder = AzureOpenAIClientBuilder.class, isAsync = true)
public final class AzureOpenAIAsyncClient {
@ServiceClient(builder = ResponsesClientBuilder.class, isAsync = true)
public final class ResponsesAsyncClient {

@Generated
private final AzureResponsesImpl serviceClient;
private final ResponsesClientImpl serviceClient;

/**
* Initializes an instance of AzureOpenAIAsyncClient class.
* Initializes an instance of ResponsesAsyncClient class.
*
* @param serviceClient the service client implementation.
*/
@Generated
AzureOpenAIAsyncClient(AzureResponsesImpl serviceClient) {
ResponsesAsyncClient(ResponsesClientImpl serviceClient) {
this.serviceClient = serviceClient;
}

@@ -69,7 +67,8 @@ public final class AzureOpenAIAsyncClient {
* }
* input (Required): [
* (Required){
* type: String(message/function_call/function_call_output/file_search_call/file_search_call_response/code_interpreter_call/code_interpreter_call_response/computer_call/computer_call_output) (Required)
* type: String(message/function_call/function_call_output/computer_call/computer_call_output/file_search_call/web_search_call/code_interpreter_call) (Required)
* id: String (Required)
* }
* ]
* previous_response_id: String (Optional)
@@ -100,7 +99,8 @@ public final class AzureOpenAIAsyncClient {
* previous_response_id: String (Required)
* output (Required): [
* (Required){
* type: String(message/function_call/function_call_output/file_search_call/file_search_call_response/code_interpreter_call/code_interpreter_call_response/computer_call/computer_call_output) (Required)
* type: String(message/function_call/function_call_output/computer_call/computer_call_output/file_search_call/web_search_call/code_interpreter_call) (Required)
* id: String (Required)
* }
* ]
* error (Required): {
@@ -172,7 +172,8 @@ public Mono<Response<BinaryData>> createResponseWithResponse(String accept, Bina
* previous_response_id: String (Required)
* output (Required): [
* (Required){
* type: String(message/function_call/function_call_output/file_search_call/file_search_call_response/code_interpreter_call/code_interpreter_call_response/computer_call/computer_call_output) (Required)
* type: String(message/function_call/function_call_output/computer_call/computer_call_output/file_search_call/web_search_call/code_interpreter_call) (Required)
* id: String (Required)
* }
* ]
* error (Required): {
@@ -229,7 +230,8 @@ public Mono<Response<BinaryData>> getResponseWithResponse(String responseId, Req
* object: String (Required)
* data (Required): [
* (Required){
* type: String(message/function_call/function_call_output/file_search_call/file_search_call_response/code_interpreter_call/code_interpreter_call_response/computer_call/computer_call_output) (Required)
* type: String(message/function_call/function_call_output/computer_call/computer_call_output/file_search_call/web_search_call/code_interpreter_call) (Required)
* id: String (Required)
* }
* ]
* first_id: String (Required)
@@ -376,9 +378,7 @@ private Mono<ResponsesResponse> createResponse(CreateResponseRequestAccept accep
public Mono<ResponsesResponse> createResponse(CreateResponsesRequest requestBody, RequestOptions requestOptions) {
requestBody.setStream(false);
return createResponseWithResponse(CreateResponseRequestAccept.APPLICATION_JSON.toString(),
BinaryData.fromObject(requestBody),
requestOptions)
.flatMap(FluxUtil::toMono)
BinaryData.fromObject(requestBody), requestOptions).flatMap(FluxUtil::toMono)
.map(protocolMethodData -> protocolMethodData.toObject(ResponsesResponse.class));
}

@@ -396,12 +396,11 @@ public Mono<ResponsesResponse> createResponse(CreateResponsesRequest requestBody
* @return the response body on successful completion of {@link Mono}.
*/
@ServiceMethod(returns = ReturnType.COLLECTION)
public Flux<ResponsesResponseStreamEvent> createResponseStream(CreateResponsesRequest requestBody, RequestOptions requestOptions) {
public Flux<ResponsesResponseStreamEvent> createResponseStream(CreateResponsesRequest requestBody,
RequestOptions requestOptions) {
requestBody.setStream(true);
Flux<ByteBuffer> response = createResponseWithResponse(CreateResponseRequestAccept.TEXT_EVENT_STREAM.toString(),
BinaryData.fromObject(requestBody),
requestOptions).flatMapMany(it -> it.getValue().toFluxByteBuffer());

BinaryData.fromObject(requestBody), requestOptions).flatMapMany(it -> it.getValue().toFluxByteBuffer());
return new OpenAIServerSentEvents(response).getEvents();
}
}
Original file line number Diff line number Diff line change
@@ -3,7 +3,9 @@
// Code generated by Microsoft (R) TypeSpec Code Generator.
package com.azure.ai.openai.responses;

import com.azure.ai.openai.responses.implementation.AzureResponsesImpl;
import static com.azure.ai.openai.implementation.OpenAIUtils.addAzureVersionToRequestOptions;

import com.azure.ai.openai.responses.implementation.ResponsesClientImpl;
import com.azure.ai.openai.responses.implementation.streaming.OpenAIServerSentEvents;
import com.azure.ai.openai.responses.models.CreateResponseRequestAccept;
import com.azure.ai.openai.responses.models.CreateResponsesRequest;
@@ -24,38 +26,35 @@
import com.azure.core.http.rest.Response;
import com.azure.core.util.BinaryData;
import com.azure.core.util.IterableStream;
import reactor.core.publisher.Flux;

import java.nio.ByteBuffer;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import static com.azure.ai.openai.implementation.OpenAIUtils.addAzureVersionToRequestOptions;
import reactor.core.publisher.Flux;

/**
* Initializes a new instance of the synchronous AzureOpenAIClient type.
* Initializes a new instance of the synchronous ResponsesClient type.
*/
@ServiceClient(builder = AzureOpenAIClientBuilder.class)
public final class AzureOpenAIClient {
@ServiceClient(builder = ResponsesClientBuilder.class)
public final class ResponsesClient {

@Generated
private final AzureResponsesImpl serviceClient;
private final ResponsesClientImpl serviceClient;

/**
* Initializes an instance of AzureOpenAIClient class.
* Initializes an instance of ResponsesClient class.
*
* @param serviceClient the service client implementation.
*/
@Generated
AzureOpenAIClient(AzureResponsesImpl serviceClient) {
ResponsesClient(ResponsesClientImpl serviceClient) {
this.serviceClient = serviceClient;
}

/**
* Creates a model response.
* <p><strong>Request Body Schema</strong></p>
*
*
* <pre>
* {@code
* {
@@ -69,7 +68,8 @@ public final class AzureOpenAIClient {
* }
* input (Required): [
* (Required){
* type: String(message/function_call/function_call_output/file_search_call/file_search_call_response/code_interpreter_call/code_interpreter_call_response/computer_call/computer_call_output) (Required)
* type: String(message/function_call/function_call_output/computer_call/computer_call_output/file_search_call/web_search_call/code_interpreter_call) (Required)
* id: String (Required)
* }
* ]
* previous_response_id: String (Optional)
@@ -86,9 +86,9 @@ public final class AzureOpenAIClient {
* }
* }
* </pre>
*
*
* <p><strong>Response Body Schema</strong></p>
*
*
* <pre>
* {@code
* {
@@ -100,7 +100,8 @@ public final class AzureOpenAIClient {
* previous_response_id: String (Required)
* output (Required): [
* (Required){
* type: String(message/function_call/function_call_output/file_search_call/file_search_call_response/code_interpreter_call/code_interpreter_call_response/computer_call/computer_call_output) (Required)
* type: String(message/function_call/function_call_output/computer_call/computer_call_output/file_search_call/web_search_call/code_interpreter_call) (Required)
* id: String (Required)
* }
* ]
* error (Required): {
@@ -160,7 +161,7 @@ public Response<BinaryData> createResponseWithResponse(String accept, BinaryData
* </table>
* You can add these to a request with {@link RequestOptions#addQueryParam}
* <p><strong>Response Body Schema</strong></p>
*
*
* <pre>
* {@code
* {
@@ -172,7 +173,8 @@ public Response<BinaryData> createResponseWithResponse(String accept, BinaryData
* previous_response_id: String (Required)
* output (Required): [
* (Required){
* type: String(message/function_call/function_call_output/file_search_call/file_search_call_response/code_interpreter_call/code_interpreter_call_response/computer_call/computer_call_output) (Required)
* type: String(message/function_call/function_call_output/computer_call/computer_call_output/file_search_call/web_search_call/code_interpreter_call) (Required)
* id: String (Required)
* }
* ]
* error (Required): {
@@ -222,14 +224,15 @@ public Response<BinaryData> getResponseWithResponse(String responseId, RequestOp
/**
* Returns a list of input items for a given response.
* <p><strong>Response Body Schema</strong></p>
*
*
* <pre>
* {@code
* {
* object: String (Required)
* data (Required): [
* (Required){
* type: String(message/function_call/function_call_output/file_search_call/file_search_call_response/code_interpreter_call/code_interpreter_call_response/computer_call/computer_call_output) (Required)
* type: String(message/function_call/function_call_output/computer_call/computer_call_output/file_search_call/web_search_call/code_interpreter_call) (Required)
* id: String (Required)
* }
* ]
* first_id: String (Required)
@@ -370,7 +373,7 @@ private ResponsesResponse createResponse(CreateResponseRequestAccept accept, Cre
public ResponsesResponse createResponse(CreateResponsesRequest requestBody, RequestOptions requestOptions) {
requestBody.setStream(false);
return createResponseWithResponse(CreateResponseRequestAccept.APPLICATION_JSON.toString(),
BinaryData.fromObject(requestBody), requestOptions).getValue().toObject(ResponsesResponse.class);
BinaryData.fromObject(requestBody), requestOptions).getValue().toObject(ResponsesResponse.class);
}

/**
@@ -390,7 +393,7 @@ public ResponsesResponse createResponse(CreateResponsesRequest requestBody) {
requestBody.setStream(false);
RequestOptions requestOptions = new RequestOptions();
return createResponseWithResponse(CreateResponseRequestAccept.APPLICATION_JSON.toString(),
BinaryData.fromObject(requestBody), requestOptions).getValue().toObject(ResponsesResponse.class);
BinaryData.fromObject(requestBody), requestOptions).getValue().toObject(ResponsesResponse.class);
}

/**
@@ -406,11 +409,11 @@ public ResponsesResponse createResponse(CreateResponsesRequest requestBody) {
* @return the response.
*/
@ServiceMethod(returns = ReturnType.COLLECTION)
public IterableStream<ResponsesResponseStreamEvent> createResponseStreaming(CreateResponsesRequest requestBody, RequestOptions requestOptions) {
public IterableStream<ResponsesResponseStreamEvent> createResponseStreaming(CreateResponsesRequest requestBody,
RequestOptions requestOptions) {
requestBody.setStream(true);
Flux<ByteBuffer> events = createResponseWithResponse(CreateResponseRequestAccept.TEXT_EVENT_STREAM.toString(),
BinaryData.fromObject(requestBody), requestOptions).getValue().toFluxByteBuffer();

BinaryData.fromObject(requestBody), requestOptions).getValue().toFluxByteBuffer();
OpenAIServerSentEvents eventsProcessor = new OpenAIServerSentEvents(events);
return new IterableStream<>(eventsProcessor.getEvents());
}
@@ -432,8 +435,7 @@ public IterableStream<ResponsesResponseStreamEvent> createResponseStreaming(Crea
RequestOptions requestOptions = new RequestOptions();
requestBody.setStream(true);
Flux<ByteBuffer> events = createResponseWithResponse(CreateResponseRequestAccept.TEXT_EVENT_STREAM.toString(),
BinaryData.fromObject(requestBody), requestOptions).getValue().toFluxByteBuffer();

BinaryData.fromObject(requestBody), requestOptions).getValue().toFluxByteBuffer();
OpenAIServerSentEvents eventsProcessor = new OpenAIServerSentEvents(events);
return new IterableStream<>(eventsProcessor.getEvents());
}
Loading