Spaces:
Sleeping
Sleeping
| 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 не найдена. Инструменты аналитики не сработают!") |