diff --git a/application/pom.xml b/application/pom.xml
index d775942f8a..33bc0972d4 100644
--- a/application/pom.xml
+++ b/application/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.thingsboard
- 4.1.0-RC
+ 4.2.0-RC
thingsboard
application
@@ -186,8 +186,8 @@
jjwt
- org.freemarker
- freemarker
+ org.springframework.boot
+ spring-boot-starter-freemarker
commons-io
@@ -381,6 +381,44 @@
org.rocksdb
rocksdbjni
+
+ dev.langchain4j
+ langchain4j-open-ai
+
+
+ dev.langchain4j
+ langchain4j-azure-open-ai
+
+
+ dev.langchain4j
+ langchain4j-google-ai-gemini
+
+
+ dev.langchain4j
+ langchain4j-vertex-ai-gemini
+
+
+ dev.langchain4j
+ langchain4j-mistral-ai
+
+
+ dev.langchain4j
+ langchain4j-anthropic
+
+
+ dev.langchain4j
+ langchain4j-bedrock
+
+
+ dev.langchain4j
+ langchain4j-github-models
+
+
+ com.azure
+ azure-core-test
+
+
+
diff --git a/application/src/main/data/json/edge/instructions/upgrade/docker/upgrade_preparing.md b/application/src/main/data/json/edge/instructions/upgrade/docker/upgrade_preparing.md
index a0536f113a..f12eaa5fc0 100644
--- a/application/src/main/data/json/edge/instructions/upgrade/docker/upgrade_preparing.md
+++ b/application/src/main/data/json/edge/instructions/upgrade/docker/upgrade_preparing.md
@@ -32,19 +32,7 @@ docker run --rm -v tb-edge-postgres-data:/volume -v ~/.mytb-edge-data/db:/backup
After completing the data migration to the newly created Docker volumes, you'll need to update the volume mounts in your Docker Compose configuration.
Modify the `docker-compose.yml` file for ThingsBoard Edge to update the volume settings.
-First, please update docker compose file version. Find next snippet:
-```text
-version: '3.0'
-...
-```
-
-And replace it with:
-```text
-version: '3.8'
-...
-```
-
-Then update volume mounts. Locate the following snippet:
+Update volume mounts. Locate the following snippet:
```text
volumes:
- ~/.mytb-edge-data:/data
diff --git a/application/src/main/data/upgrade/basic/schema_update.sql b/application/src/main/data/upgrade/basic/schema_update.sql
index e4bbe4c69e..add832ea6e 100644
--- a/application/src/main/data/upgrade/basic/schema_update.sql
+++ b/application/src/main/data/upgrade/basic/schema_update.sql
@@ -14,48 +14,33 @@
-- limitations under the License.
--
--- UPDATE TENANT PROFILE CASSANDRA RATE LIMITS START
-
-UPDATE tenant_profile
-SET profile_data = jsonb_set(
- profile_data,
- '{configuration}',
- (
- (profile_data -> 'configuration') - 'cassandraQueryTenantRateLimitsConfiguration'
- ||
- COALESCE(
- CASE
- WHEN profile_data -> 'configuration' ->
- 'cassandraQueryTenantRateLimitsConfiguration' IS NOT NULL THEN
- jsonb_build_object(
- 'cassandraReadQueryTenantCoreRateLimits',
- profile_data -> 'configuration' -> 'cassandraQueryTenantRateLimitsConfiguration',
- 'cassandraWriteQueryTenantCoreRateLimits',
- profile_data -> 'configuration' -> 'cassandraQueryTenantRateLimitsConfiguration',
- 'cassandraReadQueryTenantRuleEngineRateLimits',
- profile_data -> 'configuration' -> 'cassandraQueryTenantRateLimitsConfiguration',
- 'cassandraWriteQueryTenantRuleEngineRateLimits',
- profile_data -> 'configuration' -> 'cassandraQueryTenantRateLimitsConfiguration'
- )
- END,
- '{}'::jsonb
- )
- )
- )
-WHERE profile_data -> 'configuration' ? 'cassandraQueryTenantRateLimitsConfiguration';
-
--- UPDATE TENANT PROFILE CASSANDRA RATE LIMITS END
-
--- UPDATE NOTIFICATION RULE CASSANDRA RATE LIMITS START
-
-UPDATE notification_rule
-SET trigger_config = REGEXP_REPLACE(
- trigger_config,
- '"CASSANDRA_QUERIES"',
- '"CASSANDRA_WRITE_QUERIES_CORE","CASSANDRA_READ_QUERIES_CORE","CASSANDRA_WRITE_QUERIES_RULE_ENGINE","CASSANDRA_READ_QUERIES_RULE_ENGINE","CASSANDRA_WRITE_QUERIES_MONOLITH","CASSANDRA_READ_QUERIES_MONOLITH"',
- 'g'
- )
-WHERE trigger_type = 'RATE_LIMITS'
- AND trigger_config LIKE '%"CASSANDRA_QUERIES"%';
-
--- UPDATE NOTIFICATION RULE CASSANDRA RATE LIMITS END
+-- UPDATE OTA PACKAGE EXTERNAL ID START
+
+ALTER TABLE ota_package
+ ADD COLUMN IF NOT EXISTS external_id uuid;
+
+DO
+$$
+ BEGIN
+ IF NOT EXISTS(SELECT 1 FROM pg_constraint WHERE conname = 'ota_package_external_id_unq_key') THEN
+ ALTER TABLE ota_package ADD CONSTRAINT ota_package_external_id_unq_key UNIQUE (tenant_id, external_id);
+ END IF;
+ END;
+$$;
+
+-- UPDATE OTA PACKAGE EXTERNAL ID END
+
+-- DROP INDEXES THAT DUPLICATE UNIQUE CONSTRAINT START
+
+DROP INDEX IF EXISTS idx_device_external_id;
+DROP INDEX IF EXISTS idx_device_profile_external_id;
+DROP INDEX IF EXISTS idx_asset_external_id;
+DROP INDEX IF EXISTS idx_entity_view_external_id;
+DROP INDEX IF EXISTS idx_rule_chain_external_id;
+DROP INDEX IF EXISTS idx_dashboard_external_id;
+DROP INDEX IF EXISTS idx_customer_external_id;
+DROP INDEX IF EXISTS idx_widgets_bundle_external_id;
+
+-- DROP INDEXES THAT DUPLICATE UNIQUE CONSTRAINT END
+
+ALTER TABLE mobile_app ADD COLUMN IF NOT EXISTS title varchar(255);
\ No newline at end of file
diff --git a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java
index 0125c7c07d..ea46ce86eb 100644
--- a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java
+++ b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java
@@ -35,6 +35,7 @@ import org.thingsboard.rule.engine.api.JobManager;
import org.thingsboard.rule.engine.api.MailService;
import org.thingsboard.rule.engine.api.MqttClientSettings;
import org.thingsboard.rule.engine.api.NotificationCenter;
+import org.thingsboard.rule.engine.api.RuleEngineAiChatModelService;
import org.thingsboard.rule.engine.api.SmsService;
import org.thingsboard.rule.engine.api.notification.SlackService;
import org.thingsboard.rule.engine.api.sms.SmsSenderFactory;
@@ -62,6 +63,7 @@ import org.thingsboard.server.common.msg.queue.ServiceType;
import org.thingsboard.server.common.msg.queue.TopicPartitionInfo;
import org.thingsboard.server.common.msg.tools.TbRateLimits;
import org.thingsboard.server.common.stats.TbApiUsageReportClient;
+import org.thingsboard.server.dao.ai.AiModelService;
import org.thingsboard.server.dao.alarm.AlarmCommentService;
import org.thingsboard.server.dao.asset.AssetProfileService;
import org.thingsboard.server.dao.asset.AssetService;
@@ -311,6 +313,14 @@ public class ActorSystemContext {
@Getter
private AuditLogService auditLogService;
+ @Autowired
+ @Getter
+ private RuleEngineAiChatModelService aiChatModelService;
+
+ @Autowired
+ @Getter
+ private AiModelService aiModelService;
+
@Autowired
@Getter
private EntityViewService entityViewService;
diff --git a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java
index ebc4e60709..35539834c3 100644
--- a/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java
@@ -68,7 +68,7 @@ import java.util.stream.Collectors;
*/
@Slf4j
public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareMsgProcessor {
- // (1 for result persistence + 1 for the state persistence )
+ // (1 for result persistence + 1 for the state persistence)
public static final int CALLBACKS_PER_CF = 2;
final TenantId tenantId;
diff --git a/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java b/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java
index dff0cd4cf1..6374e4016d 100644
--- a/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java
+++ b/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java
@@ -28,6 +28,7 @@ import org.thingsboard.rule.engine.api.JobManager;
import org.thingsboard.rule.engine.api.MailService;
import org.thingsboard.rule.engine.api.MqttClientSettings;
import org.thingsboard.rule.engine.api.NotificationCenter;
+import org.thingsboard.rule.engine.api.RuleEngineAiChatModelService;
import org.thingsboard.rule.engine.api.RuleEngineAlarmService;
import org.thingsboard.rule.engine.api.RuleEngineApiUsageStateService;
import org.thingsboard.rule.engine.api.RuleEngineAssetProfileCache;
@@ -76,6 +77,7 @@ import org.thingsboard.server.common.msg.TbMsgMetaData;
import org.thingsboard.server.common.msg.TbMsgProcessingStackItem;
import org.thingsboard.server.common.msg.queue.ServiceType;
import org.thingsboard.server.common.msg.queue.TopicPartitionInfo;
+import org.thingsboard.server.dao.ai.AiModelService;
import org.thingsboard.server.dao.alarm.AlarmCommentService;
import org.thingsboard.server.dao.asset.AssetProfileService;
import org.thingsboard.server.dao.asset.AssetService;
@@ -1024,6 +1026,16 @@ public class DefaultTbContext implements TbContext {
return mainCtx.getAuditLogService();
}
+ @Override
+ public RuleEngineAiChatModelService getAiChatModelService() {
+ return mainCtx.getAiChatModelService();
+ }
+
+ @Override
+ public AiModelService getAiModelService() {
+ return mainCtx.getAiModelService();
+ }
+
@Override
public MqttClientSettings getMqttClientSettings() {
return mainCtx.getMqttClientSettings();
diff --git a/application/src/main/java/org/thingsboard/server/config/ThingsboardSecurityConfiguration.java b/application/src/main/java/org/thingsboard/server/config/ThingsboardSecurityConfiguration.java
index 93cf9da8e0..2fbc89a84d 100644
--- a/application/src/main/java/org/thingsboard/server/config/ThingsboardSecurityConfiguration.java
+++ b/application/src/main/java/org/thingsboard/server/config/ThingsboardSecurityConfiguration.java
@@ -26,9 +26,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.DefaultAuthenticationEventPublisher;
-import org.springframework.security.config.annotation.ObjectPostProcessor;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
@@ -183,15 +181,12 @@ public class ThingsboardSecurityConfiguration {
}
@Bean
- public AuthenticationManager authenticationManager(ObjectPostProcessor