This commit is contained in:
Deshraj Yadav
2024-07-17 23:40:12 -07:00
committed by GitHub
parent 7441f1462d
commit fb5a3bfd95
10 changed files with 146 additions and 20 deletions

View File

@@ -2,14 +2,13 @@ name: Publish Python 🐍 distributions 📦 to PyPI and TestPyPI
on: on:
release: release:
types: [published] # This will trigger the workflow when you create a new release types: [published]
jobs: jobs:
build-n-publish: build-n-publish:
name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
# IMPORTANT: this permission is mandatory for trusted publishing
id-token: write id-token: write
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
@@ -25,16 +24,23 @@ jobs:
echo "$HOME/.local/bin" >> $GITHUB_PATH echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Install dependencies - name: Install dependencies
run: poetry install run: |
cd embedchain
poetry install
- name: Build a binary wheel and a source tarball - name: Build a binary wheel and a source tarball
run: poetry build run: |
cd embedchain
poetry build
- name: Publish distribution 📦 to Test PyPI - name: Publish distribution 📦 to Test PyPI
uses: pypa/gh-action-pypi-publish@release/v1 uses: pypa/gh-action-pypi-publish@release/v1
with: with:
repository_url: https://test.pypi.org/legacy/ repository_url: https://test.pypi.org/legacy/
packages_dir: embedchain/dist/
- name: Publish distribution 📦 to PyPI - name: Publish distribution 📦 to PyPI
if: startsWith(github.ref, 'refs/tags') if: startsWith(github.ref, 'refs/tags')
uses: pypa/gh-action-pypi-publish@release/v1 uses: pypa/gh-action-pypi-publish@release/v1
with:
packages_dir: embedchain/dist/

View File

@@ -5,13 +5,13 @@ on:
branches: [main] branches: [main]
paths: paths:
- 'embedchain/**' - 'embedchain/**'
- 'tests/**' - 'embedchain/tests/**'
- 'examples/**' - 'embedchain/examples/**'
pull_request: pull_request:
paths: paths:
- 'embedchain/**' - 'embedchain/embedchain/**'
- 'tests/**' - 'embedchain/tests/**'
- 'examples/**' - 'embedchain/examples/**'
jobs: jobs:
build: build:
@@ -39,12 +39,12 @@ jobs:
path: .venv path: .venv
key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }} key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }}
- name: Install dependencies - name: Install dependencies
run: make install_all run: cd embedchain && make install_all
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'
- name: Lint with ruff - name: Lint with ruff
run: make lint run: cd embedchain && make lint
- name: Run tests and generate coverage report - name: Run tests and generate coverage report
run: make coverage run: cd embedchain && make coverage
- name: Upload coverage reports to Codecov - name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v3 uses: codecov/codecov-action@v3
with: with:

4
.gitignore vendored
View File

