AddSession handles POST /api/memories/sessions
(w ErrorResponseWriter, r *http.Request)
| 70 | |
| 71 | // AddSession handles POST /api/memories/sessions |
| 72 | func (h *MemoryHandler) AddSession(w ErrorResponseWriter, r *http.Request) { |
| 73 | log := ctrllog.FromContext(r.Context()) |
| 74 | var req AddSessionMemoryRequest |
| 75 | if err := json.NewDecoder(r.Body).Decode(&req); err != nil { |
| 76 | RespondWithError(w, http.StatusBadRequest, "Invalid request body") |
| 77 | return |
| 78 | } |
| 79 | |
| 80 | if req.AgentName == "" || req.UserID == "" || len(req.Vector) == 0 { |
| 81 | RespondWithError(w, http.StatusBadRequest, "Missing required fields (agent_name, user_id, vector)") |
| 82 | return |
| 83 | } |
| 84 | |
| 85 | if len(req.Vector) != memoryVectorDimension { |
| 86 | RespondWithError(w, http.StatusBadRequest, fmt.Sprintf("vector must have exactly %d dimensions, got %d", memoryVectorDimension, len(req.Vector))) |
| 87 | return |
| 88 | } |
| 89 | |
| 90 | // Ensure metadata is valid JSON |
| 91 | metadata := req.Metadata |
| 92 | if len(metadata) == 0 { |
| 93 | metadata = json.RawMessage("{}") |
| 94 | } |
| 95 | |
| 96 | ttlDays := req.TTLDays |
| 97 | if ttlDays <= 0 { |
| 98 | ttlDays = defaultMemoryTTLDays |
| 99 | } |
| 100 | expiresAt := time.Now().Add(time.Duration(ttlDays) * 24 * time.Hour) |
| 101 | memory := &database.Memory{ |
| 102 | AgentName: req.AgentName, |
| 103 | UserID: req.UserID, |
| 104 | Content: req.Content, |
| 105 | Embedding: pgvector.NewVector(req.Vector), |
| 106 | Metadata: string(metadata), |
| 107 | ExpiresAt: &expiresAt, |
| 108 | } |
| 109 | |
| 110 | if err := h.DatabaseService.StoreAgentMemory(r.Context(), memory); err != nil { |
| 111 | log.Error(err, "failed to store agent memory") |
| 112 | RespondWithError(w, http.StatusInternalServerError, fmt.Sprintf("failed to save memory: %v", err)) |
| 113 | return |
| 114 | } |
| 115 | |
| 116 | log.Info("added memory", "id", memory.ID, "userID", req.UserID, "agentName", req.AgentName) |
| 117 | |
| 118 | RespondWithJSON(w, http.StatusCreated, map[string]string{"id": memory.ID}) |
| 119 | } |
| 120 | |
| 121 | // AddSessionMemoryBatchRequest represents the request body for adding multiple memory sessions |
| 122 | type AddSessionMemoryBatchRequest struct { |