Skip to content

Commit c7cff12

Browse files
authored
Merge pull request #1177 from flyinfish/bugfix/1154
Add keys to override config for chat, embedding and image-model for Azure OpenAI
2 parents 547241c + 89b947d commit c7cff12

File tree

6 files changed

+111
-14
lines changed

6 files changed

+111
-14
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ release.properties
6666
# Quarkus CLI
6767
.quarkus
6868

69+
# dotenv
70+
.env
71+
6972
#Dolphin
7073
.directory
7174
/samples/chatbot/dev.sh

model-providers/openai/azure-openai/runtime/src/main/java/io/quarkiverse/langchain4j/azure/openai/runtime/AzureOpenAiRecorder.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import io.quarkiverse.langchain4j.azure.openai.AzureOpenAiImageModel;
3131
import io.quarkiverse.langchain4j.azure.openai.AzureOpenAiStreamingChatModel;
3232
import io.quarkiverse.langchain4j.azure.openai.runtime.config.ChatModelConfig;
33-
import io.quarkiverse.langchain4j.azure.openai.runtime.config.EmbeddingModelConfig;
3433
import io.quarkiverse.langchain4j.azure.openai.runtime.config.LangChain4jAzureOpenAiConfig;
3534
import io.quarkiverse.langchain4j.azure.openai.runtime.config.LangChain4jAzureOpenAiConfig.AzureAiConfig.EndpointType;
3635
import io.quarkiverse.langchain4j.openai.common.QuarkusOpenAiClient;
@@ -58,17 +57,16 @@ public Function<SyntheticCreationalContext<ChatLanguageModel>, ChatLanguageModel
5857
LangChain4jAzureOpenAiConfig.AzureAiConfig azureAiConfig = correspondingAzureOpenAiConfig(runtimeConfig, configName);
5958

