agentic-kit-common 0.0.1__tar.gz → 0.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of agentic-kit-common might be problematic. Click here for more details.

Files changed (23) hide show
  1. {agentic_kit_common-0.0.1 → agentic_kit_common-0.0.2}/PKG-INFO +4 -2
  2. agentic_kit_common-0.0.2/agentic_kit_common/orm/__init__.py +2 -0
  3. agentic_kit_common-0.0.2/agentic_kit_common/orm/base.py +81 -0
  4. agentic_kit_common-0.0.2/agentic_kit_common/orm/manager.py +145 -0
  5. agentic_kit_common-0.0.2/agentic_kit_common/orm/session.py +67 -0
  6. agentic_kit_common-0.0.2/agentic_kit_common/web/http/__init__.py +0 -0
  7. agentic_kit_common-0.0.2/agentic_kit_common/web/http/response.py +46 -0
  8. {agentic_kit_common-0.0.1 → agentic_kit_common-0.0.2}/agentic_kit_common.egg-info/PKG-INFO +4 -2
  9. agentic_kit_common-0.0.2/agentic_kit_common.egg-info/SOURCES.txt +20 -0
  10. {agentic_kit_common-0.0.1 → agentic_kit_common-0.0.2}/agentic_kit_common.egg-info/requires.txt +2 -0
  11. {agentic_kit_common-0.0.1 → agentic_kit_common-0.0.2}/setup.py +6 -2
  12. agentic_kit_common-0.0.2/test/__init__.py +0 -0
  13. {agentic_kit_common-0.0.1 → agentic_kit_common-0.0.2}/test/test_minio.py +3 -3
  14. agentic_kit_common-0.0.1/agentic_kit_common.egg-info/SOURCES.txt +0 -13
  15. {agentic_kit_common-0.0.1 → agentic_kit_common-0.0.2}/README.md +0 -0
  16. {agentic_kit_common-0.0.1/agentic_kit_common/Minio_db → agentic_kit_common-0.0.2/agentic_kit_common}/__init__.py +0 -0
  17. {agentic_kit_common-0.0.1/agentic_kit_common → agentic_kit_common-0.0.2/agentic_kit_common/minio}/__init__.py +0 -0
  18. {agentic_kit_common-0.0.1/agentic_kit_common/Minio_db → agentic_kit_common-0.0.2/agentic_kit_common/minio}/minio_manager.py +0 -0
  19. {agentic_kit_common-0.0.1/test → agentic_kit_common-0.0.2/agentic_kit_common/web}/__init__.py +0 -0
  20. {agentic_kit_common-0.0.1 → agentic_kit_common-0.0.2}/agentic_kit_common.egg-info/dependency_links.txt +0 -0
  21. {agentic_kit_common-0.0.1 → agentic_kit_common-0.0.2}/agentic_kit_common.egg-info/top_level.txt +0 -0
  22. {agentic_kit_common-0.0.1 → agentic_kit_common-0.0.2}/setup.cfg +0 -0
  23. {agentic_kit_common-0.0.1/agentic_kit_common/Minio_db → agentic_kit_common-0.0.2/test}/config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-kit-common
3
- Version: 0.0.1
3
+ Version: 0.0.2
4
4
  Summary: Common utilities and tools for agentic kit ecosystem, including MinIO manager and other shared components
5
5
  Home-page:
6
6
  Author: manson
@@ -14,7 +14,7 @@ Classifier: Topic :: System :: Distributed Computing
14
14
  Classifier: Programming Language :: Python :: 3
15
15
  Classifier: License :: OSI Approved :: Apache Software License
16
16
  Classifier: Operating System :: OS Independent
17
- Requires-Python: >=3.10
17
+ Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  Requires-Dist: minio
20
20
  Requires-Dist: urllib3
@@ -24,6 +24,8 @@ Requires-Dist: langchain_core
24
24
  Requires-Dist: langgraph
25
25
  Requires-Dist: langchain_community
26
26
  Requires-Dist: langchain_experimental
27
+ Requires-Dist: mysql-connector-python
28
+ Requires-Dist: sqlalchemy
27
29
  Dynamic: author
28
30
  Dynamic: author-email
29
31
  Dynamic: classifier
