AI rule node: get rid of type resolver for AiModel

This commit is contained in:
Dmytro Skarzhynets 2025-07-02 20:28:43 +03:00
parent 55c992d57b
commit 5e36a4e522
No known key found for this signature in database
GPG Key ID: 2B51652F224037DF
19 changed files with 107 additions and 244 deletions

View File

@ -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")

View File

@ -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;
}
}

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}