From 33a0df51df6ded1d6f0a545e6d0832ff880099d0 Mon Sep 17 00:00:00 2001 From: Rodrigo Lima Date: Fri, 28 Feb 2025 17:03:38 -0700 Subject: [PATCH 1/4] fix checkpointer --- chatbot.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/chatbot.py b/chatbot.py index 05b8b87d..41d6595b 100644 --- a/chatbot.py +++ b/chatbot.py @@ -1,5 +1,6 @@ import os import sys +import uuid from dotenv import load_dotenv from datetime import datetime import json @@ -402,11 +403,14 @@ async def initialize_agent(): personality = process_character_config(character) # Create config first before using + checkpoint_id = str(uuid.uuid4()) config = { "configurable": { "thread_id": f"{character['name']} Agent", "character": character["name"], "recursion_limit": 100, + "checkpoint_id": checkpoint_id, + "langgraph_checkpoint_id": checkpoint_id, }, "character": { "name": character["name"], @@ -594,7 +598,15 @@ async def initialize_agent(): print_error("GitHub tools will not be available") # Create the runnable config with increased recursion limit - runnable_config = RunnableConfig(recursion_limit=200) + runnable_config = RunnableConfig( + recursion_limit=200, + configurable={ + "thread_id": f"{character['name']} Agent", + "character": character["name"], + "recursion_limit": 100, + "langgraph_checkpoint_id": config["configurable"]["langgraph_checkpoint_id"], + } + ) for tool in tools: print_system(tool.name) @@ -602,8 +614,6 @@ async def initialize_agent(): # Initialize memory saver memory = MemorySaver() - - return create_react_agent( llm, tools=tools, @@ -663,8 +673,8 @@ async def run_chat_mode(agent_executor, config, runnable_config): recursion_limit=200, configurable={ "thread_id": config["configurable"]["thread_id"], - "checkpoint_ns": "chat_mode", - "checkpoint_id": str(datetime.now().timestamp()) + "langgraph_checkpoint_ns": "chat_mode", + "langgraph_checkpoint_id": config["configurable"]["langgraph_checkpoint_id"] } ) @@ -716,8 +726,8 @@ async def run_twitter_automation(agent_executor, config, runnable_config): recursion_limit=200, configurable={ "thread_id": config["configurable"]["thread_id"], - "checkpoint_ns": "autonomous_mode", - "checkpoint_id": str(datetime.now().timestamp()) + "langgraph_checkpoint_ns": "chat_mode", + "langgraph_checkpoint_id": config["configurable"]["langgraph_checkpoint_id"] } ) From c99fb8dc5c9ef1496a74f2e94160ada241996404 Mon Sep 17 00:00:00 2001 From: Rodrigo Lima Date: Fri, 28 Feb 2025 18:08:04 -0700 Subject: [PATCH 2/4] postgrs impl --- chatbot.py | 39 +++++++++++++++++++++++++++++---------- docker-compose.yml | 11 +++++++++++ pyproject.toml | 3 +++ 3 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 docker-compose.yml diff --git a/chatbot.py b/chatbot.py index 41d6595b..d7c74442 100644 --- a/chatbot.py +++ b/chatbot.py @@ -38,6 +38,7 @@ from langchain_core.messages import HumanMessage from langchain_anthropic import ChatAnthropic from langgraph.checkpoint.memory import MemorySaver +from langgraph.checkpoint.postgres import PostgresSaver from langgraph.prebuilt import create_react_agent from langchain_community.tools import DuckDuckGoSearchRun from langchain_community.agent_toolkits.openapi.toolkit import RequestsToolkit @@ -45,6 +46,7 @@ from langchain.tools import Tool from langchain_core.runnables import RunnableConfig from browser_agent import BrowserToolkit +from psycopg import Connection # Import Coinbase AgentKit related modules from coinbase_agentkit import ( @@ -611,16 +613,31 @@ async def initialize_agent(): for tool in tools: print_system(tool.name) - # Initialize memory saver - memory = MemorySaver() - - return create_react_agent( - llm, - tools=tools, - checkpointer=memory, - state_modifier=personality, - ), config, runnable_config - + db_uri = os.getenv("POSTGRES_DB_URI") + + if db_uri: + conn = Connection.connect(db_uri, autocommit=True) + checkpointer = PostgresSaver(conn) + checkpointer.setup() + + agent = create_react_agent( + llm, + tools=tools, + checkpointer=checkpointer, + state_modifier=personality, + ) + return agent, config, runnable_config + + else: + memory = MemorySaver() + agent = create_react_agent( + llm, + tools=tools, + checkpointer=memory, + state_modifier=personality, + ) + return agent, config, runnable_config + except Exception as e: print_error(f"Failed to initialize agent: {e}") raise @@ -710,6 +727,8 @@ async def run_chat_mode(agent_executor, config, runnable_config): print_system("\nExiting chat mode...") break except Exception as e: + print("@@@@@HERE") + print(e) print_error(f"Error: {str(e)}") async def run_twitter_automation(agent_executor, config, runnable_config): diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..6e95e50d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,11 @@ +services: + db: + image: postgres:15.6-alpine + ports: + - "5432:5432" + volumes: + - ./db/dumps:/app-db-dumps + environment: + POSTGRES_USER: postgres + POSTGRES_DB: hyperbolic_agent_db + POSTGRES_PASSWORD: postgres \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index f1effe4d..417f731b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,6 +38,9 @@ starlette = "^0.45.3" uvicorn = "^0.34.0" browser-use = "^0.1.37" tweepy = "^4.15.0" +psycopg = {extras = ["binary"], version = "^3.2.5"} +psycopg-pool = "^3.2.6" +langgraph-checkpoint-postgres = "^2.0.15" From 587ca1cade7dff6c64712f57e84aeb58c2a3040a Mon Sep 17 00:00:00 2001 From: Rodrigo Lima Date: Fri, 28 Feb 2025 19:06:56 -0700 Subject: [PATCH 3/4] add postgres --- .env.example | 4 ++++ chatbot.py | 24 +++++++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.env.example b/.env.example index 109ba173..adf0f074 100644 --- a/.env.example +++ b/.env.example @@ -61,3 +61,7 @@ USE_DEPLOY_MULTITOKEN=true USE_WEB_SEARCH=true USE_REQUEST_TOOLS=true +# Postgres Memory Configuration +USE_POSTGRES=false +POSTGRES_DB_URI=your_postgres_db_uri + diff --git a/chatbot.py b/chatbot.py index d7c74442..ebe512ac 100644 --- a/chatbot.py +++ b/chatbot.py @@ -38,7 +38,7 @@ from langchain_core.messages import HumanMessage from langchain_anthropic import ChatAnthropic from langgraph.checkpoint.memory import MemorySaver -from langgraph.checkpoint.postgres import PostgresSaver +from langgraph.checkpoint.postgres.aio import AsyncPostgresSaver from langgraph.prebuilt import create_react_agent from langchain_community.tools import DuckDuckGoSearchRun from langchain_community.agent_toolkits.openapi.toolkit import RequestsToolkit @@ -46,7 +46,7 @@ from langchain.tools import Tool from langchain_core.runnables import RunnableConfig from browser_agent import BrowserToolkit -from psycopg import Connection +from psycopg import AsyncConnection # Import Coinbase AgentKit related modules from coinbase_agentkit import ( @@ -613,12 +613,20 @@ async def initialize_agent(): for tool in tools: print_system(tool.name) - db_uri = os.getenv("POSTGRES_DB_URI") + postgres_enable = os.getenv("USE_POSTGRES") - if db_uri: - conn = Connection.connect(db_uri, autocommit=True) - checkpointer = PostgresSaver(conn) - checkpointer.setup() + if postgres_enable: + db_uri = os.getenv("POSTGRES_DB_URI") + + if not db_uri: + raise ValueError("Postgres URI not found. Please set the POSTGRES_URI environment variable.") + + conn = await AsyncConnection.connect(db_uri) + await conn.set_autocommit(True) + + checkpointer = AsyncPostgresSaver(conn) + + await checkpointer.setup() agent = create_react_agent( llm, @@ -727,8 +735,6 @@ async def run_chat_mode(agent_executor, config, runnable_config): print_system("\nExiting chat mode...") break except Exception as e: - print("@@@@@HERE") - print(e) print_error(f"Error: {str(e)}") async def run_twitter_automation(agent_executor, config, runnable_config): From 42232a8f04399da9a3c69f0fe40c9b1bd105a88d Mon Sep 17 00:00:00 2001 From: Rodrigo Lima Date: Fri, 28 Feb 2025 19:08:51 -0700 Subject: [PATCH 4/4] remove docker compose --- docker-compose.yml | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 6e95e50d..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,11 +0,0 @@ -services: - db: - image: postgres:15.6-alpine - ports: - - "5432:5432" - volumes: - - ./db/dumps:/app-db-dumps - environment: - POSTGRES_USER: postgres - POSTGRES_DB: hyperbolic_agent_db - POSTGRES_PASSWORD: postgres \ No newline at end of file