AI rule node: add basic support for Azure OpenAI
This commit is contained in:
parent
bee8f370b9
commit
c98f746aaf
@ -381,6 +381,10 @@
|
||||
<groupId>org.rocksdb</groupId>
|
||||
<artifactId>rocksdbjni</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>dev.langchain4j</groupId>
|
||||
<artifactId>langchain4j-azure-open-ai</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>dev.langchain4j</groupId>
|
||||
<artifactId>langchain4j-open-ai</artifactId>
|
||||
|
||||
@ -17,6 +17,7 @@ package org.thingsboard.server.service.ai;
|
||||
|
||||
import dev.langchain4j.model.chat.ChatModel;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.thingsboard.server.common.data.ai.model.chat.AzureOpenAiChatModel;
|
||||
import org.thingsboard.server.common.data.ai.model.chat.GoogleAiGeminiChatModel;
|
||||
import org.thingsboard.server.common.data.ai.model.chat.Langchain4jChatModelConfigurer;
|
||||
import org.thingsboard.server.common.data.ai.model.chat.MistralAiChatModel;
|
||||
@ -39,6 +40,18 @@ public class Langchain4jChatModelConfigurerImpl implements Langchain4jChatModelC
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatModel configureChatModel(AzureOpenAiChatModel chatModel) {
|
||||
AzureOpenAiChatModel.Config modelConfig = chatModel.modelConfig();
|
||||
return dev.langchain4j.model.azure.AzureOpenAiChatModel.builder()
|
||||
.apiKey(chatModel.providerConfig().apiKey())
|
||||
.deploymentName(chatModel.modelId())
|
||||
.temperature(modelConfig.temperature())
|
||||
.timeout(toDuration(modelConfig.timeoutSeconds()))
|
||||
.maxRetries(modelConfig.maxRetries())
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatModel configureChatModel(GoogleAiGeminiChatModel chatModel) {
|
||||
GoogleAiGeminiChatModel.Config modelConfig = chatModel.modelConfig();
|
||||
|
||||
@ -20,7 +20,7 @@ import org.thingsboard.server.common.data.ai.model.AiModel;
|
||||
import org.thingsboard.server.common.data.ai.model.AiModelType;
|
||||
|
||||
public sealed interface AiChatModel<C extends AiChatModelConfig<C>> extends AiModel<C>
|
||||
permits OpenAiChatModel, GoogleAiGeminiChatModel, MistralAiChatModel {
|
||||
permits OpenAiChatModel, AzureOpenAiChatModel, GoogleAiGeminiChatModel, MistralAiChatModel {
|
||||
|
||||
ChatModel configure(Langchain4jChatModelConfigurer configurer);
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@ package org.thingsboard.server.common.data.ai.model.chat;
|
||||
import org.thingsboard.server.common.data.ai.model.AiModelConfig;
|
||||
|
||||
public sealed interface AiChatModelConfig<C extends AiChatModelConfig<C>> extends AiModelConfig<C>
|
||||
permits OpenAiChatModel.Config, GoogleAiGeminiChatModel.Config, MistralAiChatModel.Config {
|
||||
permits OpenAiChatModel.Config, AzureOpenAiChatModel.Config, GoogleAiGeminiChatModel.Config, MistralAiChatModel.Config {
|
||||
|
||||
Double temperature();
|
||||
|
||||
|
||||
@ -0,0 +1,60 @@
|
||||
/**
|
||||
* Copyright © 2016-2025 The Thingsboard 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
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package org.thingsboard.server.common.data.ai.model.chat;
|
||||
|
||||
import dev.langchain4j.model.chat.ChatModel;
|
||||
import org.thingsboard.server.common.data.ai.provider.AzureOpenAiProviderConfig;
|
||||
|
||||
public record AzureOpenAiChatModel(
|
||||
AzureOpenAiProviderConfig providerConfig,
|
||||
String modelId,
|
||||
Config modelConfig
|
||||
) implements AiChatModel<AzureOpenAiChatModel.Config> {
|
||||
|
||||
public record Config(
|
||||
Double temperature,
|
||||
Integer timeoutSeconds,
|
||||
Integer maxRetries
|
||||
) implements AiChatModelConfig<AzureOpenAiChatModel.Config> {
|
||||
|
||||
@Override
|
||||
public AzureOpenAiChatModel.Config withTemperature(Double temperature) {
|
||||
return new Config(temperature, timeoutSeconds, maxRetries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AzureOpenAiChatModel.Config withTimeoutSeconds(Integer timeoutSeconds) {
|
||||
return new Config(temperature, timeoutSeconds, maxRetries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AzureOpenAiChatModel.Config withMaxRetries(Integer maxRetries) {
|
||||
return new Config(temperature, timeoutSeconds, maxRetries);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatModel configure(Langchain4jChatModelConfigurer configurer) {
|
||||
return configurer.configureChatModel(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AzureOpenAiChatModel withModelConfig(AzureOpenAiChatModel.Config config) {
|
||||
return new AzureOpenAiChatModel(providerConfig, modelId, config);
|
||||
}
|
||||
|
||||
}
|
||||
@ -21,6 +21,8 @@ public interface Langchain4jChatModelConfigurer {
|
||||
|
||||
ChatModel configureChatModel(OpenAiChatModel chatModel);
|
||||
|
||||
ChatModel configureChatModel(AzureOpenAiChatModel chatModel);
|
||||
|
||||
ChatModel configureChatModel(GoogleAiGeminiChatModel chatModel);
|
||||
|
||||
ChatModel configureChatModel(MistralAiChatModel chatModel);
|
||||
|
||||
@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.ai.provider;
|
||||
public enum AiProvider {
|
||||
|
||||
OPENAI,
|
||||
AZURE_OPENAI,
|
||||
GOOGLE_AI_GEMINI,
|
||||
MISTRAL_AI
|
||||
|
||||
|
||||
@ -25,11 +25,12 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
)
|
||||
@JsonSubTypes({
|
||||
@JsonSubTypes.Type(value = OpenAiProviderConfig.class, name = "OPENAI"),
|
||||
@JsonSubTypes.Type(value = AzureOpenAiProviderConfig.class, name = "AZURE_OPENAI"),
|
||||
@JsonSubTypes.Type(value = GoogleAiGeminiProviderConfig.class, name = "GOOGLE_AI_GEMINI"),
|
||||
@JsonSubTypes.Type(value = MistralAiProviderConfig.class, name = "MISTRAL_AI")
|
||||
})
|
||||
public sealed interface AiProviderConfig
|
||||
permits OpenAiProviderConfig, GoogleAiGeminiProviderConfig, MistralAiProviderConfig {
|
||||
permits OpenAiProviderConfig, AzureOpenAiProviderConfig, GoogleAiGeminiProviderConfig, MistralAiProviderConfig {
|
||||
|
||||
AiProvider provider();
|
||||
|
||||
|
||||
@ -0,0 +1,30 @@
|
||||
/**
|
||||
* Copyright © 2016-2025 The Thingsboard 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
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package org.thingsboard.server.common.data.ai.provider;
|
||||
|
||||
public record AzureOpenAiProviderConfig(String apiKey) implements AiProviderConfig {
|
||||
|
||||
@Override
|
||||
public AiProvider provider() {
|
||||
return AiProvider.AZURE_OPENAI;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String apiKey() {
|
||||
return apiKey;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user