Initial clean commit - unified Lyra stack

This commit is contained in:
serversdwn
2025-11-16 03:17:32 -05:00
commit 94fb091e59
270 changed files with 74200 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
{
"title": "NVGRAM development update",
"messages": [
{
"role": "user",
"content": "hello this is nvgram development .2"
},
{
"role": "tool",
"content": "All the files uploaded by the user have been fully loaded. Searching won't provide additional information."
},
{
"role": "assistant",
"content": "Perfect — all your project files are loaded and synced. \nHeres a quick snapshot so we know exactly where were starting for **NVGRAM Development .2**:\n\n---\n\n### 🧩 Current State Summary\n**NVGRAM v0.1.2**\n- Fully independent repo and submodule (serversdwn/lyra-nvgram).\n- Async memory writes, clean API layer, Postgres + Neo4j dual persistence.\n- Compatible endpoints: `/memories`, `/search`.\n- Docker service: `nvgram-api` on port **7077**.\n- Integrated with Lyra-Core (Relay now points to `${NVGRAM_API}`).\n- Clean logs: ✅ `Connected to Neo4j on attempt 1`, ✅ `Uvicorn running...`.\n\n**Core + Relay v0.3.1**\n- Now routes all memory ops through NVGRAM.\n- Stable Persona injection and prompt pipeline.\n- Safe error handling and graceful degradation on NVGRAM outages.\n\n---\n\n### ⚙️ Whats Next (from docs + changelog)\n1. **Schema Enhancements**\n - Add salience/confidence fields in Postgres.\n - Prepare for Cortex annotations (`cortex: {sentiment, novelty, tags, notes}`).\n2. **Async + Lifespan Migration**\n - Replace deprecated `@app.on_event(\"startup\")` with new FastAPI lifespan block.\n3. **Recall Consistency**\n - Ensure consistent retrieval by `user_id` (lowercase fix was key!).\n4. **Self-Memory Support**\n - Let NVGRAM store “assistant” or “system” memories too (not just user).\n5. **UI Layer Enhancements**\n - Simple local web UI to browse, search, and delete memories.\n\n---\n\nLets begin small. \nStep 1 — confirm base system health and recall.\n\nPlease run this inside your NVGRAM VM terminal (or the container if youre using Docker):\n\n```bash\ncurl -X POST http://localhost:7077/memories \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"messages\": [{\"role\": \"user\", \"content\": \"testing nvgram .2 initialization\"}],\n \"user_id\": \"brian\"\n }'\n```\n\nIf it returns `{\"status\":\"ok\"}` or similar, follow with:\n\n```bash\ncurl -X POST http://localhost:7077/search \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\":\"testing\",\"user_id\":\"brian\"}'\n```\n\nCan you post the response from both? \nThatll confirm the memory pipeline is fully functional before we move to schema expansion."
},
{
"role": "user",
"content": "\nAttributeError: 'coroutine' object has no attribute 'add'\n2025-10-12 06:44:42,416 - ERROR - Error in add_memory:\nTraceback (most recent call last):\n File \"/app/nvgram/main.py\", line 139, in add_memory\n response = MEMORY_INSTANCE.add(messages=[m.model_dump() for m in memory_create.messages], **params)\n ^^^^^^^^^^^^^^^^^^^\nAttributeError: 'coroutine' object has no attribute 'add'"
},
{
"role": "assistant",
"content": "Nice — this is exactly the kind of bug that shows were right at the seam between sync and async memory handling. \n\nLets fix it step-by-step.\n\n---\n\n### 🧩 Whats Happening\n\nIn **v0.1.1+**, `Memory` was rewritten as an **async class** (`AsyncMemory`), so its methods must be awaited.\n\nRight now your `main.py` still calls:\n```python\nresponse = MEMORY_INSTANCE.add(...)\n```\n…but `MEMORY_INSTANCE` is actually a **coroutine**, not a plain object. \nSo Python is saying: “hey, this thing is async—you cant call `.add()` directly.”\n\n---\n\n### ✅ Step 1 — Fix `MEMORY_INSTANCE` Initialization\n\nIn `main.py`, near the top (around where you do `MEMORY_INSTANCE = Memory()` or `AsyncMemory()`), change it like this:\n\n```python\n# old\n# MEMORY_INSTANCE = AsyncMemory()\n\n# new (wrap it in an async initializer)\nfrom nvgram.memory.main import AsyncMemory\n\nMEMORY_INSTANCE = None\n\nasync def get_memory_instance():\n global MEMORY_INSTANCE\n if MEMORY_INSTANCE is None:\n MEMORY_INSTANCE = await AsyncMemory.create() # factory coroutine\n return MEMORY_INSTANCE\n```\n\n---\n\n### ✅ Step 2 — Fix the `/memories` endpoint\n\nScroll down to your FastAPI route handler for `@app.post(\"/memories\")` and change it to:\n\n```python\n@app.post(\"/memories\")\nasync def add_memory(memory_create: MemoryCreate):\n try:\n memory = await get_memory_instance()\n response = await memory.add(\n messages=[m.model_dump() for m in memory_create.messages],\n user_id=memory_create.user_id,\n )\n return response\n except Exception as e:\n logger.error(\"Error in add_memory:\", exc_info=True)\n raise HTTPException(status_code=500, detail=str(e))\n```\n\n---\n\n### ✅ Step 3 — Do the Same for `/search`\n\nLikewise, make sure `/search` also awaits:\n\n```python\n@app.post(\"/search\")\nasync def search_memory(search_request: MemorySearchRequest):\n try:\n memory = await get_memory_instance()\n results = await memory.search(\n query=search_request.query,\n user_id=search_request.user_id,\n )\n return results\n except Exception as e:\n logger.error(\"Error in search_memory:\", exc_info=True)\n raise HTTPException(status_code=500, detail=str(e))\n```\n\n---\n\nOnce youve made those edits:\n\n```bash\ndocker compose -f docker-compose.nvgram.yml up -d --build\n```\n\nThen rerun your `curl` test. \nIf the response is now a JSON payload with an ID and vector score, were good to move on to Step 2 (schema upgrade for Cortex annotations).\n\nWant me to show you *exactly* where in your `main.py` these lines probably go?"
}
]
}