Skip to content

Advanced Memory Usage

This guide covers advanced features and techniques for using the Bupple AI Engine memory management system.

Advanced Message Management

Message with Metadata

php
use Bupple\Engine\Facades\Engine;

Engine::memory()->addMessage('user', 'Hello!', 'text', [
    'user_id' => 123,
    'session_id' => 'abc-xyz',
    'timestamp' => now(),
    'client_info' => [
        'ip' => request()->ip(),
        'user_agent' => request()->userAgent(),
    ],
]);

Media Content Storage

php
// Store image message
Engine::memory()->addMessage('user', $imageUrl, 'image', [
    'mime_type' => 'image/jpeg',
    'size' => $imageSize,
    'dimensions' => [
        'width' => 800,
        'height' => 600,
    ],
]);

// Store audio message
Engine::memory()->addMessage('user', $audioUrl, 'audio', [
    'format' => 'mp3',
    'duration' => 120,
    'transcript' => 'Audio transcript here',
]);

Advanced Context Management

Multiple Contexts

php
// User context
Engine::memory()->setParent(User::class, $userId);
$userMessages = Engine::memory()->getMessages();

// Chat context
Engine::memory()->setParent('ChatSession', $sessionId);
$chatMessages = Engine::memory()->getMessages();

// Thread context
Engine::memory()->setParent('Thread', $threadId);
$threadMessages = Engine::memory()->getMessages();

Context Inheritance

php
class ChatMemory
{
    protected $memory;
    protected $contexts = [];

    public function __construct()
    {
        $this->memory = Engine::memory();
    }

    public function pushContext(string $class, string|int $id): void
    {
        $this->contexts[] = [$class, $id];
        $this->memory->setParent($class, $id);
    }

    public function popContext(): void
    {
        array_pop($this->contexts);
        if ($context = end($this->contexts)) {
            $this->memory->setParent($context[0], $context[1]);
        }
    }

    public function getAllMessages(): array
    {
        $messages = [];
        foreach ($this->contexts as $context) {
            $this->memory->setParent($context[0], $context[1]);
            $messages = array_merge($messages, $this->memory->getMessages());
        }
        return $messages;
    }
}

Custom Memory Drivers

Creating a Custom Driver

php
use Bupple\Engine\Core\Drivers\Memory\AbstractMemoryDriver;
use Bupple\Engine\Core\Models\Memory;

class CustomMemoryDriver extends AbstractMemoryDriver
{
    protected function formatRole(string $role): string
    {
        return strtolower($role);
    }

    protected function formatMessage(Memory $message): array
    {
        return [
            'role' => $message->role,
            'content' => $this->formatContent($message),
            'metadata' => $message->metadata,
        ];
    }

    protected function formatContent($message): string|array
    {
        if ($message->type === 'text') {
            return $message->content;
        }

        return match ($message->type) {
            'image' => $this->formatImageContent($message),
            'audio' => $this->formatAudioContent($message),
            default => $message->content,
        };
    }

    protected function getDriverName(): string
    {
        return 'custom';
    }
}

Registering Custom Driver

php
use Bupple\Engine\Core\Drivers\Memory\MemoryManager;

class CustomMemoryServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->app->extend(MemoryManager::class, function ($manager) {
            $manager->extend('custom', function ($config) {
                return new CustomMemoryDriver($config);
            });
            return $manager;
        });
    }
}

Advanced Querying

Message Filtering

php
use Bupple\Engine\Core\Models\Memory;

// Get messages by type
$imageMessages = Memory::where('type', 'image')->get();

// Get messages by role
$userMessages = Memory::where('role', 'user')->get();

// Get messages with specific metadata
$messages = Memory::whereJsonContains('metadata->tags', ['important'])->get();

// Get messages within time range
$recentMessages = Memory::whereBetween('created_at', [
    now()->subHours(24),
    now()
])->get();

Message Aggregation

php
// Count messages by role
$messageCounts = Memory::groupBy('role')
    ->selectRaw('role, count(*) as count')
    ->get();

// Get average message length
$avgLength = Memory::where('type', 'text')
    ->selectRaw('AVG(LENGTH(content)) as avg_length')
    ->first();

// Get most active users
$activeUsers = Memory::where('role', 'user')
    ->groupBy('parent_id')
    ->selectRaw('parent_id, count(*) as message_count')
    ->orderByDesc('message_count')
    ->limit(10)
    ->get();

Performance Optimization

Batch Operations

php
// Batch insert messages
public function batchAddMessages(array $messages)
{
    $formattedMessages = array_map(function ($message) {
        return [
            'parent_class' => $this->parentClass,
            'parent_id' => $this->parentId,
            'role' => $this->formatRole($message['role']),
            'content' => $message['content'],
            'type' => $message['type'] ?? 'text',
            'metadata' => $message['metadata'] ?? [],
            'created_at' => now(),
            'updated_at' => now(),
        ];
    }, $messages);

    Memory::insert($formattedMessages);
}

// Batch delete messages
public function batchDeleteMessages(array $conditions)
{
    Memory::where($conditions)->delete();
}

Caching

php
use Illuminate\Support\Facades\Cache;

public function getCachedMessages(): array
{
    $cacheKey = "memory:{$this->parentClass}:{$this->parentId}";
    
    return Cache::remember($cacheKey, now()->addMinutes(5), function () {
        return $this->getMessages();
    });
}

public function invalidateCache(): void
{
    $cacheKey = "memory:{$this->parentClass}:{$this->parentId}";
    Cache::forget($cacheKey);
}

Next Steps

For more advanced topics, check out:

Released under the MIT License.