* Search observation groups across threads by semantic similarity. * Requires a vector store and embedder to be configured.
({
query,
resourceId,
topK = 10,
filter,
}: {
query: string;
resourceId: string;
topK?: number;
filter?: {
threadId?: string;
observedAfter?: Date;
observedBefore?: Date;
};
})
| 1925 | * Requires a vector store and embedder to be configured. |
| 1926 | */ |
| 1927 | public async searchMessages({ |
| 1928 | query, |
| 1929 | resourceId, |
| 1930 | topK = 10, |
| 1931 | filter, |
| 1932 | }: { |
| 1933 | query: string; |
| 1934 | resourceId: string; |
| 1935 | topK?: number; |
| 1936 | filter?: { |
| 1937 | threadId?: string; |
| 1938 | observedAfter?: Date; |
| 1939 | observedBefore?: Date; |
| 1940 | }; |
| 1941 | }): Promise<{ |
| 1942 | results: Array<{ |
| 1943 | threadId: string; |
| 1944 | score: number; |
| 1945 | groupId?: string; |
| 1946 | range?: string; |
| 1947 | text?: string; |
| 1948 | observedAt?: Date; |
| 1949 | }>; |
| 1950 | }> { |
| 1951 | if (!this.vector) { |
| 1952 | throw new Error('searchMessages requires a vector store. Configure vector and embedder on your Memory instance.'); |
| 1953 | } |
| 1954 | |
| 1955 | const { embeddings, dimension } = await this.embedMessageContent(query); |
| 1956 | const { indexName } = await this.createObservationEmbeddingIndex(dimension); |
| 1957 | |
| 1958 | const vectorFilter: VectorFilter = { resource_id: resourceId }; |
| 1959 | if (filter?.threadId) { |
| 1960 | vectorFilter.thread_id = filter.threadId; |
| 1961 | } |
| 1962 | if (filter?.observedAfter || filter?.observedBefore) { |
| 1963 | vectorFilter.observed_at = { |
| 1964 | ...(filter.observedAfter ? { $gt: filter.observedAfter.toISOString() } : {}), |
| 1965 | ...(filter.observedBefore ? { $lt: filter.observedBefore.toISOString() } : {}), |
| 1966 | }; |
| 1967 | } |
| 1968 | |
| 1969 | const queryResults: Array<{ |
| 1970 | threadId: string; |
| 1971 | score: number; |
| 1972 | groupId?: string; |
| 1973 | range?: string; |
| 1974 | text?: string; |
| 1975 | observedAt?: Date; |
| 1976 | }> = []; |
| 1977 | |
| 1978 | await Promise.all( |
| 1979 | embeddings.map(async embedding => { |
| 1980 | const results = await this.vector!.query({ |
| 1981 | indexName, |
| 1982 | queryVector: embedding, |
| 1983 | topK, |
| 1984 | filter: vectorFilter, |
no test coverage detected