Spaces:
Sleeping
Sleeping
File size: 2,256 Bytes
3ff7a16 76d7dae 4dfc186 3ff7a16 4dfc186 f1b21ad 3ff7a16 4dfc186 3ff7a16 b6a7e53 76d7dae b6a7e53 96ff3ae b6a7e53 76d7dae 4dfc186 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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 не найдена. Инструменты аналитики не сработают!") |