diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index dbee4d36f..8461327d3 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -8,6 +8,125 @@ This page documents the changes introduced in each release of the Visual Embed SDK. For information about the REST API v2.0 changes, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. +== Version 1.53.0, October 2026 + +[width="100%", cols="1,4"] +|==== +|[tag greenBackground]#NEW# +a| +[discrete] +===== Spotter Analyst embed (`spotterAnalystConfig`) + +You can now embed a single, pinned Spotter Analyst using `spotterAnalystConfig.analystId` in `SpotterEmbed`. Setting this property locks the embed to one governed Analyst and prevents users from navigating to other Analysts or to the default Spotter. + +New and updated configuration properties: + +`SpotterAnalystConfig.analystId` (string):: +Pins the embed to the Analyst with this GUID. Available from cluster version 26.10.0.cl. + +`spotterChatPinConfig` (on `SpotterSidebarViewConfig`):: +Enables pinning and unpinning of conversations in the sidebar. Contains `enabled` (boolean, default `false`), `pinLabel` (string), and `unpinLabel` (string). Available from cluster version 26.10.0.cl. + +`isScopedLiveboardFilteringEnabled` (on `LiveboardViewConfig` and `AppViewConfig`):: +Enables group-level filter and parameter scoping on Liveboards, in addition to existing Liveboard-level and tab-level scoping. Available from cluster version 26.10.0.cl. + +`starterPrompts` (on `SpotterChatViewConfig`):: +Configures which starter prompt pills are shown above the Spotter chat input. Contains keys: `enable`, `quick`, `research`, `previewData`, and `liveboard`. Available from cluster version 26.10.0.cl. + +`openSpotterOnLiveboardByDefault` (on `SpotterChatViewConfig`):: +Opens the Spotter chat panel automatically when a Liveboard loads. Default: `true`. Supported on `LiveboardEmbed` and `AppEmbed`. Available from cluster version 26.10.0.cl. + +For more information, see xref:embed-spotter-analyst.adoc[Embed Spotter Analyst]. + +|[tag greenBackground]#NEW# +a| +[discrete] +===== New `Action` enum members + +The following `Action` enum members are added in this release: + +[cols="2,3"] +!=== +! Action ! Description + +! `Action.SpotterChatPin` +! Controls the visibility and disabled state of the pin and unpin action in the Spotter conversation edit menu. + +! `Action.SpotterAnalystList` +! Controls the visibility and disabled state of the Show all Analysts row in the Analyst interface. + +! `Action.SpotterDefaultAnalyst` +! Controls the visibility and disabled state of the default Spotter analyst entry in the Analyst interface. + +! `Action.SpotterOnLiveboard` +! Controls the Spotter button in the Liveboard header. + +! `Action.AllLiveboardFilters` +! Shows, hides, or disables all filter surfaces on a Liveboard: filter chips, parameter chips, and cross-filter chips at the Liveboard, tab, and group levels. Parameter and cross-filter chips support hide only and cannot be disabled. + +! `Action.EditInputTable` +! Edits an input table used by an Answer directly from the Liveboard. + +! `Action.QuickSearchPill` +! Controls the Basic Search starter-prompt pill in the Spotter interface. + +! `Action.DeepAnalysisPill` +! Controls the Deep Analysis starter-prompt pill in the Spotter interface. + +! `Action.DataLiteracyPill` +! Controls the Data Literacy starter-prompt pill in the Spotter interface. +!=== + +|[tag greenBackground]#NEW# +a| +[discrete] +===== New `EmbedEvent` members + +`EmbedEvent.SpotterConversationPinned`:: +Emitted when a user pins a Spotter conversation. Payload: `{ conversationId, pinnedAt }`. Requires `spotterChatPinConfig.enabled: true` and `enablePastConversationsSidebar: true`. + +`EmbedEvent.SpotterConversationUnpinned`:: +Emitted when a user unpins a Spotter conversation. Payload: `{ conversationId, unpinnedAt }`. Requires `spotterChatPinConfig.enabled: true` and `enablePastConversationsSidebar: true`. + +The following existing `EmbedEvent` members gained an optional `applicability` attribute for scoped filter and parameter operations: + +* `EmbedEvent.FilterChanged` +* `EmbedEvent.ParameterChanged` + +|[tag greenBackground]#NEW# +a| +[discrete] +===== New `HostEvent` members + +`HostEvent.PinSpotterConversation`:: +Pins a saved Spotter conversation. Accepts `{ conversationId }`. Requires `enablePastConversationsSidebar: true` on the instance. + +`HostEvent.UnpinSpotterConversation`:: +Unpins a previously pinned Spotter conversation. Accepts `{ conversationId }`. Requires `enablePastConversationsSidebar: true` on the instance. + +`HostEvent.GetGroups`:: +Returns filter and parameter group details for the current Liveboard. Response includes `orderedGroupIds`, `numberOfGroups`, and `Groups`. + +`HostEvent.OpenParameter`:: +Opens the parameter panel for a specific parameter on the Liveboard. Accepts an optional `applicability` object to scope the action to a tab or group. + +The following existing `HostEvent` members gained an optional `applicability` attribute for scoping to a Liveboard tab or group: + +* `HostEvent.OpenFilter` +* `HostEvent.GetFilters` +* `HostEvent.UpdateFilters` +* `HostEvent.UpdateParameters` +* `HostEvent.GetParameters` + +|[tag yellowBackground]#DEPRECATED# +a| +[discrete] +===== `HostEvent.UpdatePersonalizedView` deprecated + +`HostEvent.UpdatePersonalizedView` is deprecated in this release. Use `HostEvent.SelectPersonalizedView` instead. The replacement accepts an optional `viewName` to select a view by name, resets to the original view when the payload is empty, and reports an error when the named view is not found. + +|==== + == Version 1.52.x, September 2026 [width="100%" cols="1,4"] diff --git a/modules/ROOT/pages/embed-spotter-analyst.adoc b/modules/ROOT/pages/embed-spotter-analyst.adoc new file mode 100644 index 000000000..badd322a1 --- /dev/null +++ b/modules/ROOT/pages/embed-spotter-analyst.adoc @@ -0,0 +1,300 @@ += Embed Spotter Analyst +:toc: true +:toclevels: 2 + +:page-title: Embed Spotter Analyst +:page-pageid: embed-spotter-analyst +:page-description: Embed a single, pinned Spotter Analyst in your application using the Visual Embed SDK + +// SOURCE: SCAL-317811, SDK-1.53.0-changelog.md, Spotter embed developer cheatsheet + +ThoughtSpot Spotter Analysts are governed AI agents configured with specific data sources, instructions, and starter prompts. Using the Visual Embed SDK, you can embed a single, pinned Analyst in your application. This locks the embed to one governed experience and prevents users from switching to other Analysts or to the default Spotter. + +== Version requirements + +[cols="1,2"] +|=== +| Component | Minimum version + +| Visual Embed SDK | 1.51.2 +| ThoughtSpot cluster | 26.10.0.cl +|=== + +[NOTE] +==== +Some controls described in this page are available on earlier cluster versions (26.3 through 26.9). The `spotterAnalystConfig.analystId` property itself requires cluster version 26.10.0.cl. Use 26.10.0.cl as the minimum version requirement when setting up the single-Analyst embed configuration. +==== + +== How it works + +Use `spotterAnalystConfig.analystId` in `SpotterEmbed` to pin the embed to one Analyst. By default, with no additional configuration, the Analyst panel and a switcher rail remain visible and users can navigate to other Analysts. To create a fully locked experience, you must also hide the switcher actions. + +== Minimal configuration + +The following example embeds one Analyst with the chat history sidebar disabled and the switcher hidden: + +[source,javascript] +---- +// In server-side rendered frameworks (Next.js, Nuxt, SvelteKit), +// import the SDK dynamically to avoid window reference errors. +const { init, SpotterEmbed, AuthType } = + await import('@thoughtspot/visual-embed-sdk'); + +init({ + thoughtSpotHost: 'https://{cluster}', + authType: AuthType.None, // uses the browser's existing session +}); + +new SpotterEmbed(container, { + frameParams: { width: '100%', height: '100%' }, + worksheetId: '{model-guid}', + + // Pin to one Analyst. + spotterAnalystConfig: { analystId: '{analyst-guid}' }, + + // Disable the chat history sidebar. + spotterSidebarConfig: { enablePastConversationsSidebar: false }, + + // Hide the switcher so users cannot navigate to a different Analyst. + hiddenActions: [ + 'spotterAnalystSidebar', + 'spotterDefaultAnalyst', + 'spotterAnalystList', + ], + + hideSourceSelection: true, + disableSourceSelection: true, +}).render(); +---- + +== Configuration reference + +=== `spotterAnalystConfig` + +Type: `SpotterAnalystConfig`. Available from SDK 1.53.0 and ThoughtSpot Cloud 26.10.0.cl. + +Available on `SpotterEmbedViewConfig`. Pins the embed to a single Analyst. + +[cols="1,1,1,3"] +|=== +| Property | Type | Cluster version | Description + +| `analystId` +| string +| 26.10.0.cl +| GUID of the Analyst to display. Obtain this value from the xref:spotter-analyst-api.adoc[Spotter Analyst API] or from the ThoughtSpot UI. +|=== + +=== `spotterSidebarConfig` + +Type: `SpotterSidebarViewConfig`. + +[cols="1,1,1,3"] +|=== +| Property | Type | Cluster version | Description + +| `enablePastConversationsSidebar` +| boolean +| 26.4.0.cl +| Shows or hides the chat history sidebar. Set this property explicitly. Leaving it unset applies the cluster default, which may be `true`. + +| `spotterChatPinConfig` +| `SpotterChatPinConfig` +| 26.10.0.cl +| Enables pinning and unpinning conversations in the sidebar. See xref:embed-spotter-analyst.adoc#pinning-conversations[Pinning conversations]. +|=== + +=== `worksheetId` and `dataSources` + +[cols="1,1,3"] +|=== +| Property | Cluster version | Description + +| `worksheetId` +| All +| GUID of the single model Spotter queries. Include this property alongside `spotterAnalystConfig`. Omitting it can prevent host-triggered questions from executing. + +| `dataSources` +| 26.9.0.cl +| Array of model GUIDs when the Analyst spans multiple models. If both `dataSources` and `worksheetId` are set, `dataSources` takes precedence. +|=== + +=== Locking the embed with `hiddenActions` + +Pinning an Analyst without hiding the switcher only changes the default selection. Users can still navigate to a different Analyst. Use the following three action IDs together to prevent this: + +[cols="1,1,1"] +|=== +| Action ID | What it hides | Cluster version + +| `spotterAnalystSidebar` +| The Analyst selection panel +| 26.8.0.cl + +| `spotterDefaultAnalyst` +| The default Spotter row +| 26.10.0.cl + +| `spotterAnalystList` +| The Show all Analysts row +| 26.10.0.cl +|=== + +[NOTE] +==== +An action ID not recognized by the cluster is silently dropped and does not cause an error. You can include all three action IDs even when targeting a cluster that does not yet support one of them. +==== + +If a narrow sidebar rail (expand toggle, New chat icon, or footer gear icon) remains visible after hiding these three actions, add the following shell-level action IDs. These are supported from cluster version 26.3.0.cl: + +[source,javascript] +---- +hiddenActions: [ + 'spotterAnalystSidebar', + 'spotterDefaultAnalyst', + 'spotterAnalystList', + 'spotterSidebarOpen', + 'spotterSidebarClose', + 'spotterNewConversation', + 'spotterSidebarSettings', +], +---- + +=== Starter prompts + +Use `starterPrompts` in `SpotterChatViewConfig` to customize the starter prompt pills displayed above the chat input. + +[cols="1,1,1,3"] +|=== +| Property | Type | Cluster version | Description + +| `starterPrompts` +| `StarterPromptsConfig` +| 26.10.0.cl +| Top-level configuration object for Spotter starter prompts. Contains keys: `enable`, `quick`, `research`, `previewData`, and `liveboard`. + +| `openSpotterOnLiveboardByDefault` +| boolean +| 26.10.0.cl +| Opens the Spotter chat panel automatically when a Liveboard loads. Default: `true`. Supported in `LiveboardEmbed` and `AppEmbed`. +|=== + +To show or hide individual starter prompt pills, use the `Action` enum: + +[cols="1,3"] +|=== +| Action | Description + +| `Action.QuickSearchPill` +| The Basic Search starter-prompt pill. Opens a card of suggested questions that submit on click. + +| `Action.DeepAnalysisPill` +| The Deep Analysis pill. Fills the chat input with a suggested question without auto-submitting. + +| `Action.DataLiteracyPill` +| The Data Literacy pill. Submits a backend-generated prompt describing the data source. Only its label is customizable. +|=== + +[source,javascript] +---- +hiddenActions: [ + Action.QuickSearchPill, + Action.DeepAnalysisPill, + Action.DataLiteracyPill, +], +---- + +[NOTE] +==== +Setting `hideSampleQuestions: true` hides both the generic sample questions and the Analyst's own starter prompts, as they share the same block. This is generally not the intended behavior when embedding a governed Analyst. +==== + +=== Pre-filling the chat input + +Use `searchOptions.searchQuery` to pre-fill the prompt. This does not submit the question. To submit it, also fire `HostEvent.SpotterSearch` with `executeSearch: true`. + +[source,javascript] +---- +new SpotterEmbed(container, { + searchOptions: { + searchQuery: 'What was total revenue last quarter?', + }, + // ... +}).render(); +---- + +[#pinning-conversations] +== Pinning conversations + +`SpotterChatPinConfig` lets users pin Spotter conversations so they appear at the top of the sidebar for quick access. Pinning is disabled by default in embedded deployments and must be explicitly enabled. + +[cols="1,1,1,3"] +|=== +| Property | Type | Default | Description + +| `enabled` +| boolean +| `false` +| Enables the pin and unpin actions in the conversation edit menu. Set to `true` to allow users to pin conversations. + +| `pinLabel` +| string +| System default +| Custom label for the pin action in the conversation edit menu. + +| `unpinLabel` +| string +| System default +| Custom label for the unpin action in the conversation edit menu. +|=== + +[source,javascript] +---- +new SpotterEmbed(container, { + spotterSidebarConfig: { + enablePastConversationsSidebar: true, + spotterChatPinConfig: { + enabled: true, + pinLabel: 'Save to top', + unpinLabel: 'Remove from top', + }, + }, + // ... +}).render(); +---- + +To listen for pin and unpin events, or to trigger pin state programmatically from the host application, see xref:event-embedEvents.adoc#pin-events[Spotter pin and unpin events] and xref:events-hostEvents.adoc#spotter-pin-host-events[Spotter conversation pin and unpin]. + +== New actions in SDK 1.53.0 + +The following `Action` enum members are new in SDK 1.53.0 and are relevant to Analyst embed: + +[cols="1,3"] +|=== +| Action | Description + +| `Action.SpotterChatPin` +| Controls visibility and disabled state of the pin and unpin action in the Spotter conversation edit menu. + +| `Action.SpotterAnalystList` +| Controls visibility and disabled state of the Show all Analysts row in the Analyst interface. + +| `Action.SpotterDefaultAnalyst` +| Controls visibility and disabled state of the default Spotter analyst entry in the Analyst interface. + +| `Action.SpotterOnLiveboard` +| The Spotter button in the Liveboard header. + +| `Action.AllLiveboardFilters` +| Shows, hides, or disables all filter surfaces on a Liveboard: filter chips, parameter chips, and cross-filter chips at the Liveboard, tab, and group levels. Parameter and cross-filter chips support hide only and cannot be disabled. + +| `Action.EditInputTable` +| Edits an input table used by an Answer directly from the Liveboard. +|=== + +== Related resources + +* xref:spotter-analyst-api.adoc[Spotter Analyst API] +* xref:event-embedEvents.adoc[Embed events reference] +* xref:events-hostEvents.adoc[Host events reference] +* xref:customize-spotter-embed.adoc[Customize Spotter embed] diff --git a/modules/ROOT/pages/event-embedEvents.adoc b/modules/ROOT/pages/event-embedEvents.adoc index 6b7655f0f..ee04fa89a 100644 --- a/modules/ROOT/pages/event-embedEvents.adoc +++ b/modules/ROOT/pages/event-embedEvents.adoc @@ -295,3 +295,74 @@ For information about the supported event objects and examples, see xref:EmbedEv * See the xref:EmbedEvent.adoc[EmbedEvent] and xref:HostEvent.adoc[HostEvent] SDK documentation. * For information about triggering events on React components, see xref:react-components_lesson-04.adoc[Event listeners for React components]. + + [#pin-events] + === Spotter conversation pin events + + The following `EmbedEvent` members are available from ThoughtSpot Cloud 26.10.0.cl and Visual Embed SDK 1.53.0. Both events require `spotterChatPinConfig.enabled: true` and `enablePastConversationsSidebar: true` in the embed configuration. + + [cols="1,1,3"] + |=== + | Event | Cluster version | Description + + | `EmbedEvent.SpotterConversationPinned` + | 26.10.0.cl + | Emitted when a user pins a Spotter conversation. Payload: `{ conversationId, pinnedAt }`. + + | `EmbedEvent.SpotterConversationUnpinned` + | 26.10.0.cl + | Emitted when a user unpins a Spotter conversation. Payload: `{ conversationId, unpinnedAt }`. + |=== + + .Listen for pin and unpin events + [source,javascript] + ---- + const embed = new SpotterEmbed(container, { + spotterSidebarConfig: { + enablePastConversationsSidebar: true, + spotterChatPinConfig: { enabled: true }, + }, + // ... + }); + + embed.on(EmbedEvent.SpotterConversationPinned, (event) => { + const { conversationId, pinnedAt } = event.data; + console.log(`Conversation ${conversationId} pinned at ${pinnedAt}`); + }); + + embed.on(EmbedEvent.SpotterConversationUnpinned, (event) => { + const { conversationId, unpinnedAt } = event.data; + console.log(`Conversation ${conversationId} unpinned at ${unpinnedAt}`); + }); + + embed.render(); + ---- + + [#applicability-scope] + === Scoped filter and parameter events + + The following `EmbedEvent` members gained an optional `applicability` attribute in SDK 1.53.0. This attribute scopes a filter or parameter change notification to a specific Liveboard tab or group. + + [cols="1,3"] + |=== + | Event | Change in SDK 1.53.0 + + | `EmbedEvent.FilterChanged` + | Payload gains an optional `applicability` object describing the scope of the changed filter. + + | `EmbedEvent.ParameterChanged` + | Payload gains an optional `applicability` object describing the scope of the changed parameter. + |=== + + The `applicability` object has the following shape: + + [source,json] + ---- + { + "level": "LIVEBOARD" | "TAB" | "GROUP", + "targetId": "{tab-or-group-id}" + } + ---- + + `targetId` is optional. Omit it when `level` is `LIVEBOARD`. + \ No newline at end of file diff --git a/modules/ROOT/pages/events-hostEvents.adoc b/modules/ROOT/pages/events-hostEvents.adoc index 3016a3500..d244c2cc5 100644 --- a/modules/ROOT/pages/events-hostEvents.adoc +++ b/modules/ROOT/pages/events-hostEvents.adoc @@ -357,3 +357,97 @@ When `AddFilter` is in `disabledActions`, `HostEvent.OpenAddFilterModal` is bloc * See xref:EmbedEvent.adoc[EmbedEvent] and xref:HostEvent.adoc[HostEvent] SDK documentation. * For information about triggering events on React components, see xref:react-components_lesson-04.adoc[Event listeners for React components]. + + [#spotter-pin-host-events] + === Spotter conversation pin and unpin + + The following `HostEvent` members are available from ThoughtSpot Cloud 26.10.0.cl and Visual Embed SDK 1.53.0. Both events require `enablePastConversationsSidebar: true` in the embed configuration. + + [cols="1,1,3"] + |=== + | Event | Cluster version | Description + + | `HostEvent.PinSpotterConversation` + | 26.10.0.cl + | Pins a saved Spotter conversation. Accepts `{ conversationId }`. + + | `HostEvent.UnpinSpotterConversation` + | 26.10.0.cl + | Unpins a previously pinned Spotter conversation. Accepts `{ conversationId }`. + |=== + + .Programmatically pin a conversation + [source,javascript] + ---- + embed.trigger(HostEvent.PinSpotterConversation, { + conversationId: '{conversation-id}', + }); + ---- + + [#liveboard-group-events] + === Liveboard group and parameter events + + The following `HostEvent` members are new in SDK 1.53.0 and support the scoped Liveboard filtering feature introduced in ThoughtSpot Cloud 26.10.0.cl. + + [cols="1,1,3"] + |=== + | Event | Cluster version | Description + + | `HostEvent.GetGroups` + | 26.10.0.cl + | Returns filter and parameter group details for the current Liveboard. Response includes `orderedGroupIds`, `numberOfGroups`, and `Groups`. Mirrors `HostEvent.GetTabs`. + + | `HostEvent.OpenParameter` + | 26.10.0.cl + | Opens the parameter panel for a specific parameter on the Liveboard. Accepts an optional `applicability` object to scope the action to a tab or group. Mirrors `HostEvent.OpenFilter`. + |=== + + [#applicability-host-events] + === Scoped filter and parameter host events + + The following existing `HostEvent` members gained an optional `applicability` attribute in SDK 1.53.0. This attribute scopes a filter or parameter operation to a specific Liveboard tab or group. + + [cols="1,3"] + |=== + | Event | Change in SDK 1.53.0 + + | `HostEvent.OpenFilter` + | Accepts an optional `applicability` parameter to scope which filter panel opens. + + | `HostEvent.GetFilters` + | Returned Liveboard filter objects now include an optional `applicability` field. + + | `HostEvent.UpdateFilters` + | Accepts an optional `applicability` value per filter to scope the update to a tab or group. + + | `HostEvent.UpdateParameters` + | Accepts an optional `applicability` value per parameter to scope the update to a tab or group. + + | `HostEvent.GetParameters` + | Returned parameter objects now include an optional `applicability` field. + |=== + + The `applicability` object has the following shape: + + [source,json] + ---- + { + "level": "LIVEBOARD" | "TAB" | "GROUP", + "targetId": "{tab-or-group-id}" + } + ---- + + `targetId` is optional. Omit it when `level` is `LIVEBOARD`. + + [#deprecated-host-events] + === Deprecated HostEvents + + [cols="1,1,3"] + |=== + | Event | Status | Details + + | `HostEvent.UpdatePersonalizedView` + | Deprecated in SDK 1.53.0 + | Use `HostEvent.SelectPersonalizedView` instead. The replacement accepts an optional `viewName` to select a view by name, resets to the original view when the payload is empty, and reports an error when the named view is not found. + |=== + \ No newline at end of file diff --git a/modules/ROOT/pages/feature-management-api.adoc b/modules/ROOT/pages/feature-management-api.adoc new file mode 100644 index 000000000..7e85dab14 --- /dev/null +++ b/modules/ROOT/pages/feature-management-api.adoc @@ -0,0 +1,366 @@ += Feature Management API +:toc: true +:toclevels: 2 + +:page-title: Feature Management API +:page-pageid: feature-management-api +:page-description: Search feature configurations, assign features to Orgs, and set feature values using the REST API + +// SOURCE: SCAL-319281; search-feature.md, update-feature-assignment.md, updated-feature-value.md + +The Feature Management API lets cluster and Org admins retrieve feature configurations, assign features to Orgs, and set feature values programmatically. These endpoints replicate the feature management capabilities available in the Admin Portal 2.0 UI. + +All endpoints are under `/api/rest/2.0/configurations/features/` and are available from ThoughtSpot Cloud 26.10.0.cl. + +== Prerequisites + +* Feature Management must be enabled on your ThoughtSpot instance. +* All requests require a Bearer token. +* If link:https://developers.thoughtspot.com/docs/rbac[Role-Based Access Control (RBAC)] is enabled on your instance, the `ADMINISTRATION` privilege is required for all write operations. +* Privilege requirements vary by operation. See each endpoint section for details. + +== Key concepts + +=== Feature scope + +Feature configurations exist at two levels: + +Cluster scope:: The cluster-level default, visible to cluster admins. Returns `assigned_orgs` and `is_org_aware` for each feature. +Org scope:: A per-Org value override, visible to Org admins. Returns `element_type`, `element_config`, and `element_value` for each feature. + +=== Feature identifiers + +Each feature can be referenced by its: + +* `feature_name`: a human-readable name, such as `index_columns`. +* `feature_id`: the underlying system identifier, such as `orion.embraceConfig.doIndexing`. + +Both forms are accepted in requests to any endpoint that takes a `feature_identifier`. + +=== Feature categories + +Features are grouped into availability categories: + +* `GENERAL_ACCESS`: generally available features. This is the default. +* `EARLY_ACCESS`: features in early access. + +== Search features + +`POST /api/rest/2.0/configurations/features/search` + +Returns feature configurations available on the ThoughtSpot instance, grouped by feature group. + +=== Privileges required + +`ADMINISTRATION` or `ORG_ADMINISTRATION`. + +=== Request parameters + +[cols="1,1,1,3"] +|=== +| Parameter | Type | Required | Description + +| `scope` +| string +| Required +| Administrative view: `CLUSTER` returns the cluster-admin view, including `assigned_orgs` per feature. `ORG` returns the Org-admin view, including `element_value` per feature. + +| `org_identifier` +| integer +| Conditional +| Numeric ID of the Org. Required when `scope` is `ORG`. Omitting it returns a `400` error. Ignored when `scope` is `CLUSTER`. + +| `category` +| string +| Optional +| Feature availability category: `GENERAL_ACCESS` (default) or `EARLY_ACCESS`. +|=== + +=== Response fields by scope + +The response fields populated depend on the requested `scope`. + +*Cluster view (`scope=CLUSTER`)*: each feature includes `feature_id`, `feature_name`, `assigned_orgs`, `is_org_aware`, and (for non-Org-aware features) `feature_value`. + +*Org view (`scope=ORG`)*: each feature includes `feature_id`, `feature_name`, `element_type`, `element_config`, and `element_value`. + +=== Example: cluster view + +[source,bash] +---- +curl -X POST \ + --url 'https://{cluster}/api/rest/2.0/configurations/features/search' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {token}' \ + --data-raw '{ + "scope": "CLUSTER", + "category": "GENERAL_ACCESS" +}' +---- + +=== Example: Org view + +[source,bash] +---- +curl -X POST \ + --url 'https://{cluster}/api/rest/2.0/configurations/features/search' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {token}' \ + --data-raw '{ + "scope": "ORG", + "org_identifier": 1, + "category": "GENERAL_ACCESS" +}' +---- + +=== Example response (cluster view) + +[source,json] +---- +[ + { + "feature_group": "search", + "docs_url": null, + "features": [ + { + "feature_id": "orion.embraceConfig.doIndexing", + "feature_name": "index_columns", + "assigned_orgs": [ + { + "org_id": 0, + "org_name": "Primary" + } + ], + "is_org_aware": true, + "feature_value": null, + "docs_url": null + } + ] + } +] +---- + +=== Error responses + +[cols="1,3"] +|=== +| HTTP status code | Description + +| 400 | Invalid request parameters, or `org_identifier` is missing when `scope` is `ORG`. +| 401 | Bearer token is missing, expired, or invalid. +| 403 | Insufficient privileges. +| 404 | Feature Management is not enabled on this instance. +| 500 | Unexpected server error. +|=== + +== Update feature assignments + +`POST /api/rest/2.0/configurations/features/assignments/update` + +Updates the Org assignments for a feature. Available to cluster admins only. Org-scoped admins cannot call this endpoint. + +=== Privileges required + +`ADMINISTRATION` in the cluster-admin (All-Org or default-Org) context. + +=== Request parameters + +[cols="1,1,1,3"] +|=== +| Parameter | Type | Required | Description + +| `feature_identifier` +| string +| Required +| Feature name (`feature_name`) or feature ID (`feature_id`) of the feature to update. + +| `org_identifiers` +| array +| Required +| Numeric IDs of the Orgs to assign. Send an empty array with `operation` set to `REPLACE` to remove all Org assignments for this feature. + +| `operation` +| string +| Optional +| Type of assignment update: `ADD` assigns the given Orgs in addition to existing assignments, `REMOVE` unassigns the given Orgs, or `REPLACE` sets the assignment to exactly the given Orgs. Defaults to `REPLACE`. +|=== + +=== Response + +Returns `200 OK` and a `FeatureAssignmentResponse` object with `feature_id`, `feature_name`, and the updated `assigned_orgs` list. + +=== Example: add Org assignments + +[source,bash] +---- +curl -X POST \ + --url 'https://{cluster}/api/rest/2.0/configurations/features/assignments/update' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {token}' \ + --data-raw '{ + "feature_identifier": "index_columns", + "org_identifiers": [1, 2], + "operation": "ADD" +}' +---- + +=== Example: remove all Org assignments + +[source,bash] +---- +curl -X POST \ + --url 'https://{cluster}/api/rest/2.0/configurations/features/assignments/update' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {token}' \ + --data-raw '{ + "feature_identifier": "index_columns", + "org_identifiers": [], + "operation": "REPLACE" +}' +---- + +=== Example response + +[source,json] +---- +{ + "feature_id": "orion.embraceConfig.doIndexing", + "feature_name": "index_columns", + "assigned_orgs": [ + { "org_id": 1, "org_name": "Acme" }, + { "org_id": 2, "org_name": "Beta" } + ] +} +---- + +=== Error responses + +[cols="1,3"] +|=== +| HTTP status code | Description + +| 400 | Invalid request parameters. +| 401 | Bearer token is missing, expired, or invalid. +| 403 | Insufficient privileges. Org-scoped admins cannot call this endpoint. +| 404 | Feature not found, or Feature Management is not enabled on this instance. +| 500 | Unexpected server error. +|=== + +== Update feature value + +`POST /api/rest/2.0/configurations/features/values/update` + +Sets the value of a feature at the cluster or Org scope. + +[WARNING] +==== +Setting `reset_org_overrides` to `true` at `CLUSTER` scope removes all per-Org value overrides cluster-wide. All Orgs then inherit the new cluster-level value. This operation cannot be undone via the API. +==== + +=== Privileges required + +`ADMINISTRATION`. + +=== Request parameters + +[cols="1,1,1,3"] +|=== +| Parameter | Type | Required | Description + +| `scope` +| string +| Required +| Scope at which to set the value: `CLUSTER` or `ORG`. + +| `org_identifier` +| integer +| Conditional +| Numeric ID of the Org for which to set the value. Required when `scope` is `ORG`. Ignored when `scope` is `CLUSTER`. + +| `feature_identifier` +| string +| Required +| Feature name (`feature_name`) or feature ID (`feature_id`) of the feature to update. + +| `feature_value` +| string +| Required +| New value to assign to the feature. + +| `reset_org_overrides` +| boolean +| Conditional +| Applicable only when `scope` is `CLUSTER`. When `true`, removes all existing per-Org value overrides so that every Org inherits the new cluster-level value. Required when `scope` is `CLUSTER` for Org-aware features. Passing this parameter at `ORG` scope returns a `400` error. +|=== + +=== Response + +Returns `200 OK` and a `FeatureValueResponse` object with `feature_id`, `feature_name`, and the updated `feature_value`. + +=== Example: set an Org-level override + +[source,bash] +---- +curl -X POST \ + --url 'https://{cluster}/api/rest/2.0/configurations/features/values/update' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {token}' \ + --data-raw '{ + "scope": "ORG", + "org_identifier": 1, + "feature_identifier": "index_columns", + "feature_value": "true" +}' +---- + +=== Example: set cluster value and reset all Org overrides + +[source,bash] +---- +curl -X POST \ + --url 'https://{cluster}/api/rest/2.0/configurations/features/values/update' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {token}' \ + --data-raw '{ + "scope": "CLUSTER", + "feature_identifier": "index_columns", + "feature_value": "true", + "reset_org_overrides": true +}' +---- + +=== Example response + +[source,json] +---- +{ + "feature_id": "orion.embraceConfig.doIndexing", + "feature_name": "index_columns", + "feature_value": "true" +} +---- + +=== Error responses + +[cols="1,3"] +|=== +| HTTP status code | Description + +| 400 | Invalid request, or `reset_org_overrides` was passed with `scope: ORG`. +| 401 | Bearer token is missing, expired, or invalid. +| 403 | Insufficient privileges, or the Org is not assigned to this feature. +| 404 | Feature not found, or Feature Management is not enabled on this instance. +| 500 | Unexpected server error. +|=== + +== Related resources + +* xref:rest-api-v2-reference.adoc[REST API v2 reference] +* xref:orgs-api.adoc[Orgs API] +* xref:privileges-and-roles.adoc[Privileges and roles] diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 7e201fe2f..d4d4aa8f7 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -8,6 +8,63 @@ This changelog lists the features and enhancements introduced in REST API v2.0. For information about new features and enhancements available for embedded analytics, see xref:whats-new.adoc[What's New]. +== Version 26.10.0.cl, October 2026 + +=== Spotter Analyst API + +Four new endpoints are available for managing Spotter Analysts programmatically. All endpoints are under `/api/rest/2.0/ai/agent/analysts/`. + +[cols="2,4"] +|=== +| Endpoint | Description + +| `POST /api/rest/2.0/ai/agent/analysts/create` +| Creates a Spotter Analyst with a name, description, data sources, and optional instructions, MCP connectors, and starter prompts. Requires `ADMINISTRATION`, `CAN_MANAGE_SPOTTER`, or `CAN_USE_SPOTTER` privilege, plus view access to all referenced sources. Returns the created `Analyst` object including the server-assigned `id`. + +| `POST /api/rest/2.0/ai/agent/analysts/search` +| Returns Analysts visible to the caller. Operates in fetch mode (single Analyst by `analyst_identifier`) or list mode (paginated, ordered by most recently accessed). Supports filtering by ownership type: `ALL`, `CREATED_BY_ME`, or `SHARED_TO_ME`. Requires `ADMINISTRATION`, `CAN_MANAGE_SPOTTER`, or `CAN_USE_SPOTTER`. + +| `POST /api/rest/2.0/ai/agent/analysts/{analyst_identifier}/update` +| Full-replace update of a Spotter Analyst. Omitted optional fields are cleared. Requires ownership or `ADMINISTRATION`/`CAN_MANAGE_SPOTTER` privilege. When new sources are added, they are automatically shared with existing users of the Analyst. + +| `POST /api/rest/2.0/ai/agent/analysts/{analyst_identifier}/delete` +| Permanently deletes a Spotter Analyst. This operation is irreversible. Requires ownership or `ADMINISTRATION`/`CAN_MANAGE_SPOTTER` privilege. +|=== + +For full parameter details, request and response schemas, and code examples, see xref:spotter-analyst-api.adoc[Spotter Analyst API]. + +=== Feature Management API + +Three new endpoints are available for programmatic feature management. All endpoints are under `/api/rest/2.0/configurations/features/`. + +[cols="2,4"] +|=== +| Endpoint | Description + +| `POST /api/rest/2.0/configurations/features/search` +| Returns feature configurations grouped by feature group. Supports `CLUSTER` scope (cluster-admin view, returns `assigned_orgs` per feature) and `ORG` scope (Org-admin view, returns `element_value` per feature). The `category` parameter filters by `GENERAL_ACCESS` (default) or `EARLY_ACCESS`. Requires `ADMINISTRATION` or `ORG_ADMINISTRATION`. + +| `POST /api/rest/2.0/configurations/features/assignments/update` +| Updates Org assignments for a feature using `ADD`, `REMOVE`, or `REPLACE` operations. Send an empty `org_identifiers` array with `REPLACE` to remove all assignments. Requires cluster-admin `ADMINISTRATION` privilege. Org-scoped admins cannot call this endpoint. + +| `POST /api/rest/2.0/configurations/features/values/update` +| Sets feature value at `CLUSTER` or `ORG` scope. At `CLUSTER` scope, setting `reset_org_overrides: true` removes all per-Org value overrides cluster-wide. This operation is irreversible via the API. Requires `ADMINISTRATION`. +|=== + +For full parameter details, request and response schemas, and code examples, see xref:feature-management-api.adoc[Feature Management API]. + +=== Update Conversation — `is_pinned` field added + +The `POST /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/update` endpoint now accepts an `is_pinned` boolean field. + +* Set `is_pinned: true` to pin the conversation to the top of the conversation list. +* Set `is_pinned: false` to unpin a previously pinned conversation. +* The operation is idempotent: pinning an already-pinned conversation or unpinning an already-unpinned one succeeds with no side effects. +* Only conversations created with `enable_save_chat: true` can be pinned. +* Both `title` and `is_pinned` can be updated in a single request. + +NOTE: The `title` field has been available since version 26.7.0.cl. The `is_pinned` field is new in version 26.10.0.cl. + == Version 26.9.0.cl, September 2026 === Answer Export API diff --git a/modules/ROOT/pages/spotter-analyst-api.adoc b/modules/ROOT/pages/spotter-analyst-api.adoc new file mode 100644 index 000000000..5375e876f --- /dev/null +++ b/modules/ROOT/pages/spotter-analyst-api.adoc @@ -0,0 +1,389 @@ += Spotter Analyst API +:toc: true +:toclevels: 2 + +:page-title: Spotter Analyst API +:page-pageid: spotter-analyst-api +:page-description: Create, search, update, and delete Spotter Analysts using the REST API + +// SOURCE: SCAL-317811; create-analyst.md, search-analyst.md, update-analyst.md, delete-analyst.md + +ThoughtSpot Spotter Analysts are governed AI agents, each configured with a name, description, one or more data sources, and optional instructions, MCP connectors, and starter prompts. Users converse with an Analyst directly in the Spotter interface. + +The Spotter Analyst REST API lets you create, search, update, and delete Analysts programmatically. +All endpoints are under `/api/rest/2.0/ai/agent/analysts/` and are available from ThoughtSpot Cloud 26.10.0.cl. + +== Prerequisites + +* Spotter must be enabled on your ThoughtSpot instance. Contact ThoughtSpot Support to enable it. +* All requests require a Bearer token. Use a token scoped to the Org in which the Analyst exists or should be created. +* Privilege requirements vary by operation. See each endpoint section for details. + +== Analyst object + +Each Analyst has the following fields: + +[cols="1,1,3"] +|=== +| Field | Type | Description + +| `id` +| string +| Server-assigned unique identifier. + +| `name` +| string +| Display name of the Analyst. + +| `description` +| string +| Description of the Analyst. Maximum 200 characters. + +| `instructions` +| string +| Optional natural-language behavior guidelines for the agent. + +| `sources` +| array +| Data sources the Analyst can query. Each source includes an `id`, `type`, and display `name`. Supported types: `MODEL`, `ANSWER`, `LIVEBOARD`, `CONVERSATION`. + +| `mcp_connectors` +| array +| Linked MCP connectors. Each connector includes `id`, `name`, and `icon_url`. + +| `starter_prompts` +| array +| Up to 4 suggested prompts shown on the Analyst landing page. Each entry includes `label`, `text`, `order`, and `is_ai_generated`. + +| `icon_id` +| string +| Analyst icon identifier. Analysts created via the API use the default icon until one is set in the UI. + +| `updated_time_in_millis` +| integer +| Epoch timestamp in milliseconds of the last update. + +| `last_accessed_time_in_millis` +| integer +| Epoch timestamp in milliseconds of the last access. + +| `created_by` +| object +| User who created the Analyst. Includes `id`, `name`, and `display_name`. + +| `updated_by` +| object +| User who last updated the Analyst. Includes `id`, `name`, and `display_name`. +|=== + +== Create Analyst + +`POST /api/rest/2.0/ai/agent/analysts/create` + +Creates a Spotter Analyst. Analysts created via the API use the default icon until one is set in the ThoughtSpot UI. + +=== Privileges required + +At least one of the following: `ADMINISTRATION`, `CAN_MANAGE_SPOTTER`, or `CAN_USE_SPOTTER`. The caller must also have view access to every data source listed in `sources`. + +=== Request parameters + +[cols="1,1,1,3"] +|=== +| Parameter | Type | Required | Description + +| `name` +| string +| Required +| Display name of the Analyst. + +| `description` +| string +| Required +| Description of the Analyst. Maximum 200 characters. + +| `sources` +| array +| Required +| At least one data source. Each entry requires an `identifier` and a `type` (`MODEL`, `ANSWER`, `LIVEBOARD`, or `CONVERSATION`). The `name` field is optional. The caller must have view access to every referenced source. + +| `instructions` +| string +| Optional +| Natural-language instructions that guide the agent's behavior. Instructions that conflict with system guardrails are rejected with a `409` error. + +| `mcp_connector_identifiers` +| array +| Optional +| Identifiers of MCP connectors to link to the Analyst. + +| `starter_prompts` +| array +| Optional +| Up to 4 plain-text prompts, each between 10 and 250 characters. Display order follows list position. +|=== + +=== Response + +Returns `200 OK` and the created `Analyst` object, including the server-assigned `id`. + +=== Example + +[source,bash] +---- +curl -X POST \ + --url 'https://{cluster}/api/rest/2.0/ai/agent/analysts/create' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {token}' \ + --data-raw '{ + "name": "Revenue Analyst", + "description": "Answers revenue questions using the Sales data model.", + "sources": [ + { + "identifier": "{model-guid}", + "type": "MODEL" + } + ], + "instructions": "Focus on year-over-year comparisons. Do not surface raw transaction data.", + "starter_prompts": [ + "What was total revenue last quarter?", + "Compare revenue by region for the past 12 months." + ] +}' +---- + +=== Error responses + +[cols="1,3"] +|=== +| HTTP status code | Description + +| 400 | Malformed request. +| 401 | Bearer token is missing, expired, or invalid. +| 403 | Insufficient privileges, or the caller does not have view access to a referenced data source. +| 409 | The `instructions` value conflicts with system guardrails. +| 422 | Validation failure: a required field is missing, `sources` is empty, the starter prompt count exceeds 4, or a field-length limit is violated. +| 429 | Rate limit exceeded. +| 500 | Unexpected server error. +|=== + +== Search Analysts + +`POST /api/rest/2.0/ai/agent/analysts/search` + +Returns Analysts visible to the caller. This endpoint operates in two modes: + +Fetch mode:: Provide `analyst_identifier` to retrieve a single Analyst. All other filters are ignored and `total_size` is `1`. +List mode:: Omit `analyst_identifier` to get a paginated list of Analysts, ordered by most recently accessed. + +=== Privileges required + +At least one of the following: `ADMINISTRATION`, `CAN_MANAGE_SPOTTER`, or `CAN_USE_SPOTTER`. + +=== Request parameters + +[cols="1,1,1,3"] +|=== +| Parameter | Type | Required | Description + +| `analyst_identifier` +| string +| Optional +| When provided, returns exactly this Analyst. All other filters are ignored. + +| `record_size` +| integer +| Optional +| Number of records per page. Default: `50`. Range: 1 to 500. + +| `record_offset` +| integer +| Optional +| Zero-based index of the first record. Default: `0`. Maximum: `10000`. + +| `query` +| string +| Optional +| Case-insensitive substring match on Analyst name. + +| `type` +| string +| Optional +| Ownership filter. Accepted values: `ALL` (default, returns Analysts created by or shared with the caller), `CREATED_BY_ME`, or `SHARED_TO_ME`. +|=== + +=== Response + +Returns `200 OK` and an `AnalystSearchResponse` object with: + +* `analysts`: the current page of matching `Analyst` objects. +* `total_size`: total count of matching Analysts before pagination. + +=== Example: list all Analysts + +[source,bash] +---- +curl -X POST \ + --url 'https://{cluster}/api/rest/2.0/ai/agent/analysts/search' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {token}' \ + --data-raw '{ + "record_size": 50, + "record_offset": 0, + "type": "ALL" +}' +---- + +=== Example: fetch a single Analyst + +[source,bash] +---- +curl -X POST \ + --url 'https://{cluster}/api/rest/2.0/ai/agent/analysts/search' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {token}' \ + --data-raw '{ + "analyst_identifier": "{analyst-guid}" +}' +---- + +=== Error responses + +[cols="1,3"] +|=== +| HTTP status code | Description + +| 403 | Missing privileges, or (fetch mode) the caller does not have access to the requested Analyst. +| 404 | (Fetch mode) No Analyst with the given identifier exists in the caller's Org. +| 422 | `record_size` or `record_offset` is out of the permitted range. +|=== + +== Update Analyst + +`POST /api/rest/2.0/ai/agent/analysts/{analyst_identifier}/update` + +Updates a Spotter Analyst. The update is a full replace: the Analyst is rewritten from the request body. Any optional field omitted from the request is cleared. Include all fields you want to retain. + +When new sources are added, they are automatically shared with users the Analyst was previously shared with. Those users retain access to a working Analyst. + +=== Privileges required + +The caller must be the owner of the Analyst, or hold `ADMINISTRATION` or `CAN_MANAGE_SPOTTER` privileges. Users the Analyst is shared with can use it but cannot edit it. + +=== Path parameter + +`analyst_identifier`: unique ID of the Analyst to update, as returned by the Create Analyst or Search Analysts endpoint. + +=== Request parameters + +The request body uses the same shape as Create Analyst: `name`, `description`, `sources`, `instructions`, `mcp_connector_identifiers`, and `starter_prompts`. + +=== Response + +Returns `200 OK` and the updated `Analyst` object, including the refreshed `updated_time_in_millis` and `updated_by` fields. + +=== Example + +[source,bash] +---- +curl -X POST \ + --url 'https://{cluster}/api/rest/2.0/ai/agent/analysts/{analyst_identifier}/update' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {token}' \ + --data-raw '{ + "name": "Revenue Analyst v2", + "description": "Updated to include APAC data model.", + "sources": [ + { + "identifier": "{model-guid}", + "type": "MODEL" + }, + { + "identifier": "{apac-model-guid}", + "type": "MODEL" + } + ], + "starter_prompts": [ + "What was total revenue last quarter?", + "Compare revenue by region for the past 12 months.", + "Show top 10 products by APAC revenue." + ] +}' +---- + +[NOTE] +==== +The update is a full replace. Omitting `instructions`, `mcp_connector_identifiers`, or `starter_prompts` clears those fields on the Analyst. Include every field you want to keep. +==== + +=== Error responses + +[cols="1,3"] +|=== +| HTTP status code | Description + +| 400 | Malformed `analyst_identifier`. +| 401 | Bearer token is missing, expired, or invalid. +| 403 | The caller is not the Analyst owner and does not hold admin or Spotter-management privileges. +| 404 | No Analyst with the given identifier exists in the caller's Org. +| 409 | The `instructions` value conflicts with system guardrails. +| 422 | Validation failure: a required field is missing, `sources` is empty, the starter prompt count exceeds 4, or a field-length limit is violated. +| 429 | Rate limit exceeded. +| 500 | Unexpected server error. +|=== + +== Delete Analyst + +`POST /api/rest/2.0/ai/agent/analysts/{analyst_identifier}/delete` + +Permanently deletes a Spotter Analyst. This operation is irreversible. Deleted Analysts cannot be recovered. + +=== Privileges required + +The caller must be the owner of the Analyst, or hold `ADMINISTRATION` or `CAN_MANAGE_SPOTTER` privileges. Users the Analyst is shared with cannot delete it. + +=== Path parameter + +`analyst_identifier`: unique ID of the Analyst to delete, as returned by the Create Analyst or Search Analysts endpoint. + +=== Request body + +None. + +=== Response + +Returns `200 OK` and an `AnalystDeleteResponse` object containing the `id` of the deleted Analyst. + +=== Example + +[source,bash] +---- +curl -X POST \ + --url 'https://{cluster}/api/rest/2.0/ai/agent/analysts/{analyst_identifier}/delete' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {token}' +---- + +=== Error responses + +[cols="1,3"] +|=== +| HTTP status code | Description + +| 400 | Malformed `analyst_identifier`. +| 401 | Bearer token is missing, expired, or invalid. +| 403 | The caller is not the Analyst owner and does not hold admin or Spotter-management privileges. +| 404 | No Analyst with the given identifier exists in the caller's Org. +| 429 | Rate limit exceeded. +| 500 | Unexpected server error. +|=== + +== Related resources + +* xref:embed-spotter-analyst.adoc[Embed Spotter Analyst] +* xref:rest-api-v2-reference.adoc[REST API v2 reference] +* xref:privileges-and-roles.adoc[Privileges and roles] diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index d9fc73c1f..caf3a8f4d 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -22,6 +22,70 @@ This page lists new features, enhancements, and deprecated functionality introdu // *Status:* Current / Supported / Deprecated // *Affects:* Developers, Administrators, End Users // ============================================================ + + +== October 2026 + +**Release version**: ThoughtSpot Cloud 26.10.0.cl + +*Upgrade notes*: No breaking changes in this release. + +*Recommended SDK versions*: Visual Embed SDK v1.53.0 or later + +[.cl-table, cols="2,4", frame=none, grid=none] +|=== +a| +[.cl-label] +*Version 26.10.0.cl* + +a| + +[discrete] +==== Spotter Analyst API + +Spotter Analysts are governed AI agents you can create, configure, and manage via the REST API. Four new endpoints are available under `/api/rest/2.0/ai/agent/analysts/` to create, search, update, and delete Analysts programmatically. Each Analyst is configured with a name, description, one or more data sources, and optional instructions, MCP connectors, and starter prompts. For more information, see xref:spotter-analyst-api.adoc[Spotter Analyst API]. + +--- + +[discrete] +==== Embed Spotter Analyst + +You can now embed a single, pinned Spotter Analyst in your application using the Visual Embed SDK. The `spotterAnalystConfig.analystId` property in `SpotterEmbed` locks the embed to one governed Analyst experience. Combined with the updated `hiddenActions` list, you can prevent users from switching to other Analysts or to the default Spotter. For more information, see xref:embed-spotter-analyst.adoc[Embed Spotter Analyst]. + +--- + +[discrete] +==== Spotter conversation pinning + +Users can now pin Spotter conversations so they appear at the top of the conversation list for quick access. Pinning is disabled by default in embedded deployments and must be explicitly enabled using `spotterChatPinConfig` in `spotterSidebarConfig`. The SDK emits `EmbedEvent.SpotterConversationPinned` and `EmbedEvent.SpotterConversationUnpinned` when pin state changes. Use `HostEvent.PinSpotterConversation` and `HostEvent.UnpinSpotterConversation` to trigger pin state from the host application. For REST API access, the `is_pinned` field is now available on the Update Conversation endpoint. For more information, see xref:embed-spotter-analyst.adoc[Embed Spotter Analyst] and xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + +--- + +[discrete] +==== Feature Management API + +Three new endpoints are available under `/api/rest/2.0/configurations/features/` for programmatic feature management. Cluster and Org admins can search feature configurations, assign features to Orgs, and set feature values without using the Admin Portal 2.0 UI. For more information, see xref:feature-management-api.adoc[Feature Management API]. + +--- + +[discrete] +==== Scoped Liveboard filtering + +ThoughtSpot 26.10.0.cl introduces a three-tier filter hierarchy on Liveboards: Liveboard level, tab level, and group level. You can enable group-level filter scoping in embedded Liveboards using the `isScopedLiveboardFilteringEnabled` property. The `HostEvent.GetGroups` event returns group details for the Liveboard, and the `applicability` attribute on `HostEvent.UpdateFilters` and `HostEvent.UpdateParameters` scopes filter updates to a specific tab or group. For more information, see xref:embed-events.adoc[Events and app interactions] and xref:liveboard-embed.adoc[Embed a Liveboard]. + +--- + +[discrete] +==== Visual Embed SDK +For information about the new features and enhancements introduced in Visual Embed SDK version 1.53.0, see xref:api-changelog.adoc[Visual Embed SDK changelog]. + +--- + +[discrete] +==== REST API +For information about REST API v2.0 enhancements in this release, see xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + +|=== + + == September 2026 **Release version**: ThoughtSpot Cloud 26.9.0.cl + @@ -866,4 +930,4 @@ For information about the new features and enhancements introduced in Visual Emb ==== REST API For information about REST API v2 enhancements, see xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. -|=== +|=== \ No newline at end of file