From a00a751e104f90f4bd0459afd69e2488ce5922d5 Mon Sep 17 00:00:00 2001 From: MaheshtheDev <38828053+MaheshtheDev@users.noreply.github.com> Date: Thu, 19 Mar 2026 00:38:53 +0000 Subject: [PATCH] pkg(tools): Expose raw search results in MemoryPromptData for prompt templates (#787) Expose raw search results in `MemoryPromptData` so prompt templates can traverse, filter, and selectively include results based on metadata (e.g. score, source). ##### Usage example ```typescript const promptTemplate = (data: MemoryPromptData) => { const relevant = data.searchResults.filter( (r) => (r.metadata?.score as number) > 0.7 ) return `${data.userMemories}\n${relevant.map(r => r.memory).join('\n')}` } ``` --- apps/docs/ai-sdk/user-profiles.mdx | 26 ++++++++++++++++++++++ apps/docs/integrations/ai-sdk.mdx | 2 +- apps/docs/integrations/mastra.mdx | 2 +- packages/tools/README.md | 1 + packages/tools/package.json | 2 +- packages/tools/src/shared/memory-client.ts | 1 + packages/tools/src/shared/types.ts | 7 ++++++ packages/tools/src/vercel/memory-prompt.ts | 7 ++---- 8 files changed, 40 insertions(+), 8 deletions(-) diff --git a/apps/docs/ai-sdk/user-profiles.mdx b/apps/docs/ai-sdk/user-profiles.mdx index 3afc41e0b..df8c5430f 100644 --- a/apps/docs/ai-sdk/user-profiles.mdx +++ b/apps/docs/ai-sdk/user-profiles.mdx @@ -154,6 +154,7 @@ The `MemoryPromptData` object passed to your template function provides: - `userMemories`: Pre-formatted markdown combining static profile facts (name, preferences, goals) and dynamic context (current projects, recent interests) - `generalSearchMemories`: Pre-formatted search results based on semantic similarity to the current query (empty string if mode is "profile") +- `searchResults`: Raw search results array (`Array<{ memory: string; metadata?: Record }>`) for traversing, filtering, or selectively including results based on metadata ### XML-Based Prompting for Claude @@ -179,6 +180,31 @@ const model = withSupermemory(anthropic("claude-3-sonnet"), "user-123", { }) ``` +### Filtering Search Results + +Use `searchResults` to traverse the raw data and pick what's important: + +```typescript +const selectivePrompt = (data: MemoryPromptData) => { + const relevant = data.searchResults.filter( + (r) => (r.metadata?.score as number) > 0.7 + ) + return ` + +${data.userMemories} + + +${relevant.map((r) => `- ${r.memory}`).join("\n")} + +`.trim() +} + +const model = withSupermemory(openai("gpt-4"), "user-123", { + mode: "full", + promptTemplate: selectivePrompt +}) +``` + ### Custom Branding Remove "supermemories" references and use your own branding: diff --git a/apps/docs/integrations/ai-sdk.mdx b/apps/docs/integrations/ai-sdk.mdx index 4f70d9163..a9e2d6f8a 100644 --- a/apps/docs/integrations/ai-sdk.mdx +++ b/apps/docs/integrations/ai-sdk.mdx @@ -75,7 +75,7 @@ const model = withSupermemory(openai("gpt-4"), "user-123", { mode: "full" }) ### Custom Prompt Templates -Customize how memories are formatted: +Customize how memories are formatted. The template receives `userMemories`, `generalSearchMemories`, and `searchResults` (raw array for filtering by metadata): ```typescript import { withSupermemory, type MemoryPromptData } from "@supermemory/tools/ai-sdk" diff --git a/apps/docs/integrations/mastra.mdx b/apps/docs/integrations/mastra.mdx index 34463d4e2..0874c763e 100644 --- a/apps/docs/integrations/mastra.mdx +++ b/apps/docs/integrations/mastra.mdx @@ -162,7 +162,7 @@ await agent.generate("My favorite framework is Next.js") ## Custom Prompt Templates -Customize how memories are formatted and injected: +Customize how memories are formatted and injected. The template receives `userMemories`, `generalSearchMemories`, and `searchResults` (raw array for filtering by metadata): ```typescript import { Agent } from "@mastra/core/agent" diff --git a/packages/tools/README.md b/packages/tools/README.md index 78963f101..2d03411d3 100644 --- a/packages/tools/README.md +++ b/packages/tools/README.md @@ -253,6 +253,7 @@ const result = await generateText({ The `MemoryPromptData` object provides: - `userMemories`: Pre-formatted markdown combining static profile facts (name, preferences, goals) and dynamic context (current projects, recent interests) - `generalSearchMemories`: Pre-formatted search results based on semantic similarity to the current query +- `searchResults`: Raw search results array for traversing, filtering, or selectively including results based on metadata ### OpenAI SDK Usage diff --git a/packages/tools/package.json b/packages/tools/package.json index 39cde98d8..fb9762f7b 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,7 +1,7 @@ { "name": "@supermemory/tools", "type": "module", - "version": "1.4.00", + "version": "1.4.01", "description": "Memory tools for AI SDK and OpenAI function calling with supermemory", "scripts": { "build": "tsdown", diff --git a/packages/tools/src/shared/memory-client.ts b/packages/tools/src/shared/memory-client.ts index d55926c02..58754c895 100644 --- a/packages/tools/src/shared/memory-client.ts +++ b/packages/tools/src/shared/memory-client.ts @@ -154,6 +154,7 @@ export const buildMemoriesText = async ( const promptData: MemoryPromptData = { userMemories, generalSearchMemories, + searchResults: memoriesResponse.searchResults?.results ?? [], } const memories = promptTemplate(promptData) diff --git a/packages/tools/src/shared/types.ts b/packages/tools/src/shared/types.ts index 0d457e85b..421785f52 100644 --- a/packages/tools/src/shared/types.ts +++ b/packages/tools/src/shared/types.ts @@ -13,6 +13,12 @@ export interface MemoryPromptData { * Empty string if mode is "profile" only. */ generalSearchMemories: string + /** + * Raw search results from the API for the current query. + * Use this to traverse, filter, or selectively include results based on metadata. + * Empty array if mode is "profile" or when no search was performed. + */ + searchResults: Array<{ memory: string; metadata?: Record }> } /** @@ -28,6 +34,7 @@ export interface MemoryPromptData { * ${data.generalSearchMemories} * * `.trim() + * // data.searchResults provides raw results for custom filtering/formatting * ``` */ export type PromptTemplate = (data: MemoryPromptData) => string diff --git a/packages/tools/src/vercel/memory-prompt.ts b/packages/tools/src/vercel/memory-prompt.ts index 29f2c6cb9..0f928aa28 100644 --- a/packages/tools/src/vercel/memory-prompt.ts +++ b/packages/tools/src/vercel/memory-prompt.ts @@ -8,7 +8,7 @@ export { type BuildMemoriesTextOptions, } from "../shared" -import type { Logger } from "../shared" +import type { Logger, MemoryPromptData } from "../shared" import type { LanguageModelCallOptions } from "./util" /** @@ -100,10 +100,7 @@ export const addSystemPrompt = async ( mode: "profile" | "query" | "full", baseUrl: string, apiKey: string, - promptTemplate?: (data: { - userMemories: string - generalSearchMemories: string - }) => string, + promptTemplate?: (data: MemoryPromptData) => string, ): Promise => { const { buildMemoriesText } = await import("../shared")