fiuai-sdk-python 0.6.7__tar.gz → 0.6.9__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.
Files changed (44) hide show
  1. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/PKG-INFO +1 -1
  2. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/pyproject.toml +1 -1
  3. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/__init__.py +6 -4
  4. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/auth/__init__.py +5 -3
  5. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/auth/context_mgr.py +9 -0
  6. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/context.py +16 -0
  7. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/utils/logger.py +45 -26
  8. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/.gitignore +0 -0
  9. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/CHANGELOG.md +0 -0
  10. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/LICENSE +0 -0
  11. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/README.md +0 -0
  12. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/auth/header.py +0 -0
  13. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/auth/helper.py +0 -0
  14. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/auth/type.py +0 -0
  15. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/bank.py +0 -0
  16. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/client.py +0 -0
  17. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/company.py +0 -0
  18. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/config.py +0 -0
  19. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/const.py +0 -0
  20. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/datatype.py +0 -0
  21. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/doctype.py +0 -0
  22. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/error.py +0 -0
  23. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/examples/fastapi_integration.py +0 -0
  24. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/http/__init__.py +0 -0
  25. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/http/client.py +0 -0
  26. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/item.py +0 -0
  27. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/perm.py +0 -0
  28. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/pkg/cache/__init__.py +0 -0
  29. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/pkg/cache/redis_manager.py +0 -0
  30. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/pkg/db/__init__.py +0 -0
  31. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/pkg/db/config.py +0 -0
  32. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/pkg/db/errors.py +0 -0
  33. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/pkg/db/manager.py +0 -0
  34. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/pkg/db/utils.py +0 -0
  35. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/pkg/vector/__init__.py +0 -0
  36. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/pkg/vector/vector.py +0 -0
  37. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/profile.py +0 -0
  38. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/resp.py +0 -0
  39. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/setup.py +0 -0
  40. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/type.py +0 -0
  41. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/util.py +0 -0
  42. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/utils/__init__.py +0 -0
  43. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/utils/ids.py +0 -0
  44. {fiuai_sdk_python-0.6.7 → fiuai_sdk_python-0.6.9}/src/fiuai_sdk_python/utils/text.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fiuai_sdk_python
3
- Version: 0.6.7
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,6 +1,6 @@
1
1
  [project]
2
2
  name = "fiuai_sdk_python"
3
- version = "0.6.7"
3
+ version = "0.6.9"
4
4
  description = "FiuAI Python SDK - 企业级AI服务集成开发工具包"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -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
@@ -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,
@@ -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
- logger = logging.getLogger(name)
95
-
96
-
97
- return logger
116
+ return logging.getLogger(name)