Teneo Platform 7.6 Overview
Teneo Studio Web
Output Parameters
Teneo Web now allows developers to add Output Parameters to Flow Output nodes by simply clicking the Output Parameters tab in the Output node and writing the name and value of the parameter.
Teneo Studio Desktop
Class Manager: Improvements to Examples Filter
The filters available in the Class Manager allowing developers to filter either on Class names or examples have been reviewed to ensure correct filtering in different use cases, for example, when filter by examples, any Class matching the written letters/words are now marked with a filtered icon and a count of the number of examples that match the filter.
When a filter is applied for the examples and the user edit a Class, only examples matching the filter are displayed; now, if the user adds a new Class that doesn't match the filter, the new example is not shown unless the user clears the examples filter.
Also, note that if the developer filters by Class name and adds a new Class, the Class is not displayed in the list of Classes and upon Save, the Class filter is reset (i.e., cleared) in order to display the new Class in the list of Classes.
Bug Fixes and User Driven Improvements
Several bug fixes and user driven improvements are included in the Teneo 7.6 release and listed below.
Studio General
- The tool tip on the Solution List (before opening a solution) is improved and the reference to editing solution properties removed.
- Timestamps in Studio, showing when documents have been edited, are now automatically updated every 30 seconds to provide more precise information about when a document was last edited.
- The Reload button in the top ribbon has been reviewed to ensure that the correct folder is selected after performing a reload of the solution.
- When renaming a sub-folder, the name is again shown correctly without the need for the developer to add or edit any document in the folder for the name displayed to update.
- A navigation issue, after deleting a Flow, going to the My Work tab and closing and reopening the solution, has been fixed.
- During upload of File Resources, all buttons are now correctly disabled.
- When exporting a solution as a library file, empty folders are no longer included in the exported
.library
file.
Documents
- Flow and Global Variables now expect an "Initial Value" (instead of an Evaluation Script or Value as labeled in previous Studio versions).
- The already deprecated "Document Number" field - still visible under Properties in the backstage of Language Objects, Entities and Flows - has in Teneo 7.6 been removed from the mentioned documents to avoid confusions.
- Deleted and disabled documents in the Recycle Bin are now shown with the disabled icon and italic letters.
- An issue with duplicated Language Objects after performing a Bulk Import has been fixed to ensure correct number and display of the imported documents.
- Incorrect highlighting in yellow of examples in Language Objects and Entities has been fixed.
Classifier
- The option to filter Classes on their name now works again.
- A text message, when applying filters (i.e., revision and/or date) and no reviewed inputs are found, is updated to ensure correct understanding.
Log Data Sources
- The Engine matching - available in the backstage of a Log Data Source (under Solution) - has been removed from the Teneo Platform and is no longer available nor supported. This includes removing documentation related to the functionality.
- The Log Data Source window comes with minor updates related to visualization of buttons and informative messages to ensure that all are correctly displayed when needed.
- Missing error messages are also implement, for example, to provide appropriate messages to the developers to handle a crash happening when opening a Log Data Source which is off.
- In the Augmenters view (in the backstage of the Log Data Source), the maximum/minimum revisions are now marked in red with a message when either of the settings contain a wrong value and a warning icon is displayed together with a tooltip.
- The Execute button in the Import Saved Results window has been reviewed to ensure correct visualization of the button both when disabled and enabled.
- The incorrect display of a published query's name after unpublishing has been reviewed and corrected.
Miscellaneous
- After removing and restoring a Publish Environment, the Publish Environment is now again correctly displayed in the backstage of Teneo Studio (without the need to close and open the Solution for correct visualization).
- In the advanced Tryout window, the labels in the Path referring to the ID and Name of an Integration Method are now correctly displayed as "Integration".
- Also in the Tryout, when a Solution has Classes and some errors are received from the Input Processors, these error messages are again displayed correctly.
- An error sometimes happening in Learn with small datasets in Teneo 7.2 and 7.3 has been fixed.
- Minor improvements are performed in the Auto-test window, e.g., turning the arrow of the history up-side-down as it was turning the opposite way compared to other places in Studio where the arrow is also used.
- In Trigger Ordering (Intent and Prompt), text filters are now applied without the need to click outside the filter
- Various use cases discovered in previous Teneo versions (6.0, 6.2.1, 7.1, 7.3, 7.4, ...) causing the Studio frontend app to crash have been reviewed and fixed to make Studio more stable.
- Errors displayed in the logs related to the Class Manager has been reviewed to fix the cause of the error message.
Teneo Languages
New versions of all Teneo Conversational Modules and NLU Ontology & Semantic Networks are released with Teneo 7.6 to maintain version alignments.
Teneo Engine
Engine Output Streaming
The Teneo Engine now supports output streaming; that is, the Engine is now able to immediately return the data of an Output node in a Flow graph while it's being processed, before the final Output data of processing a user input request is generated. This streaming Output mode is optional, and the non-streaming option known from Teneo up till now is the default mode.
So, the engine of a published solution now optionally supports output streaming user Server-Sent Event (SSE) messages. Streaming mode is enabled per user input request by providing the new URL request parameter stream
(with or without any value).
An SSE message is sent for each output node in a processed flow. A final SSE message is sent at the end of processing the input request (containing the same accumulated output date as in non-streaming mode), then the request connection is closed.
An example SSE message in a published solution response looks like this:
id: 1676247643849900
event: output
data: {
data: "status":0,
data: "input":{
data: "text":"",
data: "parameters":{"foo":"bar"}
data: },
data: "output":{
data: "text":"Output 1",
data: "emotion":"Emotion 1",
data: "link":"URL-1",
data: "parameters":{"output-1":"foobar"}
data: },
data: "sessionId":"6EC5FD1B3B7ACAAD2E59D3D3AF38EF7B"
data: }
In the Engine's Processing Path data, a new property is added to the event for a given Output node: output parameters. It's a map with string keys and string values. In the LDS data it appears with name output-parameters
as displayed in the following image:
In Tryout, in the Path section, the new property is displayed as shown in the following image below the Output details:
And of course, the information is also displayed in the Output section (again, in the advanced Tryout):
Technology and Deployment
Tech Stack Updates
The tech stack of the Teneo Platform is reviewed and updated for the 7.6 release, including the below mentioned:
- Groovy is updated to version 4.0.21; see more details below
- Jackrabbit Core and Jackrabbit SPI are updated to version 2.20.15 mitigating CVE-2023-6378 and CVE-2022-46337
- Log4j2 updated to version 2.23.1
- Tomcat upgraded to version 9.0.91
- Jackson raised to version 2.16.1
- Kubernetes is updated to version 21.0.0
- Jersey 2.41
- Dropwizard 3.0.7
- ANTLR, used by the language condition parser and the NLU Generator, is raised to version 4 to strengthen security
- MLeap, used by the Class Manager, is raised to version 0.23.1
- Spark, used in Input Processors, Learn and Engine, is upgraded to version 3.5.1
- JUnit updated to version 5
- ProGuard version raised to 7.5.0
- XStream is updated to version 1.4.20
- Commons compress raised to version 1.26.2
- Docsify, used for the Teneo Documentation component, is updated to mitigate the vulnerability CVE-2021-23342.
Complete list of Dependencies and Licenses.
Groovy
Groovy, which is updated to version 4.0.21, brings various new features as part of the Apache Groovy 4.0.21 release - among others important naming/structuring changes, new features, legacy consolidation, JDK requirements, etc. - The complete Groovy release notes listing the updates and breaking changes can be found here on the Apache Groovy website and Teneo users and developers are encouraged to read these to be aware of included changes. Below are summarized several changes affecting the Teneo Platform.
Important Naming/Structure Changes
Groovy 3 provided duplicate versions of numerous classes (in old and new packages) to allow Groovy users to migrate towards the new JPMS compliant package names. See the Groovy 3 release notes for more details. Groovy 4 no longer provides the duplicate legacy classes.
In short, it is time to stop using groovy.util.XmlSlurper
and start using groovy.xml.XmlSlurper
. Similarly, developers should now be using groovy.xml.XmlParser
, groovy.ant.AntBuilder
, groovy.test.GroovyTestCase
and the other classes mentioned in the prior mentioned Groovy 3 release notes.
Other Breaking Changes
- Groovy added some very minor enhancements when using the JAXB technology in its optional
groovy-jaxb
module. Since JAXB is no longer bundled in the JDK, this module is removed from Teneo. Developers wanting that functionality are likely able to use the Groovy 3 version of that module with Groovy 4, though this is not guaranteed going forward (GROOVY-10005). - The optional
groovy-bsf
module provides a Groovy BSF engine for the version 2 of BSF (aka beanshell) framework. This version hasn't had a release since 2005 and has reached end-of-life. In Groovy 4 this module is removed. Developers wanting that functionality are like able to use the Groovy 3 version of that module with Groovy 4, though this is not guaranteed going forward (GROOVY-10023). - Numerous classes previously "leaked" ASM constants which are essentially an internal implementation detail by virtue of implementing an
Opcodes
interface. This will not normally affect the majority of Groovy scripts, but might impact code which manipulates AST nodes such as AST transforms. Before compiling with Groovy 4, some of these may need one or more appropriate static import statements added. AST transforms which extendAbstractASTTransformation
are one example of potentially affected classes (GROOVY-9736). ASTTest
previously hadRUNTIME
retention, but now hasSOURCE
retention and keeping making use of the old retention may cause various issues (GROOVY-9702).- Groovy's
intersect
DGM method had a different semantics to other languages when supplied with a projecting closure/comparator. Other languages often have aintersectBy
method in this case rather than overloading theintersect
operator like Groovy does. When no projecting function is in play,a.intersect(b)
should always equalb.intersect(a)
. When a projecting function is in play, most languages definea.intersect(b)
as the subset of elements froma
which when projected match a projected value fromb
. So, the resulting values are always drawn froma
. The objects involved can be reversed to draw the elements fromb
. Groovy's semantics used to be the reverse of most other languages, but is now aligned. Some examples with the new behavior:
def abs = { a, b -> a.abs() <=> b.abs() }
assert [1, 2].intersect([-2, -3], abs) == [2]
assert [-2, -3].intersect([1, 2], abs) == [-2]
def round = { a, b -> a.round() <=> b.round() }
assert [1.1, 2.2].intersect([2.5, 3.5], round) == [2.2]
assert [2.5, 3.5].intersect([1.1, 2.2], round) == [2.5]
Simply reverse the order of the objects to get the previous behavior, e.g., use foo.intersect(bar)
instead of bar.intersect(foo)
(GROOVY-10275).
- There were some inconsistencies with JavaBean property naming conventions for various edge cases, e.g., for a field with a name being a single uppercase
X
and having agetX
accessor, then the field was given priority over the accessor (GROOVY-9618). - Numerous mostly internal data structure classes, e.g.,
AbstractConcurrentMapBase
,AbstractConcurrentMap
,ManagedConcurrentMap
were deprecated and their usage replaced with better alternatives. This should be mostly invisible, but some changes might impact developers using internal Groovy classes directly (GROOVY-9631). - The Picocli version is bumped which has resulted in minor formatting changes of some CLI help messages. It is recommended to not rely on the exact format of such messages (GROOVY-9627).
- Improvements are currently underway to improve how Groovy code accesses private fields in certain scenarios where such access is expected but problematic, e.g., within closure definitions where subclasses or inner classes are involved (GROOVY-5438). The developer may notice breakage in Groovy 4 code in such scenarios until this issue is progressed. As a workaround in the meantime, the developer may be able to use local variable outside a closure to reference the relevant fields and then reference those local variables in the closure.
- Earlier Groovy versions unintentionally stored the constants -0.0f and -0.0d to be the same as 0.0f and 0.0d, respectively. This only applied to explicit constants, i.e., it didn't apply to calculations which resulted in positive or negative zero. This also meant that certain comparisons of positive and negative zero returned true in cases where they should have been different, and calling
unique
might have resulted in a set containing just positive zero instead of both positive and negative zero (the correct answer as per IEEE-745). Depending on whether one is using primitive or wrapper floating point variants, one may or may not be affected. Consider usingequalsIgnoreZeroSign
and the booleanignoreZeroSign
constructor variant toNumberAwareComparator
if being affected and desiring the old behavior. These modifications have also been back-ported to Groovy 3, so consider using them in Groovy 3 code instead of relying on the old behavior so that the code can work correctly across versions. The fix itself hasn't been back-ported to avoid breaking existing code relying on the unintended flawed behavior. Bug fix: GROOVY-9797; improved documentation and helper methods: GROOVY-9981. - Various Groovy test classes had unnecessary hidden dependencies on JUnit 3/4 classes. After modification, these classes can now be used with e.g., JUnit 5 (or Spock) without Junit 3/4 on the class path. It is a breaking change only if code is looking explicitly at the class of thrown exceptions or inspecting the class hierarchy through reflection.
NotYetImplemented
: GROOVY-9492;GroovyAssert
: GROOVY-9767. - Several
Sql#call
variants incorrectly throwException
rather thanSQLException
. This is a binary breaking change; care should be taken with compiling code relying on those methods with an older version of Groovy and then running on Groovy 4 and vice versa (GROOVY-9923). - The
StaticTypeCheckingVisitor#collectAllInterfacesByName
is removed from the public API as it was buggy and there were numerous alternatives available. No known framework is using this method. Even though it was public, it was considered mostly internal (GROOVY-10123). - Two jar files (
servlet-api.jar
andjsp-api.jar
) were notionally "provided" dependencies, but were previously copied into the Groovy binary distribution. This is no longer the case (GROOVY-9827). - Groovy code involving
plus
on arrays broke referential transparency in certain contexts. The expressionb + c
, whereb
andc
are arrays, potentially gave different results in the two expressionsa = b + c
andb = b + c
. The latter of these expressions (shorthand forb += c
) was type preserving but the former was returned as Object[]. The type preserving behavior was the intended one (GROOVY-6837).
TIP
To mimic the old behavior, if
b
is not an Object array and an Object is desired overb + c
, use one of the following:
b.union(c)
new Object[0] + b + c
[] as Object[] + b + c
- Groovy's syntax borrows an "information hiding principal" idea from the Eiffel programming language whereby accessing a public field or a property (private field with a getter) can have the same syntactic form. This idea wasn't carried over to the
getProperties()
method in an object's metaclass. NowgetProperties()
also returns public fields (GROOVY-10449).
Log4j2
Log4j2 is updated to version 2.23.1.
The new log4j version comes with some more restrictive security settings which might affect Teneo users if they customize the log4j configuration of the Platform applications, among others:
- Scripting now requires a system property be specified naming the languages the user wishes to allow. The scripting engine will not load if the property isn't set.
- By default, the only remote protocol allowed for loading configuration files is HTTPS. Users can specify a system property to allow others or prevent remote loading entirely.
- Variable resolution has been modified so that only properties defined as properties in the configuration file can be recursive. All other Lookups are now non-recursive. This addresses issues users were having resolving lookups specified in property definitions for use in the
RoutingAppender
andRollingFileAppender
due to restrictions put in place in 2.17.1.
See the complete Log4j release notes for a detailed listing of the changes.
Public API
For the 7.6 release, work has been performed to improve the security around access to confidential data and permissions are reviewed to ensure these work as required. The work includes review of the security of API endpoints.
In the Inquire API, the model data returned by the Backend again includes values for currentVersion
and adornedVersion
properties to ensure correct validation as this was mistakenly removed for the Augmenter action endpoint PUT actions/{lds}/{actionId}
in the previous Teneo version.
The Studio API includes new endpoints covering Log Archives, endpoints related to the Localization feature (Master-Local) and also related to library conflicts.
Teneo Manager
An issue discovered in the Teneo Manager User Interface (UI) where groups were not displayed correctly for the logged in user has been fixed to ensure correct visualization of the data.
The Audit log of Teneo Manager is updated so that incorrect login attempts now are logged as unauthorized in the logs; this is done after finding that in Teneo 7.5 these login attempts were incorrectly logged as Errors.
Teneo Documentation
Minor updates are done throughout the reference documentation to cater for the development performed for the 7.6 release.