Skip to content
This repository was archived by the owner on Feb 11, 2025. It is now read-only.

Commit dc15a93

Browse files
committed
Add organizationId
Fixes #6
1 parent 99745c1 commit dc15a93

File tree

7 files changed

+70
-52
lines changed

7 files changed

+70
-52
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,8 @@
2222
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
2323
hs_err_pid*
2424
replay_pid*
25+
26+
**/target/**
27+
28+
.idea
29+
*.iml

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ String apiKey = System.getenv("OPENAI_API_KEY");
6565
6666
OpenAiClient client = OpenAiClient.builder()
6767
.openAiApiKey(apiKey)
68+
.organizationId(orgId)
6869
.callTimeout(ofSeconds(60))
6970
.connectTimeout(ofSeconds(60))
7071
.readTimeout(ofSeconds(60))
Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,10 @@
11
package dev.ai4j.openai4j;
22

3-
import okhttp3.Interceptor;
4-
import okhttp3.Request;
5-
import okhttp3.Response;
3+
import java.util.Collections;
64

7-
import java.io.IOException;
8-
9-
class ApiKeyHeaderInjector implements Interceptor {
10-
11-
private final String apiKey;
5+
class ApiKeyHeaderInjector extends GenericHeaderInjector {
126

137
ApiKeyHeaderInjector(String apiKey) {
14-
this.apiKey = apiKey;
15-
}
16-
17-
@Override
18-
public Response intercept(Chain chain) throws IOException {
19-
20-
Request request = chain.request()
21-
.newBuilder()
22-
.addHeader("api-key", apiKey)
23-
.build();
24-
25-
return chain.proceed(request);
8+
super(Collections.singletonMap("api-key", apiKey));
269
}
2710
}
Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,10 @@
11
package dev.ai4j.openai4j;
22

3-
import okhttp3.Interceptor;
4-
import okhttp3.Request;
5-
import okhttp3.Response;
3+
import java.util.Collections;
64

7-
import java.io.IOException;
8-
9-
class AuthorizationHeaderInjector implements Interceptor {
10-
11-
private final String apiKey;
5+
class AuthorizationHeaderInjector extends GenericHeaderInjector {
126

137
AuthorizationHeaderInjector(String apiKey) {
14-
this.apiKey = apiKey;
15-
}
16-
17-
@Override
18-
public Response intercept(Chain chain) throws IOException {
19-
20-
Request request = chain.request()
21-
.newBuilder()
22-
.addHeader("Authorization", "Bearer " + apiKey)
23-
.build();
24-
25-
return chain.proceed(request);
8+
super(Collections.singletonMap("Authorization", "Bearer " + apiKey));
269
}
2710
}

src/main/java/dev/ai4j/openai4j/DefaultOpenAiClient.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
package dev.ai4j.openai4j;
22

3+
import static dev.ai4j.openai4j.Json.GSON;
4+
5+
import java.io.IOException;
6+
import java.util.Collections;
7+
import java.util.List;
8+
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
312
import dev.ai4j.openai4j.chat.ChatCompletionRequest;
413
import dev.ai4j.openai4j.chat.ChatCompletionResponse;
514
import dev.ai4j.openai4j.completion.CompletionRequest;
@@ -11,16 +20,9 @@
1120
import dev.ai4j.openai4j.moderation.ModerationResult;
1221
import okhttp3.Cache;
1322
import okhttp3.OkHttpClient;
14-
import org.slf4j.Logger;
15-
import org.slf4j.LoggerFactory;
1623
import retrofit2.Retrofit;
1724
import retrofit2.converter.gson.GsonConverterFactory;
1825

19-
import java.io.IOException;
20-
import java.util.List;
21-
22-
import static dev.ai4j.openai4j.Json.GSON;
23-
2426
public class DefaultOpenAiClient extends OpenAiClient {
2527

2628
private static final Logger log = LoggerFactory.getLogger(DefaultOpenAiClient.class);
@@ -58,6 +60,10 @@ private DefaultOpenAiClient(Builder serviceBuilder) {
5860
okHttpClientBuilder.addInterceptor(new ApiKeyHeaderInjector(serviceBuilder.azureApiKey));
5961
}
6062

63+
if (serviceBuilder.organizationId != null) {
64+
okHttpClientBuilder.addInterceptor(new GenericHeaderInjector(Collections.singletonMap("OpenAI-Organization", serviceBuilder.organizationId)));
65+
}
66+
6167
if (serviceBuilder.proxy != null) {
6268
okHttpClientBuilder.proxy(serviceBuilder.proxy);
6369
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package dev.ai4j.openai4j;
2+
3+
import java.io.IOException;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
import java.util.Optional;
7+
8+
import okhttp3.Interceptor;
9+
import okhttp3.Request.Builder;
10+
import okhttp3.Response;
11+
12+
class GenericHeaderInjector implements Interceptor {
13+
private final Map<String, String> headers = new HashMap<>();
14+
15+
GenericHeaderInjector(Map<String, String> headers) {
16+
Optional.ofNullable(headers)
17+
.ifPresent(this.headers::putAll);
18+
}
19+
20+
@Override
21+
public Response intercept(Chain chain) throws IOException {
22+
Builder builder = chain.request().newBuilder();
23+
24+
// Add headers
25+
this.headers.forEach(builder::addHeader);
26+
27+
return chain.proceed(builder.build());
28+
}
29+
}

src/main/java/dev/ai4j/openai4j/OpenAiClient.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package dev.ai4j.openai4j;
22

3+
import java.net.InetSocketAddress;
4+
import java.net.Proxy;
5+
import java.time.Duration;
6+
import java.util.List;
7+
38
import dev.ai4j.openai4j.chat.ChatCompletionRequest;
49
import dev.ai4j.openai4j.chat.ChatCompletionResponse;
510
import dev.ai4j.openai4j.completion.CompletionRequest;
@@ -12,11 +17,6 @@
1217
import dev.ai4j.openai4j.spi.OpenAiClientBuilderFactory;
1318
import dev.ai4j.openai4j.spi.ServiceHelper;
1419

15-
import java.net.InetSocketAddress;
16-
import java.net.Proxy;
17-
import java.time.Duration;
18-
import java.util.List;
19-
2020
public abstract class OpenAiClient {
2121

2222
public abstract SyncOrAsyncOrStreaming<CompletionResponse> completion(CompletionRequest request);
@@ -50,6 +50,7 @@ public static OpenAiClient.Builder builder() {
5050
public abstract static class Builder<T extends OpenAiClient, B extends Builder<T, B>> {
5151

5252
public String baseUrl = "https://api.openai.com/v1/";
53+
public String organizationId;
5354
public String apiVersion;
5455
public String openAiApiKey;
5556
public String azureApiKey;
@@ -78,6 +79,16 @@ public B baseUrl(String baseUrl) {
7879
return (B) this;
7980
}
8081

82+
/**
83+
*
84+
* @param organizationId The organizationId for OpenAI: https://platform.openai.com/docs/api-reference/organization-optional
85+
* @return builder
86+
*/
87+
public B organizationId(String organizationId) {
88+
this.organizationId = organizationId;
89+
return (B) this;
90+
}
91+
8192
/**
8293
* @param apiVersion Version of the API in the YYYY-MM-DD format. Applicable only for Azure OpenAI.
8394
* @return builder

0 commit comments

Comments
 (0)