@@ -0,0 +1,2 @@
1
+ from .base import Model
2
+ from .session import get_db_session, keepalive
@@ -0,0 +1,81 @@
1
+ from sqlalchemy.orm import declarative_base
2
+
3
+ from .session import get_db_session
4
+
5
+
6
+ class CRUDMixin(object):
7
+ """Mixin that adds convenience methods for CRUD (create, read, update, delete) operations."""
8
+
9
+ @classmethod
10
+ def create(cls, commit=True, db=None, **kwargs):
11
+ """Create a new record and save it the database."""
12
+
13
+ def __create(_instance):
14
+ if commit:
15
+ db.add(_instance)
16
+ db.commit()
17
+ return _instance
18
+ else:
19
+ db.add(_instance)
20
+ db.flush()
21
+ return _instance
22
+
23
+ instance = cls(**kwargs)
24
+ if db:
25
+ return __create(_instance=instance)
26
+ else:
27
+ with get_db_session() as db:
28
+ return __create(_instance=instance)
29
+
30
+ def update(self, commit=True, db=None, **kwargs):
31
+ """Update specific fields of a record."""
32
+ for attr, value in kwargs.items():
33
+ setattr(self, attr, value)
34
+
35
+ def _update(_obj, _db):
36
+ if _db:
37
+ _db.add(_obj)
38
+ if commit:
39
+ _db.commit()
40
+ else:
41
+ _db.flush()
42
+ return self
43
+ else:
44
+ with get_db_session() as _db:
45
+ _db.add(_obj)
46
+ if commit:
47
+ _db.commit()
48
+ else:
49
+ _db.flush()
50
+ return _obj
51
+
52
+ return _update(self, _db=db)
53
+
54
+ def delete(self, commit=True, db=None):
55
+ """Remove the record from the database."""
56
+ if db:
57
+ db.delete(self)
58
+ return commit and db.commit()
59
+ else:
60
+ with get_db_session() as db:
61
+ db.delete(self)
62
+ return commit and db.commit()
63
+
64
+ def soft_delete(self, commit=True, db=None):
65
+ """Remove the record from the database."""
66
+ return self.update(commit=commit, db=db, **{
67
+ 'active': False
68
+ })
69
+
70
+
71
+ Base = declarative_base()
72
+
73
+
74
+ class Model(CRUDMixin, Base):
75
+ """Base model class that includes CRUD convenience methods."""
76
+
77
+ __abstract__ = True
78
+
79
+ def __init__(self, **kwargs):
80
+ for k, v in kwargs.items():
81
+ setattr(self, k, v)
@@ -0,0 +1,145 @@
1
+ import time
2
+ from abc import abstractmethod
3
+ from sqlalchemy import asc, desc
4
+
5
+ from .session import get_db_session
6
+
7
+
8
+ class BaseOrmManager(object):
9
+ """Model orm manager"""
10
+
11
+ _model_cls = None
12
+
13
+ @classmethod
14
+ def get_by_id(cls, obj_id, close_session_after_curd=False):
15
+ with get_db_session() as db:
16
+ query = db.query(cls._model_cls) \
17
+ .filter(cls._model_cls.id == obj_id) \
18
+ .filter(cls._model_cls.active == True)
19
+
20
+ if hasattr(cls._model_cls, 'active'):
21
+ query = query.filter(cls._model_cls.active == 1)
22
+
23
+ _obj = query.first()
24
+
25
+ if close_session_after_curd:
26
+ db.close()
27
+
28
+ return _obj or None
29
+
30
+ @classmethod
31
+ def get_object_or_none(cls, close_session_after_curd=False, **lookup):
32
+ """Get object using lookup parameters, i.e pk=1"""
33
+ if lookup:
34
+ with get_db_session() as db:
35
+ res = db.query(cls._model_cls).filter_by(**lookup).first()
36
+
37
+ if close_session_after_curd:
38
+ db.close()
39
+
40
+ return res
41
+
42
+ @classmethod
43
+ def get_objects_all(cls, close_session_after_curd=False, **lookup):
44
+ if lookup:
45
+ with get_db_session() as db:
46
+ res = db.query(cls._model_cls).filter_by(**lookup).all()
47
+
48
+ if close_session_after_curd:
49
+ db.close()
50
+
51
+ return res
52
+
53
+ @classmethod
54
+ def get_list(cls, paginate=False, close_session_after_curd=False, **kwargs):
55
+ with get_db_session() as db:
56
+ query = db.query(cls._model_cls)
57
+ # """分页查询示例"""
58
+ # # 填充具体查询条件
59
+ for column, value in kwargs.items():
60
+ if not hasattr(cls._model_cls, column):
61
+ continue
62
+ # 根据值类型,来组装查询条件
63
+ if isinstance(value, tuple):
64
+ # 范围查询
65
+ query = query.filter(getattr(cls._model_cls, column).between(*value))
66
+ elif isinstance(value, list):
67
+ # in查询
68
+ query = query.filter(getattr(cls._model_cls, column).in_(value))
69
+ elif isinstance(value, str) and value.find("%") != -1:
70
+ # 模糊查询
71
+ query = query.filter(getattr(cls._model_cls, column).like(value))
72
+ else:
73
+ # 等值查询
74
+ query = query.filter(getattr(cls._model_cls, column) == value)
75
+
76
+ if kwargs.get('active', None) is None and hasattr(cls._model_cls, 'active'):
77
+ query = query.filter(cls._model_cls.active == 1)
78
+
79
+ if paginate:
80
+ # 总数
81
+ total = query.count()
82
+
83
+ # 计算分页offset
84
+ page = kwargs.get('page', 1)
85
+ per_page = kwargs.get('per_page', 20)
86
+ offset = (page - 1) * per_page
87
+
88
+ # 排序
89
+ if hasattr(cls._model_cls, 'sort'):
90
+ query = query.order_by(asc(cls._model_cls.sort))
91
+ query = query.order_by(desc(cls._model_cls.id)).offset(offset).limit(per_page)
92
+
93
+ # 查询记录
94
+ result = query.all()
95
+ pagination = {
96
+ 'total': total,
97
+ 'page': page,
98
+ 'per_page': per_page,
99
+ 'items': result
100
+ }
101
+ res = pagination
102
+ # return pagination
103
+ else:
104
+ res = query.all()
105
+ # return res
106
+
107
+ if close_session_after_curd:
108
+ db.close()
109
+
110
+ return res
111
+
112
+ @classmethod
113
+ def create_obj(cls, commit=False, **kwargs):
114
+ now = int(time.time())
115
+ obj = cls._model_cls.create(commit=commit, created_at=now, updated_at=now, active=True, **kwargs)
116
+ return obj
117
+
118
+ @classmethod
119
+ def update_obj(cls, obj, commit=False, **kwargs):
120
+ """更新obj信息"""
121
+ obj.update(commit=commit, updated_at=int(time.time()), **kwargs)
122
+ return obj
123
+
124
+ @classmethod
125
+ def soft_delete_obj(cls, obj):
126
+ """软删除obj信息"""
127
+ cls.update_obj(obj, **{
128
+ 'active': False
129
+ })
130
+ return obj
131
+
132
+ @classmethod
133
+ def delete_obj(cls, obj, commit=False):
134
+ """删除obj信息"""
135
+ obj.delete(commit=commit)
136
+ return obj
137
+
138
+ @classmethod
139
+ @abstractmethod
140
+ def render(cls, obj):
141
+ raise NotImplemented()
142
+
143
+ @classmethod
144
+ def render_simple(cls, obj):
145
+ cls.render(obj)
@@ -0,0 +1,67 @@
1
+ import asyncio
2
+ from contextlib import contextmanager
3
+
4
+ from sqlalchemy import create_engine, text
5
+ from sqlalchemy.exc import OperationalError
6
+ from sqlalchemy.orm import sessionmaker, scoped_session
7
+
8
+
9
+ sqlalchemy_database_uri = os.getenv("SQLALCHEMY_DATABASE_URI", "sqlite:///fallback.db")
10
+ sqlalchemy_database_name = os.getenv("SQLALCHEMY_DATABASE_NAME", "default")
11
+ sqlalchemy_echo = os.getenv("SQLALCHEMY_ECHO", False)
12
+ sqlalchemy_pool_size = os.getenv("SQLALCHEMY_POOL_SIZE", 10)
13
+ sqlalchemy_max_overflow = os.getenv("SQLALCHEMY_MAX_OVERFLOW", 5)
14
+ sqlalchemy_pool_pre_ping = os.getenv("SQLALCHEMY_POOL_PRE_PING", True)
15
+ sqlalchemy_pool_recycle = os.getenv("SQLALCHEMY_POOL_RECYCLE", 1800)
16
+
17
+
18
+ # 创建引擎
19
+ engine = create_engine(
20
+ url=f'{sqlalchemy_database_uri}/{sqlalchemy_database_name}',
21
+ echo=sqlalchemy_echo, # 是否打印SQL
22
+ pool_size=sqlalchemy_pool_size, # 连接池的大小,指定同时在连接池中保持的数据库连接数,默认:5
23
+ max_overflow=sqlalchemy_max_overflow, # 超出连接池大小的连接数,超过这个数量的连接将被丢弃,默认: 5
24
+ pool_pre_ping=sqlalchemy_pool_pre_ping,
25
+ pool_recycle=sqlalchemy_pool_recycle,
26
+ # connect_args={ "use_unicode": True}
27
+ )
28
+ # print("Database engine created")
29
+ # print(f"DATABASE_URL: {settings.sqlalchemy_database_uri}")
30
+ # 封装获取会话
31
+ _Session = scoped_session(sessionmaker(bind=engine, expire_on_commit=False, autocommit=False, autoflush=False))
32
+
33
+
34
+ # 实例化SessionLocal类
35
+ @contextmanager
36
+ def get_db_session(auto_commit_by_exit=False, auto_close=False):
37
+ """使用上下文管理资源关闭"""
38
+ _session = _Session()
39
+ try:
40
+ yield _session
41
+ # 退出时,是否自动提交
42
+ if auto_commit_by_exit:
43
+ _session.commit()
44
+ except OperationalError as e:
45
+ # 捕获连接超时异常并重新初始化会话
46
+ _session.close()
47
+ _session = _Session()
48
+ yield _session
49
+ if auto_commit_by_exit:
50
+ _session.commit()
51
+ except Exception as e:
52
+ _session.rollback()
53
+ raise e
54
+ finally:
55
+ if auto_close:
56
+ _session.close()
57
+
58
+ async def keepalive():
59
+ while True:
60
+ try:
61
+ with get_db_session() as session:
62
+ session.execute(text("SELECT 1"))
63
+ session.commit()
64
+ except Exception as e:
65
+ print(f"Keepalive failed: {e}")
66
+ keepalive()
67
+ await asyncio.sleep(300) # 每5分钟执行一次
@@ -0,0 +1,46 @@
1
+ from fastapi.responses import JSONResponse
2
+ from pydantic import BaseModel, Field
3
+ from typing import Any, Optional, Union
4
+
5
+
6
+ class ResponseCode:
7
+ SUCCESS = 0
8
+ ERROR = -1
9
+
10
+
11
+ class ResponseMessage:
12
+ SUCCESS = 'success'
13
+ ERROR = 'error'
14
+
15
+
16
+ def default_data():
17
+ return ''
18
+
19
+
20
+ class BaseResponse(BaseModel):
21
+ code: int = Field(0, description='API status code')
22
+ message: str = Field('success', description='API status message')
23
+ data: Optional[Union[Any, None]] = Field(default_factory=default_data, description='API data')
24
+
25
+ class Config:
26
+ json_schema_extra = {
27
+ 'example': {
28
+ 'code': ResponseCode.SUCCESS,
29
+ 'message': ResponseMessage.SUCCESS,
30
+ 'data': None
31
+ }
32
+ }
33
+
34
+ @classmethod
35
+ def success(cls, data: Optional[Any] = '', message: str = ResponseMessage.SUCCESS, code=ResponseCode.SUCCESS):
36
+ return BaseResponse(code=code, message=message, data=data)
37
+
38
+ @classmethod
39
+ def error(cls, data: Optional[Any] = '', message: str = ResponseMessage.ERROR, code=ResponseCode.ERROR):
40
+ return BaseResponse(code=code, message=message, data=data)
41
+
42
+ @classmethod
43
+ def json_resp(cls, data=None, status_code: int = 200):
44
+ if data is None:
45
+ data = {}
46
+ return JSONResponse(status_code=status_code, content=data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-kit-common
3
- Version: 0.0.1
3
+ Version: 0.0.2
4
4
  Summary: Common utilities and tools for agentic kit ecosystem, including MinIO manager and other shared components
5
5
  Home-page:
6
6
  Author: manson
@@ -14,7 +14,7 @@ Classifier: Topic :: System :: Distributed Computing
14
14
  Classifier: Programming Language :: Python :: 3
15
15
  Classifier: License :: OSI Approved :: Apache Software License
16
16
  Classifier: Operating System :: OS Independent
17
- Requires-Python: >=3.10
17
+ Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  Requires-Dist: minio
20
20
  Requires-Dist: urllib3
@@ -24,6 +24,8 @@ Requires-Dist: langchain_core
24
24
  Requires-Dist: langgraph
25
25
  Requires-Dist: langchain_community
26
26
  Requires-Dist: langchain_experimental
27
+ Requires-Dist: mysql-connector-python
28
+ Requires-Dist: sqlalchemy
27
29
  Dynamic: author
28
30
  Dynamic: author-email
29
31
  Dynamic: classifier
@@ -0,0 +1,20 @@
1
+ README.md
2
+ setup.py
3
+ agentic_kit_common/__init__.py
4
+ agentic_kit_common.egg-info/PKG-INFO
5
+ agentic_kit_common.egg-info/SOURCES.txt
6
+ agentic_kit_common.egg-info/dependency_links.txt
7
+ agentic_kit_common.egg-info/requires.txt
8
+ agentic_kit_common.egg-info/top_level.txt
9
+ agentic_kit_common/minio/__init__.py
10
+ agentic_kit_common/minio/minio_manager.py
11
+ agentic_kit_common/orm/__init__.py
12
+ agentic_kit_common/orm/base.py
13
+ agentic_kit_common/orm/manager.py
14
+ agentic_kit_common/orm/session.py
15
+ agentic_kit_common/web/__init__.py
16
+ agentic_kit_common/web/http/__init__.py
17
+ agentic_kit_common/web/http/response.py
18
+ test/__init__.py
19
+ test/config.py
20
+ test/test_minio.py
@@ -6,3 +6,5 @@ langchain_core
6
6
  langgraph
7
7
  langchain_community
8
8
  langchain_experimental
9
+ mysql-connector-python
10
+ sqlalchemy
@@ -4,7 +4,7 @@ from setuptools import setup, find_packages
4
4
 
5
5
  setup(
6
6
  name='agentic-kit-common',
7
- version="0.0.1",
7
+ version="0.0.2",
8
8
  author="manson",
9
9
  author_email="manson.li3307@gmail.com",
10
10
  description='Common utilities and tools for agentic kit ecosystem, including MinIO manager and other shared components',
@@ -22,7 +22,7 @@ setup(
22
22
  'License :: OSI Approved :: Apache Software License',
23
23
  'Operating System :: OS Independent'
24
24
  ],
25
- python_requires='>=3.10',
25
+ python_requires='>=3.12',
26
26
  install_requires=[
27
27
  # MinIO dependencies
28
28
  "minio",
@@ -37,6 +37,10 @@ setup(
37
37
  "langgraph",
38
38
  "langchain_community",
39
39
  "langchain_experimental",
40
+
41
+ # sqlalchemy
42
+ "mysql-connector-python",
43
+ "sqlalchemy",
40
44
  ],
41
45
  keywords=['AI', 'LLM', 'Agent', 'MinIO', 'Storage', 'Common', 'Utilities'],
42
46
  include_package_data=True,
File without changes
@@ -1,13 +1,13 @@
1
+ import sys
1
2
  import unittest
2
3
  from datetime import timedelta
3
4
  from pathlib import Path
4
- import sys
5
5
 
6
6
  project_root = Path(__file__).parent.parent
7
7
  sys.path.insert(0, str(project_root))
8
8
 
9
- from agentic_kit_common.Minio_db.minio_manager import MinioManager
10
- from agentic_kit_common.Minio_db.config import load_config
9
+ from agentic_kit_common.minio.minio_manager import MinioManager
10
+ from .config import load_config
11
11
 
12
12
 
13
13
  class MyTestCase(unittest.TestCase):
@@ -1,13 +0,0 @@
1
- README.md
2
- setup.py
3
- agentic_kit_common/__init__.py
4
- agentic_kit_common.egg-info/PKG-INFO
5
- agentic_kit_common.egg-info/SOURCES.txt
6
- agentic_kit_common.egg-info/dependency_links.txt
7
- agentic_kit_common.egg-info/requires.txt
8
- agentic_kit_common.egg-info/top_level.txt
9
- agentic_kit_common/Minio_db/__init__.py
10
- agentic_kit_common/Minio_db/config.py
11
- agentic_kit_common/Minio_db/minio_manager.py
12
- test/__init__.py
13
- test/test_minio.py