6059
if (azureAiConfig.enableIntegration()) {
61-
ChatModelConfig chatModelConfig = azureAiConfig.chatModel();
62-
String apiKey = azureAiConfig.apiKey().orElse(null);
63-
String adToken = azureAiConfig.adToken().orElse(null);
64-
60+
var chatModelConfig = azureAiConfig.chatModel();
61+
var apiKey = firstOrDefault(null, chatModelConfig.apiKey(), azureAiConfig.apiKey());
62+
var adToken = firstOrDefault(null, chatModelConfig.adToken(), azureAiConfig.adToken());
6563
var builder = AzureOpenAiChatModel.builder()
6664
.endpoint(getEndpoint(azureAiConfig, configName, EndpointType.CHAT))
6765
.configName(NamedConfigUtil.isDefault(configName) ? null : configName)
6866
.apiKey(apiKey)
6967
.adToken(adToken)
7068
// .tokenizer(new OpenAiTokenizer("<modelName>")) TODO: Set the tokenizer, it is always null!!
71-
.apiVersion(azureAiConfig.apiVersion())
69+
.apiVersion(chatModelConfig.apiVersion().orElse(azureAiConfig.apiVersion()))
7270
.timeout(azureAiConfig.timeout().orElse(Duration.ofSeconds(10)))
7371
.maxRetries(azureAiConfig.maxRetries())
7472
.logRequests(firstOrDefault(false, chatModelConfig.logRequests(), azureAiConfig.logRequests()))
@@ -158,15 +156,15 @@ public Function<SyntheticCreationalContext<EmbeddingModel>, EmbeddingModel> embe
158156
LangChain4jAzureOpenAiConfig.AzureAiConfig azureAiConfig = correspondingAzureOpenAiConfig(runtimeConfig, configName);
159157

160158
if (azureAiConfig.enableIntegration()) {
161-
EmbeddingModelConfig embeddingModelConfig = azureAiConfig.embeddingModel();
162-
String apiKey = azureAiConfig.apiKey().orElse(null);
163-
String adToken = azureAiConfig.adToken().orElse(null);
159+
var embeddingModelConfig = azureAiConfig.embeddingModel();
160+
var apiKey = firstOrDefault(null, embeddingModelConfig.apiKey(), azureAiConfig.apiKey());
161+
var adToken = firstOrDefault(null, embeddingModelConfig.adToken(), azureAiConfig.adToken());
164162
var builder = AzureOpenAiEmbeddingModel.builder()
165163
.endpoint(getEndpoint(azureAiConfig, configName, EndpointType.EMBEDDING))
166164
.apiKey(apiKey)
167165
.adToken(adToken)
168166
.configName(NamedConfigUtil.isDefault(configName) ? null : configName)
169-
.apiVersion(azureAiConfig.apiVersion())
167+
.apiVersion(embeddingModelConfig.apiVersion().orElse(azureAiConfig.apiVersion()))
170168
.timeout(azureAiConfig.timeout().orElse(Duration.ofSeconds(10)))
171169
.maxRetries(azureAiConfig.maxRetries())
172170
.logRequests(firstOrDefault(false, embeddingModelConfig.logRequests(), azureAiConfig.logRequests()))
@@ -195,15 +193,14 @@ public Function<SyntheticCreationalContext<ImageModel>, ImageModel> imageModel(L
195193
LangChain4jAzureOpenAiConfig.AzureAiConfig azureAiConfig = correspondingAzureOpenAiConfig(runtimeConfig, configName);
196194

197195
if (azureAiConfig.enableIntegration()) {
198-
var apiKey = azureAiConfig.apiKey().orElse(null);
199-
String adToken = azureAiConfig.adToken().orElse(null);
200-
201196
var imageModelConfig = azureAiConfig.imageModel();
197+
var apiKey = firstOrDefault(null, imageModelConfig.apiKey(), azureAiConfig.apiKey());
198+
var adToken = firstOrDefault(null, imageModelConfig.adToken(), azureAiConfig.adToken());
202199
var builder = AzureOpenAiImageModel.builder()
203200
.endpoint(getEndpoint(azureAiConfig, configName, EndpointType.IMAGE))
204201
.apiKey(apiKey)
205202
.adToken(adToken)
206-
.apiVersion(azureAiConfig.apiVersion())
203+
.apiVersion(imageModelConfig.apiVersion().orElse(azureAiConfig.apiVersion()))
207204
.timeout(azureAiConfig.timeout().orElse(Duration.ofSeconds(10)))
208205
.maxRetries(azureAiConfig.maxRetries())
209206
.logRequests(firstOrDefault(false, imageModelConfig.logRequests(), azureAiConfig.logRequests()))

model-providers/openai/azure-openai/runtime/src/main/java/io/quarkiverse/langchain4j/azure/openai/runtime/config/ChatModelConfig.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,23 @@ public interface ChatModelConfig {
3636
@WithDefault(ConfigConstants.DUMMY_VALUE)
3737
Optional<String> endpoint();
3838

39+
/**
40+
* The Azure AD token to use for this operation.
41+
* If present, then the requests towards OpenAI will include this in the Authorization header.
42+
* Note that this property overrides the functionality of {@code quarkus.langchain4j.azure-openai.embedding-model.api-key}.
43+
*/
44+
Optional<String> adToken();
45+
46+
/**
47+
* The API version to use for this operation. This follows the YYYY-MM-DD format
48+
*/
49+
Optional<String> apiVersion();
50+
51+
/**
52+
* Azure OpenAI API key
53+
*/
54+
Optional<String> apiKey();
55+
3956
/**
4057
* What sampling temperature to use, with values between 0 and 2.
4158
* Higher values means the model will take more risks.

model-providers/openai/azure-openai/runtime/src/main/java/io/quarkiverse/langchain4j/azure/openai/runtime/config/EmbeddingModelConfig.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,23 @@ public interface EmbeddingModelConfig {
3131
*/
3232
Optional<String> endpoint();
3333

34+
/**
35+
* The Azure AD token to use for this operation.
36+
* If present, then the requests towards OpenAI will include this in the Authorization header.
37+
* Note that this property overrides the functionality of {@code quarkus.langchain4j.azure-openai.embedding-model.api-key}.
38+
*/
39+
Optional<String> adToken();
40+
41+
/**
42+
* The API version to use for this operation. This follows the YYYY-MM-DD format
43+
*/
44+
Optional<String> apiVersion();
45+
46+
/**
47+
* Azure OpenAI API key
48+
*/
49+
Optional<String> apiKey();
50+
3451
/**
3552
* Whether embedding model requests should be logged
3653
*/

model-providers/openai/azure-openai/runtime/src/main/java/io/quarkiverse/langchain4j/azure/openai/runtime/config/ImageModelConfig.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,23 @@ public interface ImageModelConfig {
3333
*/
3434
Optional<String> endpoint();
3535

36+
/**
37+
* The Azure AD token to use for this operation.
38+
* If present, then the requests towards OpenAI will include this in the Authorization header.
39+
* Note that this property overrides the functionality of {@code quarkus.langchain4j.azure-openai.embedding-model.api-key}.
40+
*/
41+
Optional<String> adToken();
42+
43+
/**
44+
* The API version to use for this operation. This follows the YYYY-MM-DD format
45+
*/
46+
Optional<String> apiVersion();
47+
48+
/**
49+
* Azure OpenAI API key
50+
*/
51+
Optional<String> apiKey();
52+
3653
/**
3754
* Model name to use
3855
*/

model-providers/openai/azure-openai/runtime/src/test/java/io/quarkiverse/langchain4j/azure/openai/runtime/AzureOpenAiRecorderEndpointTests.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,21 @@ public Optional<String> endpoint() {
219219
return Optional.empty();
220220
}
221221

222+
@Override
223+
public Optional<String> adToken() {
224+
return Optional.empty();
225+
}
226+
227+
@Override
228+
public Optional<String> apiVersion() {
229+
return Optional.empty();
230+
}
231+
232+
@Override
233+
public Optional<String> apiKey() {
234+
return Optional.empty();
235+
}
236+
222237
@Override
223238
public Double temperature() {
224239
return null;
@@ -285,6 +300,21 @@ public Optional<String> endpoint() {
285300
return Optional.empty();
286301
}
287302

303+
@Override
304+
public Optional<String> adToken() {
305+
return Optional.empty();
306+
}
307+
308+
@Override
309+
public Optional<String> apiVersion() {
310+
return Optional.empty();
311+
}
312+
313+
@Override
314+
public Optional<String> apiKey() {
315+
return Optional.empty();
316+
}
317+
288318
@Override
289319
public Optional<Boolean> logRequests() {
290320
return Optional.empty();
@@ -294,6 +324,7 @@ public Optional<Boolean> logRequests() {
294324
public Optional<Boolean> logResponses() {
295325
return Optional.empty();
296326
}
327+
297328
};
298329
}
299330

@@ -320,6 +351,21 @@ public Optional<String> endpoint() {
320351
return Optional.empty();
321352
}
322353

354+
@Override
355+
public Optional<String> adToken() {
356+
return Optional.empty();
357+
}
358+
359+
@Override
360+
public Optional<String> apiVersion() {
361+
return Optional.empty();
362+
}
363+
364+
@Override
365+
public Optional<String> apiKey() {
366+
return Optional.empty();
367+
}
368+
323369
@Override
324370
public String modelName() {
325371
return null;

0 commit comments

Comments
 (0)