fiuai-sdk-python 0.6.7__py3-none-any.whl → 0.6.9__py3-none-any.whl
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.
- fiuai_sdk_python/__init__.py +6 -4
- fiuai_sdk_python/auth/__init__.py +5 -3
- fiuai_sdk_python/auth/context_mgr.py +9 -0
- fiuai_sdk_python/context.py +16 -0
- fiuai_sdk_python/utils/logger.py +45 -26
- {fiuai_sdk_python-0.6.7.dist-info → fiuai_sdk_python-0.6.9.dist-info}/METADATA +1 -1
- {fiuai_sdk_python-0.6.7.dist-info → fiuai_sdk_python-0.6.9.dist-info}/RECORD +9 -9
- {fiuai_sdk_python-0.6.7.dist-info → fiuai_sdk_python-0.6.9.dist-info}/WHEEL +0 -0
- {fiuai_sdk_python-0.6.7.dist-info → fiuai_sdk_python-0.6.9.dist-info}/licenses/LICENSE +0 -0
fiuai_sdk_python/__init__.py
CHANGED
|
@@ -3,11 +3,12 @@ from .util import init_fiuai
|
|
|
3
3
|
from .profile import UserProfileInfo
|
|
4
4
|
from .type import UserProfile
|
|
5
5
|
from .context import (
|
|
6
|
-
RequestContext,
|
|
6
|
+
RequestContext,
|
|
7
7
|
get_current_headers,
|
|
8
8
|
validate_current_context,
|
|
9
9
|
get_current_missing_fields,
|
|
10
|
-
is_current_context_valid
|
|
10
|
+
is_current_context_valid,
|
|
11
|
+
get_trace_id,
|
|
11
12
|
)
|
|
12
13
|
|
|
13
14
|
__version__ = "0.6.5"
|
|
@@ -22,5 +23,6 @@ __all__ = [
|
|
|
22
23
|
'get_current_headers',
|
|
23
24
|
'validate_current_context',
|
|
24
25
|
'get_current_missing_fields',
|
|
25
|
-
'is_current_context_valid'
|
|
26
|
-
|
|
26
|
+
'is_current_context_valid',
|
|
27
|
+
'get_trace_id',
|
|
28
|
+
]
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
from .header import parse_auth_headers, extract_auth_from_request
|
|
2
2
|
from .type import AuthData, AuthHeader
|
|
3
3
|
from .helper import (
|
|
4
|
-
get_auth_data,
|
|
4
|
+
get_auth_data as get_auth_data_from_request,
|
|
5
5
|
get_current_user_id,
|
|
6
6
|
get_current_tenant_id,
|
|
7
7
|
get_current_company,
|
|
8
8
|
get_company_unique_no,
|
|
9
9
|
get_impersonation,
|
|
10
|
-
is_impersonating
|
|
10
|
+
is_impersonating,
|
|
11
11
|
)
|
|
12
12
|
from .context_mgr import (
|
|
13
13
|
ContextManager,
|
|
14
14
|
init_context,
|
|
15
15
|
WorldData,
|
|
16
16
|
get_auth_data_from_context,
|
|
17
|
+
get_auth_data,
|
|
17
18
|
set_auth_data,
|
|
18
19
|
update_auth_data,
|
|
19
20
|
get_world_data,
|
|
@@ -24,7 +25,9 @@ __all__ = [
|
|
|
24
25
|
"extract_auth_from_request",
|
|
25
26
|
"AuthData",
|
|
26
27
|
"AuthHeader",
|
|
28
|
+
"get_auth_data_from_request",
|
|
27
29
|
"get_auth_data",
|
|
30
|
+
"get_auth_data_from_context",
|
|
28
31
|
"get_current_user_id",
|
|
29
32
|
"get_current_tenant_id",
|
|
30
33
|
"get_current_company",
|
|
@@ -34,7 +37,6 @@ __all__ = [
|
|
|
34
37
|
"ContextManager",
|
|
35
38
|
"init_context",
|
|
36
39
|
"WorldData",
|
|
37
|
-
"get_auth_data_from_context",
|
|
38
40
|
"set_auth_data",
|
|
39
41
|
"update_auth_data",
|
|
40
42
|
"get_world_data",
|
|
@@ -171,6 +171,15 @@ def get_auth_data_from_context() -> Optional[AuthData]:
|
|
|
171
171
|
return None
|
|
172
172
|
|
|
173
173
|
|
|
174
|
+
def get_auth_data() -> Optional[AuthData]:
|
|
175
|
+
"""
|
|
176
|
+
从当前上下文获取认证数据(无参)。
|
|
177
|
+
与 get_auth_data_from_context() 行为一致,供业务方统一使用无参 get_auth_data()。
|
|
178
|
+
上下文无效或不存在时返回 None。
|
|
179
|
+
"""
|
|
180
|
+
return get_auth_data_from_context()
|
|
181
|
+
|
|
182
|
+
|
|
174
183
|
def set_auth_data(auth_data: AuthData) -> bool:
|
|
175
184
|
"""设置当前上下文中的认证数据。需在 init_context 的 with 块内使用。"""
|
|
176
185
|
global _current_context_manager
|
fiuai_sdk_python/context.py
CHANGED
|
@@ -222,6 +222,22 @@ def is_current_context_valid(required_fields: list = None) -> bool:
|
|
|
222
222
|
return is_valid
|
|
223
223
|
|
|
224
224
|
|
|
225
|
+
def get_trace_id(default: str = "") -> str:
|
|
226
|
+
"""
|
|
227
|
+
从当前上下文获取 trace_id。
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
default: 无上下文或无 x-fiuai-trace-id 时的返回值,默认为 ""。
|
|
231
|
+
|
|
232
|
+
Returns:
|
|
233
|
+
str: x-fiuai-trace-id 的值,否则返回 default。
|
|
234
|
+
"""
|
|
235
|
+
headers = get_current_headers()
|
|
236
|
+
if not headers:
|
|
237
|
+
return default
|
|
238
|
+
return headers.get("x-fiuai-trace-id") or default
|
|
239
|
+
|
|
240
|
+
|
|
225
241
|
def extract_auth_headers_from_context(
|
|
226
242
|
username: str,
|
|
227
243
|
auth_tenant_id: str,
|
fiuai_sdk_python/utils/logger.py
CHANGED
|
@@ -8,49 +8,78 @@
|
|
|
8
8
|
import logging
|
|
9
9
|
import os
|
|
10
10
|
import sys
|
|
11
|
+
from typing import Any, Callable, Dict, Optional
|
|
11
12
|
|
|
12
13
|
|
|
14
|
+
def _make_context_filter(
|
|
15
|
+
context_injector: Optional[Callable[[], Optional[Dict[str, Any]]]],
|
|
16
|
+
) -> logging.Filter:
|
|
17
|
+
"""根据 context_injector 构建过滤器:非 None 时注入返回值到 record,否则仅设置默认 trace_id。"""
|
|
18
|
+
|
|
19
|
+
class _InjectorFilter(logging.Filter):
|
|
20
|
+
def __init__(self, injector: Optional[Callable[[], Optional[Dict[str, Any]]]]) -> None:
|
|
21
|
+
super().__init__()
|
|
22
|
+
self._injector = injector
|
|
23
|
+
|
|
24
|
+
def filter(self, record: logging.LogRecord) -> bool:
|
|
25
|
+
if self._injector is not None:
|
|
26
|
+
try:
|
|
27
|
+
ctx = self._injector()
|
|
28
|
+
if ctx:
|
|
29
|
+
for k, v in ctx.items():
|
|
30
|
+
setattr(record, k, v)
|
|
31
|
+
except Exception:
|
|
32
|
+
pass
|
|
33
|
+
if not getattr(record, "trace_id", None):
|
|
34
|
+
record.trace_id = "-"
|
|
35
|
+
return True
|
|
36
|
+
|
|
37
|
+
return _InjectorFilter(context_injector)
|
|
13
38
|
|
|
14
39
|
|
|
15
40
|
def init_logger(
|
|
16
41
|
log_path: str = "logs/",
|
|
17
42
|
log_level: str = "INFO",
|
|
18
43
|
json_log: bool = False,
|
|
19
|
-
caller: bool = True
|
|
44
|
+
caller: bool = True,
|
|
45
|
+
context_injector: Optional[Callable[[], Optional[Dict[str, Any]]]] = None,
|
|
20
46
|
):
|
|
21
47
|
"""初始化日志配置
|
|
22
|
-
|
|
48
|
+
|
|
23
49
|
Args:
|
|
24
50
|
log_path: 日志文件路径
|
|
25
51
|
log_level: 日志级别
|
|
26
52
|
json_log: 是否使用JSON格式日志
|
|
27
53
|
caller: 是否显示调用者信息
|
|
54
|
+
context_injector: 可选,无参可调用对象,返回 dict(如 {"trace_id": "xxx"}),
|
|
55
|
+
非 None 时会将返回的键值注入到每条日志记录中。
|
|
28
56
|
"""
|
|
29
57
|
# 创建日志目录
|
|
30
58
|
if log_path and not os.path.exists(log_path):
|
|
31
59
|
os.makedirs(log_path)
|
|
32
|
-
|
|
60
|
+
|
|
33
61
|
# 设置日志级别
|
|
34
62
|
level = getattr(logging, log_level.upper(), logging.INFO)
|
|
35
|
-
|
|
63
|
+
|
|
36
64
|
# 获取根日志记录器
|
|
37
65
|
root_logger = logging.getLogger()
|
|
38
|
-
|
|
66
|
+
|
|
39
67
|
# 设置根日志记录器的级别
|
|
40
68
|
root_logger.setLevel(level)
|
|
41
|
-
|
|
69
|
+
|
|
42
70
|
# 清除现有的处理器(避免重复添加)
|
|
43
71
|
root_logger.handlers.clear()
|
|
44
|
-
|
|
72
|
+
|
|
73
|
+
context_filter = _make_context_filter(context_injector)
|
|
74
|
+
log_format = '%(asctime)s - %(name)s - %(levelname)s - [trace_id:%(trace_id)s] - %(message)s'
|
|
75
|
+
|
|
45
76
|
# 配置控制台处理器
|
|
46
77
|
console_handler = logging.StreamHandler(sys.stdout)
|
|
47
78
|
console_handler.setLevel(level)
|
|
48
|
-
# 添加 event_id 和 task_id 到日志格式中
|
|
49
|
-
log_format = '%(asctime)s - %(name)s - %(levelname)s - [trace_id:%(trace_id)s] - %(message)s'
|
|
50
79
|
console_handler.setFormatter(logging.Formatter(log_format))
|
|
51
|
-
|
|
80
|
+
console_handler.addFilter(context_filter)
|
|
52
81
|
root_logger.addHandler(console_handler)
|
|
53
|
-
|
|
82
|
+
|
|
54
83
|
# 如果指定了日志文件路径,添加文件处理器
|
|
55
84
|
if log_path:
|
|
56
85
|
file_handler = logging.FileHandler(
|
|
@@ -58,13 +87,11 @@ def init_logger(
|
|
|
58
87
|
encoding='utf-8'
|
|
59
88
|
)
|
|
60
89
|
file_handler.setLevel(level)
|
|
61
|
-
# 添加 event_id 和 task_id 到日志格式中
|
|
62
90
|
file_handler.setFormatter(logging.Formatter(log_format))
|
|
63
|
-
|
|
91
|
+
file_handler.addFilter(context_filter)
|
|
64
92
|
root_logger.addHandler(file_handler)
|
|
65
|
-
|
|
93
|
+
|
|
66
94
|
# 过滤第三方库的日志,只显示 ERROR 及以上级别
|
|
67
|
-
# 这样可以减少不必要的 INFO、DEBUG 和 WARNING 日志输出
|
|
68
95
|
third_party_loggers = [
|
|
69
96
|
'nebula3.logger',
|
|
70
97
|
'nebula3',
|
|
@@ -77,21 +104,13 @@ def init_logger(
|
|
|
77
104
|
third_party_logger.setLevel(logging.ERROR)
|
|
78
105
|
|
|
79
106
|
|
|
80
|
-
# 全局过滤器实例
|
|
81
|
-
|
|
82
|
-
|
|
83
107
|
def get_logger(name: str) -> logging.Logger:
|
|
84
108
|
"""获取日志记录器
|
|
85
|
-
|
|
86
|
-
自动添加 ContextFilter,从上下文中获取 event_id 和 task_id 并记录到日志中
|
|
87
|
-
|
|
109
|
+
|
|
88
110
|
Args:
|
|
89
111
|
name: 日志记录器名称
|
|
90
|
-
|
|
112
|
+
|
|
91
113
|
Returns:
|
|
92
114
|
logging.Logger: 日志记录器实例
|
|
93
115
|
"""
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
return logger
|
|
116
|
+
return logging.getLogger(name)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fiuai_sdk_python
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.9
|
|
4
4
|
Summary: FiuAI Python SDK - 企业级AI服务集成开发工具包
|
|
5
5
|
Project-URL: Homepage, https://github.com/fiuai/fiuai-sdk-python
|
|
6
6
|
Project-URL: Documentation, https://github.com/fiuai/fiuai-sdk-python#readme
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
fiuai_sdk_python/__init__.py,sha256=
|
|
1
|
+
fiuai_sdk_python/__init__.py,sha256=oJKn3ZflK4ysURBCP4rWJBq7ArEnod6bMaBaWrgHd9A,616
|
|
2
2
|
fiuai_sdk_python/bank.py,sha256=GRAmkI33rRZw9UE67SpkYsqPN-kdLm-iuJuuBLxSvrE,5438
|
|
3
3
|
fiuai_sdk_python/client.py,sha256=AGc8iqXaHOYUsAPDekV8dYZL6OFgERufR7FvAZscW8g,19087
|
|
4
4
|
fiuai_sdk_python/company.py,sha256=ZELOAxCTIA-F9cUWakvq7hv6SflM19Rq3XMDkV0mtbg,4771
|
|
5
5
|
fiuai_sdk_python/config.py,sha256=vCD-aW2Y9OpJitfTDB3Acjw_PCurYT69vQjZ_wY950I,825
|
|
6
6
|
fiuai_sdk_python/const.py,sha256=fPoUeOJ4WPymEQqarA7cJE3bmdz5fCPq2PtYvzZJ4Tk,346
|
|
7
|
-
fiuai_sdk_python/context.py,sha256=
|
|
7
|
+
fiuai_sdk_python/context.py,sha256=poW6yWHyuFh-W9GnUJXRzHVRv8NtNpxyqi-L1JJPfnY,10018
|
|
8
8
|
fiuai_sdk_python/datatype.py,sha256=WQjsoJgpkkw0GtAQLzTrsem4joT8e3cnhcfy3dKN0bA,8919
|
|
9
9
|
fiuai_sdk_python/doctype.py,sha256=5o6WsZDeKuCWfTiQa0H_BNh4jb96EpZt9WaDh8TgKZo,5013
|
|
10
10
|
fiuai_sdk_python/error.py,sha256=YYsqP39vY8N7wWD4ervsx7ngcdXIMR59Wc4A4h4Rb-k,235
|
|
@@ -15,8 +15,8 @@ fiuai_sdk_python/resp.py,sha256=4twCxmwqe2e1vlhfFnu-5_FR8PwQiveB9njY3exaQ88,1018
|
|
|
15
15
|
fiuai_sdk_python/setup.py,sha256=ER0IPAouHhrVSzG0Iu87Ky0R5c4kCgOF77kRAOO-1MI,8025
|
|
16
16
|
fiuai_sdk_python/type.py,sha256=vinZKflNvmQNhqO5mDARAE6O133k0LiR1s1ZvexN_q4,28940
|
|
17
17
|
fiuai_sdk_python/util.py,sha256=x3TkNsC8_nzA-8x6ndIGrIpE9sRKpn3vlxnj2Hqpxwo,2326
|
|
18
|
-
fiuai_sdk_python/auth/__init__.py,sha256=
|
|
19
|
-
fiuai_sdk_python/auth/context_mgr.py,sha256=
|
|
18
|
+
fiuai_sdk_python/auth/__init__.py,sha256=AK1OQQJvX7tdzjOybt2UOcGABdXJzddWc49PHZeqxLY,1004
|
|
19
|
+
fiuai_sdk_python/auth/context_mgr.py,sha256=Wl7Q0YCw0VKiPrYkPZXoBHJM6d0t8kkPOCFxxJv1O_A,9179
|
|
20
20
|
fiuai_sdk_python/auth/header.py,sha256=JoMT6OJQUU7laGP6235kolfG-Qy_AP6ZQQQ9Ca8U88c,3606
|
|
21
21
|
fiuai_sdk_python/auth/helper.py,sha256=GeuRwOZivtIsAo4_XBt0PDDbOLntF2uxSrO9mPvVMBs,5014
|
|
22
22
|
fiuai_sdk_python/auth/type.py,sha256=lPUgbSOW-mQfOZpxPGhwDmpbKr5UfjznEuSKGwDosxY,2233
|
|
@@ -34,9 +34,9 @@ fiuai_sdk_python/pkg/vector/__init__.py,sha256=fvbetFxbHiFeojnTfKT3roA1hOcoNHF_e
|
|
|
34
34
|
fiuai_sdk_python/pkg/vector/vector.py,sha256=gC8CQTZm56zXbhM3g_hFa7SGtAo9D1atNs3HwuEbJHQ,28994
|
|
35
35
|
fiuai_sdk_python/utils/__init__.py,sha256=UwwsvqBsaRCHbWdx-wvM48szT3j50h95k9MZdbfawRQ,72
|
|
36
36
|
fiuai_sdk_python/utils/ids.py,sha256=ZDtEqt_Woth8ytPB2tdnnTIv7noWr8XYhSsUvkZ7Hc0,6448
|
|
37
|
-
fiuai_sdk_python/utils/logger.py,sha256=
|
|
37
|
+
fiuai_sdk_python/utils/logger.py,sha256=RuKn9TFmV1IfsRTV3ZdtXLZkM44GkHs32ehbJdrdu-8,3657
|
|
38
38
|
fiuai_sdk_python/utils/text.py,sha256=bnob_W0nj_Vj8Hp93B0cYmFOY8IhUWF0C8UedOYCNvs,1667
|
|
39
|
-
fiuai_sdk_python-0.6.
|
|
40
|
-
fiuai_sdk_python-0.6.
|
|
41
|
-
fiuai_sdk_python-0.6.
|
|
42
|
-
fiuai_sdk_python-0.6.
|
|
39
|
+
fiuai_sdk_python-0.6.9.dist-info/METADATA,sha256=ZKbU-s_9nobP_2kNJVR2e6vZfVJ9wKbCROabQfDdojQ,1523
|
|
40
|
+
fiuai_sdk_python-0.6.9.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
41
|
+
fiuai_sdk_python-0.6.9.dist-info/licenses/LICENSE,sha256=PFMF0dFErrBFqU-rryEby0yW8GBagYqrdbyZQHMUCJg,1062
|
|
42
|
+
fiuai_sdk_python-0.6.9.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|