cognee/cognitive_architecture/infrastructure/databases/relational/general/adapter.py
Boris Arzentar 769d6b5080 feat: add create-memory and remember API endpoints
Add possibility to create a new Vector memory and store text data points using openai embeddings.
2024-02-25 23:56:50 +01:00

74 lines
2.7 KiB
Python

import uuid
from pathlib import Path
from sqlalchemy import select
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from cognitive_architecture.config import Config
# from ..relational_db_interface import RelationalDBInterface
from cognitive_architecture.database.relationaldb.models.memory import MemoryModel
config = Config()
config.load()
class RelationalDBAdapter():
session_maker: async_sessionmaker[AsyncSession]
def __init__(self):
engine = create_async_engine(
self.get_database_url(),
pool_recycle = 3600,
echo = config.sqlalchemy_logging,
)
self.create_session = async_sessionmaker[AsyncSession](
bind = engine,
class_ = AsyncSession,
expire_on_commit = False,
)
def get_database_url(
self,
db_type = config.db_type,
db_name = config.db_name,
db_path = config.db_path,
user = config.db_user,
password = config.db_password,
host = config.db_host,
port = config.db_port,
):
if db_type == "sqlite":
db_path = (Path(db_path) / db_name).absolute()
return f"sqlite+aiosqlite:///{db_path}" # SQLite uses file path
elif db_type == "duckdb":
db_path = (Path(db_path) / db_name).absolute()
return f"duckdb+aiosqlite:///{db_path}"
elif db_type == "postgresql":
# Ensure optional parameters are handled gracefully
port_str = f":{port}" if port else ""
password_str = f":{password}" if password else ""
if not all([user, host]):
raise ValueError("User and host are required for PostgreSQL connections.")
return f"postgresql+asyncpg://{user}{password_str}@{host}{port_str}/{db_name}"
else:
raise ValueError(f"Unsupported database type: {db_type}")
async def add_memory(self, user_id: str, memory_name: str):
memory_id = uuid.uuid4()
async with self.create_session() as session:
async with session.begin():
return session.add(MemoryModel(
id = memory_id,
user_id = user_id,
memory_name = memory_name,
))
async def get_memory_by_name(self, memory_name: int):
async with self.create_session() as session:
async with session.begin():
result = await session.execute(
select(MemoryModel.id)
.where(MemoryModel.memory_name == memory_name)
)
memory = result.scalars().one_or_none()
return memory