sycommon-python-lib 0.1.55b0__py3-none-any.whl → 0.1.56__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.
Files changed (51) hide show
  1. sycommon/config/Config.py +29 -4
  2. sycommon/config/LangfuseConfig.py +15 -0
  3. sycommon/config/RerankerConfig.py +1 -0
  4. sycommon/config/SentryConfig.py +13 -0
  5. sycommon/database/async_base_db_service.py +36 -0
  6. sycommon/database/async_database_service.py +96 -0
  7. sycommon/llm/__init__.py +0 -0
  8. sycommon/llm/embedding.py +204 -0
  9. sycommon/llm/get_llm.py +37 -0
  10. sycommon/llm/llm_logger.py +126 -0
  11. sycommon/llm/llm_tokens.py +119 -0
  12. sycommon/llm/struct_token.py +192 -0
  13. sycommon/llm/sy_langfuse.py +103 -0
  14. sycommon/llm/usage_token.py +117 -0
  15. sycommon/logging/async_sql_logger.py +65 -0
  16. sycommon/logging/kafka_log.py +200 -434
  17. sycommon/logging/logger_levels.py +23 -0
  18. sycommon/middleware/context.py +2 -0
  19. sycommon/middleware/exception.py +10 -16
  20. sycommon/middleware/timeout.py +2 -1
  21. sycommon/middleware/traceid.py +174 -48
  22. sycommon/notice/__init__.py +0 -0
  23. sycommon/notice/uvicorn_monitor.py +200 -0
  24. sycommon/rabbitmq/rabbitmq_client.py +232 -242
  25. sycommon/rabbitmq/rabbitmq_pool.py +278 -218
  26. sycommon/rabbitmq/rabbitmq_service.py +25 -843
  27. sycommon/rabbitmq/rabbitmq_service_client_manager.py +206 -0
  28. sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +73 -0
  29. sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +285 -0
  30. sycommon/rabbitmq/rabbitmq_service_core.py +117 -0
  31. sycommon/rabbitmq/rabbitmq_service_producer_manager.py +238 -0
  32. sycommon/sentry/__init__.py +0 -0
  33. sycommon/sentry/sy_sentry.py +35 -0
  34. sycommon/services.py +132 -103
  35. sycommon/synacos/feign.py +8 -3
  36. sycommon/synacos/feign_client.py +22 -8
  37. sycommon/synacos/nacos_client_base.py +119 -0
  38. sycommon/synacos/nacos_config_manager.py +107 -0
  39. sycommon/synacos/nacos_heartbeat_manager.py +144 -0
  40. sycommon/synacos/nacos_service.py +64 -771
  41. sycommon/synacos/nacos_service_discovery.py +157 -0
  42. sycommon/synacos/nacos_service_registration.py +270 -0
  43. sycommon/tools/env.py +62 -0
  44. sycommon/tools/merge_headers.py +117 -0
  45. sycommon/tools/snowflake.py +133 -120
  46. {sycommon_python_lib-0.1.55b0.dist-info → sycommon_python_lib-0.1.56.dist-info}/METADATA +13 -6
  47. sycommon_python_lib-0.1.56.dist-info/RECORD +89 -0
  48. sycommon_python_lib-0.1.55b0.dist-info/RECORD +0 -59
  49. {sycommon_python_lib-0.1.55b0.dist-info → sycommon_python_lib-0.1.56.dist-info}/WHEEL +0 -0
  50. {sycommon_python_lib-0.1.55b0.dist-info → sycommon_python_lib-0.1.56.dist-info}/entry_points.txt +0 -0
  51. {sycommon_python_lib-0.1.55b0.dist-info → sycommon_python_lib-0.1.56.dist-info}/top_level.txt +0 -0
@@ -3,48 +3,48 @@ import threading
3
3
  import socket
4
4
  import hashlib
5
5
  import random
6
+ import os
6
7
  from typing import Optional, Type, Any
7
8
  from os import environ
8
- import netifaces
9
+ import psutil
9
10
 
10
11
 
11
12
  class ClassProperty:
12
- """
13
- 自定义类属性描述符,替代 @classmethod + @property 的废弃写法
14
- 支持通过 类.属性 的方式访问,无需实例化
15
- """
13
+ """支持通过 类.属性 的方式访问,无需实例化"""
16
14
 
17
15
  def __init__(self, func):
18
16
  self.func = func
19
17
 
20
18
  def __get__(self, instance: Any, cls: Type) -> str:
21
- # 调用传入的函数,并传入类本身作为第一个参数
22
19
  return self.func(cls)
23
20
 
24
21
 
25
22
  class Snowflake:
26
- """雪花算法生成器(无公网依赖,适配内网环境)"""
23
+ """
24
+ 雪花算法生成器(高并发终极优化版 - 修复语法错误)
25
+
26
+ 终极优化点:
27
+ 1. 解决溢出死锁:当序列号溢出时,释放锁自旋等待,避免阻塞其他线程。
28
+ 2. 锁内原子更新:确保时钟回拨判断与状态更新的原子性。
29
+ 3. 移除 sleep:全流程无休眠,纯自旋保证极致吞吐。
30
+ """
27
31
  START_TIMESTAMP = 1388534400000 # 2014-01-01 00:00:00
28
32
  SEQUENCE_BITS = 12
29
33
  MACHINE_ID_BITS = 10
30
34
  MAX_MACHINE_ID = (1 << MACHINE_ID_BITS) - 1 # 0~1023
