AI rule node: get rid of type resolver for AiModel
This commit is contained in:
		
							parent
							
								
									55c992d57b
								
							
						
					
					
						commit
						5e36a4e522
					
				@ -16,18 +16,62 @@
 | 
				
			|||||||
package org.thingsboard.server.common.data.ai.model;
 | 
					package org.thingsboard.server.common.data.ai.model;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
					import com.fasterxml.jackson.annotation.JsonProperty;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonSubTypes;
 | 
				
			||||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
 | 
					import com.fasterxml.jackson.annotation.JsonTypeInfo;
 | 
				
			||||||
import com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver;
 | 
					import org.thingsboard.server.common.data.ai.model.chat.AmazonBedrockChatModel;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.model.chat.AnthropicChatModel;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.model.chat.AzureOpenAiChatModel;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.model.chat.GitHubModelsChatModel;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.model.chat.GoogleAiGeminiChatModel;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.model.chat.GoogleVertexAiGeminiChatModel;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.model.chat.MistralAiChatModel;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.model.chat.OpenAiChatModel;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.AiProvider;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.provider.AiProviderConfig;
 | 
					import org.thingsboard.server.common.data.ai.provider.AiProviderConfig;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.AmazonBedrockProviderConfig;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.AnthropicProviderConfig;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.AzureOpenAiProviderConfig;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.GitHubModelsProviderConfig;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.GoogleAiGeminiProviderConfig;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.GoogleVertexAiGeminiProviderConfig;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.MistralAiProviderConfig;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.OpenAiProviderConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@JsonTypeInfo(
 | 
					@JsonTypeInfo(
 | 
				
			||||||
        use = JsonTypeInfo.Id.CUSTOM,
 | 
					        use = JsonTypeInfo.Id.NAME,
 | 
				
			||||||
        include = JsonTypeInfo.As.PROPERTY,
 | 
					        include = JsonTypeInfo.As.PROPERTY,
 | 
				
			||||||
        property = "@type"
 | 
					        property = "provider",
 | 
				
			||||||
 | 
					        visible = true
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@JsonTypeIdResolver(AiModelTypeIdResolver.class)
 | 
					@JsonSubTypes({
 | 
				
			||||||
 | 
					        @JsonSubTypes.Type(value = OpenAiChatModel.class, name = "OPENAI"),
 | 
				
			||||||
 | 
					        @JsonSubTypes.Type(value = AzureOpenAiChatModel.class, name = "AZURE_OPENAI"),
 | 
				
			||||||
 | 
					        @JsonSubTypes.Type(value = GoogleAiGeminiChatModel.class, name = "GOOGLE_AI_GEMINI"),
 | 
				
			||||||
 | 
					        @JsonSubTypes.Type(value = GoogleVertexAiGeminiChatModel.class, name = "GOOGLE_VERTEX_AI_GEMINI"),
 | 
				
			||||||
 | 
					        @JsonSubTypes.Type(value = MistralAiChatModel.class, name = "MISTRAL_AI"),
 | 
				
			||||||
 | 
					        @JsonSubTypes.Type(value = AnthropicChatModel.class, name = "ANTHROPIC"),
 | 
				
			||||||
 | 
					        @JsonSubTypes.Type(value = AmazonBedrockChatModel.class, name = "AMAZON_BEDROCK"),
 | 
				
			||||||
 | 
					        @JsonSubTypes.Type(value = GitHubModelsChatModel.class, name = "GITHUB_MODELS")
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
public interface AiModel<C extends AiModelConfig> {
 | 
					public interface AiModel<C extends AiModelConfig> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    AiProvider provider();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @JsonTypeInfo(
 | 
				
			||||||
 | 
					            use = JsonTypeInfo.Id.NAME,
 | 
				
			||||||
 | 
					            include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
 | 
				
			||||||
 | 
					            property = "provider"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    @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 = GoogleVertexAiGeminiProviderConfig.class, name = "GOOGLE_VERTEX_AI_GEMINI"),
 | 
				
			||||||
 | 
					            @JsonSubTypes.Type(value = MistralAiProviderConfig.class, name = "MISTRAL_AI"),
 | 
				
			||||||
 | 
					            @JsonSubTypes.Type(value = AnthropicProviderConfig.class, name = "ANTHROPIC"),
 | 
				
			||||||
 | 
					            @JsonSubTypes.Type(value = AmazonBedrockProviderConfig.class, name = "AMAZON_BEDROCK"),
 | 
				
			||||||
 | 
					            @JsonSubTypes.Type(value = GitHubModelsProviderConfig.class, name = "GITHUB_MODELS")
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
    AiProviderConfig providerConfig();
 | 
					    AiProviderConfig providerConfig();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @JsonProperty("modelType")
 | 
					    @JsonProperty("modelType")
 | 
				
			||||||
 | 
				
			|||||||
@ -1,151 +0,0 @@
 | 
				
			|||||||
/**
 | 
					 | 
				
			||||||
 * 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;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
 | 
					 | 
				
			||||||
import com.fasterxml.jackson.databind.DatabindContext;
 | 
					 | 
				
			||||||
import com.fasterxml.jackson.databind.JavaType;
 | 
					 | 
				
			||||||
import com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase;
 | 
					 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.chat.AmazonBedrockChatModel;
 | 
					 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.chat.AnthropicChatModel;
 | 
					 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.chat.GitHubModelsChatModel;
 | 
					 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.chat.GoogleAiGeminiChatModel;
 | 
					 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.chat.GoogleVertexAiGeminiChatModel;
 | 
					 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.chat.MistralAiChatModel;
 | 
					 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.chat.OpenAiChatModel;
 | 
					 | 
				
			||||||
import org.thingsboard.server.common.data.ai.provider.AiProvider;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public final class AiModelTypeIdResolver extends TypeIdResolverBase {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private static final Map<String, Class<?>> typeIdToModelClass = Map.ofEntries(
 | 
					 | 
				
			||||||
            // OpenAI models
 | 
					 | 
				
			||||||
            Map.entry("OPENAI::o4-mini", OpenAiChatModel.class),
 | 
					 | 
				
			||||||
            // Map.entry("OPENAI::o3-pro", OpenAiChatModel.class); // needs verification with Gov ID :)
 | 
					 | 
				
			||||||
            // Map.entry("OPENAI::o3", OpenAiChatModel.class);     // needs verification with Gov ID :)
 | 
					 | 
				
			||||||
            Map.entry("OPENAI::o3-mini", OpenAiChatModel.class),
 | 
					 | 
				
			||||||
            // Map.entry("OPENAI::o1-pro", OpenAiChatModel.class); // LC4j sends requests to v1/chat/completions, but o1-pro is only supported in v1/responses
 | 
					 | 
				
			||||||
            Map.entry("OPENAI::o1", OpenAiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("OPENAI::gpt-4.1", OpenAiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("OPENAI::gpt-4.1-mini", OpenAiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("OPENAI::gpt-4.1-nano", OpenAiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("OPENAI::gpt-4o", OpenAiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("OPENAI::gpt-4o-mini", OpenAiChatModel.class),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Google AI Gemini models
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_AI_GEMINI::gemini-2.5-pro", GoogleAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_AI_GEMINI::gemini-2.5-flash", GoogleAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_AI_GEMINI::gemini-2.0-flash", GoogleAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_AI_GEMINI::gemini-2.0-flash-lite", GoogleAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_AI_GEMINI::gemini-1.5-pro", GoogleAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_AI_GEMINI::gemini-1.5-flash", GoogleAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_AI_GEMINI::gemini-1.5-flash-8b", GoogleAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Google Vertex AI Gemini models
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_VERTEX_AI_GEMINI::gemini-2.5-pro", GoogleVertexAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_VERTEX_AI_GEMINI::gemini-2.5-flash", GoogleVertexAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_VERTEX_AI_GEMINI::gemini-2.0-flash", GoogleVertexAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_VERTEX_AI_GEMINI::gemini-2.0-flash-lite", GoogleVertexAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_VERTEX_AI_GEMINI::gemini-1.5-pro", GoogleVertexAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_VERTEX_AI_GEMINI::gemini-1.5-flash", GoogleVertexAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("GOOGLE_VERTEX_AI_GEMINI::gemini-1.5-flash-8b", GoogleVertexAiGeminiChatModel.class),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Mistral AI models
 | 
					 | 
				
			||||||
            Map.entry("MISTRAL_AI::magistral-medium-latest", MistralAiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("MISTRAL_AI::magistral-small-latest", MistralAiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("MISTRAL_AI::mistral-large-latest", MistralAiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("MISTRAL_AI::mistral-medium-latest", MistralAiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("MISTRAL_AI::mistral-small-latest", MistralAiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("MISTRAL_AI::pixtral-large-latest", MistralAiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("MISTRAL_AI::ministral-8b-latest", MistralAiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("MISTRAL_AI::ministral-3b-latest", MistralAiChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("MISTRAL_AI::open-mistral-nemo", MistralAiChatModel.class),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Anthropic models
 | 
					 | 
				
			||||||
            Map.entry("ANTHROPIC::claude-opus-4-0", AnthropicChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("ANTHROPIC::claude-sonnet-4-0", AnthropicChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("ANTHROPIC::claude-3-7-sonnet-latest", AnthropicChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("ANTHROPIC::claude-3-5-sonnet-latest", AnthropicChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("ANTHROPIC::claude-3-5-haiku-latest", AnthropicChatModel.class),
 | 
					 | 
				
			||||||
            Map.entry("ANTHROPIC::claude-3-opus-latest", AnthropicChatModel.class),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Amazon Bedrock models
 | 
					 | 
				
			||||||
            Map.entry("AMAZON_BEDROCK::amazon.nova-lite-v1:0", AmazonBedrockChatModel.class),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // GitHub Models models
 | 
					 | 
				
			||||||
            Map.entry("GITHUB_MODELS::gpt-4o", GitHubModelsChatModel.class)
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private static final String PROVIDER_MODEL_SEPARATOR = "::";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private JavaType baseType;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public void init(JavaType baseType) {
 | 
					 | 
				
			||||||
        this.baseType = baseType;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public String idFromValue(Object value) {
 | 
					 | 
				
			||||||
        return generateId((AiModel<?>) value);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public String idFromValueAndType(Object value, Class<?> suggestedType) {
 | 
					 | 
				
			||||||
        return generateId((AiModel<?>) value);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public JavaType typeFromId(DatabindContext context, String id) {
 | 
					 | 
				
			||||||
        Class<?> modelClass = typeIdToModelClass.get(id);
 | 
					 | 
				
			||||||
        if (modelClass != null) { // known model
 | 
					 | 
				
			||||||
            return context.constructSpecializedType(baseType, modelClass);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        String[] parts = id.split(PROVIDER_MODEL_SEPARATOR, 2);
 | 
					 | 
				
			||||||
        if (parts.length != 2) {
 | 
					 | 
				
			||||||
            throw new IllegalArgumentException("Invalid model type ID format: " + id + ". Expected format: PROVIDER::MODEL_ID");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        String providerName = parts[0];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Check if the provider exists
 | 
					 | 
				
			||||||
        AiProvider provider;
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            provider = AiProvider.valueOf(providerName);
 | 
					 | 
				
			||||||
        } catch (IllegalArgumentException e) {
 | 
					 | 
				
			||||||
            throw new IllegalArgumentException("Unknown AI provider: " + providerName);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Provider is valid but model is unknown - fallback to default model class
 | 
					 | 
				
			||||||
        modelClass = provider.getDefaultModelClass();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return context.constructSpecializedType(baseType, modelClass);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public JsonTypeInfo.Id getMechanism() {
 | 
					 | 
				
			||||||
        return JsonTypeInfo.Id.CUSTOM;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private static String generateId(AiModel<?> model) {
 | 
					 | 
				
			||||||
        String provider = model.providerConfig().provider().name();
 | 
					 | 
				
			||||||
        String modelId = model.modelConfig().modelId();
 | 
					 | 
				
			||||||
        return provider + PROVIDER_MODEL_SEPARATOR + modelId;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.ai.model.chat;
 | 
				
			|||||||
import dev.langchain4j.model.chat.ChatModel;
 | 
					import dev.langchain4j.model.chat.ChatModel;
 | 
				
			||||||
import lombok.With;
 | 
					import lombok.With;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
					import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.AiProvider;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.provider.AmazonBedrockProviderConfig;
 | 
					import org.thingsboard.server.common.data.ai.provider.AmazonBedrockProviderConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
@ -28,6 +29,11 @@ public record AmazonBedrockChatModel(
 | 
				
			|||||||
        @With Config modelConfig
 | 
					        @With Config modelConfig
 | 
				
			||||||
) implements AiChatModel<AmazonBedrockChatModel.Config> {
 | 
					) implements AiChatModel<AmazonBedrockChatModel.Config> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public AiProvider provider() {
 | 
				
			||||||
 | 
					        return AiProvider.AMAZON_BEDROCK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @With
 | 
					    @With
 | 
				
			||||||
    public record Config(
 | 
					    public record Config(
 | 
				
			||||||
            String modelId,
 | 
					            String modelId,
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.ai.model.chat;
 | 
				
			|||||||
import dev.langchain4j.model.chat.ChatModel;
 | 
					import dev.langchain4j.model.chat.ChatModel;
 | 
				
			||||||
import lombok.With;
 | 
					import lombok.With;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
					import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.AiProvider;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.provider.AnthropicProviderConfig;
 | 
					import org.thingsboard.server.common.data.ai.provider.AnthropicProviderConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
@ -28,6 +29,11 @@ public record AnthropicChatModel(
 | 
				
			|||||||
        @With Config modelConfig
 | 
					        @With Config modelConfig
 | 
				
			||||||
) implements AiChatModel<AnthropicChatModel.Config> {
 | 
					) implements AiChatModel<AnthropicChatModel.Config> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public AiProvider provider() {
 | 
				
			||||||
 | 
					        return AiProvider.ANTHROPIC;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @With
 | 
					    @With
 | 
				
			||||||
    public record Config(
 | 
					    public record Config(
 | 
				
			||||||
            String modelId,
 | 
					            String modelId,
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.ai.model.chat;
 | 
				
			|||||||
import dev.langchain4j.model.chat.ChatModel;
 | 
					import dev.langchain4j.model.chat.ChatModel;
 | 
				
			||||||
import lombok.With;
 | 
					import lombok.With;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
					import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.AiProvider;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.provider.AzureOpenAiProviderConfig;
 | 
					import org.thingsboard.server.common.data.ai.provider.AzureOpenAiProviderConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
@ -28,6 +29,11 @@ public record AzureOpenAiChatModel(
 | 
				
			|||||||
        @With Config modelConfig
 | 
					        @With Config modelConfig
 | 
				
			||||||
) implements AiChatModel<AzureOpenAiChatModel.Config> {
 | 
					) implements AiChatModel<AzureOpenAiChatModel.Config> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public AiProvider provider() {
 | 
				
			||||||
 | 
					        return AiProvider.AZURE_OPENAI;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @With
 | 
					    @With
 | 
				
			||||||
    public record Config(
 | 
					    public record Config(
 | 
				
			||||||
            String modelId,
 | 
					            String modelId,
 | 
				
			||||||
 | 
				
			|||||||
@ -18,16 +18,22 @@ package org.thingsboard.server.common.data.ai.model.chat;
 | 
				
			|||||||
import dev.langchain4j.model.chat.ChatModel;
 | 
					import dev.langchain4j.model.chat.ChatModel;
 | 
				
			||||||
import lombok.With;
 | 
					import lombok.With;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
					import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.provider.GithubModelsProviderConfig;
 | 
					import org.thingsboard.server.common.data.ai.provider.AiProvider;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.GitHubModelsProviderConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public record GitHubModelsChatModel(
 | 
					public record GitHubModelsChatModel(
 | 
				
			||||||
        AiModelType modelType,
 | 
					        AiModelType modelType,
 | 
				
			||||||
        GithubModelsProviderConfig providerConfig,
 | 
					        GitHubModelsProviderConfig providerConfig,
 | 
				
			||||||
        @With Config modelConfig
 | 
					        @With Config modelConfig
 | 
				
			||||||
) implements AiChatModel<GitHubModelsChatModel.Config> {
 | 
					) implements AiChatModel<GitHubModelsChatModel.Config> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public AiProvider provider() {
 | 
				
			||||||
 | 
					        return AiProvider.GITHUB_MODELS;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @With
 | 
					    @With
 | 
				
			||||||
    public record Config(
 | 
					    public record Config(
 | 
				
			||||||
            String modelId,
 | 
					            String modelId,
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.ai.model.chat;
 | 
				
			|||||||
import dev.langchain4j.model.chat.ChatModel;
 | 
					import dev.langchain4j.model.chat.ChatModel;
 | 
				
			||||||
import lombok.With;
 | 
					import lombok.With;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
					import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.AiProvider;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.provider.GoogleAiGeminiProviderConfig;
 | 
					import org.thingsboard.server.common.data.ai.provider.GoogleAiGeminiProviderConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
@ -28,6 +29,11 @@ public record GoogleAiGeminiChatModel(
 | 
				
			|||||||
        @With Config modelConfig
 | 
					        @With Config modelConfig
 | 
				
			||||||
) implements AiChatModel<GoogleAiGeminiChatModel.Config> {
 | 
					) implements AiChatModel<GoogleAiGeminiChatModel.Config> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public AiProvider provider() {
 | 
				
			||||||
 | 
					        return AiProvider.GOOGLE_AI_GEMINI;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @With
 | 
					    @With
 | 
				
			||||||
    public record Config(
 | 
					    public record Config(
 | 
				
			||||||
            String modelId,
 | 
					            String modelId,
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.ai.model.chat;
 | 
				
			|||||||
import dev.langchain4j.model.chat.ChatModel;
 | 
					import dev.langchain4j.model.chat.ChatModel;
 | 
				
			||||||
import lombok.With;
 | 
					import lombok.With;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
					import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.AiProvider;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.provider.GoogleVertexAiGeminiProviderConfig;
 | 
					import org.thingsboard.server.common.data.ai.provider.GoogleVertexAiGeminiProviderConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
@ -28,6 +29,11 @@ public record GoogleVertexAiGeminiChatModel(
 | 
				
			|||||||
        @With Config modelConfig
 | 
					        @With Config modelConfig
 | 
				
			||||||
) implements AiChatModel<GoogleVertexAiGeminiChatModel.Config> {
 | 
					) implements AiChatModel<GoogleVertexAiGeminiChatModel.Config> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public AiProvider provider() {
 | 
				
			||||||
 | 
					        return AiProvider.GOOGLE_VERTEX_AI_GEMINI;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @With
 | 
					    @With
 | 
				
			||||||
    public record Config(
 | 
					    public record Config(
 | 
				
			||||||
            String modelId,
 | 
					            String modelId,
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.ai.model.chat;
 | 
				
			|||||||
import dev.langchain4j.model.chat.ChatModel;
 | 
					import dev.langchain4j.model.chat.ChatModel;
 | 
				
			||||||
import lombok.With;
 | 
					import lombok.With;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
					import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.AiProvider;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.provider.MistralAiProviderConfig;
 | 
					import org.thingsboard.server.common.data.ai.provider.MistralAiProviderConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
@ -28,6 +29,11 @@ public record MistralAiChatModel(
 | 
				
			|||||||
        @With Config modelConfig
 | 
					        @With Config modelConfig
 | 
				
			||||||
) implements AiChatModel<MistralAiChatModel.Config> {
 | 
					) implements AiChatModel<MistralAiChatModel.Config> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public AiProvider provider() {
 | 
				
			||||||
 | 
					        return AiProvider.MISTRAL_AI;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @With
 | 
					    @With
 | 
				
			||||||
    public record Config(
 | 
					    public record Config(
 | 
				
			||||||
            String modelId,
 | 
					            String modelId,
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.ai.model.chat;
 | 
				
			|||||||
import dev.langchain4j.model.chat.ChatModel;
 | 
					import dev.langchain4j.model.chat.ChatModel;
 | 
				
			||||||
import lombok.With;
 | 
					import lombok.With;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
					import org.thingsboard.server.common.data.ai.model.AiModelType;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.ai.provider.AiProvider;
 | 
				
			||||||
import org.thingsboard.server.common.data.ai.provider.OpenAiProviderConfig;
 | 
					import org.thingsboard.server.common.data.ai.provider.OpenAiProviderConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
@ -28,6 +29,11 @@ public record OpenAiChatModel(
 | 
				
			|||||||
        @With Config modelConfig
 | 
					        @With Config modelConfig
 | 
				
			||||||
) implements AiChatModel<OpenAiChatModel.Config> {
 | 
					) implements AiChatModel<OpenAiChatModel.Config> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public AiProvider provider() {
 | 
				
			||||||
 | 
					        return AiProvider.OPENAI;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @With
 | 
					    @With
 | 
				
			||||||
    public record Config(
 | 
					    public record Config(
 | 
				
			||||||
            String modelId,
 | 
					            String modelId,
 | 
				
			||||||
 | 
				
			|||||||
@ -15,30 +15,8 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
package org.thingsboard.server.common.data.ai.provider;
 | 
					package org.thingsboard.server.common.data.ai.provider;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
 | 
					 | 
				
			||||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@JsonTypeInfo(
 | 
					 | 
				
			||||||
        use = JsonTypeInfo.Id.NAME,
 | 
					 | 
				
			||||||
        include = JsonTypeInfo.As.PROPERTY,
 | 
					 | 
				
			||||||
        property = "provider"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
@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 = GoogleVertexAiGeminiProviderConfig.class, name = "GOOGLE_VERTEX_AI_GEMINI"),
 | 
					 | 
				
			||||||
        @JsonSubTypes.Type(value = MistralAiProviderConfig.class, name = "MISTRAL_AI"),
 | 
					 | 
				
			||||||
        @JsonSubTypes.Type(value = AnthropicProviderConfig.class, name = "ANTHROPIC"),
 | 
					 | 
				
			||||||
        @JsonSubTypes.Type(value = AmazonBedrockProviderConfig.class, name = "AMAZON_BEDROCK"),
 | 
					 | 
				
			||||||
        @JsonSubTypes.Type(value = GithubModelsProviderConfig.class, name = "GITHUB_MODELS")
 | 
					 | 
				
			||||||
})
 | 
					 | 
				
			||||||
public sealed interface AiProviderConfig
 | 
					public sealed interface AiProviderConfig
 | 
				
			||||||
        permits
 | 
					        permits
 | 
				
			||||||
        OpenAiProviderConfig, AzureOpenAiProviderConfig, GoogleAiGeminiProviderConfig,
 | 
					        OpenAiProviderConfig, AzureOpenAiProviderConfig, GoogleAiGeminiProviderConfig,
 | 
				
			||||||
        GoogleVertexAiGeminiProviderConfig, MistralAiProviderConfig, AnthropicProviderConfig,
 | 
					        GoogleVertexAiGeminiProviderConfig, MistralAiProviderConfig, AnthropicProviderConfig,
 | 
				
			||||||
        AmazonBedrockProviderConfig, GithubModelsProviderConfig {
 | 
					        AmazonBedrockProviderConfig, GitHubModelsProviderConfig {}
 | 
				
			||||||
 | 
					 | 
				
			||||||
    AiProvider provider();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -15,11 +15,4 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
package org.thingsboard.server.common.data.ai.provider;
 | 
					package org.thingsboard.server.common.data.ai.provider;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public record AmazonBedrockProviderConfig(String region, String accessKeyId, String secretAccessKey) implements AiProviderConfig {
 | 
					public record AmazonBedrockProviderConfig(String region, String accessKeyId, String secretAccessKey) implements AiProviderConfig {}
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public AiProvider provider() {
 | 
					 | 
				
			||||||
        return AiProvider.AMAZON_BEDROCK;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -15,11 +15,4 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
package org.thingsboard.server.common.data.ai.provider;
 | 
					package org.thingsboard.server.common.data.ai.provider;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public record AnthropicProviderConfig(String apiKey) implements AiProviderConfig {
 | 
					public record AnthropicProviderConfig(String apiKey) implements AiProviderConfig {}
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public AiProvider provider() {
 | 
					 | 
				
			||||||
        return AiProvider.ANTHROPIC;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -15,11 +15,4 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
package org.thingsboard.server.common.data.ai.provider;
 | 
					package org.thingsboard.server.common.data.ai.provider;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public record AzureOpenAiProviderConfig(String apiKey) implements AiProviderConfig {
 | 
					public record AzureOpenAiProviderConfig(String apiKey) implements AiProviderConfig {}
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public AiProvider provider() {
 | 
					 | 
				
			||||||
        return AiProvider.AZURE_OPENAI;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -15,11 +15,4 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
package org.thingsboard.server.common.data.ai.provider;
 | 
					package org.thingsboard.server.common.data.ai.provider;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public record GithubModelsProviderConfig(String personalAccessToken) implements AiProviderConfig {
 | 
					public record GitHubModelsProviderConfig(String personalAccessToken) implements AiProviderConfig {}
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public AiProvider provider() {
 | 
					 | 
				
			||||||
        return AiProvider.GITHUB_MODELS;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -15,11 +15,4 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
package org.thingsboard.server.common.data.ai.provider;
 | 
					package org.thingsboard.server.common.data.ai.provider;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public record GoogleAiGeminiProviderConfig(String apiKey) implements AiProviderConfig {
 | 
					public record GoogleAiGeminiProviderConfig(String apiKey) implements AiProviderConfig {}
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public AiProvider provider() {
 | 
					 | 
				
			||||||
        return AiProvider.GOOGLE_AI_GEMINI;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -20,11 +20,4 @@ public record GoogleVertexAiGeminiProviderConfig(
 | 
				
			|||||||
        String projectId,
 | 
					        String projectId,
 | 
				
			||||||
        String location,
 | 
					        String location,
 | 
				
			||||||
        String serviceAccountKey
 | 
					        String serviceAccountKey
 | 
				
			||||||
) implements AiProviderConfig {
 | 
					) implements AiProviderConfig {}
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public AiProvider provider() {
 | 
					 | 
				
			||||||
        return AiProvider.GOOGLE_VERTEX_AI_GEMINI;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -15,11 +15,4 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
package org.thingsboard.server.common.data.ai.provider;
 | 
					package org.thingsboard.server.common.data.ai.provider;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public record MistralAiProviderConfig(String apiKey) implements AiProviderConfig {
 | 
					public record MistralAiProviderConfig(String apiKey) implements AiProviderConfig {}
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public AiProvider provider() {
 | 
					 | 
				
			||||||
        return AiProvider.MISTRAL_AI;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -15,11 +15,4 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
package org.thingsboard.server.common.data.ai.provider;
 | 
					package org.thingsboard.server.common.data.ai.provider;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public record OpenAiProviderConfig(String apiKey) implements AiProviderConfig {
 | 
					public record OpenAiProviderConfig(String apiKey) implements AiProviderConfig {}
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public AiProvider provider() {
 | 
					 | 
				
			||||||
        return AiProvider.OPENAI;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user