From 3005cf3282101f404b9d1e05c93fec97656282b9 Mon Sep 17 00:00:00 2001 From: Stream Date: Tue, 16 Sep 2025 19:12:08 +0800 Subject: [PATCH] refactor: update MemoryApi(WebApiResource) for version --- api/controllers/web/chatflow_memory.py | 53 +++++++++++++------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/api/controllers/web/chatflow_memory.py b/api/controllers/web/chatflow_memory.py index d8fcd49b53..c56f50dc35 100644 --- a/api/controllers/web/chatflow_memory.py +++ b/api/controllers/web/chatflow_memory.py @@ -1,8 +1,11 @@ from flask_restx import reqparse from sqlalchemy.orm.session import Session +from sympy import false from controllers.web import api from controllers.web.wraps import WebApiResource +from core.memory.entities import MemoryBlock +from core.workflow.entities.variable_pool import VariablePool from libs.helper import uuid_value from models import db from models.chatflow_memory import ChatflowMemoryVariable @@ -13,24 +16,33 @@ from services.workflow_service import WorkflowService class MemoryListApi(WebApiResource): def get(self, app_model): parser = reqparse.RequestParser() - parser.add_argument("conversation_id", required=False, type=uuid_value, location="args") + parser.add_argument("conversation_id", required=False, type=str | None, default=None) + parser.add_argument("memory_id", required=False, type=str | None, default=None) + parser.add_argument("version", required=False, type=int | None, default=None) args = parser.parse_args() conversation_id = args.get("conversation_id") + memory_id = args.get("memory_id") + version = args.get("version") - result = ChatflowMemoryService.get_persistent_memories(app_model) + result = ChatflowMemoryService.get_persistent_memories(app_model, version) if conversation_id: - result = [*result, *ChatflowMemoryService.get_session_memories(app_model, conversation_id)] - + result = [*result, *ChatflowMemoryService.get_session_memories(app_model, conversation_id, version)] + if memory_id: + result = [it for it in result if it.memory_id == memory_id] return [it for it in result if it.end_user_visible] class MemoryEditApi(WebApiResource): def put(self, app_model): parser = reqparse.RequestParser() parser.add_argument('id', type=str, required=True) - parser.add_argument('node_id', type=str, required=False, default=None) + parser.add_argument("conversation_id", type=str | None, required=False, default=None) + parser.add_argument('node_id', type=str | None, required=False, default=None) parser.add_argument('update', type=str, required=True) args = parser.parse_args() workflow = WorkflowService().get_published_workflow(app_model) + update = args.get("update") + conversation_id = args.get("conversation_id") + node_id = args.get("node_id") if not workflow: return {'error': 'Workflow not found'}, 404 memory_spec = next((it for it in workflow.memory_blocks if it.id == args['id']), None) @@ -38,29 +50,18 @@ class MemoryEditApi(WebApiResource): return {'error': 'Memory not found'}, 404 if not memory_spec.end_user_editable: return {'error': 'Memory not editable'}, 403 - with Session(db.engine) as session: - existing = session.query(ChatflowMemoryVariable).filter_by( - memory_id=args['id'], + ChatflowMemoryService.save_memory( + MemoryBlock( + spec=memory_spec, tenant_id=app_model.tenant_id, + value=update, + conversation_id=conversation_id, + node_id=node_id, app_id=app_model.id, - node_id=args['node_id'] - ).first() - if existing: - existing.value = args['update'] - else: - session.add( - ChatflowMemoryVariable( - tenant_id=app_model.tenant_id, - app_id=app_model.id, - node_id=args['node_id'], - memory_id=args['id'], - name=memory_spec.name, - value=args['update'], - scope=memory_spec.scope, - term=memory_spec.term, - ) - ) - session.commit() + ), + variable_pool=VariablePool(), + is_draft=False + ) return '', 204 api.add_resource(MemoryListApi, '/memories')