31
- MAX_SEQUENCE = (1 << SEQUENCE_BITS) - 1
35
+ MAX_SEQUENCE = (1 << SEQUENCE_BITS) - 1 # 4095
32
36
  MACHINE_ID_SHIFT = SEQUENCE_BITS
33
37
  TIMESTAMP_SHIFT = SEQUENCE_BITS + MACHINE_ID_BITS
38
+ CLOCK_BACKWARD_THRESHOLD = 5
39
+ _MAX_JAVA_LONG = 9223372036854775807
34
40
 
35
- # 类级别的单例实例
36
41
  _instance = None
37
42
  _instance_lock = threading.Lock()
38
43
 
39
44
  def __init__(self, machine_id: Optional[int] = None):
40
- """
41
- 初始化:优先使用传入的machine_id,否则自动从K8s环境获取
42
- :param machine_id: 手动指定机器ID(None则自动计算)
43
- """
44
- # 自动计算K8s环境下的machine_id
45
+ self._validate_timestamp_range()
45
46
  if machine_id is None:
46
47
  machine_id = self._get_k8s_machine_id()
47
-
48
48
  if not (0 <= machine_id <= self.MAX_MACHINE_ID):
49
49
  raise ValueError(f"机器ID必须在0~{self.MAX_MACHINE_ID}之间")
50
50
 
@@ -53,116 +53,137 @@ class Snowflake:
53
53
  self.sequence = 0
54
54
  self.lock = threading.Lock()
55
55
 
56
+ def _validate_timestamp_range(self):
57
+ max_support_timestamp = self.START_TIMESTAMP + \
58
+ (1 << (64 - self.TIMESTAMP_SHIFT)) - 1
59
+ current_timestamp = self._get_current_timestamp()
60
+ if current_timestamp > max_support_timestamp:
61
+ raise RuntimeError(f"当前时间戳({current_timestamp})超过支持范围")
62
+
56
63
  def _get_k8s_machine_id(self) -> int:
57
- """
58
- 从K8s环境自动计算唯一machine_id(无公网依赖,多层兜底):
59
- 优先级:POD_NAME > POD_IP > 容器内网IP(网卡读取) > 容器主机名 > 随机数(最终兜底)
60
- """
61
- # 1. 优先读取K8s内置的POD_NAME(默认注入,优先级最高)
62
64
  pod_name = environ.get("POD_NAME")
63
65
  if pod_name:
64
66
  return self._hash_to_machine_id(pod_name)
65
-
66
- # 2. 读取POD_IP(手动配置downwardAPI后必存在)
67
67
  pod_ip = environ.get("POD_IP")
68
68
  if pod_ip:
69
69
  return self._hash_to_machine_id(pod_ip)
70
-
71
- # 3. 兜底1:读取本机网卡获取内网IP(无公网依赖)
72
70
  try:
73
71
  local_ip = self._get_local_internal_ip()
74
72
  if local_ip:
75
73
  return self._hash_to_machine_id(local_ip)
76
74
  except Exception:
77
75
  pass
78
-
79
- # 4. 兜底2:获取容器主机名(K8s中默认等于Pod名称,保证唯一)
80
76
  hostname = socket.gethostname()
81
77
  if hostname:
82
78
  return self._hash_to_machine_id(hostname)
83
-
84
- # 5. 最终兜底:生成随机数(仅极端情况使用)
85
- random_id = random.randint(0, self.MAX_MACHINE_ID)
86
- return random_id
79
+ fallback_text = f"{os.getpid()}_{int(time.time()*1000)}_{random.randint(0, 100000)}"
80
+ return self._hash_to_machine_id(fallback_text)
87
81
 
88
82
  def _get_local_internal_ip(self) -> Optional[str]:
89
- """
90
- 读取本机网卡信息,获取非回环的内网IP(无公网依赖)
91
- :return: 内网IP字符串,失败返回None
92
- """
93
83
  try:
94
- # 遍历所有网卡
95
- for interface in netifaces.interfaces():
96
- # 获取网卡的IP地址信息
97
- addrs = netifaces.ifaddresses(interface)
98
- # 只取IPv4地址
99
- if netifaces.AF_INET in addrs:
100
- for addr in addrs[netifaces.AF_INET]:
101
- ip = addr.get('addr')
102
- # 过滤回环地址(127.0.0.1)
103
- if ip and not ip.startswith('127.'):
84
+ net_if_addrs = psutil.net_if_addrs()
85
+ for interface_name, addrs in net_if_addrs.items():
86
+ if (interface_name.lower().startswith("lo")
87
+ or interface_name.lower() in ["loopback", "virtual", "docker", "veth"]):
88
+ continue
89
+ for addr in addrs:
90
+ if addr.family == psutil.AF_INET:
91
+ ip = addr.address
92
+ if ip and not ip.startswith('127.') and not ip.startswith('0.'):
104
93
  return ip
105
94
  return None
106
- except ImportError:
107
- # 若未安装netifaces,降级为socket方式
95
+ except Exception:
108
96
  return self._get_local_ip_fallback()
109
97
 
110
98
  def _get_local_ip_fallback(self) -> Optional[str]:
111
- """
112
- 降级方案:不连接公网,仅通过本地socket获取IP(兼容无netifaces的场景)
113
- """
114
99
  try:
115
- # 创建socket但不连接任何地址,仅绑定到本地
116
100
  s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
117
- s.bind(('', 0))
101
+ s.connect(("10.0.0.1", 80))
118
102
  local_ip = s.getsockname()[0]
