instantsearch.js 4.86.1 → 4.87.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/connectors/autocomplete/connectAutocomplete.js +13 -5
- package/cjs/connectors/chat/connectChat.js +92 -20
- package/cjs/connectors/filter-suggestions/connectFilterSuggestions.js +255 -0
- package/cjs/connectors/index.js +7 -0
- package/cjs/connectors/index.umd.js +7 -0
- package/cjs/index.js +2 -2
- package/cjs/lib/ai-lite/abstract-chat.js +823 -0
- package/cjs/lib/ai-lite/index.js +57 -0
- package/cjs/lib/ai-lite/stream-parser.js +138 -0
- package/cjs/lib/ai-lite/transport.js +218 -0
- package/cjs/lib/ai-lite/types.js +1 -0
- package/cjs/lib/ai-lite/utils.js +85 -0
- package/cjs/lib/chat/chat.js +6 -6
- package/cjs/lib/chat/index.js +5 -2
- package/cjs/lib/version.js +1 -1
- package/cjs/widgets/autocomplete/autocomplete.js +15 -6
- package/cjs/widgets/chat/chat.js +32 -3
- package/cjs/widgets/filter-suggestions/filter-suggestions.js +131 -0
- package/cjs/widgets/index.js +7 -0
- package/cjs/widgets/index.umd.js +7 -0
- package/dist/instantsearch.development.d.ts +2551 -346
- package/dist/instantsearch.development.js +9408 -4314
- package/dist/instantsearch.development.js.map +1 -1
- package/dist/instantsearch.production.d.ts +2551 -346
- package/dist/instantsearch.production.min.d.ts +2551 -346
- package/dist/instantsearch.production.min.js +2 -2
- package/dist/instantsearch.production.min.js.map +1 -1
- package/es/connectors/autocomplete/connectAutocomplete.d.ts +10 -0
- package/es/connectors/autocomplete/connectAutocomplete.js +13 -5
- package/es/connectors/chat/connectChat.d.ts +24 -14
- package/es/connectors/chat/connectChat.js +90 -18
- package/es/connectors/filter-suggestions/connectFilterSuggestions.d.ts +95 -0
- package/es/connectors/filter-suggestions/connectFilterSuggestions.js +249 -0
- package/es/connectors/frequently-bought-together/connectFrequentlyBoughtTogether.d.ts +2 -2
- package/es/connectors/geo-search/connectGeoSearch.d.ts +1 -1
- package/es/connectors/hits/connectHits.d.ts +1 -1
- package/es/connectors/hits/connectHitsWithInsights.d.ts +1 -1
- package/es/connectors/index.d.ts +1 -0
- package/es/connectors/index.js +2 -1
- package/es/connectors/index.umd.d.ts +1 -0
- package/es/connectors/index.umd.js +2 -1
- package/es/connectors/infinite-hits/connectInfiniteHits.d.ts +1 -1
- package/es/connectors/infinite-hits/connectInfiniteHitsWithInsights.d.ts +1 -1
- package/es/connectors/looking-similar/connectLookingSimilar.d.ts +2 -2
- package/es/connectors/related-products/connectRelatedProducts.d.ts +2 -2
- package/es/connectors/trending-items/connectTrendingItems.d.ts +2 -2
- package/es/lib/ai-lite/abstract-chat.d.ts +89 -0
- package/es/lib/ai-lite/abstract-chat.js +818 -0
- package/es/lib/ai-lite/index.d.ts +11 -0
- package/es/lib/ai-lite/index.js +18 -0
- package/es/lib/ai-lite/stream-parser.d.ts +18 -0
- package/es/lib/ai-lite/stream-parser.js +131 -0
- package/es/lib/ai-lite/transport.d.ts +24 -0
- package/es/lib/ai-lite/transport.js +214 -0
- package/es/lib/ai-lite/types.d.ts +362 -0
- package/es/lib/ai-lite/types.js +1 -0
- package/es/lib/ai-lite/utils.d.ts +12 -0
- package/es/lib/ai-lite/utils.js +76 -0
- package/es/lib/chat/chat.d.ts +3 -3
- package/es/lib/chat/chat.js +4 -4
- package/es/lib/chat/index.d.ts +3 -0
- package/es/lib/chat/index.js +4 -1
- package/es/lib/version.d.ts +1 -1
- package/es/lib/version.js +1 -1
- package/es/widgets/autocomplete/autocomplete.d.ts +2 -1
- package/es/widgets/autocomplete/autocomplete.js +15 -6
- package/es/widgets/chat/chat.d.ts +22 -14
- package/es/widgets/chat/chat.js +33 -4
- package/es/widgets/filter-suggestions/filter-suggestions.d.ts +689 -0
- package/es/widgets/filter-suggestions/filter-suggestions.js +124 -0
- package/es/widgets/frequently-bought-together/frequently-bought-together.d.ts +3 -3
- package/es/widgets/geo-search/geo-search.d.ts +1 -1
- package/es/widgets/hits/hits.d.ts +1 -1
- package/es/widgets/index.d.ts +1 -0
- package/es/widgets/index.js +2 -1
- package/es/widgets/index.umd.d.ts +1 -0
- package/es/widgets/index.umd.js +2 -1
- package/es/widgets/infinite-hits/infinite-hits.d.ts +1 -1
- package/es/widgets/looking-similar/looking-similar.d.ts +3 -3
- package/es/widgets/related-products/related-products.d.ts +3 -3
- package/es/widgets/trending-items/trending-items.d.ts +3 -3
- package/package.json +6 -7
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { SendEventForHits } from '../../lib/utils';
|
|
2
2
|
import type { Hit, Connector, WidgetRenderState } from '../../types';
|
|
3
3
|
import type { SearchResults } from 'algoliasearch-helper';
|
|
4
|
+
export type TransformItemsIndicesConfig = {
|
|
5
|
+
indexName: string;
|
|
6
|
+
indexId: string;
|
|
7
|
+
hits: Hit[];
|
|
8
|
+
results: SearchResults;
|
|
9
|
+
};
|
|
4
10
|
export type AutocompleteConnectorParams = {
|
|
5
11
|
/**
|
|
6
12
|
* Escapes HTML entities from hits string values.
|
|
@@ -8,6 +14,10 @@ export type AutocompleteConnectorParams = {
|
|
|
8
14
|
* @default `true`
|
|
9
15
|
*/
|
|
10
16
|
escapeHTML?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Transforms the items of all indices.
|
|
19
|
+
*/
|
|
20
|
+
transformItems?: (indices: TransformItemsIndicesConfig[]) => TransformItemsIndicesConfig[];
|
|
11
21
|
};
|
|
12
22
|
export type AutocompleteRenderState = {
|
|
13
23
|
/**
|
|
@@ -15,7 +15,11 @@ var connectAutocomplete = function connectAutocomplete(renderFn) {
|
|
|
15
15
|
return function (widgetParams) {
|
|
16
16
|
var _ref = widgetParams || {},
|
|
17
17
|
_ref$escapeHTML = _ref.escapeHTML,
|
|
18
|
-
escapeHTML = _ref$escapeHTML === void 0 ? true : _ref$escapeHTML
|
|
18
|
+
escapeHTML = _ref$escapeHTML === void 0 ? true : _ref$escapeHTML,
|
|
19
|
+
_ref$transformItems = _ref.transformItems,
|
|
20
|
+
transformItems = _ref$transformItems === void 0 ? function (indices) {
|
|
21
|
+
return indices;
|
|
22
|
+
} : _ref$transformItems;
|
|
19
23
|
process.env.NODE_ENV === 'development' ? warning(!widgetParams.indices, "\nThe option `indices` has been removed from the Autocomplete connector.\n\nThe indices to target are now inferred from the widgets tree.\n".concat(Array.isArray(widgetParams.indices) ? "\nAn alternative would be:\n\nconst autocomplete = connectAutocomplete(renderer);\n\nsearch.addWidgets([\n ".concat(widgetParams.indices.map(function (_ref2) {
|
|
20
24
|
var value = _ref2.value;
|
|
21
25
|
return "index({ indexName: '".concat(value, "' }),");
|
|
@@ -57,6 +61,7 @@ var connectAutocomplete = function connectAutocomplete(renderFn) {
|
|
|
57
61
|
helper.setQuery(query).search();
|
|
58
62
|
};
|
|
59
63
|
}
|
|
64
|
+
var sendEventMap = {};
|
|
60
65
|
var indices = scopedResults.map(function (scopedResult) {
|
|
61
66
|
var _scopedResult$results, _scopedResult$results2;
|
|
62
67
|
// We need to escape the hits because highlighting
|
|
@@ -64,7 +69,7 @@ var connectAutocomplete = function connectAutocomplete(renderFn) {
|
|
|
64
69
|
if (scopedResult.results) {
|
|
65
70
|
scopedResult.results.hits = escapeHTML ? escapeHits(scopedResult.results.hits) : scopedResult.results.hits;
|
|
66
71
|
}
|
|
67
|
-
|
|
72
|
+
sendEventMap[scopedResult.indexId] = createSendEventForHits({
|
|
68
73
|
instantSearchInstance: instantSearchInstance,
|
|
69
74
|
helper: scopedResult.helper,
|
|
70
75
|
widgetType: _this.$$type
|
|
@@ -73,13 +78,16 @@ var connectAutocomplete = function connectAutocomplete(renderFn) {
|
|
|
73
78
|
indexId: scopedResult.indexId,
|
|
74
79
|
indexName: ((_scopedResult$results = scopedResult.results) === null || _scopedResult$results === void 0 ? void 0 : _scopedResult$results.index) || '',
|
|
75
80
|
hits: ((_scopedResult$results2 = scopedResult.results) === null || _scopedResult$results2 === void 0 ? void 0 : _scopedResult$results2.hits) || [],
|
|
76
|
-
results: scopedResult.results || {}
|
|
77
|
-
sendEvent: sendEvent
|
|
81
|
+
results: scopedResult.results || {}
|
|
78
82
|
};
|
|
79
83
|
});
|
|
80
84
|
return {
|
|
81
85
|
currentRefinement: state.query || '',
|
|
82
|
-
indices: indices
|
|
86
|
+
indices: transformItems(indices).map(function (transformedIndex) {
|
|
87
|
+
return _objectSpread(_objectSpread({}, transformedIndex), {}, {
|
|
88
|
+
sendEvent: sendEventMap[transformedIndex.indexId]
|
|
89
|
+
});
|
|
90
|
+
}),
|
|
83
91
|
refine: connectorState.refine,
|
|
84
92
|
widgetParams: widgetParams
|
|
85
93
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DefaultChatTransport } from 'ai';
|
|
1
|
+
import { DefaultChatTransport } from '../../lib/ai-lite';
|
|
2
2
|
import { Chat } from '../../lib/chat';
|
|
3
3
|
import type { AbstractChat, ChatInit as ChatInitAi, UIMessage } from '../../lib/chat';
|
|
4
4
|
import type { SendEventForHits } from '../../lib/utils';
|
|
@@ -37,6 +37,10 @@ export type ChatRenderState<TUiMessage extends UIMessage = UIMessage> = {
|
|
|
37
37
|
* Tools configuration with addToolResult bound, ready to be used by the UI.
|
|
38
38
|
*/
|
|
39
39
|
tools: ClientSideTools;
|
|
40
|
+
/**
|
|
41
|
+
* Suggestions received from the AI model.
|
|
42
|
+
*/
|
|
43
|
+
suggestions?: string[];
|
|
40
44
|
} & Pick<AbstractChat<TUiMessage>, 'addToolResult' | 'clearError' | 'error' | 'id' | 'messages' | 'regenerate' | 'resumeStream' | 'sendMessage' | 'status' | 'stop'>;
|
|
41
45
|
export type ChatInitWithoutTransport<TUiMessage extends UIMessage> = Omit<ChatInitAi<TUiMessage>, 'transport'>;
|
|
42
46
|
export type ChatTransport = {
|
|
@@ -55,6 +59,11 @@ export type ChatConnectorParams<TUiMessage extends UIMessage = UIMessage> = ({
|
|
|
55
59
|
* Configuration for client-side tools.
|
|
56
60
|
*/
|
|
57
61
|
tools?: Record<string, Omit<UserClientSideTool, 'layoutComponent'>>;
|
|
62
|
+
/**
|
|
63
|
+
* Identifier of this type of chat widget. This is used for the key in renderState.
|
|
64
|
+
* @default 'chat'
|
|
65
|
+
*/
|
|
66
|
+
type?: string;
|
|
58
67
|
};
|
|
59
68
|
export type ChatWidgetDescription<TUiMessage extends UIMessage = UIMessage> = {
|
|
60
69
|
$$type: 'ais.chat';
|
|
@@ -64,7 +73,7 @@ export type ChatWidgetDescription<TUiMessage extends UIMessage = UIMessage> = {
|
|
|
64
73
|
};
|
|
65
74
|
};
|
|
66
75
|
export type ChatConnector<TUiMessage extends UIMessage = UIMessage> = Connector<ChatWidgetDescription<TUiMessage>, ChatConnectorParams<TUiMessage>>;
|
|
67
|
-
declare const _default: <TWidgetParams extends UnknownWidgetParams>(renderFn: Renderer<ChatRenderState, TWidgetParams & ChatConnectorParams>, unmountFn?: Unmounter) => <TUiMessage extends UIMessage = UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>>(widgetParams: TWidgetParams & ChatConnectorParams<TUiMessage>) => {
|
|
76
|
+
declare const _default: <TWidgetParams extends UnknownWidgetParams>(renderFn: Renderer<ChatRenderState, TWidgetParams & ChatConnectorParams>, unmountFn?: Unmounter) => <TUiMessage extends UIMessage = UIMessage<unknown, import("../../lib/ai-lite").UIDataTypes, import("../../lib/ai-lite").UITools>>(widgetParams: TWidgetParams & ChatConnectorParams<TUiMessage>) => {
|
|
68
77
|
$$type: "ais.chat";
|
|
69
78
|
init(initOptions: import("../../types").InitOptions): void;
|
|
70
79
|
render(renderOptions: import("../../types").RenderOptions): void;
|
|
@@ -74,7 +83,7 @@ declare const _default: <TWidgetParams extends UnknownWidgetParams>(renderFn: Re
|
|
|
74
83
|
breadcrumb?: {
|
|
75
84
|
[rootAttribute: string]: WidgetRenderState<import("../breadcrumb/connectBreadcrumb").BreadcrumbRenderState, import("../breadcrumb/connectBreadcrumb").BreadcrumbConnectorParams>;
|
|
76
85
|
} | undefined;
|
|
77
|
-
chat?: WidgetRenderState<ChatRenderState<UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>>, ChatConnectorParams<UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>>> | undefined;
|
|
86
|
+
chat?: WidgetRenderState<ChatRenderState<UIMessage<unknown, import("../../lib/ai-lite").UIDataTypes, import("../../lib/ai-lite").UITools>>, ChatConnectorParams<UIMessage<unknown, import("../../lib/ai-lite").UIDataTypes, import("../../lib/ai-lite").UITools>>> | undefined;
|
|
78
87
|
clearRefinements?: WidgetRenderState<import("../clear-refinements/connectClearRefinements").ClearRefinementsRenderState, import("../clear-refinements/connectClearRefinements").ClearRefinementsConnectorParams> | undefined;
|
|
79
88
|
configure?: WidgetRenderState<import("../configure/connectConfigure").ConfigureRenderState, import("../configure/connectConfigure").ConfigureConnectorParams> | undefined;
|
|
80
89
|
currentRefinements?: WidgetRenderState<import("../current-refinements/connectCurrentRefinements").CurrentRefinementsRenderState, import("../current-refinements/connectCurrentRefinements").CurrentRefinementsConnectorParams> | undefined;
|
|
@@ -343,15 +352,16 @@ declare const _default: <TWidgetParams extends UnknownWidgetParams>(renderFn: Re
|
|
|
343
352
|
setInput: (input: string) => void;
|
|
344
353
|
setOpen: (open: boolean) => void;
|
|
345
354
|
setMessages: (messagesParam: TUiMessage[] | ((m: TUiMessage[]) => TUiMessage[])) => void;
|
|
355
|
+
suggestions: string[] | undefined;
|
|
346
356
|
isClearing: boolean;
|
|
347
357
|
clearMessages: () => void;
|
|
348
358
|
onClearTransitionEnd: () => void;
|
|
349
359
|
tools: ClientSideTools;
|
|
350
360
|
widgetParams: TWidgetParams & ChatConnectorParams<TUiMessage>;
|
|
351
|
-
addToolResult: <
|
|
352
|
-
tool:
|
|
361
|
+
addToolResult: <TTool extends keyof import("../../lib/ai-lite").InferUIMessageTools<TUiMessage>>({ tool, toolCallId, output, }: {
|
|
362
|
+
tool: TTool;
|
|
353
363
|
toolCallId: string;
|
|
354
|
-
output:
|
|
364
|
+
output: import("../../lib/ai-lite").InferUIMessageTools<TUiMessage>[TTool]["output"];
|
|
355
365
|
}) => Promise<void>;
|
|
356
366
|
clearError: () => void;
|
|
357
367
|
error: Error | undefined;
|
|
@@ -359,8 +369,8 @@ declare const _default: <TWidgetParams extends UnknownWidgetParams>(renderFn: Re
|
|
|
359
369
|
messages: TUiMessage[];
|
|
360
370
|
regenerate: ({ messageId, ...options }?: {
|
|
361
371
|
messageId?: string;
|
|
362
|
-
} & import("ai").ChatRequestOptions) => Promise<void>;
|
|
363
|
-
resumeStream: (options?: import("ai").ChatRequestOptions) => Promise<void>;
|
|
372
|
+
} & import("../../lib/ai-lite").ChatRequestOptions) => Promise<void>;
|
|
373
|
+
resumeStream: (options?: import("../../lib/ai-lite").ChatRequestOptions) => Promise<void>;
|
|
364
374
|
sendMessage: (message?: (Omit<TUiMessage, "id" | "role"> & {
|
|
365
375
|
id?: TUiMessage["id"] | undefined;
|
|
366
376
|
role?: TUiMessage["role"] | undefined;
|
|
@@ -370,17 +380,17 @@ declare const _default: <TWidgetParams extends UnknownWidgetParams>(renderFn: Re
|
|
|
370
380
|
messageId?: string;
|
|
371
381
|
}) | {
|
|
372
382
|
text: string;
|
|
373
|
-
files?: FileList | import("ai").FileUIPart[];
|
|
374
|
-
metadata?:
|
|
383
|
+
files?: FileList | import("../../lib/ai-lite").FileUIPart[];
|
|
384
|
+
metadata?: import("../../lib/ai-lite").InferUIMessageMetadata<TUiMessage> | undefined;
|
|
375
385
|
parts?: never;
|
|
376
386
|
messageId?: string;
|
|
377
387
|
} | {
|
|
378
|
-
files: FileList | import("ai").FileUIPart[];
|
|
379
|
-
metadata?:
|
|
388
|
+
files: FileList | import("../../lib/ai-lite").FileUIPart[];
|
|
389
|
+
metadata?: import("../../lib/ai-lite").InferUIMessageMetadata<TUiMessage> | undefined;
|
|
380
390
|
parts?: never;
|
|
381
391
|
messageId?: string;
|
|
382
|
-
} | undefined, options?: import("ai").ChatRequestOptions) => Promise<void>;
|
|
383
|
-
status: import("ai").ChatStatus;
|
|
392
|
+
} | undefined, options?: import("../../lib/ai-lite").ChatRequestOptions) => Promise<void>;
|
|
393
|
+
status: import("../../lib/ai-lite").ChatStatus;
|
|
384
394
|
stop: () => Promise<void>;
|
|
385
395
|
};
|
|
386
396
|
dispose(): void;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
-
var _excluded = ["resume", "tools"]
|
|
2
|
+
var _excluded = ["resume", "tools", "type"],
|
|
3
|
+
_excluded2 = ["messages", "trigger"];
|
|
3
4
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
4
5
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
5
6
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
@@ -7,13 +8,17 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
|
|
|
7
8
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
8
9
|
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
9
10
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
10
|
-
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
11
|
-
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
12
11
|
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
13
12
|
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
13
|
+
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
14
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
15
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
16
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
17
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
18
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
14
19
|
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
|
|
15
20
|
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
|
16
|
-
import { DefaultChatTransport, lastAssistantMessageIsCompleteWithToolCalls } from
|
|
21
|
+
import { DefaultChatTransport, lastAssistantMessageIsCompleteWithToolCalls } from "../../lib/ai-lite/index.js";
|
|
17
22
|
import { Chat } from "../../lib/chat/index.js";
|
|
18
23
|
import { checkRendering, createDocumentationMessageGenerator, createSendEventForHits, getAlgoliaAgent, getAppIdAndApiKey, noop, warning } from "../../lib/utils/index.js";
|
|
19
24
|
var withUsage = createDocumentationMessageGenerator({
|
|
@@ -30,6 +35,8 @@ export default (function connectChat(renderFn) {
|
|
|
30
35
|
resume = _ref$resume === void 0 ? false : _ref$resume,
|
|
31
36
|
_ref$tools = _ref.tools,
|
|
32
37
|
tools = _ref$tools === void 0 ? {} : _ref$tools,
|
|
38
|
+
_ref$type = _ref.type,
|
|
39
|
+
type = _ref$type === void 0 ? 'chat' : _ref$type,
|
|
33
40
|
options = _objectWithoutProperties(_ref, _excluded);
|
|
34
41
|
var _chatInstance;
|
|
35
42
|
var input = '';
|
|
@@ -39,6 +46,25 @@ export default (function connectChat(renderFn) {
|
|
|
39
46
|
var setInput;
|
|
40
47
|
var setOpen;
|
|
41
48
|
var setIsClearing;
|
|
49
|
+
var agentId = 'agentId' in options ? options.agentId : undefined;
|
|
50
|
+
|
|
51
|
+
// Extract suggestions from the last assistant message's data-suggestions part
|
|
52
|
+
var getSuggestionsFromMessages = function getSuggestionsFromMessages(messages) {
|
|
53
|
+
// Find the last assistant message (iterate from end)
|
|
54
|
+
var lastAssistantMessage = _toConsumableArray(messages).reverse().find(function (message) {
|
|
55
|
+
return message.role === 'assistant' && message.parts;
|
|
56
|
+
});
|
|
57
|
+
if (!(lastAssistantMessage !== null && lastAssistantMessage !== void 0 && lastAssistantMessage.parts)) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Find the data-suggestions part
|
|
62
|
+
var suggestionsPart = lastAssistantMessage.parts.find(function (part) {
|
|
63
|
+
var _data;
|
|
64
|
+
return 'type' in part && part.type === 'data-suggestions' && 'data' in part && Array.isArray((_data = part.data) === null || _data === void 0 ? void 0 : _data.suggestions);
|
|
65
|
+
});
|
|
66
|
+
return suggestionsPart === null || suggestionsPart === void 0 ? void 0 : suggestionsPart.data.suggestions;
|
|
67
|
+
};
|
|
42
68
|
var setMessages = function setMessages(messagesParam) {
|
|
43
69
|
if (typeof messagesParam === 'function') {
|
|
44
70
|
messagesParam = messagesParam(_chatInstance.messages);
|
|
@@ -62,20 +88,67 @@ export default (function connectChat(renderFn) {
|
|
|
62
88
|
_getAppIdAndApiKey2 = _slicedToArray(_getAppIdAndApiKey, 2),
|
|
63
89
|
appId = _getAppIdAndApiKey2[0],
|
|
64
90
|
apiKey = _getAppIdAndApiKey2[1];
|
|
91
|
+
|
|
92
|
+
// Filter out custom data parts (like data-suggestions) that the backend doesn't accept
|
|
93
|
+
var filterDataParts = function filterDataParts(messages) {
|
|
94
|
+
return messages.map(function (message) {
|
|
95
|
+
var _message$parts;
|
|
96
|
+
return _objectSpread(_objectSpread({}, message), {}, {
|
|
97
|
+
parts: (_message$parts = message.parts) === null || _message$parts === void 0 ? void 0 : _message$parts.filter(function (part) {
|
|
98
|
+
return !('type' in part && part.type.startsWith('data-'));
|
|
99
|
+
})
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
};
|
|
65
103
|
if ('transport' in options && options.transport) {
|
|
66
|
-
|
|
104
|
+
var originalPrepare = options.transport.prepareSendMessagesRequest;
|
|
105
|
+
transport = new DefaultChatTransport(_objectSpread(_objectSpread({}, options.transport), {}, {
|
|
106
|
+
prepareSendMessagesRequest: function prepareSendMessagesRequest(params) {
|
|
107
|
+
// Call the original prepareSendMessagesRequest if it exists,
|
|
108
|
+
// otherwise construct the default body
|
|
109
|
+
var preparedOrPromise = originalPrepare ? originalPrepare(params) : {
|
|
110
|
+
body: _objectSpread({}, params)
|
|
111
|
+
};
|
|
112
|
+
// Then filter out data-* parts
|
|
113
|
+
var applyFilter = function applyFilter(prepared) {
|
|
114
|
+
return _objectSpread(_objectSpread({}, prepared), {}, {
|
|
115
|
+
body: _objectSpread(_objectSpread({}, prepared.body), {}, {
|
|
116
|
+
messages: filterDataParts(prepared.body.messages)
|
|
117
|
+
})
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
// Handle both sync and async cases
|
|
122
|
+
if (preparedOrPromise && 'then' in preparedOrPromise) {
|
|
123
|
+
return preparedOrPromise.then(applyFilter);
|
|
124
|
+
}
|
|
125
|
+
return applyFilter(preparedOrPromise);
|
|
126
|
+
}
|
|
127
|
+
}));
|
|
67
128
|
}
|
|
68
129
|
if ('agentId' in options && options.agentId) {
|
|
69
|
-
var agentId = options.agentId;
|
|
70
130
|
if (!appId || !apiKey) {
|
|
71
131
|
throw new Error(withUsage('Could not extract Algolia credentials from the search client.'));
|
|
72
132
|
}
|
|
133
|
+
var baseApi = "https://".concat(appId, ".algolia.net/agent-studio/1/agents/").concat(agentId, "/completions?compatibilityMode=ai-sdk-5");
|
|
73
134
|
transport = new DefaultChatTransport({
|
|
74
|
-
api:
|
|
135
|
+
api: baseApi,
|
|
75
136
|
headers: {
|
|
76
137
|
'x-algolia-application-id': appId,
|
|
77
138
|
'x-algolia-api-Key': apiKey,
|
|
78
139
|
'x-algolia-agent': getAlgoliaAgent(instantSearchInstance.client)
|
|
140
|
+
},
|
|
141
|
+
prepareSendMessagesRequest: function prepareSendMessagesRequest(_ref2) {
|
|
142
|
+
var messages = _ref2.messages,
|
|
143
|
+
trigger = _ref2.trigger,
|
|
144
|
+
rest = _objectWithoutProperties(_ref2, _excluded2);
|
|
145
|
+
return {
|
|
146
|
+
// Bypass cache when regenerating to ensure fresh responses
|
|
147
|
+
api: trigger === 'regenerate-message' ? "".concat(baseApi, "&cache=false") : baseApi,
|
|
148
|
+
body: _objectSpread(_objectSpread({}, rest), {}, {
|
|
149
|
+
messages: filterDataParts(messages)
|
|
150
|
+
})
|
|
151
|
+
};
|
|
79
152
|
}
|
|
80
153
|
});
|
|
81
154
|
}
|
|
@@ -88,8 +161,8 @@ export default (function connectChat(renderFn) {
|
|
|
88
161
|
return new Chat(_objectSpread(_objectSpread({}, options), {}, {
|
|
89
162
|
transport: transport,
|
|
90
163
|
sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,
|
|
91
|
-
onToolCall: function onToolCall(
|
|
92
|
-
var toolCall =
|
|
164
|
+
onToolCall: function onToolCall(_ref3) {
|
|
165
|
+
var toolCall = _ref3.toolCall;
|
|
93
166
|
var tool = tools[toolCall.toolName];
|
|
94
167
|
if (!tool) {
|
|
95
168
|
if (process.env.NODE_ENV === 'development') {
|
|
@@ -102,8 +175,8 @@ export default (function connectChat(renderFn) {
|
|
|
102
175
|
});
|
|
103
176
|
}
|
|
104
177
|
if (tool.onToolCall) {
|
|
105
|
-
var addToolResult = function addToolResult(
|
|
106
|
-
var output =
|
|
178
|
+
var addToolResult = function addToolResult(_ref4) {
|
|
179
|
+
var output = _ref4.output;
|
|
107
180
|
return _chatInstance.addToolResult({
|
|
108
181
|
output: output,
|
|
109
182
|
tool: toolCall.toolName,
|
|
@@ -159,9 +232,7 @@ export default (function connectChat(renderFn) {
|
|
|
159
232
|
getRenderState: function getRenderState(renderState, renderOptions
|
|
160
233
|
// Type is explicitly redefined, to avoid having the TWidgetParams type in the definition
|
|
161
234
|
) {
|
|
162
|
-
return _objectSpread(_objectSpread({}, renderState), {}, {
|
|
163
|
-
chat: this.getWidgetRenderState(renderOptions)
|
|
164
|
-
});
|
|
235
|
+
return _objectSpread(_objectSpread({}, renderState), {}, _defineProperty({}, type, this.getWidgetRenderState(renderOptions)));
|
|
165
236
|
},
|
|
166
237
|
getWidgetRenderState: function getWidgetRenderState(renderOptions) {
|
|
167
238
|
var instantSearchInstance = renderOptions.instantSearchInstance,
|
|
@@ -180,10 +251,10 @@ export default (function connectChat(renderFn) {
|
|
|
180
251
|
});
|
|
181
252
|
}
|
|
182
253
|
var toolsWithAddToolResult = {};
|
|
183
|
-
Object.entries(tools).forEach(function (
|
|
184
|
-
var
|
|
185
|
-
key =
|
|
186
|
-
tool =
|
|
254
|
+
Object.entries(tools).forEach(function (_ref5) {
|
|
255
|
+
var _ref6 = _slicedToArray(_ref5, 2),
|
|
256
|
+
key = _ref6[0],
|
|
257
|
+
tool = _ref6[1];
|
|
187
258
|
var toolWithAddToolResult = _objectSpread(_objectSpread({}, tool), {}, {
|
|
188
259
|
addToolResult: _chatInstance.addToolResult
|
|
189
260
|
});
|
|
@@ -198,6 +269,7 @@ export default (function connectChat(renderFn) {
|
|
|
198
269
|
setInput: setInput,
|
|
199
270
|
setOpen: setOpen,
|
|
200
271
|
setMessages: setMessages,
|
|
272
|
+
suggestions: getSuggestionsFromMessages(_chatInstance.messages),
|
|
201
273
|
isClearing: isClearing,
|
|
202
274
|
clearMessages: clearMessages,
|
|
203
275
|
onClearTransitionEnd: onClearTransitionEnd,
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { Connector, TransformItems, WidgetRenderState } from '../../types';
|
|
2
|
+
export type Suggestion = {
|
|
3
|
+
/**
|
|
4
|
+
* The facet attribute name.
|
|
5
|
+
*/
|
|
6
|
+
attribute: string;
|
|
7
|
+
/**
|
|
8
|
+
* The facet value to filter by.
|
|
9
|
+
*/
|
|
10
|
+
value: string;
|
|
11
|
+
/**
|
|
12
|
+
* Human-readable display label.
|
|
13
|
+
*/
|
|
14
|
+
label: string;
|
|
15
|
+
/**
|
|
16
|
+
* Number of records matching this filter.
|
|
17
|
+
*/
|
|
18
|
+
count: number;
|
|
19
|
+
};
|
|
20
|
+
export type FilterSuggestionsTransport = {
|
|
21
|
+
/**
|
|
22
|
+
* The custom API endpoint URL.
|
|
23
|
+
*/
|
|
24
|
+
api: string;
|
|
25
|
+
/**
|
|
26
|
+
* Custom headers to send with the request.
|
|
27
|
+
*/
|
|
28
|
+
headers?: Record<string, string>;
|
|
29
|
+
/**
|
|
30
|
+
* Function to prepare the request body before sending.
|
|
31
|
+
* Receives the default body and returns the modified request options.
|
|
32
|
+
*/
|
|
33
|
+
prepareSendMessagesRequest?: (body: Record<string, unknown>) => {
|
|
34
|
+
body: Record<string, unknown>;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export type FilterSuggestionsRenderState = {
|
|
38
|
+
/**
|
|
39
|
+
* The list of suggested filters.
|
|
40
|
+
*/
|
|
41
|
+
suggestions: Suggestion[];
|
|
42
|
+
/**
|
|
43
|
+
* Whether suggestions are currently being fetched.
|
|
44
|
+
*/
|
|
45
|
+
isLoading: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Applies a filter for the given attribute and value.
|
|
48
|
+
*/
|
|
49
|
+
refine: (attribute: string, value: string) => void;
|
|
50
|
+
};
|
|
51
|
+
export type FilterSuggestionsConnectorParams = {
|
|
52
|
+
/**
|
|
53
|
+
* The ID of the agent configured in the Algolia dashboard.
|
|
54
|
+
* Required unless a custom `transport` is provided.
|
|
55
|
+
*/
|
|
56
|
+
agentId?: string;
|
|
57
|
+
/**
|
|
58
|
+
* Limit to specific facet attributes.
|
|
59
|
+
*/
|
|
60
|
+
attributes?: string[];
|
|
61
|
+
/**
|
|
62
|
+
* Maximum number of suggestions to return.
|
|
63
|
+
* @default 3
|
|
64
|
+
*/
|
|
65
|
+
maxSuggestions?: number;
|
|
66
|
+
/**
|
|
67
|
+
* Debounce delay in milliseconds before fetching suggestions.
|
|
68
|
+
* @default 300
|
|
69
|
+
*/
|
|
70
|
+
debounceMs?: number;
|
|
71
|
+
/**
|
|
72
|
+
* Number of hits to send for context.
|
|
73
|
+
* @default 5
|
|
74
|
+
*/
|
|
75
|
+
hitsToSample?: number;
|
|
76
|
+
/**
|
|
77
|
+
* Function to transform the items passed to the templates.
|
|
78
|
+
*/
|
|
79
|
+
transformItems?: TransformItems<Suggestion>;
|
|
80
|
+
/**
|
|
81
|
+
* Custom transport configuration for the API requests.
|
|
82
|
+
* When provided, allows using a custom endpoint, headers, and request body.
|
|
83
|
+
*/
|
|
84
|
+
transport?: FilterSuggestionsTransport;
|
|
85
|
+
};
|
|
86
|
+
export type FilterSuggestionsWidgetDescription = {
|
|
87
|
+
$$type: 'ais.filterSuggestions';
|
|
88
|
+
renderState: FilterSuggestionsRenderState;
|
|
89
|
+
indexRenderState: {
|
|
90
|
+
filterSuggestions: WidgetRenderState<FilterSuggestionsRenderState, FilterSuggestionsConnectorParams>;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
export type FilterSuggestionsConnector = Connector<FilterSuggestionsWidgetDescription, FilterSuggestionsConnectorParams>;
|
|
94
|
+
declare const connectFilterSuggestions: FilterSuggestionsConnector;
|
|
95
|
+
export default connectFilterSuggestions;
|