Skip to main content

Building a Personalized Prompt

The most common use case: inject profile data into your LLM’s system prompt.
async function handleChatMessage(userId: string, message: string) {  // Get user profile  const profileResponse = await fetch('https://api.supermemory.ai/v4/profile', {  method: 'POST',  headers: {  'Authorization': `Bearer ${process.env.SUPERMEMORY_API_KEY}`,  'Content-Type': 'application/json'  },  body: JSON.stringify({ containerTag: userId })  });   const { profile } = await profileResponse.json();   // Build personalized system prompt  const systemPrompt = `You are assisting a user with the following context:  ABOUT THE USER: ${profile.static?.join('\n') || 'No profile information yet.'}  CURRENT CONTEXT: ${profile.dynamic?.join('\n') || 'No recent activity.'}  Provide responses personalized to their expertise level and preferences.`;   // Send to your LLM  const response = await llm.chat({  messages: [  { role: "system", content: systemPrompt },  { role: "user", content: message }  ]  });   return response; } 

Full Context Mode

Combine profile data with query-specific search for comprehensive context:
async function getFullContext(userId: string, userQuery: string) {  // Single call gets both profile and search results  const response = await fetch('https://api.supermemory.ai/v4/profile', {  method: 'POST',  headers: {  'Authorization': `Bearer ${process.env.SUPERMEMORY_API_KEY}`,  'Content-Type': 'application/json'  },  body: JSON.stringify({  containerTag: userId,  q: userQuery // Include the user's query  })  });   const data = await response.json();   return {  // Static background about the user  userBackground: data.profile.static,  // Current activities and context  currentContext: data.profile.dynamic,  // Query-specific memories  relevantMemories: data.searchResults?.results || []  }; }  // Usage const context = await getFullContext('user_123', 'deployment error last week');  const systemPrompt = ` User Background: ${context.userBackground.join('\n')}  Current Context: ${context.currentContext.join('\n')}  Relevant Information: ${context.relevantMemories.map(m => m.content).join('\n')} `; 
For more control, you can call profile and search endpoints separately:
TypeScript
async function advancedContext(userId: string, query: string) {  // Parallel requests for profile and search  const [profileRes, searchRes] = await Promise.all([  fetch('https://api.supermemory.ai/v4/profile', {  method: 'POST',  headers: {  'Authorization': `Bearer ${process.env.SUPERMEMORY_API_KEY}`,  'Content-Type': 'application/json'  },  body: JSON.stringify({ containerTag: userId })  }),  fetch('https://api.supermemory.ai/v3/search', {  method: 'POST',  headers: {  'Authorization': `Bearer ${process.env.SUPERMEMORY_API_KEY}`,  'Content-Type': 'application/json'  },  body: JSON.stringify({  q: query,  containerTag: userId,  limit: 5  })  })  ]);   const profile = await profileRes.json();  const search = await searchRes.json();   return { profile: profile.profile, searchResults: search.results }; } 

Express.js Middleware

Add profile context to all authenticated requests:
TypeScript
import express from 'express';  // Middleware to fetch user profile async function withUserProfile(req, res, next) {  if (!req.user?.id) {  return next();  }   try {  const response = await fetch('https://api.supermemory.ai/v4/profile', {  method: 'POST',  headers: {  'Authorization': `Bearer ${process.env.SUPERMEMORY_API_KEY}`,  'Content-Type': 'application/json'  },  body: JSON.stringify({ containerTag: req.user.id })  });   req.userProfile = await response.json();  } catch (error) {  console.error('Failed to fetch profile:', error);  req.userProfile = null;  }   next(); }  const app = express();  // Apply to all routes app.use(withUserProfile);  app.post('/chat', async (req, res) => {  const { message } = req.body;   // Profile is automatically available  const profile = req.userProfile?.profile;   // Use in your LLM call... }); 

Next.js API Route

TypeScript
// app/api/chat/route.ts import { NextRequest, NextResponse } from 'next/server';  export async function POST(req: NextRequest) {  const { userId, message } = await req.json();   // Fetch profile  const profileRes = await fetch('https://api.supermemory.ai/v4/profile', {  method: 'POST',  headers: {  'Authorization': `Bearer ${process.env.SUPERMEMORY_API_KEY}`,  'Content-Type': 'application/json'  },  body: JSON.stringify({ containerTag: userId })  });   const { profile } = await profileRes.json();   // Build context and call your LLM...  const response = await generateResponse(message, profile);   return NextResponse.json({ response }); } 

AI SDK Integration

For the cleanest integration, use the Supermemory AI SDK middleware:
TypeScript
import { generateText } from "ai" import { withSupermemory } from "@supermemory/tools/ai-sdk" import { openai } from "@ai-sdk/openai"  // One line setup - profiles automatically injected const model = withSupermemory(openai("gpt-4"), "user-123")  const result = await generateText({  model,  messages: [{ role: "user", content: "Help me with my current project" }] }) // Model automatically has access to user's profile! 

AI SDK User Profiles

Learn more about automatic profile injection with the AI SDK