@@ -165,7 +165,7 @@ cython_debug/
# Database # Database
db db
test-db test-db
!embedchain/core/db/ !embedchain/embedchain/core/db/
.vscode .vscode
.idea/ .idea/
@@ -183,4 +183,4 @@ notebooks/*.yaml
# local directories for testing # local directories for testing
eval/ eval/
qdrant_storage/ qdrant_storage/
.crossnote .crossnote

View File

@@ -234,7 +234,7 @@ class BaseLlmConfig(BaseConfig):
self.api_version = api_version self.api_version = api_version
if token_usage: if token_usage:
f = open("config/model_prices_and_context_window.json") f = open("embedchain/config/model_prices_and_context_window.json")
self.model_pricing_map = json.load(f) self.model_pricing_map = json.load(f)
if isinstance(prompt, str): if isinstance(prompt, str):

View File

@@ -0,0 +1,88 @@
import os
from alembic import command
from alembic.config import Config
from sqlalchemy import create_engine
from sqlalchemy.engine.base import Engine
from sqlalchemy.orm import Session as SQLAlchemySession
from sqlalchemy.orm import scoped_session, sessionmaker
from .models import Base
class DatabaseManager:
def __init__(self, echo: bool = False):
self.database_uri = os.environ.get("EMBEDCHAIN_DB_URI")
self.echo = echo
self.engine: Engine = None
self._session_factory = None
def setup_engine(self) -> None:
"""Initializes the database engine and session factory."""
if not self.database_uri:
raise RuntimeError("Database URI is not set. Set the EMBEDCHAIN_DB_URI environment variable.")
connect_args = {}
if self.database_uri.startswith("sqlite"):
connect_args["check_same_thread"] = False
self.engine = create_engine(self.database_uri, echo=self.echo, connect_args=connect_args)
self._session_factory = scoped_session(sessionmaker(bind=self.engine))
Base.metadata.bind = self.engine
def init_db(self) -> None:
"""Creates all tables defined in the Base metadata."""
if not self.engine:
raise RuntimeError("Database engine is not initialized. Call setup_engine() first.")
Base.metadata.create_all(self.engine)
def get_session(self) -> SQLAlchemySession:
"""Provides a session for database operations."""
if not self._session_factory:
raise RuntimeError("Session factory is not initialized. Call setup_engine() first.")
return self._session_factory()
def close_session(self) -> None:
"""Closes the current session."""
if self._session_factory:
self._session_factory.remove()
def execute_transaction(self, transaction_block):
"""Executes a block of code within a database transaction."""
session = self.get_session()
try:
transaction_block(session)
session.commit()
except Exception as e:
session.rollback()
raise e
finally:
self.close_session()
# Singleton pattern to use throughout the application
database_manager = DatabaseManager()
# Convenience functions for backward compatibility and ease of use
def setup_engine(database_uri: str, echo: bool = False) -> None:
database_manager.database_uri = database_uri
database_manager.echo = echo
database_manager.setup_engine()
def alembic_upgrade() -> None:
"""Upgrades the database to the latest version."""
alembic_config_path = os.path.join(os.path.dirname(__file__), "..", "..", "alembic.ini")
alembic_cfg = Config(alembic_config_path)
command.upgrade(alembic_cfg, "head")
def init_db() -> None:
alembic_upgrade()
def get_session() -> SQLAlchemySession:
return database_manager.get_session()
def execute_transaction(transaction_block):
database_manager.execute_transaction(transaction_block)

View File

@@ -0,0 +1,31 @@
import uuid
from sqlalchemy import TIMESTAMP, Column, Integer, String, Text, func
from sqlalchemy.orm import declarative_base
Base = declarative_base()
metadata = Base.metadata
class DataSource(Base):
__tablename__ = "ec_data_sources"
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
app_id = Column(Text, index=True)
hash = Column(Text, index=True)
type = Column(Text, index=True)
value = Column(Text)
meta_data = Column(Text, name="metadata")
is_uploaded = Column(Integer, default=0)
class ChatHistory(Base):
__tablename__ = "ec_chat_history"
app_id = Column(String, primary_key=True)
id = Column(String, primary_key=True)
session_id = Column(String, primary_key=True, index=True)
question = Column(Text)
answer = Column(Text)
meta_data = Column(Text, name="metadata")
created_at = Column(TIMESTAMP, default=func.current_timestamp(), index=True)

View File

@@ -12,7 +12,8 @@ class GPT4AllEmbedder(BaseEmbedder):
from langchain_community.embeddings import GPT4AllEmbeddings as LangchainGPT4AllEmbeddings from langchain_community.embeddings import GPT4AllEmbeddings as LangchainGPT4AllEmbeddings
model_name = self.config.model or "all-MiniLM-L6-v2-f16.gguf" model_name = self.config.model or "all-MiniLM-L6-v2-f16.gguf"
embeddings = LangchainGPT4AllEmbeddings(model_name=model_name) gpt4all_kwargs = {'allow_download': 'True'}
embeddings = LangchainGPT4AllEmbeddings(model_name=model_name, gpt4all_kwargs=gpt4all_kwargs)
embedding_fn = BaseEmbedder._langchain_default_concept(embeddings) embedding_fn = BaseEmbedder._langchain_default_concept(embeddings)
self.set_embedding_fn(embedding_fn=embedding_fn) self.set_embedding_fn(embedding_fn=embedding_fn)

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "embedchain" name = "embedchain"
version = "0.1.116" version = "0.1.117"
description = "Simplest open source retrieval (RAG) framework" description = "Simplest open source retrieval (RAG) framework"
authors = [ authors = [
"Taranjeet Singh <taranjeet@embedchain.ai>", "Taranjeet Singh <taranjeet@embedchain.ai>",

View File

@@ -13,8 +13,8 @@ from embedchain.vectordb.chroma import ChromaDB
@pytest.fixture @pytest.fixture
def app(): def app():
os.environ["OPENAI_API_KEY"] = "test_api_key" os.environ["OPENAI_API_KEY"] = "test-api-key"
os.environ["OPENAI_API_BASE"] = "test_api_base" os.environ["OPENAI_API_BASE"] = "test-api-base"
return App() return App()