agentic-kit-common 0.0.10__tar.gz → 0.0.12__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.
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/PKG-INFO +2 -1
- agentic_kit_common-0.0.12/agentic_kit_common/log/logger.py +16 -0
- agentic_kit_common-0.0.12/agentic_kit_common/orm/execution.py +90 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/orm/multi_session.py +4 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/orm/schema.py +2 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common.egg-info/PKG-INFO +2 -1
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common.egg-info/SOURCES.txt +2 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common.egg-info/requires.txt +1 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/setup.py +4 -1
- agentic_kit_common-0.0.12/test/__init__.py +0 -0
- agentic_kit_common-0.0.10/agentic_kit_common/orm/execution.py +0 -53
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/README.md +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/__init__.py +0 -0
- {agentic_kit_common-0.0.10/agentic_kit_common/minio → agentic_kit_common-0.0.12/agentic_kit_common/log}/__init__.py +0 -0
- {agentic_kit_common-0.0.10/agentic_kit_common/vector → agentic_kit_common-0.0.12/agentic_kit_common/minio}/__init__.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/minio/minio_manager.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/orm/__init__.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/orm/base.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/orm/manager.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/orm/session.py +0 -0
- {agentic_kit_common-0.0.10/agentic_kit_common/web → agentic_kit_common-0.0.12/agentic_kit_common/vector}/__init__.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/embedding/__init__.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/embedding/embedding.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/manager/__init__.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/manager/milvus_manager.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/schema/__init__.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/schema/base.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/schema/milvus_schema.py +0 -0
- {agentic_kit_common-0.0.10/agentic_kit_common/web/http → agentic_kit_common-0.0.12/agentic_kit_common/web}/__init__.py +0 -0
- {agentic_kit_common-0.0.10/test → agentic_kit_common-0.0.12/agentic_kit_common/web/http}/__init__.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/web/http/response.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common.egg-info/dependency_links.txt +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common.egg-info/top_level.txt +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/setup.cfg +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/test/config.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/test/settings.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/test/test_embedding.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/test/test_minio.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/test/test_orm.py +0 -0
- {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/test/test_vector.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentic-kit-common
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.12
|
|
4
4
|
Summary: Common utilities and tools for agentic kit ecosystem
|
|
5
5
|
Home-page:
|
|
6
6
|
Author: manson
|
|
@@ -26,6 +26,7 @@ Requires-Dist: langchain_community
|
|
|
26
26
|
Requires-Dist: langchain_experimental
|
|
27
27
|
Requires-Dist: mysql-connector-python
|
|
28
28
|
Requires-Dist: sqlalchemy
|
|
29
|
+
Requires-Dist: sqlglot
|
|
29
30
|
Requires-Dist: pymilvus
|
|
30
31
|
Requires-Dist: xinference_client
|
|
31
32
|
Dynamic: author
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def setup_logger(tag, level):
|
|
5
|
+
logger = logging.getLogger(tag)
|
|
6
|
+
logger.setLevel(level)
|
|
7
|
+
|
|
8
|
+
if not logger.handlers:
|
|
9
|
+
handler = logging.StreamHandler()
|
|
10
|
+
formatter = logging.Formatter(
|
|
11
|
+
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
12
|
+
)
|
|
13
|
+
handler.setFormatter(formatter)
|
|
14
|
+
logger.addHandler(handler)
|
|
15
|
+
|
|
16
|
+
return logger
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
from typing import List, Union, Optional, Set
|
|
2
|
+
|
|
3
|
+
import sqlglot
|
|
4
|
+
from sqlalchemy import text
|
|
5
|
+
from sqlalchemy.orm import Session
|
|
6
|
+
from sqlglot import expressions
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def get_operation_type(statement) -> str:
|
|
10
|
+
"""获取SQL操作类型"""
|
|
11
|
+
return type(statement).__name__.upper()
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_sql_operation_info(sql: str) -> Optional[dict]:
|
|
15
|
+
"""
|
|
16
|
+
获取SQL操作信息(用于调试和日志记录)
|
|
17
|
+
|
|
18
|
+
Returns:
|
|
19
|
+
dict: 包含操作类型、涉及表等信息
|
|
20
|
+
"""
|
|
21
|
+
try:
|
|
22
|
+
statement = sqlglot.parse_one(sql, read="mysql")
|
|
23
|
+
operation_type = get_operation_type(statement)
|
|
24
|
+
|
|
25
|
+
tables = []
|
|
26
|
+
for table in statement.find_all(expressions.Table):
|
|
27
|
+
table_name = table.name
|
|
28
|
+
if table_name.startswith('`') and table_name.endswith('`'):
|
|
29
|
+
table_name = table_name[1:-1]
|
|
30
|
+
tables.append(table_name)
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
'operation': operation_type,
|
|
34
|
+
'tables': tables,
|
|
35
|
+
'has_wildcard': bool(statement.find(expressions.Star)) if isinstance(statement, expressions.Select) else False
|
|
36
|
+
}
|
|
37
|
+
except Exception as e:
|
|
38
|
+
print(f"获取SQL操作信息失败: {e}")
|
|
39
|
+
return None
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def is_readonly_expression(node: expressions.Expression, allowed_operations: Optional[Set[str]] = None, enable_wildcard_check: bool = True):
|
|
43
|
+
"""递归检查表达式树中是否出现写操作节点"""
|
|
44
|
+
# 写操作黑名单节点类型
|
|
45
|
+
write_types = {
|
|
46
|
+
expressions.Insert,
|
|
47
|
+
expressions.Update,
|
|
48
|
+
expressions.Delete,
|
|
49
|
+
expressions.Create,
|
|
50
|
+
expressions.Alter,
|
|
51
|
+
expressions.Drop,
|
|
52
|
+
expressions.Replace,
|
|
53
|
+
expressions.Merge
|
|
54
|
+
}
|
|
55
|
+
for descendant in node.walk():
|
|
56
|
+
if type(descendant) in write_types:
|
|
57
|
+
return False, type(descendant)
|
|
58
|
+
|
|
59
|
+
if allowed_operations:
|
|
60
|
+
op_type = get_operation_type(node)
|
|
61
|
+
# 检查操作类型
|
|
62
|
+
if op_type not in allowed_operations:
|
|
63
|
+
return False, op_type
|
|
64
|
+
|
|
65
|
+
if enable_wildcard_check and isinstance(node, expressions.Select) and node.find(expressions.Star):
|
|
66
|
+
return False, expressions.Star
|
|
67
|
+
|
|
68
|
+
return True, None
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def session_sql_execute(db_session: Session, sql_text: Union[str, List], format_result: bool = True):
|
|
72
|
+
def __do_execute(_sql: str):
|
|
73
|
+
_result = db_session.execute(text(f"{sql_text}"))
|
|
74
|
+
if format_result:
|
|
75
|
+
columns = list(_result.keys())
|
|
76
|
+
rows = [dict(zip(columns, r)) for r in _result.fetchall()]
|
|
77
|
+
return rows
|
|
78
|
+
else:
|
|
79
|
+
return _result
|
|
80
|
+
|
|
81
|
+
if isinstance(sql_text, str):
|
|
82
|
+
return __do_execute(sql_text)
|
|
83
|
+
elif isinstance(sql_text, list):
|
|
84
|
+
results = []
|
|
85
|
+
for sub_sql_text in sql_text:
|
|
86
|
+
result = __do_execute(sub_sql_text)
|
|
87
|
+
results.append(result)
|
|
88
|
+
return results
|
|
89
|
+
else:
|
|
90
|
+
return []
|
{agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/orm/multi_session.py
RENAMED
|
@@ -64,9 +64,11 @@ class DatabaseEngineManager:
|
|
|
64
64
|
def add_engine(self, engine_info: DatabaseEngineModel) -> bool:
|
|
65
65
|
"""添加数据库引擎"""
|
|
66
66
|
with self._lock:
|
|
67
|
+
resource_uid = engine_info.resource_uid
|
|
67
68
|
engine_name = engine_info.engine_name
|
|
68
69
|
database_uri = engine_info.database_uri
|
|
69
70
|
database_name = engine_info.database_name
|
|
71
|
+
database_desc = engine_info.database_desc
|
|
70
72
|
config = engine_info.config.model_dump().copy()
|
|
71
73
|
|
|
72
74
|
if engine_name in self._engines:
|
|
@@ -91,8 +93,10 @@ class DatabaseEngineManager:
|
|
|
91
93
|
self._engines[engine_name] = engine
|
|
92
94
|
self._sessions[engine_name] = session_factory
|
|
93
95
|
self._engine_configs[engine_name] = {
|
|
96
|
+
"resource_uid": resource_uid,
|
|
94
97
|
"database_uri": database_uri,
|
|
95
98
|
"database_name": database_name,
|
|
99
|
+
"database_desc": database_desc,
|
|
96
100
|
"config": config or self._default_config.copy()
|
|
97
101
|
}
|
|
98
102
|
|
|
@@ -13,7 +13,9 @@ _DEFAULT_CONFIG = DatabaseEngineConfigModel()
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class DatabaseEngineModel(BaseModel):
|
|
16
|
+
resource_uid: str = Field("", description="数据库唯一ID")
|
|
16
17
|
engine_name: str = Field(..., description="数据库引擎名字")
|
|
17
18
|
database_uri: str = Field(..., description="数据库uir地址")
|
|
18
19
|
database_name: str = Field(..., description="数据库名称")
|
|
20
|
+
database_desc: str = Field("", description="数据库描述信息")
|
|
19
21
|
config: DatabaseEngineConfigModel = Field(_DEFAULT_CONFIG, description="配置信息")
|
{agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentic-kit-common
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.12
|
|
4
4
|
Summary: Common utilities and tools for agentic kit ecosystem
|
|
5
5
|
Home-page:
|
|
6
6
|
Author: manson
|
|
@@ -26,6 +26,7 @@ Requires-Dist: langchain_community
|
|
|
26
26
|
Requires-Dist: langchain_experimental
|
|
27
27
|
Requires-Dist: mysql-connector-python
|
|
28
28
|
Requires-Dist: sqlalchemy
|
|
29
|
+
Requires-Dist: sqlglot
|
|
29
30
|
Requires-Dist: pymilvus
|
|
30
31
|
Requires-Dist: xinference_client
|
|
31
32
|
Dynamic: author
|
{agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common.egg-info/SOURCES.txt
RENAMED
|
@@ -6,6 +6,8 @@ agentic_kit_common.egg-info/SOURCES.txt
|
|
|
6
6
|
agentic_kit_common.egg-info/dependency_links.txt
|
|
7
7
|
agentic_kit_common.egg-info/requires.txt
|
|
8
8
|
agentic_kit_common.egg-info/top_level.txt
|
|
9
|
+
agentic_kit_common/log/__init__.py
|
|
10
|
+
agentic_kit_common/log/logger.py
|
|
9
11
|
agentic_kit_common/minio/__init__.py
|
|
10
12
|
agentic_kit_common/minio/minio_manager.py
|
|
11
13
|
agentic_kit_common/orm/__init__.py
|
|
@@ -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.
|
|
7
|
+
version="0.0.12",
|
|
8
8
|
author="manson",
|
|
9
9
|
author_email="manson.li3307@gmail.com",
|
|
10
10
|
description='Common utilities and tools for agentic kit ecosystem',
|
|
@@ -42,6 +42,9 @@ setup(
|
|
|
42
42
|
"mysql-connector-python",
|
|
43
43
|
"sqlalchemy",
|
|
44
44
|
|
|
45
|
+
# orm
|
|
46
|
+
"sqlglot",
|
|
47
|
+
|
|
45
48
|
# milvus
|
|
46
49
|
"pymilvus",
|
|
47
50
|
|
|
File without changes
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
from typing import List, Union
|
|
2
|
-
|
|
3
|
-
import sqlparse
|
|
4
|
-
from sqlalchemy import text
|
|
5
|
-
from sqlalchemy.orm import Session
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def is_readonly_sql(sql: str) -> bool:
|
|
9
|
-
"""
|
|
10
|
-
只允许:
|
|
11
|
-
SELECT / WITH / VALUES / EXPLAIN / DESCRIBE / SHOW
|
|
12
|
-
拒绝:
|
|
13
|
-
INSERT/UPDATE/DELETE/CREATE/ALTER/DROP/TRUNCATE/LOAD/REPLACE/LOCK/UNLOCK/GRANT/REVOKE/EXECUTE/CALL
|
|
14
|
-
"""
|
|
15
|
-
sql_clean = sqlparse.format(sql.strip(), strip_comments=True)
|
|
16
|
-
tokens = [t.normalized for t in sqlparse.parse(sql_clean)[0].flatten()
|
|
17
|
-
if t.ttype in (sqlparse.tokens.Keyword, sqlparse.tokens.DML, sqlparse.tokens.DDL)]
|
|
18
|
-
|
|
19
|
-
forbidden = {"INSERT", "UPDATE", "DELETE", "CREATE", "ALTER", "DROP", "TRUNCATE",
|
|
20
|
-
"LOAD", "REPLACE", "LOCK", "UNLOCK", "GRANT", "REVOKE", "EXEC", "CALL"}
|
|
21
|
-
allowed_root = {"SELECT", "WITH", "EXPLAIN", "DESCRIBE", "SHOW", "VALUES"}
|
|
22
|
-
|
|
23
|
-
root = tokens[0].upper() if tokens else ""
|
|
24
|
-
if root not in allowed_root:
|
|
25
|
-
return False
|
|
26
|
-
if any(k in forbidden for k in tokens):
|
|
27
|
-
return False
|
|
28
|
-
return True
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def session_sql_execute(db_session: Session, sql_text: Union[str, List], query_only: bool = True):
|
|
32
|
-
if isinstance(sql_text, str):
|
|
33
|
-
# 处理单条SQL语句
|
|
34
|
-
if query_only:
|
|
35
|
-
if not is_readonly_sql(sql_text):
|
|
36
|
-
return []
|
|
37
|
-
result = db_session.execute(text(f"{sql_text}"))
|
|
38
|
-
columns = list(result.keys())
|
|
39
|
-
rows = [dict(zip(columns, r)) for r in result.fetchall()]
|
|
40
|
-
return rows
|
|
41
|
-
elif isinstance(sql_text, list):
|
|
42
|
-
results = []
|
|
43
|
-
for sub_sql_text in sql_text:
|
|
44
|
-
if query_only:
|
|
45
|
-
if not is_readonly_sql(sub_sql_text):
|
|
46
|
-
continue
|
|
47
|
-
result = db_session.execute(text(f"{sub_sql_text}"))
|
|
48
|
-
columns = list(result.keys())
|
|
49
|
-
rows = [dict(zip(columns, r)) for r in result.fetchall()]
|
|
50
|
-
results.append(rows)
|
|
51
|
-
return results
|
|
52
|
-
else:
|
|
53
|
-
return []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/minio/minio_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/schema/__init__.py
RENAMED
|
File without changes
|
{agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/schema/base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentic_kit_common-0.0.10/test → agentic_kit_common-0.0.12/agentic_kit_common/web/http}/__init__.py
RENAMED
|
File without changes
|
{agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/web/http/response.py
RENAMED
|
File without changes
|
|
File without changes
|
{agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|