# Project Memory – PS_AI_Agent > This file is committed to the repository so it is available on any machine. > Claude Code reads it automatically at session start (via the auto-memory system) > when the working directory is inside this repo. > **Keep it under ~180 lines** – lines beyond 200 are truncated by the system. --- ## Project Location - Repo root: `/` (wherever this is cloned) - UE5 project: `/Unreal/PS_AI_Agent/` - `.uproject`: `/Unreal/PS_AI_Agent/PS_AI_Agent.uproject` - Engine: **Unreal Engine 5.5** — Win64 primary target ## Plugins | Plugin | Path | Purpose | |--------|------|---------| | Convai (reference) | `/ConvAI/Convai/` | gRPC + protobuf streaming to Convai API. Has ElevenLabs voice type enum in `ConvaiDefinitions.h`. Used as architectural reference. | | **PS_AI_Agent_ElevenLabs** | `/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/` | Our ElevenLabs Conversational AI integration. See `.claude/elevenlabs_plugin.md` for full details. | ## User Preferences - Plugin naming: `PS_AI_Agent_` (e.g. `PS_AI_Agent_ElevenLabs`) - Save memory frequently during long sessions - Goal: ElevenLabs Conversational AI integration — simpler than Convai, no gRPC - Full original ask + intent: see `.claude/project_context.md` ## Key UE5 Plugin Patterns - Settings object: `UCLASS(config=Engine, defaultconfig)` inheriting `UObject`, registered via `ISettingsModule` - Module startup: `NewObject(..., RF_Standalone)` + `AddToRoot()` - WebSocket: `FWebSocketsModule::Get().CreateWebSocket(URL, TEXT(""), Headers)` - Audio capture: `Audio::FAudioCapture` from the `AudioCapture` module - Procedural audio playback: `USoundWaveProcedural` + `OnSoundWaveProceduralUnderflow` delegate - Audio capture callbacks arrive on a **background thread** — always marshal to game thread with `AsyncTask(ENamedThreads::GameThread, ...)` - Resample mic audio to **16000 Hz mono** before sending to ElevenLabs