You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by se...@apache.org on 2022/08/11 20:50:01 UTC

[incubator-nlpcraft] branch NLPCRAFT-510-2 created (now 4af18dc0)

This is an automated email from the ASF dual-hosted git repository.

sergeykamov pushed a change to branch NLPCRAFT-510-2
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git


      at 4af18dc0 Validation fixes.

This branch includes the following new commits:

     new 4af18dc0 Validation fixes.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-nlpcraft] 01/01: Validation fixes.

Posted by se...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sergeykamov pushed a commit to branch NLPCRAFT-510-2
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 4af18dc0e296512fd97e6bac27e6f6bd6a8e7f0b
Author: Sergey Kamov <sk...@gmail.com>
AuthorDate: Thu Aug 11 23:49:53 2022 +0300

    Validation fixes.
---
 .../examples/lightswitch/LightSwitchFrModel.scala  | 27 +-------
 .../lightswitch/NCModelValidationSpec.scala        | 27 +++++++-
 .../examples/lightswitch/LightSwitchRuModel.scala  | 15 -----
 .../lightswitch/NCModelValidationSpec.scala        | 18 +++++-
 .../lightswitch/LightSwitchScalaModel.scala        | 24 -------
 .../lightswitch/NCModelValidationSpec.scala        | 27 +++++++-
 .../pizzeria/cli/PizzeriaModelServer.scala         |  2 +-
 .../apache/nlpcraft/examples/time/TimeModel.scala  |  7 --
 .../examples/time/NCModelValidationSpec.scala      | 11 +++-
 .../{NCCallbackData.scala => NCFiredIntent.scala}  |  8 ++-
 .../scala/org/apache/nlpcraft/NCIntentSkip.scala   |  2 -
 .../scala/org/apache/nlpcraft/NCModelClient.scala  | 62 ++----------------
 .../org/apache/nlpcraft/annotations/NCIntent.java  |  2 -
 .../apache/nlpcraft/annotations/NCIntentRef.java   |  2 -
 .../nlpcraft/annotations/NCIntentSample.java       | 73 ---------------------
 .../nlpcraft/annotations/NCIntentSampleRef.java    | 75 ----------------------
 .../apache/nlpcraft/annotations/NCIntentTerm.java  |  2 -
 .../nlpcraft/internal/impl/NCModelScanner.scala    | 68 +-------------------
 .../intent/matcher/NCIntentSolverManager.scala     |  4 +-
 .../internal/impl/NCModelCallbacksSpec.scala       |  2 +-
 .../nlpcraft/internal/impl/NCModelClientSpec.scala |  4 --
 .../internal/impl/NCModelClientSpec3.scala         |  8 +--
 .../scan/NCModelIntentsInvalidIntentsSpec.scala    | 40 +-----------
 .../internal/impl/scan/NCTestModelScala.scala      |  6 --
 24 files changed, 105 insertions(+), 411 deletions(-)

diff --git a/nlpcraft-examples/lightswitch-fr/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchFrModel.scala b/nlpcraft-examples/lightswitch-fr/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchFrModel.scala
index ac7bca22..c813c4fc 100644
--- a/nlpcraft-examples/lightswitch-fr/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchFrModel.scala
+++ b/nlpcraft-examples/lightswitch-fr/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchFrModel.scala
@@ -19,13 +19,14 @@ package org.apache.nlpcraft.examples.lightswitch
 
 import com.google.gson.Gson
 import org.apache.nlpcraft.*
+import org.apache.nlpcraft.annotations.*
 import org.apache.nlpcraft.examples.lightswitch.nlp.entity.parser.NCFrSemanticEntityParser
 import org.apache.nlpcraft.examples.lightswitch.nlp.token.enricher.*
 import org.apache.nlpcraft.examples.lightswitch.nlp.token.parser.NCFrTokenParser
 import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.nlp.token.enricher.*
 import org.apache.nlpcraft.nlp.token.parser.NCOpenNLPTokenParser
-import org.apache.nlpcraft.annotations.*
+
 import java.util
 import scala.jdk.CollectionConverters.*
 
