diff --git a/agentcore_memory_browser/backend.py b/agentcore_memory_browser/backend.py index 185c938..07d9ee8 100644 --- a/agentcore_memory_browser/backend.py +++ b/agentcore_memory_browser/backend.py @@ -144,6 +144,16 @@ class RetrieveRequest(BaseModel): nextToken: Optional[str] = None +class CreateRecordRequest(BaseModel): + """Request for creating a memory record via event""" + + content: str + contentType: str = "text" # "text" or "json" + actorId: str = "default" + sessionId: str = "default" + role: str = "USER" # USER, ASSISTANT, TOOL, OTHER + + # --- Helper Functions --- @@ -383,6 +393,56 @@ async def delete_memory_record( raise HTTPException(status_code=500, detail=str(e)) +@app.post("/api/memories/{memory_id}/records") +async def create_memory_record( + memory_id: str, request: CreateRecordRequest +) -> Dict[str, Any]: + """Create a new memory record via event""" + import json as json_module + + try: + # Validate JSON if contentType is json + content_text = request.content + payload=[ + { + "conversational": { + "content": {"text": content_text}, + "role": request.role, + } + } + ] + if request.contentType == "json": + try: + json_module.loads(content_text) + payload=[ + { + "blob": content_text + } + ] + except json_module.JSONDecodeError as e: + raise HTTPException(status_code=400, detail=f"Invalid JSON: {e}") + + response = bedrock_data.create_event( + memoryId=memory_id, + actorId=request.actorId or "default", + sessionId=request.sessionId or "default", + eventTimestamp=datetime.now(), + payload=payload, + ) + + return { + "success": True, + "message": "Event created successfully", + "eventId": response.get("event", {}).get("eventId"), + } + + except HTTPException: + raise + except Exception as e: + logger.error(f"Error creating event: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + if __name__ == "__main__": import uvicorn diff --git a/agentcore_memory_browser/static/js/app.js b/agentcore_memory_browser/static/js/app.js index 4b5ec2d..9125c5c 100644 --- a/agentcore_memory_browser/static/js/app.js +++ b/agentcore_memory_browser/static/js/app.js @@ -821,6 +821,56 @@ async function refreshData() { let currentSessionId = null; let currentActorId = null; +// Execute Add Event (global, at memory level) +async function executeAddEvent() { + if (!currentMemory) { + console.error('No memory selected'); + return; + } + + const resultsDiv = document.getElementById('add-event-results'); + const contentInput = document.getElementById('add-event-content'); + const typeSelect = document.getElementById('add-event-type'); + const roleSelect = document.getElementById('add-event-role'); + const actorInput = document.getElementById('add-event-actor'); + const sessionInput = document.getElementById('add-event-session'); + + await executeApiCall({ + resultsDiv, + validation: () => { + if (!contentInput.value.trim()) { + showWarning(resultsDiv, 'Please enter content.'); + return false; + } + return true; + }, + apiCall: async () => { + const response = await fetch(`/api/memories/${currentMemory.id}/records`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + content: contentInput.value.trim(), + contentType: typeSelect.value, + role: roleSelect.value, + actorId: actorInput.value.trim() || 'default', + sessionId: sessionInput.value.trim() || 'default' + }) + }); + if (!response.ok) { + const err = await response.json(); + throw new Error(err.detail || response.statusText); + } + return await response.json(); + }, + displayFunction: (container, result) => { + container.innerHTML = `