Skip to documentation

    OpenAI Integration

    Connecting MemoryStack inside ChatGPT? Use the ChatGPT plugin setup guide. This page covers applications built with the OpenAI API.

    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/sdk

    Basic Integration

    Combine OpenAI with Memorystack for context-aware conversations:

    openai-memory.ts
    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:

    streaming.ts
    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:

    function-calling.ts
    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.