OpenAI Integration
Add persistent memory to your OpenAI applications. Memorystack works seamlessly with OpenAI's Chat Completions API to provide context-aware conversations.
✓ GPT-4✓ GPT-3.5 Turbo✓ Function Calling
Installation
npm install openai @memorystack/sdkBasic Integration
Combine OpenAI with Memorystack for context-aware conversations:
import OpenAI from "openai";
import { MemoryStackClient } from "@memorystack/sdk";
// Initialize clients
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY
});
const memoryOS = new MemoryStackClient({
apiKey: process.env.MEMORYSTACK_API_KEY
});
async function chatWithMemory(userMessage: string, userId?: string) {
// 1. Get relevant memories for context
const memories = await memoryOS.listMemories({
user_id: userId,
limit: 5,
order: "desc"
});
// 2. Build context from memories
const context = memories.results
.map(m => `[${m.memory_type}] ${m.content}`)
.join("\n");
// 3. Call OpenAI with context
const completion = await openai.chat.completions.create({
model: "gpt-4",
messages: [
{
role: "system",
content: `You are a helpful assistant. Here's what you know about the user:\n${context}`
},
{
role: "user",
content: userMessage
}
]
});
const aiResponse = completion.choices[0].message.content;
// 4. Save conversation to Memorystack
await memoryOS.addConversation(userMessage, aiResponse, userId);
return aiResponse;
}
// Usage
const response = await chatWithMemory(
"What programming language do I prefer?",
"user_123"
);
console.log(response);Streaming Responses
Stream OpenAI responses while saving to Memorystack:
async function streamChatWithMemory(userMessage: string, userId?: string) {
// Get memories for context
const memories = await memoryOS.getUserMemories(userId, 5);
const context = memories.results
.map(m => `[${m.memory_type}] ${m.content}`)
.join("\n");
// Stream OpenAI response
const stream = await openai.chat.completions.create({
model: "gpt-4",
messages: [
{
role: "system",
content: `Context: ${context}`
},
{
role: "user",
content: userMessage
}
],
stream: true
});
// Collect the full response
let fullResponse = "";
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content || "";
fullResponse += content;
process.stdout.write(content); // Stream to console
}
// Save to Memorystack after streaming completes
await memoryOS.addConversation(userMessage, fullResponse, userId);
return fullResponse;
}Function Calling with Memory
Use OpenAI function calling to query memories:
const functions = [
{
name: "search_memories",
description: "Search user's memories for relevant information",
parameters: {
type: "object",
properties: {
query: {
type: "string",
description: "What to search for in memories"
},
memory_type: {
type: "string",
enum: ["preference", "fact", "experience", "goal"],
description: "Type of memory to search"
}
},
required: ["query"]
}
}
];
async function chatWithFunctions(userMessage: string, userId?: string) {
const completion = await openai.chat.completions.create({
model: "gpt-4",
messages: [
{ role: "user", content: userMessage }
],
functions,
function_call: "auto"
});
const message = completion.choices[0].message;
// If OpenAI wants to call a function
if (message.function_call) {
const args = JSON.parse(message.function_call.arguments);
// Search memories
const memories = await memoryOS.listMemories({
user_id: userId,
memory_type: args.memory_type,
limit: 10
});
// Send results back to OpenAI
const secondCompletion = await openai.chat.completions.create({
model: "gpt-4",
messages: [
{ role: "user", content: userMessage },
message,
{
role: "function",
name: "search_memories",
content: JSON.stringify(memories.results)
}
]
});
return secondCompletion.choices[0].message.content;
}
return message.content;
}Best Practices
💡 Context Window Management
Limit memories to 5-10 most relevant items to stay within OpenAI's context window.
🎯 Semantic Filtering
Use memory_type filters to get only relevant memories (preferences, facts, etc.).
⚡ Async Operations
Save memories asynchronously to avoid blocking the response to users.
🔄 Error Handling
Always handle errors gracefully - don't let memory failures break your chat.
