SaveSession saves the conversation history.
(ctx context.Context, req *pb.SaveSessionRequest)
| 243 | |
| 244 | // SaveSession saves the conversation history. |
| 245 | func (h *Handler) SaveSession(ctx context.Context, req *pb.SaveSessionRequest) (*pb.SaveSessionResponse, error) { |
| 246 | if h.sessionManager == nil { |
| 247 | return nil, status.Errorf(codes.Unavailable, "%s", i18n.T("server.session.mgmt_unavailable")) |
| 248 | } |
| 249 | |
| 250 | if req.Name == "" { |
| 251 | return nil, status.Errorf(codes.InvalidArgument, "%s", i18n.T("server.session.name_empty")) |
| 252 | } |
| 253 | |
| 254 | // Prefer v2 if client sent session_data AND store supports v2 |
| 255 | if req.SessionData != nil { |
| 256 | if v2Store, ok := h.sessionManager.(SessionStoreV2); ok { |
| 257 | sd := protoSessionDataToModels(req.SessionData) |
| 258 | if err := v2Store.SaveSessionV2(req.Name, sd); err != nil { |
| 259 | return nil, status.Errorf(codes.Internal, "%s", i18n.T("server.session.save_error", err)) |
| 260 | } |
| 261 | if h.sessionMetrics != nil { |
| 262 | h.sessionMetrics.OperationsTotal.WithLabelValues("save").Inc() |
| 263 | } |
| 264 | return &pb.SaveSessionResponse{Success: true}, nil |
| 265 | } |
| 266 | } |
| 267 | |
| 268 | // Fallback to v1 |
| 269 | history := protoToHistory(req.Messages) |
| 270 | if err := h.sessionManager.SaveSession(req.Name, history); err != nil { |
| 271 | return nil, status.Errorf(codes.Internal, "%s", i18n.T("server.session.save_error", err)) |
| 272 | } |
| 273 | |
| 274 | if h.sessionMetrics != nil { |
| 275 | h.sessionMetrics.OperationsTotal.WithLabelValues("save").Inc() |
| 276 | } |
| 277 | return &pb.SaveSessionResponse{Success: true}, nil |
| 278 | } |
| 279 | |
| 280 | // DeleteSession removes a saved session. |
| 281 | func (h *Handler) DeleteSession(ctx context.Context, req *pb.DeleteSessionRequest) (*pb.DeleteSessionResponse, error) { |