119
103
  s.close()
120
- # 过滤回环地址
121
- if not local_ip.startswith('127.'):
104
+ if not local_ip.startswith('127.') and not local_ip.startswith('0.'):
122
105
  return local_ip
123
- return None
124
106
  except Exception:
125
- return None
107
+ pass
108
+ try:
109
+ hostname = socket.gethostname()
110
+ ip_list = socket.gethostbyname_ex(hostname)[2]
111
+ for ip in ip_list:
112
+ if not ip.startswith('127.') and not ip.startswith('0.'):
113
+ return ip
114
+ except Exception:
115
+ pass
116
+ return None
126
117
 
127
118
  def _hash_to_machine_id(self, text: str) -> int:
128
- """将字符串哈希后取模,得到0~1023的machine_id(保证分布均匀)"""
129
119
  hash_bytes = hashlib.md5(text.encode("utf-8")).digest()
130
- hash_int = int.from_bytes(hash_bytes[:4], byteorder="big")
131
- return hash_int % self.MAX_MACHINE_ID
120
+ return int.from_bytes(hash_bytes[:4], byteorder="big") % (self.MAX_MACHINE_ID + 1)
132
121
 
133
122
  def _get_current_timestamp(self) -> int:
134
123
  return int(time.time() * 1000)
135
124
 
136
- def _wait_next_millisecond(self, current_timestamp: int) -> int:
137
- while current_timestamp <= self.last_timestamp:
138
- current_timestamp = self._get_current_timestamp()
139
- return current_timestamp
140
-
141
125
  def generate_id(self) -> int:
142
- with self.lock:
126
+ """
127
+ 生成雪花ID(高并发优化版)
128
+ 使用 while True 循环来处理序列号溢出时的重试逻辑
129
+ """
130
+ while True:
131
+ # 1. 快速获取当前时间
143
132
  current_timestamp = self._get_current_timestamp()
144
133
 
