import os from langgraph.checkpoint.postgres.aio import AsyncPostgresSaver from psycopg_pool import AsyncConnectionPool from sqlalchemy import create_engine # ========================================== # 1. СУБД ДЛЯ ПАМЯТИ АГЕНТА (LangGraph) # ========================================== DB_URI = os.getenv("SUPABASE_URL") pool = AsyncConnectionPool( conninfo=DB_URI, max_size=20, kwargs={"autocommit": True, "prepare_threshold": None}, open=False ) # Инициализируется позже внутри async-контекста checkpointer: AsyncPostgresSaver | None = None async def init_storage(): global checkpointer if checkpointer is not None: return # 1. Запускаем пул — event loop уже работает await pool.open() # 2. Создаём checkpointer внутри async-контекста checkpointer = AsyncPostgresSaver(pool) # 3. Создаем таблицы await checkpointer.setup() print("✅ Асинхронное хранилище контекста в Supabase готово.") # ========================================== # 2. СУБД ДЛЯ БИЗНЕС-ДАННЫХ WB (Инструменты) # ========================================== # Добавь эту переменную в секреты (даже если она совпадает с SUPABASE_URL) ANALYTICS_DB_URL = os.getenv("ANALYTICS_DB_URL") # Создаем синхронный движок для pandas.read_sql if ANALYTICS_DB_URL: # URL для SQLAlchemy обычно должен начинаться с postgresql:// # Если в секретах postgres://, SQLAlchemy может ругаться, так что подстрахуемся: if ANALYTICS_DB_URL.startswith("postgres://"): ANALYTICS_DB_URL = ANALYTICS_DB_URL.replace("postgres://", "postgresql://", 1) engine = create_engine(ANALYTICS_DB_URL) print("✅ Подключение к аналитической БД инициализировано.") else: engine = None print("⚠️ ВНИМАНИЕ: Переменная ANALYTICS_DB_URL не найдена. Инструменты аналитики не сработают!")