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.

Files changed (40) hide show
  1. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/PKG-INFO +2 -1
  2. agentic_kit_common-0.0.12/agentic_kit_common/log/logger.py +16 -0
  3. agentic_kit_common-0.0.12/agentic_kit_common/orm/execution.py +90 -0
  4. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/orm/multi_session.py +4 -0
  5. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/orm/schema.py +2 -0
  6. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common.egg-info/PKG-INFO +2 -1
  7. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common.egg-info/SOURCES.txt +2 -0
  8. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common.egg-info/requires.txt +1 -0
  9. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/setup.py +4 -1
  10. agentic_kit_common-0.0.12/test/__init__.py +0 -0
  11. agentic_kit_common-0.0.10/agentic_kit_common/orm/execution.py +0 -53
  12. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/README.md +0 -0
  13. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/__init__.py +0 -0
  14. {agentic_kit_common-0.0.10/agentic_kit_common/minio → agentic_kit_common-0.0.12/agentic_kit_common/log}/__init__.py +0 -0
  15. {agentic_kit_common-0.0.10/agentic_kit_common/vector → agentic_kit_common-0.0.12/agentic_kit_common/minio}/__init__.py +0 -0
  16. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/minio/minio_manager.py +0 -0
  17. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/orm/__init__.py +0 -0
  18. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/orm/base.py +0 -0
  19. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/orm/manager.py +0 -0
  20. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/orm/session.py +0 -0
  21. {agentic_kit_common-0.0.10/agentic_kit_common/web → agentic_kit_common-0.0.12/agentic_kit_common/vector}/__init__.py +0 -0
  22. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/embedding/__init__.py +0 -0
  23. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/embedding/embedding.py +0 -0
  24. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/manager/__init__.py +0 -0
  25. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/manager/milvus_manager.py +0 -0
  26. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/schema/__init__.py +0 -0
  27. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/schema/base.py +0 -0
  28. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/vector/schema/milvus_schema.py +0 -0
  29. {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
  30. {agentic_kit_common-0.0.10/test → agentic_kit_common-0.0.12/agentic_kit_common/web/http}/__init__.py +0 -0
  31. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common/web/http/response.py +0 -0
  32. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common.egg-info/dependency_links.txt +0 -0
  33. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/agentic_kit_common.egg-info/top_level.txt +0 -0
  34. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/setup.cfg +0 -0
  35. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/test/config.py +0 -0
  36. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/test/settings.py +0 -0
  37. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/test/test_embedding.py +0 -0
  38. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/test/test_minio.py +0 -0
  39. {agentic_kit_common-0.0.10 → agentic_kit_common-0.0.12}/test/test_orm.py +0 -0
  40. {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.10
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 []
@@ -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="配置信息")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-kit-common
3
- Version: 0.0.10
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
@@ -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
@@ -8,5 +8,6 @@ langchain_community
8
8
  langchain_experimental
9
9
  mysql-connector-python
10
10
  sqlalchemy
11
+ sqlglot
11
12
  pymilvus
12
13
  xinference_client
@@ -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.10",
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 []