Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AI-based recommendations with draft #302

Merged
merged 103 commits into from
Jul 11, 2024
Merged
Show file tree
Hide file tree
Changes from 99 commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
21fdba4
Tag recommendation function
HeikoTheissen Aug 17, 2023
0b7c2c1
Unbound actions are simpler
HeikoTheissen Aug 17, 2023
1176d8e
Annotation = action name
HeikoTheissen Aug 17, 2023
083cbf4
remove duplicate
HeikoTheissen Aug 17, 2023
1e1a281
typo
HeikoTheissen Aug 17, 2023
84ef77f
@SNairVinod's suggestion
HeikoTheissen Aug 18, 2023
935506a
@SNairVinod's suggestions
HeikoTheissen Aug 21, 2023
9c29063
As discussed in Albatross
HeikoTheissen Aug 22, 2023
0659d7c
@ralfhandl's suggestion
HeikoTheissen Aug 22, 2023
c7999a8
qualified name
HeikoTheissen Aug 22, 2023
cc17fe9
Insist on functions
HeikoTheissen Aug 22, 2023
f033026
RecommendationsDependency
HeikoTheissen Aug 29, 2023
201048d
Separate retrieval function
HeikoTheissen Aug 30, 2023
ccb0ae4
ComputeFunction -> Function
HeikoTheissen Aug 30, 2023
bccfaaf
Optimization
HeikoTheissen Aug 30, 2023
a61e211
Merge remote-tracking branch 'origin/main' into Common.Recommendations
HeikoTheissen Aug 31, 2023
5e5184e
Merge remote-tracking branch 'origin/main' into Common.Recommendations
HeikoTheissen Aug 31, 2023
fbd1d13
@SNairVinod's proposal
HeikoTheissen Aug 31, 2023
586212a
All URLs relative to the recommendations function request URL
HeikoTheissen Aug 31, 2023
b8ed09d
rephrased
HeikoTheissen Aug 31, 2023
ade2340
added template for asynchronous OData requests
HeikoTheissen Aug 31, 2023
ab48971
@uhlmannm's suggestion
HeikoTheissen Aug 31, 2023
c309707
rephrased
HeikoTheissen Sep 1, 2023
a683229
Async descriptions
HeikoTheissen Sep 1, 2023
8b8c28d
formatting
HeikoTheissen Sep 1, 2023
d3012d0
@SNairVinod's suggestion
HeikoTheissen Sep 1, 2023
fafb6f2
extended `Targets` example
HeikoTheissen Sep 1, 2023
b15b7a0
Relative URLs for undergraduates
HeikoTheissen Sep 1, 2023
780c62a
Templates 1 and 2
HeikoTheissen Sep 1, 2023
b80c8e1
required means required input
HeikoTheissen Sep 4, 2023
9df8274
RecommendationsRoleType w/o flags
HeikoTheissen Sep 12, 2023
bb9610d
Merge remote-tracking branch 'origin/main' into Common.Recommendations
HeikoTheissen Sep 15, 2023
1f1bb4d
@ralfhandl's suggestions
HeikoTheissen Sep 19, 2023
f37b4d8
Don't mention the "return URL" variant
HeikoTheissen Sep 19, 2023
9e684bc
Flow diagram in separate document
HeikoTheissen Sep 20, 2023
ace9242
link to diagram
HeikoTheissen Sep 20, 2023
2748840
Enable Mermaid diagrams and Math Jax formulas
HeikoTheissen Sep 20, 2023
23391ff
Sessions are on server, not client
HeikoTheissen Sep 20, 2023
a68ea66
Required -> RequiredInput
HeikoTheissen Sep 20, 2023
a939cf5
@uhlmannm's suggestion
HeikoTheissen Sep 21, 2023
e8dd3f0
Avoid collection-valued parameters
HeikoTheissen Sep 21, 2023
d6dd053
Newlines are better separators
HeikoTheissen Sep 21, 2023
f1a2af5
Revert to Collection(Edm.String)
HeikoTheissen Sep 21, 2023
a0317f4
Targets parameter optional
HeikoTheissen Sep 22, 2023
e2630ee
Use global field names
HeikoTheissen Sep 22, 2023
a5e657d
auto-refreshed
HeikoTheissen Sep 25, 2023
5bd26a1
prefix AI
HeikoTheissen Sep 27, 2023
9b48544
auto-refreshed
HeikoTheissen Sep 28, 2023
a7f5321
Unabbreviated field names
HeikoTheissen Sep 28, 2023
d72cd8a
Recommendation path format
HeikoTheissen Sep 28, 2023
e2d631e
Merge branch 'Common.Recommendations' of [email protected]:SAP/odata-voc…
HeikoTheissen Sep 28, 2023
5387fe6
Recommendation path format according to @SNairVinod
HeikoTheissen Sep 29, 2023
954043f
auto-refreshed
HeikoTheissen Sep 29, 2023
241e192
No leading slash in AIRecommendedFieldPath
HeikoTheissen Sep 29, 2023
6e456e1
Merge branch 'Common.Recommendations' of [email protected]:SAP/odata-voc…
HeikoTheissen Sep 29, 2023
3c93623
Corrected reference
HeikoTheissen Sep 29, 2023
2d5cf09
prettier
HeikoTheissen Oct 2, 2023
31891b6
auto-refreshed
HeikoTheissen Oct 2, 2023
a6d91f0
@ralfhandl's suggestions
HeikoTheissen Oct 4, 2023
0c12fe6
Merge branch 'Common.Recommendations' of [email protected]:SAP/odata-voc…
HeikoTheissen Oct 4, 2023
02fb049
Merge branch 'Common.Recommendations' of
HeikoTheissen Oct 4, 2023
aaf2fee
AI prefixes
HeikoTheissen Oct 4, 2023
5662b6f
new AI vocabulary
HeikoTheissen Oct 4, 2023
f02169a
file move
HeikoTheissen Oct 4, 2023
bc27018
Allowed Values
HeikoTheissen Oct 4, 2023
17c17b1
namespace AI
HeikoTheissen Oct 4, 2023
f1732f7
@ralfhandl's suggestion
HeikoTheissen Oct 5, 2023
ef4578e
Corrected over-eager search/replace
HeikoTheissen Oct 5, 2023
0099ef7
Targets -> AIRecommendationTargets
HeikoTheissen Oct 10, 2023
760f8ea
Syntax for AIRecommendationTargets
HeikoTheissen Oct 10, 2023
f72dee3
Corrected parameter syntax
HeikoTheissen Oct 17, 2023
45c722f
CCTS-compliant field name
HeikoTheissen Oct 20, 2023
c65f472
auto-refreshed
HeikoTheissen Oct 20, 2023
53a5f71
Corrected Text annotation
HeikoTheissen Oct 26, 2023
8fff62e
Allowed values are strings
HeikoTheissen Nov 23, 2023
ceb9b45
Long-term signature of recommendations function (#291)
HeikoTheissen Nov 23, 2023
3b69ed9
Flag suggestions
HeikoTheissen Jan 10, 2024
963984a
Prepare for abolition of Core.IsSignature
HeikoTheissen Jan 10, 2024
6b895b4
AI-based recommendations with draft
HeikoTheissen Jan 11, 2024
e75e404
No key properties necessary
HeikoTheissen Jan 11, 2024
b139a66
Alternative with web sockets
HeikoTheissen Jan 11, 2024
aab1680
Rephrased
HeikoTheissen Jan 12, 2024
6b7977e
As discussed with @MarcelWaechter and @RaizoC
HeikoTheissen Jan 23, 2024
2091d58
AI -> UI
HeikoTheissen Jan 24, 2024
d8f3983
Merge remote-tracking branch 'origin/main' into Common.Recommendations2
HeikoTheissen Jan 24, 2024
6470843
@ralfhandl's suggestions
HeikoTheissen Jan 24, 2024
13adff8
Update README.md
HeikoTheissen Jan 24, 2024
e116639
Update docs/recommendations.md
HeikoTheissen Jan 24, 2024
16b1219
Don't mention SAP__Recommendations
HeikoTheissen Jan 24, 2024
ec740bf
Merge remote-tracking branch 'origin/main' into Common.Recommendations2
HeikoTheissen Feb 27, 2024
b429969
SuggestionScore
HeikoTheissen Mar 4, 2024
bf34318
New annotation type
HeikoTheissen Mar 4, 2024
020880a
Don't mention AI
HeikoTheissen Mar 5, 2024
9061eae
Correct indentation
HeikoTheissen Mar 5, 2024
2962d85
Text property is optional
HeikoTheissen Mar 7, 2024
e48a1a7
Merge remote-tracking branch 'origin/main' into Common.Recommendations2
HeikoTheissen Apr 11, 2024
60ecaf8
auto-refreshed
HeikoTheissen Apr 11, 2024
58949b2
AppliesTo EntityType
HeikoTheissen Apr 17, 2024
96e275c
Merge branch 'Common.Recommendations2' of [email protected]:SAP/odata-vo…
HeikoTheissen Apr 17, 2024
cdcdf88
Merge remote-tracking branch 'origin/main' into Common.Recommendations2
HeikoTheissen Jun 27, 2024
44feef8
Fixed property names
HeikoTheissen Jun 27, 2024
821d368
@ralfhandl's suggestions
HeikoTheissen Jul 11, 2024
b7c5b99
@ralfhandl's suggestion
HeikoTheissen Jul 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 91 additions & 0 deletions docs/recommendations.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
Entity types for which recommendations are available have an additional property carrying the recommendations and the following annotation pointing to this property:
```xml
<EntityType Name="...">
<Annotation Term="UI.Recommendations" Path="SAP__Recommendations" />
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.String" Nullable="false" />
<Property Name="DocumentType" Type="Edm.String" />
...
<Property Name="SAP__Recommendations" Type="self.RecommendationsType" />
</EntityType>
<ComplexType Name="RecommendationsType">
<Property Name="DocumentType" Type="Collection(UI.PropertyRecommendationType)" />
...
</ComplexType>
```

Clients request recommendations from the server at their discretion.

```mermaid
sequenceDiagram
actor client as Fiori client
actor otherclient as Other Fiori client<br>of same collaborative draft
box ABAP
participant server as OData service
participant task as New task
end
participant AI as BTP recommendations service
client ->>+ server: POST $batch
server ->> server: PATCH SalesOrder('A')
server ->> server: GET SalesOrder('A')?$expand=... for side effects
server -->> client: $batch response
par server decides whether to update recommendations
opt input for recommendations has changed
server ->>+ task: call function ... starting new task
deactivate server
task ->>+ AI: compute recommendations
AI -->>- task: return recommendations
task ->> task: update recommendations in draft
deactivate task
end
and
client ->>+ server: GET SalesOrder('A')?$select=SAP__Recommendations&$expand=...
server ->> server: read recommendations from draft
server -->>- client: return recommendations
and
otherclient ->>+ server: GET SalesOrder('A')?$select=SAP__Recommendations&$expand=...
server ->> server: read recommendations from draft
server -->>- otherclient: return recommendations
end
```

Alternatively, clients can be notified via web socket if recommendations have been updated.

```mermaid
sequenceDiagram
actor client as Fiori client
actor otherclient as Other Fiori client<br>of same collaborative draft
box ABAP
participant server as OData service
participant task as New task
end
participant AI as BTP recommendations service
client ->>+ server: POST $batch
server ->> server: PATCH SalesOrder('A')
server ->> server: GET SalesOrder('A')?$expand=... for side effects
server -->> client: $batch response
opt input for recommendations has changed
server ->>+ task: call function ... starting new task
deactivate server
task ->>+ AI: compute recommendations
AI -->>- task: return recommendations
task ->> task: update recommendations in draft
par
task ->> client: notify client of updated recommendations
and
task ->> otherclient: notify client of updated recommendations
end
deactivate task
par
client ->>+ server: GET SalesOrder('A')?$select=SAP__Recommendations&$expand=...
server ->> server: read recommendations from draft
server -->>- client: return recommendations
and
otherclient ->>+ server: GET SalesOrder('A')?$select=SAP__Recommendations&$expand=...
server ->> server: read recommendations from draft
server -->>- otherclient: return recommendations
end
end
```
37 changes: 37 additions & 0 deletions vocabularies/UI.json
Original file line number Diff line number Diff line change
Expand Up @@ -1696,6 +1696,43 @@
"@Core.Description": "Path to property in the collection of recommended values. Format is identical to PropertyPath annotations."
}
},
"Recommendations": {
"$Kind": "Term",
"$Type": "Edm.ComplexType",
"$AppliesTo": ["EntityType"],
"@Common.Experimental": true,
"@Core.Description": "Recommendations for an entity",
"@Core.LongDescription": "This complex-typed annotation contains structural properties corresponding via name equality\nto non-key structural properties of the entity type for which recommendations are available.\nThe type of such a property is a collection of an informal specialization of [`PropertyRecommendationType`](#PropertyRecommendationType).\n\nClients retrieve the recommendations with a GET request that includes this annotation in a `$select` clause.\nThe recommendations SHOULD be computed asynchronously, see [this diagram](../docs/recommendations.md)."
},
"PropertyRecommendationType": {
"$Kind": "ComplexType",
"$Abstract": true,
"@Common.Experimental": true,
"@Core.Description": "Base type containing recommendations for an entity type property",
"@Core.LongDescription": "Informal specializations of this base type have four properties:\n- a property that is the target of a [`Common.Text`](Common.md#Text) annotation, its name may differ from `RecommendedFieldValue`\n- a property to which the `Common.Text` annotation evaluates, its name may differ from `RecommendedFieldDescription`\n- a property named `RecommendedFieldScoreValue`\n- a Boolean property named `RecommendedFieldIsSuggestion`.",
"RecommendedFieldValue": {
"$Type": "Edm.PrimitiveType",
"@Core.Description": "Recommended value",
"@Core.LongDescription": "In specializations of this base type, this property is specialized to the primitive type of the entity type property.",
"@Common.Text": { "$Path": "RecommendedFieldDescription" }
},
"RecommendedFieldDescription": {
"$Nullable": true,
"@Core.Description": "Description of the recommended value",
"@Core.LongDescription": "In specializations of this base type, this property is specialized to the string type of the text property corresponding to the entity type property.\n This property is omitted from specializations for recommendations without text."
},
"RecommendedFieldScoreValue": {
"$Type": "Edm.Decimal",
"$Nullable": true,
"@Core.Description": "Confidence score of the recommended value"
},
"RecommendedFieldIsSuggestion": {
"$Type": "Edm.Boolean",
"$DefaultValue": false,
"@Core.Description": "Whether the recommended value shall be suggested in the input field",
"@Core.LongDescription": "For any collection of a specialization of `PropertyRecommendationType`\n in a property containing [`Recommendations`](#Recommendations),\n this flag can be true in at most one instance of the collection,\n and only if the `RecommendedFieldScoreValue` exceeds a certain threshold."
}
},
"ExcludeFromNavigationContext": {
"$Kind": "Term",
"$Type": "Core.Tag",
Expand Down
26 changes: 22 additions & 4 deletions vocabularies/UI.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,10 @@ Term|Type|Description
[ParameterDefaultValue](./UI.xml#L1789:~:text=<Term%20Name="-,ParameterDefaultValue,-")|PrimitiveType?|<a name="ParameterDefaultValue"></a>Define default values for action parameters<br>For unbound actions the default value can either be a constant expression, or a dynamic expression using absolute paths, e.g. singletons or function import results. Whereas for bound actions the bound entity and its properties and associated properties can be used as default values
[RecommendationState](./UI.xml#L1795:~:text=<Term%20Name="-,RecommendationState,-")|[RecommendationStateType](#RecommendationStateType)|<a name="RecommendationState"></a>Indicates whether a field contains or has a recommended value<br>Intelligent systems can help users by recommending input the user may "prefer".
[RecommendationList](./UI.xml#L1825:~:text=<Term%20Name="-,RecommendationList,-")|[RecommendationListType](#RecommendationListType)|<a name="RecommendationList"></a>Specifies how to get a list of recommended values for a property or parameter<br>Intelligent systems can help users by recommending input the user may "prefer".
[ExcludeFromNavigationContext](./UI.xml#L1857:~:text=<Term%20Name="-,ExcludeFromNavigationContext,-")|[Tag](https://github.com/oasis-tcs/odata-vocabularies/blob/main/vocabularies/Org.OData.Core.V1.md#Tag)|<a name="ExcludeFromNavigationContext"></a>The contents of this property must not be propagated to the app-to-app navigation context
[DoNotCheckScaleOfMeasuredQuantity](./UI.xml#L1861:~:text=<Term%20Name="-,DoNotCheckScaleOfMeasuredQuantity,-") *([Experimental](Common.md#Experimental))*|Boolean|<a name="DoNotCheckScaleOfMeasuredQuantity"></a>Do not check the number of fractional digits of the annotated measured quantity<br>The annotated property contains a measured quantity, and the user may enter more fractional digits than defined for the corresponding unit of measure.<br/>This switches off the validation of user input with respect to decimals.
[LeadingEntitySet](./UI.xml#L1871:~:text=<Term%20Name="-,LeadingEntitySet,-") *([Experimental](Common.md#Experimental))*|String|<a name="LeadingEntitySet"></a>The referenced entity set is the preferred starting point for UIs using this service
[Recommendations](./UI.xml#L1857:~:text=<Term%20Name="-,Recommendations,-") *([Experimental](Common.md#Experimental))*|ComplexType|<a name="Recommendations"></a>Recommendations for an entity<br>This complex-typed annotation contains structural properties corresponding via name equality to non-key structural properties of the entity type for which recommendations are available. The type of such a property is a collection of an informal specialization of [`PropertyRecommendationType`](#PropertyRecommendationType).<br/>Clients retrieve the recommendations with a GET request that includes this annotation in a `$select` clause. The recommendations SHOULD be computed asynchronously, see [this diagram](../docs/recommendations.md).
[ExcludeFromNavigationContext](./UI.xml#L1907:~:text=<Term%20Name="-,ExcludeFromNavigationContext,-")|[Tag](https://github.com/oasis-tcs/odata-vocabularies/blob/main/vocabularies/Org.OData.Core.V1.md#Tag)|<a name="ExcludeFromNavigationContext"></a>The contents of this property must not be propagated to the app-to-app navigation context
[DoNotCheckScaleOfMeasuredQuantity](./UI.xml#L1911:~:text=<Term%20Name="-,DoNotCheckScaleOfMeasuredQuantity,-") *([Experimental](Common.md#Experimental))*|Boolean|<a name="DoNotCheckScaleOfMeasuredQuantity"></a>Do not check the number of fractional digits of the annotated measured quantity<br>The annotated property contains a measured quantity, and the user may enter more fractional digits than defined for the corresponding unit of measure.<br/>This switches off the validation of user input with respect to decimals.
[LeadingEntitySet](./UI.xml#L1921:~:text=<Term%20Name="-,LeadingEntitySet,-") *([Experimental](Common.md#Experimental))*|String|<a name="LeadingEntitySet"></a>The referenced entity set is the preferred starting point for UIs using this service

<a name="HeaderInfoType"></a>
## [HeaderInfoType](./UI.xml#L68:~:text=<ComplexType%20Name="-,HeaderInfoType,-")
Expand Down Expand Up @@ -1138,8 +1139,25 @@ Property|Type|Description
[LocalDataProperty](./UI.xml#L1849:~:text=<ComplexType%20Name="-,RecommendationBinding,-")|PropertyPath|Path to editable property for which recommended values exist
[ValueListProperty](./UI.xml#L1852:~:text=<ComplexType%20Name="-,RecommendationBinding,-")|String|Path to property in the collection of recommended values. Format is identical to PropertyPath annotations.

<a name="PropertyRecommendationType"></a>
## [*PropertyRecommendationType*](./UI.xml#L1869:~:text=<ComplexType%20Name="-,PropertyRecommendationType,-") *([Experimental](Common.md#Experimental))*
Base type containing recommendations for an entity type property

Informal specializations of this base type have four properties:
- a property that is the target of a [`Common.Text`](Common.md#Text) annotation, its name may differ from `RecommendedFieldValue`
- a property to which the `Common.Text` annotation evaluates, its name may differ from `RecommendedFieldDescription`
- a property named `RecommendedFieldScoreValue`
- a Boolean property named `RecommendedFieldIsSuggestion`.

Property|Type|Description
:-------|:---|:----------
[RecommendedFieldValue](./UI.xml#L1879:~:text=<ComplexType%20Name="-,PropertyRecommendationType,-")|PrimitiveType|Recommended value<br>In specializations of this base type, this property is specialized to the primitive type of the entity type property.
[RecommendedFieldDescription](./UI.xml#L1886:~:text=<ComplexType%20Name="-,PropertyRecommendationType,-")|String?|Description of the recommended value<br>In specializations of this base type, this property is specialized to the string type of the text property corresponding to the entity type property. This property is omitted from specializations for recommendations without text.
[RecommendedFieldScoreValue](./UI.xml#L1893:~:text=<ComplexType%20Name="-,PropertyRecommendationType,-")|Decimal?|Confidence score of the recommended value
[RecommendedFieldIsSuggestion](./UI.xml#L1896:~:text=<ComplexType%20Name="-,PropertyRecommendationType,-")|Boolean|Whether the recommended value shall be suggested in the input field<br>For any collection of a specialization of `PropertyRecommendationType` in a property containing [`Recommendations`](#Recommendations), this flag can be true in at most one instance of the collection, and only if the `RecommendedFieldScoreValue` exceeds a certain threshold.

<a name="ActionName"></a>
## [ActionName](./UI.xml#L1876:~:text=<TypeDefinition%20Name="-,ActionName,-")
## [ActionName](./UI.xml#L1926:~:text=<TypeDefinition%20Name="-,ActionName,-")
**Type:** String

Name of an Action, Function, ActionImport, or FunctionImport in scope
Expand Down
50 changes: 50 additions & 0 deletions vocabularies/UI.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1854,6 +1854,56 @@ This is in contrast to [DataFieldForIntentBasedNavigation](#DataFieldForIntentBa
</Property>
</ComplexType>

<Term Name="Recommendations" Type="Edm.ComplexType" Nullable="false" AppliesTo="EntityType">
<Annotation Term="Common.Experimental" />
<Annotation Term="Core.Description" String="Recommendations for an entity" />
<Annotation Term="Core.LongDescription">
<String>This complex-typed annotation contains structural properties corresponding via name equality
to non-key structural properties of the entity type for which recommendations are available.
ralfhandl marked this conversation as resolved.
Show resolved Hide resolved
The type of such a property is a collection of an informal specialization of [`PropertyRecommendationType`](#PropertyRecommendationType).
ralfhandl marked this conversation as resolved.
Show resolved Hide resolved

Clients retrieve the recommendations with a GET request that includes this annotation in a `$select` clause.
The recommendations SHOULD be computed asynchronously, see [this diagram](../docs/recommendations.md).</String>
ralfhandl marked this conversation as resolved.
Show resolved Hide resolved
</Annotation>
</Term>
<ComplexType Name="PropertyRecommendationType" Abstract="true">
<Annotation Term="Common.Experimental" />
<Annotation Term="Core.Description" String="Base type containing recommendations for an entity type property" />
<Annotation Term="Core.LongDescription">
<String>Informal specializations of this base type have four properties:
- a property that is the target of a [`Common.Text`](Common.md#Text) annotation, its name may differ from `RecommendedFieldValue`
- a property to which the `Common.Text` annotation evaluates, its name may differ from `RecommendedFieldDescription`
HeikoTheissen marked this conversation as resolved.
Show resolved Hide resolved
- a property named `RecommendedFieldScoreValue`
- a Boolean property named `RecommendedFieldIsSuggestion`.</String>
</Annotation>
<Property Name="RecommendedFieldValue" Type="Edm.PrimitiveType" Nullable="false">
<Annotation Term="Core.Description" String="Recommended value" />
<Annotation Term="Core.LongDescription">
<String>In specializations of this base type, this property is specialized to the primitive type of the entity type property.</String>
</Annotation>
<Annotation Term="Common.Text" Path="RecommendedFieldDescription" />
</Property>
<Property Name="RecommendedFieldDescription" Type="Edm.String" Nullable="true">
<Annotation Term="Core.Description" String="Description of the recommended value" />
<Annotation Term="Core.LongDescription">
<String>In specializations of this base type, this property is specialized to the string type of the text property corresponding to the entity type property.
This property is omitted from specializations for recommendations without text.</String>
</Annotation>
</Property>
<Property Name="RecommendedFieldScoreValue" Type="Edm.Decimal" Scale="variable" Nullable="true">
<Annotation Term="Core.Description" String="Confidence score of the recommended value" />
</Property>
<Property Name="RecommendedFieldIsSuggestion" Type="Edm.Boolean" Nullable="false" DefaultValue="false">
<Annotation Term="Core.Description" String="Whether the recommended value shall be suggested in the input field" />
<Annotation Term="Core.LongDescription">
<String>For any collection of a specialization of `PropertyRecommendationType`
in a property containing [`Recommendations`](#Recommendations),
this flag can be true in at most one instance of the collection,
and only if the `RecommendedFieldScoreValue` exceeds a certain threshold.</String>
</Annotation>
</Property>
</ComplexType>

<Term Name="ExcludeFromNavigationContext" Type="Core.Tag" Nullable="false" DefaultValue="true" AppliesTo="Property">
<Annotation Term="Core.Description" String="The contents of this property must not be propagated to the app-to-app navigation context" />
</Term>
Expand Down