145
- if current_timestamp < self.last_timestamp:
146
- raise RuntimeError(
147
- f"时钟回拨检测:当前时间戳({current_timestamp}) < 上一次时间戳({self.last_timestamp})"
134
+ # 2. 加锁,保证状态更新的原子性
135
+ with self.lock:
136
+ # 读取当前状态(快照)
137
+ last_timestamp = self.last_timestamp
138
+ sequence = self.sequence
139
+
140
+ # 2.1 处理时钟回拨
141
+ time_diff = last_timestamp - current_timestamp
142
+ if time_diff > 0:
143
+ if time_diff > self.CLOCK_BACKWARD_THRESHOLD:
144
+ # 大幅回拨:直接“借用”未来1ms
145
+ current_timestamp = last_timestamp + 1
146
+ else:
147
+ # 微小回拨:锁内自旋等待追上(通常很快)
148
+ while current_timestamp <= last_timestamp:
149
+ current_timestamp = self._get_current_timestamp()
150
+
151
+ # 2.2 计算序列号
152
+ if current_timestamp == last_timestamp:
153
+ # 同一毫秒内
154
+ sequence = (sequence + 1) & self.MAX_SEQUENCE
155
+ if sequence == 0:
156
+ self.lock.release() # 手动释放锁
157
+
158
+ # 锁外自旋等待下一毫秒
159
+ while current_timestamp <= last_timestamp:
160
+ current_timestamp = self._get_current_timestamp()
161
+
162
+ # 等待到了新毫秒,进入下一轮循环(continue 默认行为),重新抢锁竞争
163
+ continue
164
+
165
+ elif current_timestamp > last_timestamp:
166
+ # 时间推进,重置序列号
167
+ sequence = 0
168
+ self.last_timestamp = current_timestamp
169
+ self.sequence = sequence
170
+ else:
171
+ # current < last 的情况通常已被回拨逻辑处理
172
+ pass
173
+
174
+ # 2.4 生成 ID
175
+ snowflake_id = (
176
+ ((current_timestamp - self.START_TIMESTAMP)
177
+ << self.TIMESTAMP_SHIFT)
178
+ | (self.machine_id << self.MACHINE_ID_SHIFT)
179
+ | sequence
148
180
  )
149
181
 
150
- if current_timestamp == self.last_timestamp:
151
- self.sequence = (self.sequence + 1) & self.MAX_SEQUENCE
152
- if self.sequence == 0:
153
- current_timestamp = self._wait_next_millisecond(
154
- current_timestamp)
155
- else:
156
- self.sequence = 0
157
-
158
- self.last_timestamp = current_timestamp
159
-
160
- snowflake_id = (
161
- ((current_timestamp - self.START_TIMESTAMP) << self.TIMESTAMP_SHIFT)
162
- | (self.machine_id << self.MACHINE_ID_SHIFT)
163
- | self.sequence
164
- )
182
+ # 更新全局状态(如果是同一毫秒)
183
+ if current_timestamp == self.last_timestamp:
184
+ self.sequence = sequence
165
185
 
186
+ # 成功生成 ID,退出循环
166
187
  return snowflake_id
167
188
 
168
189
  @staticmethod
@@ -175,61 +196,53 @@ class Snowflake:
175
196
  Snowflake.START_TIMESTAMP
176
197
  generate_time = datetime.fromtimestamp(
177
198
  timestamp / 1000).strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
178
-
179
199
  return {
180
200
  "snowflake_id": snowflake_id,
181
201
  "generate_time": generate_time,
182
202
  "machine_id": machine_id,
183
- "sequence": sequence
203
+ "sequence": sequence,
204
+ "is_java_long_safe": snowflake_id <= Snowflake._MAX_JAVA_LONG
184
205
  }
185
206
 
186
207
  @classmethod
187
208
  def next_id(cls) -> str:
188
- """
189
- 生成雪花ID(单例模式,避免重复创建实例)
190
- :return: 雪花ID字符串
191
- """
192
- # 单例模式创建实例
193
209
  if cls._instance is None:
194
210
  with cls._instance_lock:
195
211
  if cls._instance is None:
196
212
  cls._instance = cls()
197
- # 生成ID并转为字符串返回
198
213
  return str(cls._instance.generate_id())
199
214
 
200
215
  @ClassProperty
201
216
  def id(cls) -> str:
202
- """
203
- 直接通过 `Snowflake.id` 属性生成雪花ID(兼容Python 3.11+)
204
- :return: 雪花ID字符串
205
- """
206
217
  return cls.next_id()
207
218
 
208
219
 
209
220
  if __name__ == "__main__":
210
- print("=== 兼容Python 3.11+的属性方式生成雪花ID ===")
211
- # 直接访问 Snowflake.id 即可生成,无废弃警告
212
- id1 = Snowflake.id
213
- id2 = Snowflake.id
214
- id3 = Snowflake.id
215
- print(f"生成ID1: {id1}")
216
- print(f"生成ID2: {id2}")
217
- print(f"生成ID3: {id3}")
218
- print(f"ID是否唯一: {len({id1, id2, id3}) == 3}")
219
-
220
- # 原有方式仍可正常使用
221
- print("\n=== 原有方法方式生成 ===")
222
- id4 = Snowflake.next_id()
223
- print(f"生成ID4: {id4}")
224
-
225
- # 批量验证(1000个唯一ID)
226
- id_set = set()
227
- _MAX_JAVA_LONG = 9223372036854775807
228
- for i in range(1000):
229
- snow_id = Snowflake.id # 全程使用兼容版属性方式
230
- id_num = int(snow_id)
231
- assert id_num <= _MAX_JAVA_LONG, f"ID超过Java long最大值: {id_num}"
232
- assert snow_id not in id_set, f"重复生成ID: {snow_id}"
233
- id_set.add(snow_id)
234
-
235
- print(f"\n成功生成{len(id_set)}个唯一雪花ID,兼容版属性访问方式验证通过!")
221
+ import concurrent.futures
222
+
223
+ print("=== 高并发终极版 Snowflake 性能测试 ===")
224
+ count = 100000
225
+ workers = 100
226
+
227
+ ids = []
228
+ start_time = time.perf_counter()
229
+
230
+ def task():
231
+ return Snowflake.id
232
+
233
+ with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:
234
+ futures = [executor.submit(task) for _ in range(count)]
235
+ for future in concurrent.futures.as_completed(futures):
236
+ ids.append(future.result())
237
+
238
+ end_time = time.perf_counter()
239
+ duration = end_time - start_time
240
+
241
+ unique_count = len(set(ids))
242
+ print(f"生成数量: {len(ids)}")
243
+ print(f"唯一ID数量: {unique_count}")
244
+ print(f"是否有重复: {'是 ❌' if unique_count != len(ids) else '否 ✅'}")
245
+ print(f"总耗时: {duration:.4f} 秒")
246
+ print(f"吞吐量 (QPS): {len(ids) / duration:,.2f}")
247
+ print("\n最后一个ID解析:")
248
+ print(Snowflake.parse_id(int(ids[-1])))
@@ -1,22 +1,29 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.1.55b0
3
+ Version: 0.1.56
4
4
  Summary: Add your description here
5
- Requires-Python: >=3.10
5
+ Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
7
7
  Requires-Dist: aio-pika>=9.5.8
8
- Requires-Dist: aiohttp>=3.13.2
8
+ Requires-Dist: aiohttp>=3.13.3
9
+ Requires-Dist: aiomysql>=0.3.2
9
10
  Requires-Dist: decorator>=5.2.1
10
- Requires-Dist: fastapi>=0.127.0
11
+ Requires-Dist: fastapi>=0.128.0
11
12
  Requires-Dist: kafka-python>=2.3.0
13
+ Requires-Dist: langchain>=1.2.3
14
+ Requires-Dist: langchain-core>=1.2.7
15
+ Requires-Dist: langchain-openai>=1.1.7
16
+ Requires-Dist: langfuse>=3.11.2
17
+ Requires-Dist: langgraph>=1.0.6
12
18
  Requires-Dist: loguru>=0.7.3
13
19
  Requires-Dist: mysql-connector-python>=9.5.0
14
20
  Requires-Dist: nacos-sdk-python<3.0,>=2.0.9
15
- Requires-Dist: netifaces>=0.11.0
21
+ Requires-Dist: psutil>=7.2.1
16
22
  Requires-Dist: pydantic>=2.12.5
17
23
  Requires-Dist: python-dotenv>=1.2.1
18
24
  Requires-Dist: pyyaml>=6.0.3
19
- Requires-Dist: sqlalchemy>=2.0.45
25
+ Requires-Dist: sentry-sdk[fastapi]>=2.49.0
26
+ Requires-Dist: sqlalchemy[asyncio]>=2.0.45
20
27
  Requires-Dist: starlette>=0.50.0
21
28
  Requires-Dist: uvicorn>=0.40.0
22
29
 
@@ -0,0 +1,89 @@
1
+ command/cli.py,sha256=bP2LCLkRvfETIwWkVD70q5xFxMI4D3BpH09Ws1f-ENc,5849
2
+ sycommon/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ sycommon/services.py,sha256=F1fwBqVd7luywJjXeK7rF_7FzBePstyEfxXBR_5o04Q,12330
4
+ sycommon/config/Config.py,sha256=L4vlGsVFL1ZHEULxvE8-VyLF-wDBuOMZGmWXIldqfn8,4014
5
+ sycommon/config/DatabaseConfig.py,sha256=ILiUuYT9_xJZE2W-RYuC3JCt_YLKc1sbH13-MHIOPhg,804
6
+ sycommon/config/EmbeddingConfig.py,sha256=gPKwiDYbeu1GpdIZXMmgqM7JqBIzCXi0yYuGRLZooMI,362
7
+ sycommon/config/LLMConfig.py,sha256=yU-aIqePIeF6msfRVEtGq7SXZVDfHyTi6JduKjhMO_4,371
8
+ sycommon/config/LangfuseConfig.py,sha256=t2LulAtnMUvIINOKHXNWlT5PtgNb7IuaHURjWlbma38,370
9
+ sycommon/config/MQConfig.py,sha256=_RDcmIdyWKjmgM5ZnriOoI-DpaxgXs7CD0awdAD6z88,252
10
+ sycommon/config/RerankerConfig.py,sha256=35sVwzus2IscvTHnCG63Orl2pC-pMsrVi6wAGDmOH3U,341
11
+ sycommon/config/SentryConfig.py,sha256=OsLb3G9lTsCSZ7tWkcXWJHmvfILQopBxje5pjnkFJfo,320
12
+ sycommon/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ sycommon/database/async_base_db_service.py,sha256=w6ONUiTtF4-bXRnkBt9QpL9BAy0XUDbQG7F9Hf2rfjw,1337
14
+ sycommon/database/async_database_service.py,sha256=4Ag5PH6DFEcJOXR8MRF9V_Jho5uCoU9Ibo3PqulDsXw,3916
15
+ sycommon/database/base_db_service.py,sha256=J5ELHMNeGfzA6zVcASPSPZ0XNKrRY3_gdGmVkZw3Mto,946
16
+ sycommon/database/database_service.py,sha256=mun5vgM7nkuH6_UyHLHqQ2Qk_5gRgMxJu4_obIKLT6o,3253
17
+ sycommon/health/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ sycommon/health/health_check.py,sha256=EhfbhspRpQiKJaxdtE-PzpKQO_ucaFKtQxIm16F5Mpk,391
19
+ sycommon/health/metrics.py,sha256=fHqO73JuhoZkNPR-xIlxieXiTCvttq-kG-tvxag1s1s,268
20
+ sycommon/health/ping.py,sha256=FTlnIKk5y1mPfS1ZGOeT5IM_2udF5aqVLubEtuBp18M,250
21
+ sycommon/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ sycommon/llm/embedding.py,sha256=HknwDqXmRQcAZ8-6d8wZ6n7Bv7HtxTajDt1vvzHGeFQ,8411
23
+ sycommon/llm/get_llm.py,sha256=C48gt9GCwEpR26M-cUjM74_t-el18ZvlwpGhcQfR3gs,1054
24
+ sycommon/llm/llm_logger.py,sha256=n4UeNy_-g4oHQOsw-VUzF4uo3JVRLtxaMp1FcI8FiEo,5437
25
+ sycommon/llm/llm_tokens.py,sha256=-udDyFcmyzx6UAwIi6_d_wwI5kMd5w0-WcS2soVPQxg,4309
26
+ sycommon/llm/struct_token.py,sha256=jlpZnTOLDmRDdrCuxZe-1pQopd6OmCM9B_gWZ48CnEQ,7655
27
+ sycommon/llm/sy_langfuse.py,sha256=NZv6ydfn3-cxqQvuB5WdnM9GYliO9qB_RWh_XqIS3VU,3692
28
+ sycommon/llm/usage_token.py,sha256=n0hytuaHI4tJi6wuOS3bd-yWzQjZ-lx5w9egHs8uYgg,5140
29
+ sycommon/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ sycommon/logging/async_sql_logger.py,sha256=_OY36XkUm__U3NhMgiecy-qd-nptZ_0gpE3J8lGAr58,2619
31
+ sycommon/logging/kafka_log.py,sha256=gfOqdZe0HJ3PkIFfnNWG4DZVadxsCKJ6AmelR7_Z1Xs,9960
32
+ sycommon/logging/logger_levels.py,sha256=_-uQ_T1N8NkNgcAmLrMmJ83nHTDw5ZNvXFPvdk89XGY,1144
33
+ sycommon/logging/logger_wrapper.py,sha256=TiHsrIIHiQMzXgXK12-0KIpU9GhwQJOoHslakzmq2zc,357
34
+ sycommon/logging/sql_logger.py,sha256=aEU3OGnI_51Tjyuuf4FpUi9KPTceFRuKAOyQbPzGhzM,2021
35
+ sycommon/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ sycommon/middleware/context.py,sha256=sc1UjN55dYww2tT9KdFMJV8mgpGro67SnETzbVzty-s,155
37
+ sycommon/middleware/cors.py,sha256=0B5d_ovD56wcH9TfktRs88Q09R9f8Xx5h5ALWYvE8Iw,600
38
+ sycommon/middleware/docs.py,sha256=bVdDBIHXGVBv562MQLSroa1DgHoObxR9gFzv71PIejg,1187
39
+ sycommon/middleware/exception.py,sha256=UAy0tKijI_2JoKjwT3h62aL-tybftP3IETvcr26NOao,2883
40
+ sycommon/middleware/middleware.py,sha256=SzZ4wufSNdwC4Ppw99TE7a6AVGkrZRc55NHSrA3PiC8,1447
41
+ sycommon/middleware/monitor_memory.py,sha256=pYRK-wRuDd6enSg9Pf8tQxPdYQS6S0AyjyXeKFRLKEs,628
42
+ sycommon/middleware/mq.py,sha256=4wBqiT5wJGcrfjk2GSr0_U3TStBxoNpHTzcRxVlMEHE,183
43
+ sycommon/middleware/timeout.py,sha256=RLMzGMrzK14zsf8x-hmUW1DXWezETB0ZY8mpr9EKsos,740
44
+ sycommon/middleware/traceid.py,sha256=rJ6yLkYJi-x_Vq41xzkfAAc4xDts2IpPmDcKN8hYuv8,13065
45
+ sycommon/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
+ sycommon/models/base_http.py,sha256=EICAAibx3xhjBsLqm35Mi3DCqxp0FME4rD_3iQVjT_E,3051
47
+ sycommon/models/log.py,sha256=rZpj6VkDRxK3B6H7XSeWdYZshU8F0Sks8bq1p6pPlDw,500
48
+ sycommon/models/mqlistener_config.py,sha256=vXp2uMmd0XQ5B9noSRXWHewTy-juQ2y7IsWtISJD5aI,1661
49
+ sycommon/models/mqmsg_model.py,sha256=cxn0M5b0utQK6crMYmL-1waeGYHvK3AlGaRy23clqTE,277
50
+ sycommon/models/mqsend_config.py,sha256=NQX9dc8PpuquMG36GCVhJe8omAW1KVXXqr6lSRU6D7I,268
51
+ sycommon/models/sso_user.py,sha256=i1WAN6k5sPcPApQEdtjpWDy7VrzWLpOrOQewGLGoGIw,2702
52
+ sycommon/notice/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
+ sycommon/notice/uvicorn_monitor.py,sha256=VryQYcAtjijJuGDBimbVurgwxlsLaLtkNnABPDY5Tao,7332
54
+ sycommon/rabbitmq/rabbitmq_client.py,sha256=hNl82gPSNxuNbuNX-1uOdYrL0waM_c_j5_m-D3herjc,17765
55
+ sycommon/rabbitmq/rabbitmq_pool.py,sha256=BiFQgZPzSAFR-n5XhyIafoeWQXETF_31nFRDhMbe6aU,15577
56
+ sycommon/rabbitmq/rabbitmq_service.py,sha256=XSHo9HuIJ_lq-vizRh4xJVdZr_2zLqeLhot09qb0euA,2025
57
+ sycommon/rabbitmq/rabbitmq_service_client_manager.py,sha256=MM4r8Pa2rjAmzy_NpHFb4thGznr6AYk6m__IC8IIxEM,7852
58
+ sycommon/rabbitmq/rabbitmq_service_connection_monitor.py,sha256=uvoMuJDzJ9i63uVRq1NKFV10CvkbGnTMyEoq2rgjQx8,3013
59
+ sycommon/rabbitmq/rabbitmq_service_consumer_manager.py,sha256=489r1RKd5WrTNMAcWCxUZpt9yWGrNunZlLCCp-M_rzM,11497
60
+ sycommon/rabbitmq/rabbitmq_service_core.py,sha256=6RMvIf78DmEOZmN8dA0duA9oy4ieNswdGrOeyJdD6tU,4753
61
+ sycommon/rabbitmq/rabbitmq_service_producer_manager.py,sha256=TJrLbvsjF55P9lwr7aCm9uRIRuC3z4EZNx74KEVKBtU,10190
62
+ sycommon/sentry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
+ sycommon/sentry/sy_sentry.py,sha256=e5Fbt9Gi2gIb048z0nuKbuhp3uCAEqYH2xXbF6qrZq4,1471
64
+ sycommon/sse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
+ sycommon/sse/event.py,sha256=k_rBJy23R7crtzQeetT0Q73D8o5-5p-eESGSs_BPOj0,2797
66
+ sycommon/sse/sse.py,sha256=__CfWEcYxOxQ-HpLor4LTZ5hLWqw9-2X7CngqbVHsfw,10128
67
+ sycommon/synacos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
+ sycommon/synacos/example.py,sha256=61XL03tU8WTNOo3FUduf93F2fAwah1S0lbH1ufhRhRk,5739
69
+ sycommon/synacos/example2.py,sha256=adUaru3Hy482KrOA17DfaC4nwvLj8etIDS_KrWLWmCU,4811
70
+ sycommon/synacos/feign.py,sha256=frB3D5LeFDtT3pJLFOwFzEOrNAJKeQNGk-BzUg9T3WM,8295
71
+ sycommon/synacos/feign_client.py,sha256=ExO7Pd5B3eFKDjXqBRc260K1jkI49IYguLwJJaD2R-o,16166
72
+ sycommon/synacos/nacos_client_base.py,sha256=l5jpall6nEt0Hy07Wk-PVU0VN0BmD_Mmtldmtyvvksg,4526
73
+ sycommon/synacos/nacos_config_manager.py,sha256=Cff-4gpp0aD7sQVi-nEvDO4BWqK9abEDDDJ9qXKFQgs,4399
74
+ sycommon/synacos/nacos_heartbeat_manager.py,sha256=G80_pOn37WdO_HpYUiAfpwMqAxW0ff0Bnw0NEuge9v0,5568
75
+ sycommon/synacos/nacos_service.py,sha256=BezQ1eDIYwBPE567Po_Qh1Ki_z9WmhZy1J1NiTPbdHY,6118
76
+ sycommon/synacos/nacos_service_discovery.py,sha256=O0M4facMa3I9YDFaovrfiTnCMtJWTuewbt9ce4a2-CA,6828
77
+ sycommon/synacos/nacos_service_registration.py,sha256=plg2PmH8CWgmVnPtiIXBxtj-3BpyMdSzKr1wyWRdzh4,10968
78
+ sycommon/synacos/param.py,sha256=KcfSkxnXOa0TGmCjY8hdzU9pzUsA8-4PeyBKWI2-568,1765
79
+ sycommon/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
+ sycommon/tools/docs.py,sha256=OPj2ETheuWjXLyaXtaZPbwmJKfJaYXV5s4XMVAUNrms,1607
81
+ sycommon/tools/env.py,sha256=Ah-tBwG2C0_hwLGFebVQgKdWWXCjTzBuF23gCkLHYy4,2437
82
+ sycommon/tools/merge_headers.py,sha256=u9u8_1ZIuGIminWsw45YJ5qnsx9MB-Fot0VPge7itPw,4941
83
+ sycommon/tools/snowflake.py,sha256=xQlYXwYnI85kSJ1rZ89gMVBhzemP03xrMPVX9vVa3MY,9228
84
+ sycommon/tools/timing.py,sha256=OiiE7P07lRoMzX9kzb8sZU9cDb0zNnqIlY5pWqHcnkY,2064
85
+ sycommon_python_lib-0.1.56.dist-info/METADATA,sha256=ltMM2t0DU6zckyce9GbslshwOgTSlq1VXp9KVomJ0ak,7299
86
+ sycommon_python_lib-0.1.56.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
87
+ sycommon_python_lib-0.1.56.dist-info/entry_points.txt,sha256=q_h2nbvhhmdnsOUZEIwpuoDjaNfBF9XqppDEmQn9d_A,46
88
+ sycommon_python_lib-0.1.56.dist-info/top_level.txt,sha256=98CJ-cyM2WIKxLz-Pf0AitWLhJyrfXvyY8slwjTXNuc,17
89
+ sycommon_python_lib-0.1.56.dist-info/RECORD,,
@@ -1,59 +0,0 @@
1
- command/cli.py,sha256=bP2LCLkRvfETIwWkVD70q5xFxMI4D3BpH09Ws1f-ENc,5849
2
- sycommon/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- sycommon/services.py,sha256=66YUddNJsbx8axuxUZ6ERr95yphlhLOUbBUJ_tgNseI,11851
4
- sycommon/config/Config.py,sha256=9yO5b8WfvEDvkyrGrlwrLFasgh_-MjcEvGF20Gz5Xo4,3041
5
- sycommon/config/DatabaseConfig.py,sha256=ILiUuYT9_xJZE2W-RYuC3JCt_YLKc1sbH13-MHIOPhg,804
6
- sycommon/config/EmbeddingConfig.py,sha256=gPKwiDYbeu1GpdIZXMmgqM7JqBIzCXi0yYuGRLZooMI,362
7
- sycommon/config/LLMConfig.py,sha256=yU-aIqePIeF6msfRVEtGq7SXZVDfHyTi6JduKjhMO_4,371
8
- sycommon/config/MQConfig.py,sha256=_RDcmIdyWKjmgM5ZnriOoI-DpaxgXs7CD0awdAD6z88,252
9
- sycommon/config/RerankerConfig.py,sha256=dohekaY_eTynmMimIuKHBYGXXQO6rJjSkm94OPLuMik,322
10
- sycommon/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- sycommon/database/base_db_service.py,sha256=J5ELHMNeGfzA6zVcASPSPZ0XNKrRY3_gdGmVkZw3Mto,946
12
- sycommon/database/database_service.py,sha256=mun5vgM7nkuH6_UyHLHqQ2Qk_5gRgMxJu4_obIKLT6o,3253
13
- sycommon/health/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- sycommon/health/health_check.py,sha256=EhfbhspRpQiKJaxdtE-PzpKQO_ucaFKtQxIm16F5Mpk,391
15
- sycommon/health/metrics.py,sha256=fHqO73JuhoZkNPR-xIlxieXiTCvttq-kG-tvxag1s1s,268
16
- sycommon/health/ping.py,sha256=FTlnIKk5y1mPfS1ZGOeT5IM_2udF5aqVLubEtuBp18M,250
17
- sycommon/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- sycommon/logging/kafka_log.py,sha256=viqJ2hDqnyX5eUKkhIhU__kytIwe6nLuHIAFGcaRpUI,21118
19
- sycommon/logging/logger_wrapper.py,sha256=TiHsrIIHiQMzXgXK12-0KIpU9GhwQJOoHslakzmq2zc,357
20
- sycommon/logging/sql_logger.py,sha256=aEU3OGnI_51Tjyuuf4FpUi9KPTceFRuKAOyQbPzGhzM,2021
21
- sycommon/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- sycommon/middleware/context.py,sha256=_5ghpv4u_yAvjkgM-XDx8OnO-YI1XtntHrXsHJHZkwo,88
23
- sycommon/middleware/cors.py,sha256=0B5d_ovD56wcH9TfktRs88Q09R9f8Xx5h5ALWYvE8Iw,600
24
- sycommon/middleware/docs.py,sha256=bVdDBIHXGVBv562MQLSroa1DgHoObxR9gFzv71PIejg,1187
25
- sycommon/middleware/exception.py,sha256=Bk8IchNND1wg6tUX9hf4xWeEJhvA-E_zE9ysBpRZrqE,3010
26
- sycommon/middleware/middleware.py,sha256=SzZ4wufSNdwC4Ppw99TE7a6AVGkrZRc55NHSrA3PiC8,1447
27
- sycommon/middleware/monitor_memory.py,sha256=pYRK-wRuDd6enSg9Pf8tQxPdYQS6S0AyjyXeKFRLKEs,628
28
- sycommon/middleware/mq.py,sha256=4wBqiT5wJGcrfjk2GSr0_U3TStBxoNpHTzcRxVlMEHE,183
29
- sycommon/middleware/timeout.py,sha256=fImlAPLm4Oa8N9goXtT_0os1GZPCi9F92OgXU81DgDU,656
30
- sycommon/middleware/traceid.py,sha256=FLZTxVAIboZvqK_S69eReeIzZGUDIVy6KTA1kZBoRyI,6908
31
- sycommon/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- sycommon/models/base_http.py,sha256=EICAAibx3xhjBsLqm35Mi3DCqxp0FME4rD_3iQVjT_E,3051
33
- sycommon/models/log.py,sha256=rZpj6VkDRxK3B6H7XSeWdYZshU8F0Sks8bq1p6pPlDw,500
34
- sycommon/models/mqlistener_config.py,sha256=vXp2uMmd0XQ5B9noSRXWHewTy-juQ2y7IsWtISJD5aI,1661
35
- sycommon/models/mqmsg_model.py,sha256=cxn0M5b0utQK6crMYmL-1waeGYHvK3AlGaRy23clqTE,277
36
- sycommon/models/mqsend_config.py,sha256=NQX9dc8PpuquMG36GCVhJe8omAW1KVXXqr6lSRU6D7I,268
37
- sycommon/models/sso_user.py,sha256=i1WAN6k5sPcPApQEdtjpWDy7VrzWLpOrOQewGLGoGIw,2702
38
- sycommon/rabbitmq/rabbitmq_client.py,sha256=GkuYILMZJnvgZs4ID46I-w_UGzzI28YUydKgkTIDhIs,20226
39
- sycommon/rabbitmq/rabbitmq_pool.py,sha256=QtUcK4HuepRqRmy5XkUQo8gDgj74fr77CX7T5rN0y4I,15640
40
- sycommon/rabbitmq/rabbitmq_service.py,sha256=wpEJynP0gzbnmMyB02sfR9nTWB4hfTTP00xQxDJu644,38119
41
- sycommon/sse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
- sycommon/sse/event.py,sha256=k_rBJy23R7crtzQeetT0Q73D8o5-5p-eESGSs_BPOj0,2797
43
- sycommon/sse/sse.py,sha256=__CfWEcYxOxQ-HpLor4LTZ5hLWqw9-2X7CngqbVHsfw,10128
44
- sycommon/synacos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- sycommon/synacos/example.py,sha256=61XL03tU8WTNOo3FUduf93F2fAwah1S0lbH1ufhRhRk,5739
46
- sycommon/synacos/example2.py,sha256=adUaru3Hy482KrOA17DfaC4nwvLj8etIDS_KrWLWmCU,4811
47
- sycommon/synacos/feign.py,sha256=xvyH_1no6gsggO3YYB0_88NWNA26odbQ_G-2MjApif0,8016
48
- sycommon/synacos/feign_client.py,sha256=PYjTrnqMc_Jl6Wnpiz8-PFozCjPk6VGnPWv29JefL14,15421
49
- sycommon/synacos/nacos_service.py,sha256=tyh_JOjjoCGiKCr1xfU7MAmu7dDQCZmTzmYsSqNjiQY,35465
50
- sycommon/synacos/param.py,sha256=KcfSkxnXOa0TGmCjY8hdzU9pzUsA8-4PeyBKWI2-568,1765
51
- sycommon/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
- sycommon/tools/docs.py,sha256=OPj2ETheuWjXLyaXtaZPbwmJKfJaYXV5s4XMVAUNrms,1607
53
- sycommon/tools/snowflake.py,sha256=wSATJzWGb6HcaZ1u_fdzF6I5seRviQQm2KS3Jf45nm4,8520
54
- sycommon/tools/timing.py,sha256=OiiE7P07lRoMzX9kzb8sZU9cDb0zNnqIlY5pWqHcnkY,2064
55
- sycommon_python_lib-0.1.55b0.dist-info/METADATA,sha256=9K3VD62twbBtlxjoty9K0h96O74lp2NFfqtviimdqGM,7050
56
- sycommon_python_lib-0.1.55b0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
57
- sycommon_python_lib-0.1.55b0.dist-info/entry_points.txt,sha256=q_h2nbvhhmdnsOUZEIwpuoDjaNfBF9XqppDEmQn9d_A,46
58
- sycommon_python_lib-0.1.55b0.dist-info/top_level.txt,sha256=98CJ-cyM2WIKxLz-Pf0AitWLhJyrfXvyY8slwjTXNuc,17
59
- sycommon_python_lib-0.1.55b0.dist-info/RECORD,,