@@ -58,30 +59,6 @@ class LightSwitchFrModel extends NCModelAdapter(
       * @return Query result to be sent to the REST caller.
       */
     @NCIntent("intent=ls term(act)={has(ent_groups, 'act')} term(loc)={# == 'ls:loc'}*")
-    @NCIntentSample(Array(
-        "Éteignez les lumières dans toute la maison.",
-        "Éteignez toutes les lumières maintenant.",
-        "Allumez l'éclairage dans le placard de la chambre des maîtres.",
-        "Éteindre les lumières au 1er étage.",
-        "Allumez les lumières.",
-        "Allumes dans la cuisine.",
-        "S'il vous plait, éteignez la lumière dans la chambre à l'étage.",
-        "Allumez les lumières dans toute la maison.",
-        "Éteignez les lumières dans la chambre d'hôtes.",
-        "Pourriez-vous éteindre toutes les lumières s'il vous plait?",
-        "Désactivez l'éclairage au 2ème étage.",
-        "Éteignez les lumières dans la chambre au 1er étage.",
-        "Lumières allumées à la cuisine du deuxième étage.",
-        "S'il te plaît, pas de lumières!",
-        "Coupez toutes les lumières maintenant!",
-        "Éteindre les lumières dans le garage.",
-        "Lumières éteintes dans la cuisine!",
-        "Augmentez l'éclairage dans le garage et la chambre des maîtres.",
-        "Baissez toute la lumière maintenant!",
-        "Pas de lumières dans la chambre, s'il vous plait.",
-        "Allumez le garage, s'il vous plait.",
-        "Tuez l'illumination maintenant."
-    ))
     def onMatch(
         ctx: NCContext,
         im: NCIntentMatch,
diff --git a/nlpcraft-examples/lightswitch-fr/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala b/nlpcraft-examples/lightswitch-fr/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
index 2871ec51..11fe249e 100644
--- a/nlpcraft-examples/lightswitch-fr/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
+++ b/nlpcraft-examples/lightswitch-fr/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
@@ -27,4 +27,29 @@ import scala.util.Using
   */
 class NCModelValidationSpec:
     @Test
-    def test(): Unit = Using.resource(new NCModelClient(new LightSwitchFrModel)) { _.validateSamples() }
+    def test(): Unit = Using.resource(new NCModelClient(new LightSwitchFrModel)) { client =>
+        def check(txt: String): Unit = client.debugAsk(txt, "userId", true).getIntentId == "ls"
+        
+        check("Éteignez les lumières dans toute la maison.")
+        check("Éteignez toutes les lumières maintenant.")
+        check("Allumez l'éclairage dans le placard de la chambre des maîtres.")
+        check("Éteindre les lumières au 1er étage.")
+        check("Allumez les lumières.")
+        check("Allumes dans la cuisine.")
+        check("S'il vous plait, éteignez la lumière dans la chambre à l'étage.")
+        check("Allumez les lumières dans toute la maison.")
+        check("Éteignez les lumières dans la chambre d'hôtes.")
+        check("Pourriez-vous éteindre toutes les lumières s'il vous plait?")
+        check("Désactivez l'éclairage au 2ème étage.")
+        check("Éteignez les lumières dans la chambre au 1er étage.")
+        check("Lumières allumées à la cuisine du deuxième étage.")
+        check("S'il te plaît, pas de lumières!")
+        check("Coupez toutes les lumières maintenant!")
+        check("Éteindre les lumières dans le garage.")
+        check("Lumières éteintes dans la cuisine!")
+        check("Augmentez l'éclairage dans le garage et la chambre des maîtres.")
+        check("Baissez toute la lumière maintenant!")
+        check("Pas de lumières dans la chambre, s'il vous plait.")
+        check("Allumez le garage, s'il vous plait.")
+        check("Tuez l'illumination maintenant.")
+    }
diff --git a/nlpcraft-examples/lightswitch-ru/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchRuModel.scala b/nlpcraft-examples/lightswitch-ru/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchRuModel.scala
index 10eca4ca..84ac035c 100644
--- a/nlpcraft-examples/lightswitch-ru/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchRuModel.scala
+++ b/nlpcraft-examples/lightswitch-ru/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchRuModel.scala
@@ -51,21 +51,6 @@ class LightSwitchRuModel extends NCModelAdapter(
       * @return Query result to be sent to the REST caller.
       */
     @NCIntent("intent=ls term(act)={has(ent_groups, 'act')} term(loc)={# == 'ls:loc'}*")
-    @NCIntentSample(Array(
-        "Выключи свет по всем доме",
-        "Выруби электричество!",
-        "Включи свет в детской",
-        "Включай повсюду освещение",
-        "Включайте лампы в детской комнате",
-        "Свет на кухне, пожалуйста, приглуши",
-        "Нельзя ли повсюду выключить свет?",
-        "Пожалуйста без света",
-        "Отключи электричество в ванной",
-        "Выключи, пожалуйста, тут всюду свет",
-        "Выключай все!",
-        "Свет пожалуйста везде включи",
-        "Зажги лампу на кухне"
-    ))
     def onMatch(
         ctx: NCContext, 
         im: NCIntentMatch,
diff --git a/nlpcraft-examples/lightswitch-ru/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala b/nlpcraft-examples/lightswitch-ru/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
index 6b031eb9..c61cbcd0 100644
--- a/nlpcraft-examples/lightswitch-ru/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
+++ b/nlpcraft-examples/lightswitch-ru/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
@@ -27,4 +27,20 @@ import scala.util.Using
   */
 class NCModelValidationSpec:
     @Test
-    def test(): Unit = Using.resource(new NCModelClient(new LightSwitchRuModel)) { _.validateSamples() }
+    def test(): Unit = Using.resource(new NCModelClient(new LightSwitchRuModel)) { client =>
+        def check(txt: String): Unit = client.debugAsk(txt, "userId", true).getIntentId == "ls"
+        
+        check("Выключи свет по всем доме")
+        check("Выруби электричество!")
+        check("Включи свет в детской")
+        check("Включай повсюду освещение")
+        check("Включайте лампы в детской комнате")
+        check("Свет на кухне, пожалуйста, приглуши")
+        check("Нельзя ли повсюду выключить свет?")
+        check("Пожалуйста без света")
+        check("Отключи электричество в ванной")
+        check("Выключи, пожалуйста, тут всюду свет")
+        check("Выключай все!")
+        check("Свет пожалуйста везде включи")
+        check("Зажги лампу на кухне")
+    }
diff --git a/nlpcraft-examples/lightswitch/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchScalaModel.scala b/nlpcraft-examples/lightswitch/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchScalaModel.scala
index 2320e128..72e9d2cd 100644
--- a/nlpcraft-examples/lightswitch/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchScalaModel.scala
+++ b/nlpcraft-examples/lightswitch/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchScalaModel.scala
@@ -51,30 +51,6 @@ class LightSwitchScalaModel extends NCModelAdapter(
       * @return Query result to be sent to the REST caller.
       */
     @NCIntent("intent=ls term(act)={has(ent_groups, 'act')} term(loc)={# == 'ls:loc'}*")
-    @NCIntentSample(Array(
-        "Turn the lights off in the entire house.",
-        "Turn off all lights now",
-        "Switch on the illumination in the master bedroom closet.",
-        "Get the lights on.",
-        "Off the lights on the 1st floor",
-        "Lights up in the kitchen.",
-        "Please, put the light out in the upstairs bedroom.",
-        "Set the lights on in the entire house.",
-        "Turn the lights off in the guest bedroom.",
-        "Could you please switch off all the lights?",
-        "Dial off illumination on the 2nd floor.",
-        "Turn down lights in 1st floor bedroom",
-        "Lights on at second floor kitchen",
-        "Please, no lights!",
-        "Kill off all the lights now!",
-        "Down the lights in the garage",
-        "Lights down in the kitchen!",
-        "Turn up the illumination in garage and master bedroom",
-        "Turn down all the light now!",
-        "No lights in the bedroom, please.",
-        "Light up the garage, please!",
-        "Kill the illumination now!"
-    ))
     def onMatch(
         ctx: NCContext,
         im: NCIntentMatch,
diff --git a/nlpcraft-examples/lightswitch/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala b/nlpcraft-examples/lightswitch/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
index b95c943e..4735bb90 100644
--- a/nlpcraft-examples/lightswitch/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
+++ b/nlpcraft-examples/lightswitch/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
@@ -26,7 +26,32 @@ import scala.util.Using
   * JUnit models validation.
   */
 class NCModelValidationSpec:
-    private def test(mdl: NCModel): Unit = Using.resource(new NCModelClient(mdl)) { _.validateSamples() }
+    private def test(mdl: NCModel): Unit = Using.resource(new NCModelClient(mdl)) { client =>
+        def check(txt: String): Unit = client.debugAsk(txt, "userId", true).getIntentId == "ls"
+        
+        check("Turn the lights off in the entire house.")
+        check("Turn off all lights now")
+        check("Switch on the illumination in the master bedroom closet.")
+        check("Get the lights on.")
+        check("Off the lights on the 1st floor")
+        check("Lights up in the kitchen.")
+        check("Please, put the light out in the upstairs bedroom.")
+        check("Set the lights on in the entire house.")
+        check("Turn the lights off in the guest bedroom.")
+        check("Could you please switch off all the lights?")
+        check("Dial off illumination on the 2nd floor.")
+        check("Turn down lights in 1st floor bedroom")
+        check("Lights on at second floor kitchen")
+        check("Please, no lights!")
+        check("Kill off all the lights now!")
+        check("Down the lights in the garage")
+        check("Lights down in the kitchen!")
+        check("Turn up the illumination in garage and master bedroom")
+        check("Turn down all the light now!")
+        check("No lights in the bedroom, please.")
+        check("Light up the garage, please!")
+        check("Kill the illumination now!")
+    }
 
     @Test
     def test(): Unit = test(new LightSwitchScalaModel())
diff --git a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala
index aa8fd12a..c447b462 100644
--- a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala
+++ b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala
@@ -63,7 +63,7 @@ object PizzeriaModelServer:
 
                     if req == null || req.isEmpty then Exception(s"Empty request.")
 
-                    val resp = nlpClient.ask(req, null, "userId")
+                    val resp = nlpClient.ask(req, "userId")
                     val prompt = if resp.getType == ASK_DIALOG then "(Your should answer on the model's question below)\n" else ""
                     doResponse(s"$prompt${resp.getBody}")
                 catch
diff --git a/nlpcraft-examples/time/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.scala b/nlpcraft-examples/time/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.scala
index 245b80f0..b98465bc 100644
--- a/nlpcraft-examples/time/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.scala
+++ b/nlpcraft-examples/time/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.scala
@@ -83,12 +83,6 @@ class TimeModel extends NCModelAdapter(
       * @param cityEnt Token for 'geo' term.
       * @return Query result. */
     @NCIntentRef("intent2")
-    @NCIntentSample(Array(
-        "What time is it now in New York City?",
-        "What's the current time in Moscow?",
-        "Show me time of the day in London.",
-        "Can you please give me the Tokyo's current date and time."
-    ))
     private def onRemoteMatch(ctx: NCContext, im: NCIntentMatch, @NCIntentTerm("city") cityEnt: NCEntity): NCResult =
         val cityName: String = cityEnt.mkText
 
@@ -106,7 +100,6 @@ class TimeModel extends NCModelAdapter(
       * @param ctx Intent solver context.
       * @return Query result. */
     @NCIntentRef("intent1")
-    @NCIntentSample(Array("What's the local time?"))
     private def onLocalMatch(ctx: NCContext, im: NCIntentMatch): NCResult =  // NOTE:
         // We need to have two intents vs. one intent with an optional GEO. The reason is that
         // first intent isn't using the conversation to make sure we can always ask
diff --git a/nlpcraft-examples/time/src/test/scala/org/apache/nlpcraft/examples/time/NCModelValidationSpec.scala b/nlpcraft-examples/time/src/test/scala/org/apache/nlpcraft/examples/time/NCModelValidationSpec.scala
index a79a81c1..14f51db0 100644
--- a/nlpcraft-examples/time/src/test/scala/org/apache/nlpcraft/examples/time/NCModelValidationSpec.scala
+++ b/nlpcraft-examples/time/src/test/scala/org/apache/nlpcraft/examples/time/NCModelValidationSpec.scala
@@ -27,4 +27,13 @@ import scala.util.Using
   */
 class NCModelValidationSpec:
     @Test
-    def test(): Unit = Using.resource(new NCModelClient(new TimeModel())) { _.validateSamples() }
+    def test(): Unit = Using.resource(new NCModelClient(new TimeModel())) { client =>
+        def check(txt: String, intentId: String): Unit = client.debugAsk(txt, "userId", true).getIntentId == intentId
+
+        check("What time is it now in New York City?", "intent2")
+        check("What's the current time in Moscow?", "intent2")
+        check("Show me time of the day in London.", "intent2")
+        check("Can you please give me the Tokyo's current date and time.", "intent2")
+
+        check("What's the local time?", "intent1")
+    }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCCallbackData.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCFiredIntent.scala
similarity index 86%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/NCCallbackData.scala
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/NCFiredIntent.scala
index cb09c81c..6f7c892c 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCCallbackData.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCFiredIntent.scala
@@ -20,7 +20,9 @@ package org.apache.nlpcraft
 /**
   * 
   */
-trait NCCallbackData:
+trait NCFiredIntent:
+    type NCArguments = List[List[NCEntity]]
+
     /**
       * 
       * @return
@@ -31,10 +33,10 @@ trait NCCallbackData:
       * 
       * @return
       */
-    def getCallbackArguments: List[List[NCEntity]]
+    def getCallbackArguments: NCArguments
 
     /**
       * 
       * @return
       */
-    def getCallback: List[List[NCEntity]] => NCResult
+    def getCallback: NCArguments => NCResult
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCIntentSkip.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCIntentSkip.scala
index e9ffd3db..10647c0d 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCIntentSkip.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCIntentSkip.scala
@@ -31,8 +31,6 @@ package org.apache.nlpcraft
   * @see NCIntent
   * @see NCIntentTerm
   * @see NCIntentRef
-  * @see NCIntentSample
-  * @see NCIntentSampleRef
   * @see NCIntentMatch
   * @see NCModel#onMatchedIntent(NCIntentMatch) */
 class NCIntentSkip(msg: String, cause: Throwable = null) extends NCException(msg, cause)
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelClient.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelClient.scala
index 4b5553e1..24aa4c65 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelClient.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelClient.scala
@@ -78,7 +78,7 @@ class NCModelClient(mdl: NCModel) extends LazyLogging, AutoCloseable:
       * @param typ
       * @return
       */
-    private def ask0(txt: String, data: Map[String, Any], usrId: String, typ: NCIntentSolveType): Either[NCResult, NCCallbackData] =
+    private def ask0(txt: String, data: Map[String, Any], usrId: String, typ: NCIntentSolveType): Either[NCResult, NCFiredIntent] =
         val plData = plMgr.prepare(txt, data, usrId)
 
         val userId = plData.request.getUserId
@@ -112,14 +112,12 @@ class NCModelClient(mdl: NCModel) extends LazyLogging, AutoCloseable:
       * @param usrId
       * @return
       */
-    def ask(txt: String, data: Map[String, AnyRef], usrId: String): NCResult =
+    def ask(txt: String, usrId: String, data: Map[String, AnyRef] = Map.empty): NCResult =
         require(txt != null, "Input text cannot be null.")
         require(data != null, "Data cannot be null.")
         require(usrId != null, "User id cannot be null.")
         ask0(txt, data, usrId, NCIntentSolveType.REGULAR).swap.toOption.get
 
-    def ask(txt: String, usrId: String): NCResult = ask(txt, Map.empty, usrId)
-
     /**
       *
       * @param usrId
@@ -158,55 +156,7 @@ class NCModelClient(mdl: NCModel) extends LazyLogging, AutoCloseable:
     /**
       *
       */
-    def validateSamples(): Unit =
-        case class Result(intentId: String, text: String, error: Option[String], time: Long)
-
-        val userId = UUID.randomUUID().toString
-        val res = scala.collection.mutable.ArrayBuffer.empty[Result]
-
-        def now: Long = System.currentTimeMillis()
-
-        for (i <- intents; samples <- i.samples)
-            for (sample <- samples)
-                val start = now
-
-                val err: Option[String] =
-                    try
-                        val r = ask(sample, Map.empty, userId)
-
-                        Option.when(r.getIntentId.isEmpty || r.getIntentId.get != i.intent.id)(s"Unexpected intent ID: '${r.getIntentId.getOrElse("(not set)")}'")
-                    catch case e: Throwable =>
-                        logger.warn("Unexpected error.", e) 
-                        Option(e.getLocalizedMessage)
-
-                res += Result(i.intent.id, sample, err, now - start)
-
-            clearDialog(userId)
-            clearStm(userId)
-
-        val tbl = NCAsciiTable()
-        tbl #= ("Intent ID", "+/-", "Text", "Error", "ms.")
-
-        for (res <- res)
-            tbl += (
-                res.intentId,
-                if res.error.isEmpty then "OK" else "FAIL",
-                res.text,
-                res.error.getOrElse(""),
-                res.time
-            )
-
-        val passCnt = res.count(_.error.isEmpty)
-        val failCnt = res.count(_.error.isDefined)
-
-        tbl.info(logger, Option(s"Model auto-validation results: OK $passCnt, FAIL $failCnt:"))
-
-        if failCnt > 0 then require(false, "Some tests failed.")
-
-    /**
-      *
-      */
-    def close(): Unit =
+    override def close(): Unit =
         plMgr.close()
         dlgMgr.close()
         convMgr.close()
@@ -220,11 +170,9 @@ class NCModelClient(mdl: NCModel) extends LazyLogging, AutoCloseable:
       * @param saveHist
       * @return
       */
-    def debugAsk(txt: String, data: Map[String, AnyRef], usrId: String, saveHist: Boolean): NCCallbackData =
+    def debugAsk(txt: String, usrId: String, saveHist: Boolean, data: Map[String, AnyRef] = Map.empty): NCFiredIntent =
         require(txt != null, "Input text cannot be null.")
         require(data != null, "Data cannot be null.")
         require(usrId != null, "User id cannot be null.")
         import NCIntentSolveType.*
-        ask0(txt, data, usrId, if saveHist then SEARCH else SEARCH_NO_HISTORY).toOption.get
-
-    def debugAsk(txt: String, usrId: String, saveHist: Boolean): NCCallbackData = debugAsk(txt, Map.empty, usrId, saveHist)
+        ask0(txt, data, usrId, if saveHist then SEARCH else SEARCH_NO_HISTORY).toOption.get
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntent.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntent.java
index c98817ae..416d0cb7 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntent.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntent.java
@@ -36,8 +36,6 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  * 
  * @see NCIntentRef
  * @see NCIntentTerm
- * @see NCIntentSample
- * @see NCIntentSampleRef
  * @see NCModelAddClasses
  * @see NCModelAddPackage
  * @see NCIntentSkip
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentRef.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentRef.java
index 5f6af9c7..ed0503d3 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentRef.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentRef.java
@@ -35,8 +35,6 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  * 
  * @see NCIntent
  * @see NCIntentTerm
- * @see NCIntentSample
- * @see NCIntentSampleRef
  * @see NCModelAddClasses
  * @see NCModelAddPackage
  * @see NCIntentSkip
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentSample.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentSample.java
deleted file mode 100644
index 760e4e41..00000000
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentSample.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.nlpcraft.annotations;
-
-import org.apache.nlpcraft.NCIntentMatch;
-import org.apache.nlpcraft.NCIntentSkip;
-import org.apache.nlpcraft.NCModel;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Repeatable;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-/**
- * The corpus of intent samples that is used for documentaiton and model auto-validation.
- *
- * @see NCIntentSampleRef
- * @see NCIntent
- * @see NCIntentRef
- * @see NCIntentTerm
- * @see NCModelAddClasses
- * @see NCModelAddPackage
- * @see NCIntentSkip
- * @see NCIntentMatch
- * @see NCModel#onMatchedIntent(NCIntentMatch)
- * @see NCTestAutoModelValidator
- */
-@Retention(value=RUNTIME)
-@Target(value=METHOD)
-@Repeatable(NCIntentSample.NCIntentSampleList.class)
-public @interface NCIntentSample {
-    /**
-     * Gets a list of user input samples that should match corresponding intent. This annotation should be
-     * attached the intent callback method.
-     *
-     * @return Set of user input examples that should match corresponding intent.
-     */
-    String[] value();
-
-    /**
-     * Grouping annotation required for when more than one {@link NCIntentSample} annotation is used.
-     */
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target(value=METHOD)
-    @Documented
-    @interface NCIntentSampleList {
-        /**
-         * Gets the list of all {@link NCIntentSample} annotations attached to the callback.
-         *
-         * @return List of all {@link NCIntentSample} annotations attached to the callback.
-         */
-        NCIntentSample[] value();
-    }
-}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentSampleRef.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentSampleRef.java
deleted file mode 100644
index f326dd4e..00000000
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentSampleRef.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.nlpcraft.annotations;
-
-import org.apache.nlpcraft.NCIntentMatch;
-import org.apache.nlpcraft.NCIntentSkip;
-import org.apache.nlpcraft.NCModel;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Repeatable;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-/**
- * The corpus of intent samples that is used for documentaiton and model auto-validation.
- *
- * @see NCIntentSample
- * @see NCIntent
- * @see NCIntentRef
- * @see NCIntentTerm
- * @see NCModelAddClasses
- * @see NCModelAddPackage
- * @see NCIntentSkip
- * @see NCIntentMatch
- * @see NCModel#onMatchedIntent(NCIntentMatch)
- * @see NCTestAutoModelValidator
- */
-@Retention(value=RUNTIME)
-@Target(value=METHOD)
-@Repeatable(NCIntentSampleRef.NCIntentSampleList.class)
-public @interface NCIntentSampleRef {
-    /**
-     * Local file path, classpath resource path or URL supported by {@link java.net.URL} class. The content of the source
-     * should be a new-line separated list of string. Empty strings and strings starting with '#" (hash) symbol will
-     * be ignored. This annotation should be attached the intent callback method. Note that using this annotation is equivalent
-     * to using {@link NCIntentSample} annotation and listing all of its samples in place instead of an external source.
-     *
-     * @return Local file path, classpath resource path or URL supported by {@link java.net.URL} class.
-     */
-    String value();
-
-    /**
-     * Grouping annotation required for when more than one {@link NCIntentSampleRef} annotation is used.
-     */
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target(value=METHOD)
-    @Documented
-    @interface NCIntentSampleList {
-        /**
-         * Gets the list of all {@link NCIntentSampleRef} annotations attached to the callback.
-         *
-         * @return List of all {@link NCIntentSampleRef} annotations attached to the callback.
-         */
-        NCIntentSampleRef[] value();
-    }
-}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentTerm.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentTerm.java
index 12c34481..fc0d6b7d 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentTerm.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/annotations/NCIntentTerm.java
@@ -33,8 +33,6 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  * 
  * @see NCIntent
  * @see NCIntentRef
- * @see NCIntentSample
- * @see NCIntentSampleRef
  * @see NCIntentSkip
  * @see NCIntentMatch
  * @see NCModel#onMatchedIntent(NCIntentMatch)
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala
index 89bdf13d..5312b372 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala
@@ -42,9 +42,8 @@ case class NCCallbackInput(ctx: NCContext, im: NCIntentMatch)
   *
   * @param intent
   * @param function
-  * @param samples
   */
-case class NCModelIntent(intent: NCIDLIntent, function: NCCallbackInput => NCResult, samples: Seq[Seq[String]])
+case class NCModelIntent(intent: NCIDLIntent, function: NCCallbackInput => NCResult)
 
 object NCModelScanner extends LazyLogging:
     private final val CLS_INTENT = classOf[NCIntent]
@@ -52,8 +51,6 @@ object NCModelScanner extends LazyLogging:
     private final val CLS_QRY_RES = classOf[NCResult]
     private final val CLS_CTX = classOf[NCContext]
     private final val CLS_INTENT_MATCH = classOf[NCIntentMatch]
-    private final val CLS_SAMPLE = classOf[NCIntentSample]
-    private final val CLS_SAMPLE_REF = classOf[NCIntentSampleRef]
     private final val CLS_INTENT_OBJ = classOf[NCIntentObject]
 
     private final val CLS_SCALA_SEQ = classOf[Seq[_]]
@@ -65,8 +62,6 @@ object NCModelScanner extends LazyLogging:
     private lazy val I = "@NCIntent"
     private lazy val IT = "@NCIntentTerm"
     private lazy val IR = "@NCIntentRef"
-    private lazy val S = "@NCIntentSample"
-    private lazy val SR = "@NCIntentSampleRef"
 
     private final val COMP_CLS: Set[Class[_]] = Set(
         CLS_SCALA_SEQ,
@@ -89,13 +84,6 @@ object NCModelScanner extends LazyLogging:
         def apply(cfg: NCModelConfig, intent: NCIDLIntent, obj: AnyRef, mtd: Method): IntentHolder =
             new IntentHolder(intent, prepareCallback(cfg, mtd, obj, intent), mtd)
 
-    /**
-      *
-      * @param wct
-      * @return
-      */
-    private def wc2Str(wct: WildcardType): String = if wct == null then "null" else s"'${wct.getTypeName}'"
-
     /**
       *
       * @param iter
@@ -259,50 +247,6 @@ object NCModelScanner extends LazyLogging:
         val cls = o.getClass
         (cls.getDeclaredFields ++ cls.getFields).toSet
 
-    /**
-      *
-      * @param cfg
-      * @param mtd
-      * @return
-      */
-    private def scanSamples(cfg: NCModelConfig, mtd: Method): Map[String, Seq[Seq[String]]] =
-        val smpAnns = mtd.getAnnotationsByType(CLS_SAMPLE)
-        val smpAnnsRef = mtd.getAnnotationsByType(CLS_SAMPLE_REF)
-        lazy val mtdStr = method2Str(mtd)
-        lazy val intAnns = mtd.getAnnotationsByType(CLS_INTENT)
-        lazy val refAnns = mtd.getAnnotationsByType(CLS_INTENT_REF)
-        lazy val samples = mutable.HashMap.empty[String, Seq[Seq[String]]]
-
-        if smpAnns.nonEmpty || smpAnnsRef.nonEmpty then
-            if intAnns.isEmpty && refAnns.isEmpty then
-                E(s"$S or $SR annotations without corresponding $I or $IR annotations: $mtdStr")
-            else
-                def read[T](annArr: scala.Array[T], annName: String, getSamples: T => Seq[String], getSource: Option[T => String]): Seq[Seq[String]] =
-                    for (ann <- annArr.toSeq) yield
-                        val samples = getSamples(ann).map(_.strip).filter(s => s.nonEmpty && s.head != '#')
-                        if samples.isEmpty then
-                            getSource match
-                                case None => logger.warn(s"$annName annotation has no samples: $mtdStr")
-                                case Some(f) => logger.warn(s"$annName annotation references '${f(ann)}' file that has no samples: $mtdStr")
-                            Seq.empty
-                        else
-                            samples.filter(_.nonEmpty)
-
-                val seqSeq =
-                    read[NCIntentSample](smpAnns, S, _.value.toSeq, None) ++
-                    read[NCIntentSampleRef](smpAnnsRef, SR, a => NCUtils.readResource(a.value), Option(_.value))
-
-                if NCUtils.containsDups(seqSeq.flatMap(_.toSeq).toList) then
-                    logger.warn(s"$S and $SR annotations have duplicates: $mtdStr")
-
-                val distinct = seqSeq.map(_.distinct).distinct
-                for (ann <- intAnns; intent <- NCIDLCompiler.compile(ann.value, cfg, mtdStr)) samples += intent.id -> distinct
-                for (ann <- refAnns) samples += ann.value -> distinct
-        else if intAnns.nonEmpty || refAnns.nonEmpty then
-            logger.warn(s"$S or $SR annotations are missing for: $mtdStr")
-
-        samples.toMap
-
     /**
       *
       * @param cfg
@@ -421,8 +365,6 @@ object NCModelScanner extends LazyLogging:
         // Gets terms IDs.
         val termIds = tokParamAnns.zipWithIndex.map {
             case (annArr, idx) =>
-                def mkArg(): String = arg2Str(method, idx)
-
                 val termAnns = annArr.filter(_.isInstanceOf[NCIntentTerm])
 
                 // Each method arguments (second and later) must have one 'NCIntentTerm' annotation.
@@ -476,7 +418,6 @@ object NCModelScanner extends LazyLogging:
         val intentDecls = mutable.HashMap.empty[String, NCIDLIntent]
         val objs = mutable.Buffer.empty[AnyRef]
         val processed = mutable.HashSet.empty[Class[_]]
-        val samples = mutable.HashMap.empty[Method, Map[String, Seq[Seq[String]]]]
 
         def addDecl(intent: NCIDLIntent): Unit =
             intentDecls.get(intent.id) match
@@ -498,15 +439,12 @@ object NCModelScanner extends LazyLogging:
 
         // First phase scan.
         // For given object finds references via fields (NCIntentObject). Scans also each reference recursively and collects them.
-        // For all methods of processed object collects samples (NCIntentSample, NCIntentSampleRef) and intents (NCIntent)
+        // For all methods of processed object collects  intents (NCIntent)
         def scan(obj: AnyRef): Unit =
             objs += obj
             processClassAnnotations(obj.getClass)
             val methods = getAllMethods(obj)
 
-            // Collects samples for each method.
-            for (mtd <- methods) samples += mtd -> scanSamples(cfg, mtd)
-
             // // Collects intents for each method.
             for (
                 mtd <- methods;
@@ -550,4 +488,4 @@ object NCModelScanner extends LazyLogging:
         else
             logger.warn(s"Model has no intent: ${cfg.getId}")
 
-        intents.map(i => NCModelIntent(i.intent, i.function, samples.getOrElse(i.method, Map.empty).getOrElse(i.intent.id, Seq.empty))).toSeq
\ No newline at end of file
+        intents.map(i => NCModelIntent(i.intent, i.function)).toSeq
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolverManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolverManager.scala
index 1f04f9f1..a16a94d6 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolverManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolverManager.scala
@@ -89,7 +89,7 @@ object NCIntentSolverManager:
         getIntentId: String,
         getCallbackArguments: List[List[NCEntity]],
         getCallback: List[List[NCEntity]] => NCResult
-    ) extends NCCallbackData
+    ) extends NCFiredIntent
 
     /**
       *
@@ -183,7 +183,7 @@ object NCIntentSolverManager:
       */
     private case class IntentEntity(var used: Boolean, var conv: Boolean, entity: NCEntity)
 
-    type ResultData = Either[NCResult, NCCallbackData]
+    type ResultData = Either[NCResult, NCFiredIntent]
 
     /**
       *
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelCallbacksSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelCallbacksSpec.scala
index 706c0641..6fe529ad 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelCallbacksSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelCallbacksSpec.scala
@@ -111,7 +111,7 @@ class NCModelCallbacksSpec:
         set(states*)
 
         try
-            client.ask("x", null, "userId")
+            client.ask("x", "userId")
 
             require(false)
         catch
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec.scala
index 4452a1c4..471bac4b 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec.scala
@@ -52,8 +52,6 @@ class NCModelClientSpec:
             println(s"Intent: ${res.getIntentId}")
             println(s"Body: ${res.getBody}")
 
-            client.validateSamples()
-
             val winner = client.debugAsk("Lights on at second floor kitchen", "userId", true)
             println(s"Winner intent: ${winner.getIntentId}")
             println("Entities: \n" + winner.getCallbackArguments.map(p => p.map(s).mkString(", ")).mkString("\n"))
@@ -66,7 +64,6 @@ class NCModelClientSpec:
     def test(): Unit =
         test0(
             new NCTestModelAdapter():
-                @NCIntentSample(Array("Lights on at second floor kitchen"))
                 @NCIntent("intent=ls term(act)={# == 'ls:on'} term(loc)={# == 'ls:loc'}*")
                 def onMatch(ctx: NCContext, im: NCIntentMatch, @NCIntentTerm("act") act: NCEntity, @NCIntentTerm("loc") locs: List[NCEntity]): NCResult = NCResult("test", NCResultType.ASK_RESULT)
         )
@@ -78,7 +75,6 @@ class NCModelClientSpec:
         test0(
             new NCTestModelAdapter():
                 @NCIntent("intent=ls term(act)={has(ent_groups, 'act')} term(loc)={# == 'ls:loc'}*")
-                @NCIntentSample(Array("Lights on at second floor kitchen"))
                 def onMatch(ctx: NCContext, im: NCIntentMatch, @NCIntentTerm("act") act: NCEntity, @NCIntentTerm("loc") locs: List[NCEntity]): NCResult = NCResult("test", NCResultType.ASK_RESULT)
         )
 
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec3.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec3.scala
index 332822ed..4dbe4379 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec3.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec3.scala
@@ -47,10 +47,10 @@ class NCModelClientSpec3:
             def onMatch(ctx: NCContext, im: NCIntentMatch, @NCIntentTerm("t1") t1: NCEntity): NCResult = NCResult("Data", NCResultType.ASK_RESULT)
 
         Using.resource(new NCModelClient(mdl)) { client =>
-            def ask(): NCCallbackData = client.debugAsk("e1", "userId", true)
-            def execCallback(cb: NCCallbackData): NCResult = cb.getCallback.apply(cb.getCallbackArguments)
-            def execCallbackOk(cb: NCCallbackData): Unit = println(s"Result: ${execCallback(cb).getBody}")
-            def execCallbackFail(cb: NCCallbackData): Unit =
+            def ask(): NCFiredIntent = client.debugAsk("e1", "userId", true)
+            def execCallback(cb: NCFiredIntent): NCResult = cb.getCallback.apply(cb.getCallbackArguments)
+            def execCallbackOk(cb: NCFiredIntent): Unit = println(s"Result: ${execCallback(cb).getBody}")
+            def execCallbackFail(cb: NCFiredIntent): Unit =
                 try execCallback(cb)
                 catch case e: NCException => println(s"Expected error: ${e.getMessage}")
 
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsInvalidIntentsSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsInvalidIntentsSpec.scala
index 0a0c2236..8c935b94 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsInvalidIntentsSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsInvalidIntentsSpec.scala
@@ -62,22 +62,11 @@ class NCModelIntentsInvalidIntentsSpec:
                 def x(ctx: NCContext, im: NCIntentMatch, @NCIntentTerm("list") list: List[NCEntity]): NCResult = null
         )
 
-    /**
-      * Samples without intent.
-      */
-    @Test
-    def testError3(): Unit =
-        testError(
-            new NCTestModelAdapter():
-                @NCIntentSample(Array("sample"))
-                def x(ctx: NCContext, im: NCIntentMatch, @NCIntentTerm("list") list: List[NCEntity]): NCResult = null
-        )
-
     /**
       * Duplicated intents definitions.
       */
     @Test
-    def testError4(): Unit =
+    def testError3(): Unit =
         @NCIntent("intent=validList1 term(list)~{# == 'x'}[0,10]")
         @NCIntent("intent=validList1 term(list)~{# == 'x'}[0,11]")
         class X:
@@ -93,32 +82,9 @@ class NCModelIntentsInvalidIntentsSpec:
       * Invalid argument type.
       */
     @Test
-    def testError5(): Unit =
+    def testError4(): Unit =
         testError(
             new NCTestModelAdapter():
                 @NCIntent("intent=validList1 term(list)~{# == 'x'}[0,10]")
                 def x(ctx: NCContext, im: NCIntentMatch, @NCIntentTerm("list") e: NCEntity): NCResult = null
-        )
-
-    /**
-      * Duplicated samples definitions.
-      */
-    @Test
-    def testWarning1(): Unit =
-        NCModelScanner.scan(
-            new NCTestModelAdapter():
-                @NCIntent("intent=validList1 term(list)~{# == 'x'}[0,10]")
-                @NCIntentSample(Array("x", "x"))
-                def x(ctx: NCContext, im: NCIntentMatch, @NCIntentTerm("list") list: List[NCEntity]): NCResult = null
-        )
-
-    /**
-      * Missed samples.
-      */
-    @Test
-    def testWarning2(): Unit =
-        NCModelScanner.scan(
-            new NCTestModelAdapter():
-                @NCIntent("intent=validList1 term(list)~{# == 'x'}[0,10]")
-                def x(ctx: NCContext, im: NCIntentMatch, @NCIntentTerm("list") list: List[NCEntity]): NCResult = null
-        )
+        )
\ No newline at end of file
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCTestModelScala.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCTestModelScala.scala
index b2f487f4..8d297a65 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCTestModelScala.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCTestModelScala.scala
@@ -26,7 +26,6 @@ import org.apache.nlpcraft.nlp.util.*
 object NCTestModelScala:
     object NCTestModelScalaObj extends NCTestModelAdapter :
         @NCIntent("intent=locInt term(single)~{# == 'id1'} term(list)~{# == 'id2'}[0,10] term(opt)~{# == 'id3'}?")
-        @NCIntentSample(Array("What are the least performing categories for the last quarter?"))
         def intent(
             ctx: NCContext,
             im: NCIntentMatch,
@@ -36,7 +35,6 @@ object NCTestModelScala:
         ): NCResult = NCTestResult()
 
         @NCIntent("import('scan/idl.idl')")
-        @NCIntentSampleRef("scan/samples.txt")
         def intentImport(
             ctx: NCContext,
             im: NCIntentMatch,
@@ -48,7 +46,6 @@ object NCTestModelScala:
     @NCIntent("import('scan/idl.idl')")
     class NCTestModelScalaClass extends NCTestModelAdapter :
         @NCIntent("intent=locInt term(single)~{# == 'id1'} term(list)~{# == 'id2'}[0,10] term(opt)~{# == 'id3'}?")
-        @NCIntentSample(Array("What are the least performing categories for the last quarter?"))
         def intent(
             ctx: NCContext,
             im: NCIntentMatch,
@@ -58,7 +55,6 @@ object NCTestModelScala:
         ) = NCTestResult()
 
         @NCIntentRef("impIntId")
-        @NCIntentSampleRef("scan/samples.txt")
         def intentImport(
             ctx: NCContext,
             im: NCIntentMatch,
@@ -73,7 +69,6 @@ object NCTestModelScala:
       */
     def mkModel: NCModel = new NCTestModelAdapter() :
         @NCIntent("intent=locInt term(single)~{# == 'id1'} term(list)~{# == 'id2'}[0,10] term(opt)~{# == 'id3'}?")
-        @NCIntentSample(Array("What are the least performing categories for the last quarter?"))
         def intent(
             ctx: NCContext,
             im: NCIntentMatch,
@@ -83,7 +78,6 @@ object NCTestModelScala:
         ): NCResult = NCTestResult()
 
         @NCIntent("import('scan/idl.idl')")
-        @NCIntentSampleRef("scan/samples.txt")
         def intentImport(
             ctx: NCContext,
             im: NCIntentMatch,