sycommon-python-lib 0.2.3a2__py3-none-any.whl → 0.2.3a4__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.
@@ -617,7 +617,8 @@ async def create_deep_agent(
617
617
  from deepagents import create_deep_agent as _create_deep_agent
618
618
 
619
619
  # 根据模型上下文窗口大小配置压缩阈值
620
- summarization_mw = build_summarization_middleware(
620
+ # 返回 (auto_summarization_mw, tool_mw),auto 用于自动压缩,tool_mw 提供 compact_conversation 工具
621
+ auto_summarization_mw, tool_summarization_mw = build_summarization_middleware(
621
622
  model, config.model_name, sandbox_backend,
622
623
  )
623
624
 
@@ -632,7 +633,8 @@ async def create_deep_agent(
632
633
  BackgroundExecutionMiddleware(backend=sandbox_backend),
633
634
  ToolResultTruncationMiddleware(),
634
635
  TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
635
- summarization_mw,
636
+ auto_summarization_mw,
637
+ tool_summarization_mw,
636
638
  ],
637
639
  }
638
640
  if skills_path:
@@ -584,11 +584,14 @@ async def create_multi_agent_team(
584
584
  from deepagents import create_deep_agent
585
585
  from deepagents.middleware.subagents import CompiledSubAgent
586
586
 
587
+ # 子 agent 共享同一组压缩 middleware
588
+ _auto_mw, _tool_mw = build_summarization_middleware(model, config.model_name, sandbox_backend)
587
589
  middleware = [
588
590
  BackgroundExecutionMiddleware(backend=sandbox_backend),
589
591
  ToolResultTruncationMiddleware(),
590
592
  TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
591
- build_summarization_middleware(model, config.model_name, sandbox_backend),
593
+ _auto_mw,
594
+ _tool_mw,
592
595
  ]
593
596
  shared = config.shared_tools or [get_current_date]
594
597
 
@@ -629,6 +632,7 @@ async def create_multi_agent_team(
629
632
 
630
633
  # 创建协调者 Agent
631
634
  coord_name = config.coordinator_name
635
+ _coord_auto_mw, _coord_tool_mw = build_summarization_middleware(model, config.model_name, sandbox_backend)
632
636
  coordinator_agent = create_deep_agent(
633
637
  model=model,
634
638
  tools=config.shared_tools or [get_current_date],
@@ -644,7 +648,8 @@ async def create_multi_agent_team(
644
648
  BackgroundExecutionMiddleware(backend=sandbox_backend),
645
649
  ToolResultTruncationMiddleware(),
646
650
  TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
647
- build_summarization_middleware(model, config.model_name, sandbox_backend),
651
+ _coord_auto_mw,
652
+ _coord_tool_mw,
648
653
  ],
649
654
  )
650
655
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- from typing import TYPE_CHECKING
9
+ from typing import TYPE_CHECKING, Tuple
10
10
 
11
11
  from deepagents.middleware.summarization import (
12
12
  SummarizationMiddleware,
@@ -26,7 +26,7 @@ def build_summarization_middleware(
26
26
  trigger_fraction: float = 0.70,
27
27
  keep_fraction: float = 0.10,
28
28
  default_max_tokens: int = 200000,
29
- ) -> SummarizationToolMiddleware:
29
+ ) -> Tuple[SummarizationMiddleware, SummarizationToolMiddleware]:
30
30
  """根据模型上下文窗口大小构建压缩 middleware。
31
31
 
32
32
  使用绝对 token 数而非 fraction 模式,避免要求模型提供 profile 信息。
@@ -40,7 +40,8 @@ def build_summarization_middleware(
40
40
  default_max_tokens: 无法从配置读取时的默认上下文窗口大小。
41
41
 
42
42
  Returns:
43
- SummarizationToolMiddleware 实例(包含自动压缩 + compact_conversation 工具)。
43
+ (SummarizationMiddleware, SummarizationToolMiddleware) 元组。
44
+ 第一个是自动压缩 middleware,第二个是 compact_conversation 工具 middleware。
44
45
  """
45
46
  try:
46
47
  from sycommon.config.Config import Config
@@ -65,4 +66,7 @@ def build_summarization_middleware(
65
66
  "max_length": 2000,
66
67
  },
67
68
  )
68
- return SummarizationToolMiddleware(summ)
69
+ print(f"[Summarization] 压缩配置: model={model_name}, max_tokens={max_tokens}, "
70
+ f"trigger={trigger_tokens} tokens ({trigger_fraction:.0%}), "
71
+ f"keep={keep_tokens} tokens ({keep_fraction:.0%})")
72
+ return summ, SummarizationToolMiddleware(summ)
@@ -230,6 +230,23 @@ class LLMWithTokenTracking(BaseChatModel):
230
230
  "output_tokens": total_output,
231
231
  })
232
232
 
233
+ def _resolve_model_profile(self):
234
+ """从 llmConfig.maxTokens 构建 profile,供 deepagents 计算压缩阈值使用。"""
235
+ if self.llmConfig and self.llmConfig.maxTokens:
236
+ return {"max_input_tokens": self.llmConfig.maxTokens}
237
+ if self.llm and hasattr(self.llm, 'profile') and self.llm.profile:
238
+ return self.llm.profile
239
+ return None
240
+
241
+ @property
242
+ def profile(self):
243
+ p = self._resolve_model_profile()
244
+ return p
245
+
246
+ @profile.setter
247
+ def profile(self, value):
248
+ pass
249
+
233
250
  def bind_tools(self, tools, *, tool_choice=None, **kwargs):
234
251
  """绑定工具 - 委托给底层 LLM,返回绑定后的 Runnable"""
235
252
  return self.llm.bind_tools(tools, tool_choice=tool_choice, **kwargs)
@@ -51,7 +51,7 @@ MAX_IMAGE_BASE64_CHARS = 500
51
51
  def _convert_list_content_to_str(content: list, tool_name: str) -> str:
52
52
  """将 list 类型的 ToolMessage.content 转换为字符串。
53
53
 
54
- 对于图片类型(type=image 且含 base64),只保留前 MAX_IMAGE_BASE64_CHARS 个字符的 base64 预览。
54
+ 对于图片类型(type=image 且含 base64),转换为提示模型自行用 execute 处理的说明。
55
55
  对于文本类型,保留完整文本。
56
56
  """
57
57
  parts = []
@@ -61,16 +61,13 @@ def _convert_list_content_to_str(content: list, tool_name: str) -> str:
61
61
  if item_type == "image" and "base64" in item:
62
62
  b64 = item["base64"]
63
63
  mime = item.get("mime_type", "image/unknown")
64
- if len(b64) > MAX_IMAGE_BASE64_CHARS:
65
- parts.append(
66
- f"[图片文件 ({mime}, {len(b64)} 字符 base64 数据), "
67
- f"预览: {b64[:MAX_IMAGE_BASE64_CHARS]}...]"
68
- )
69
- else:
70
- parts.append(
71
- f"[图片文件 ({mime}, {len(b64)} 字符 base64 数据), "
72
- f"数据: {b64}]"
73
- )
64
+ size_kb = len(b64) * 3 // 4 // 1024 # base64 -> bytes -> KB
65
+ parts.append(
66
+ f"[图片文件 ({mime}, {size_kb}KB) "
67
+ f"图片二进制数据无法直接发送给模型。"
68
+ f"请使用 execute 工具通过 Python (如 PIL/OpenCV) 读取并处理图片,"
69
+ f"例如 OCR 识别文字、分析图片内容等。]"
70
+ )
74
71
  elif "text" in item:
75
72
  parts.append(item["text"])
76
73
  else:
@@ -32,6 +32,7 @@ class RabbitMQListenerConfig(BaseModel):
32
32
  auto_delete: bool = Field(False, description="是否自动删除队列")
33
33
  auto_parse_json: bool = Field(True, description="是否自动解析JSON消息")
34
34
  prefetch_count: int = Field(2, description="mq同时消费数量")
35
+ max_concurrent_tasks: int = Field(5, description="handler 最大并发任务数")
35
36
 
36
37
  class Config:
37
38
  """模型配置"""
@@ -13,6 +13,7 @@ from aio_pika.abc import (
13
13
  )
14
14
  from sycommon.rabbitmq.rabbitmq_pool import RabbitMQConnectionPool
15
15
  from sycommon.logging.kafka_log import SYLogger
16
+ from sycommon.middleware.context import current_trace_id
16
17
  from sycommon.models.mqmsg_model import MQMsgModel
17
18
 
18
19
  logger = SYLogger
@@ -41,6 +42,7 @@ class RabbitMQClient:
41
42
  auto_delete: bool = False,
42
43
  auto_parse_json: bool = True,
43
44
  create_if_not_exists: bool = True,
45
+ max_concurrent_tasks: int = 5,
44
46
  **kwargs,
45
47
  ):
46
48
  self.connection_pool = connection_pool
@@ -73,6 +75,10 @@ class RabbitMQClient:
73
75
  self._connect_lock = asyncio.Lock()
74
76
  self._reconnect_semaphore = asyncio.Semaphore(1)
75
77
 
78
+ # 异步任务并发控制(方案C:收到即ACK + create_task)
79
+ self._task_semaphore = asyncio.Semaphore(max_concurrent_tasks)
80
+ self._running_tasks: set = set()
81
+
76
82
  @property
77
83
  async def is_connected(self) -> bool:
78
84
  if self._closed:
@@ -231,9 +237,9 @@ class RabbitMQClient:
231
237
  f"后台重连尝试 {attempt + 1}/{max_attempts} 失败: {e}")
232
238
  logger.warning(f"后台重连已达最大尝试次数 {max_attempts},放弃重连")
233
239
 
234
- async def set_message_handler(self, handler: Callable[..., Coroutine]) -> None:
235
- if not inspect.iscoroutinefunction(handler):
236
- raise TypeError("消息处理器必须是协程函数")
240
+ async def set_message_handler(self, handler: Callable) -> None:
241
+ if not callable(handler):
242
+ raise TypeError("消息处理器必须是可调用对象")
237
243
  self._message_handler = handler
238
244
 
239
245
  async def _process_message_callback(self, message: AbstractIncomingMessage):
@@ -246,20 +252,50 @@ class RabbitMQClient:
246
252
 
247
253
  SYLogger.set_trace_id(msg_obj.traceId)
248
254
 
249
- if self._message_handler:
250
- await self._message_handler(msg_obj, message)
251
-
255
+ # 先 ACK,让 RabbitMQ 确认投递成功
252
256
  await message.ack()
253
257
 
258
+ # 将 handler 投递到后台任务,不阻塞消费循环
259
+ if self._message_handler:
260
+ task = asyncio.create_task(
261
+ self._safe_execute_handler(msg_obj, message)
262
+ )
263
+ self._running_tasks.add(task)
264
+ task.add_done_callback(self._running_tasks.discard)
265
+
254
266
  except json.JSONDecodeError as e:
255
- # JSON解析失败,消息格式错误,记录日志并ACK(避免无限循环)
256
267
  logger.error(f"消息JSON解析失败,消息将被丢弃: {e}", exc_info=True)
257
268
  await message.ack()
258
269
  except Exception as e:
259
- # 处理异常,记录日志并ACK(避免消息重复消费)
260
270
  logger.error(f"消息处理异常,消息将被丢弃: {e}", exc_info=True)
261
271
  await message.ack()
262
272
 
273
+ async def _safe_execute_handler(self, msg_obj: MQMsgModel, message: AbstractIncomingMessage):
274
+ """在 Semaphore 控制下安全执行 handler,支持异步和同步阻塞 handler"""
275
+ async with self._task_semaphore:
276
+ try:
277
+ if not self._message_handler:
278
+ return
279
+ handler = self._message_handler
280
+ if inspect.iscoroutinefunction(handler):
281
+ await handler(msg_obj, message)
282
+ else:
283
+ # 同步阻塞 handler:丢进线程池,手动传递 traceId
284
+ trace_id = msg_obj.traceId
285
+ loop = asyncio.get_running_loop()
286
+
287
+ def _sync_wrapper():
288
+ SYLogger.set_trace_id(trace_id)
289
+ try:
290
+ return handler(msg_obj, message)
291
+ finally:
292
+ SYLogger.reset_trace_id(
293
+ current_trace_id.set(None))
294
+
295
+ await loop.run_in_executor(None, _sync_wrapper)
296
+ except Exception as e:
297
+ logger.error(f"异步任务执行失败: {e}", exc_info=True)
298
+
263
299
  async def start_consuming(self) -> Optional[ConsumerTag]:
264
300
  if self._closed:
265
301
  raise RuntimeError("客户端已关闭,无法启动消费")
@@ -391,6 +427,18 @@ class RabbitMQClient:
391
427
 
392
428
  await self.stop_consuming()
393
429
 
430
+ # 等待后台任务完成(优雅退出)
431
+ if self._running_tasks:
432
+ logger.info(f"等待 {len(self._running_tasks)} 个后台任务完成...")
433
+ try:
434
+ await asyncio.wait_for(
435
+ asyncio.gather(*self._running_tasks, return_exceptions=True),
436
+ timeout=15.0
437
+ )
438
+ except asyncio.TimeoutError:
439
+ logger.warning(f"等待后台任务超时,剩余 {len(self._running_tasks)} 个任务将被丢弃")
440
+ self._running_tasks.clear()
441
+
394
442
  if self._channel and not self._channel.is_closed:
395
443
  try:
396
444
  await self._channel.close()
@@ -158,6 +158,7 @@ class RabbitMQClientManager(RabbitMQCoreService):
158
158
  auto_parse_json=kwargs.get('auto_parse_json', True),
159
159
  create_if_not_exists=create_if_not_exists,
160
160
  prefetch_count=kwargs.get('prefetch_count', 2),
161
+ max_concurrent_tasks=kwargs.get('max_concurrent_tasks', 5),
161
162
  )
162
163
 
163
164
  # 4. 连接客户端
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.3a2
3
+ Version: 0.2.3a4
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -9,16 +9,16 @@ Requires-Dist: aiohttp>=3.13.5
9
9
  Requires-Dist: aiomysql>=0.3.2
10
10
  Requires-Dist: anyio>=4.12.1
11
11
  Requires-Dist: decorator>=5.2.1
12
- Requires-Dist: deepagents>=0.5.3
13
- Requires-Dist: elasticsearch>=9.3.0
12
+ Requires-Dist: deepagents>=0.5.7
13
+ Requires-Dist: elasticsearch>=9.4.0
14
14
  Requires-Dist: fastapi>=0.136.1
15
15
  Requires-Dist: jinja2>=3.1.6
16
16
  Requires-Dist: kafka-python>=2.3.1
17
- Requires-Dist: langchain>=1.2.15
18
- Requires-Dist: langchain-core>=1.3.2
17
+ Requires-Dist: langchain>=1.2.17
18
+ Requires-Dist: langchain-core>=1.3.3
19
19
  Requires-Dist: langchain-openai>=1.2.1
20
20
  Requires-Dist: langfuse>=4.5.1
21
- Requires-Dist: langgraph>=1.1.9
21
+ Requires-Dist: langgraph>=1.1.10
22
22
  Requires-Dist: langgraph-checkpoint-redis>=0.4.1
23
23
  Requires-Dist: ldap3>=2.9.1
24
24
  Requires-Dist: loguru>=0.7.3
@@ -26,12 +26,12 @@ Requires-Dist: mysql-connector-python>=9.6.0
26
26
  Requires-Dist: nacos-sdk-python<3.0,>=2.0.11
27
27
  Requires-Dist: psutil>=7.2.2
28
28
  Requires-Dist: pyxxl>=0.4.6
29
- Requires-Dist: pydantic>=2.13.3
29
+ Requires-Dist: pydantic>=2.13.4
30
30
  Requires-Dist: python-dotenv>=1.2.2
31
- Requires-Dist: python-multipart>=0.0.26
31
+ Requires-Dist: python-multipart>=0.0.27
32
32
  Requires-Dist: pyyaml>=6.0.3
33
33
  Requires-Dist: redis>=7.3.0
34
- Requires-Dist: sentry-sdk[fastapi]>=2.58.0
34
+ Requires-Dist: sentry-sdk[fastapi]>=2.59.0
35
35
  Requires-Dist: sqlalchemy[asyncio]>=2.0.48
36
36
  Requires-Dist: starlette[full]>=1.0.0
37
37
  Requires-Dist: tiktoken>=0.12.0
@@ -129,9 +129,9 @@ sycommon/services.py,sha256=N6Z4D-qmdyGBZ5z72j2dtSfpXnrnWjEuSyKCgSIY0Cs,21332
129
129
  sycommon/agent/__init__.py,sha256=PXxUiDwdzxv3WQfD8R5MKXtV7qZPvbRc0wPxnS-ZsNQ,3752
130
130
  sycommon/agent/agent_manager.py,sha256=UhhaekEumT7g4v_Z1UB4jTp13X0n8M8erYaQdkGGWkA,13620
131
131
  sycommon/agent/chat_events.py,sha256=bWAMWYIZ2L_yqUcn5jq9ius_lQxLHEv4zQLEqX6UaeM,13190
132
- sycommon/agent/deep_agent.py,sha256=Ptbz-NKJ1hFhMULxdG7TjQo0hAQ5ULuMQOcjaEg5l8E,30393
133
- sycommon/agent/multi_agent_team.py,sha256=zsJNjVx0U5qPXlQO-tgAbKotsfL1LMPZvvouxUQGbwY,26466
134
- sycommon/agent/summarization_utils.py,sha256=Fz6xY6DkLXoUfqQVsz8uZrMvxTtEYEJBcDl6pqFJnRk,2242
132
+ sycommon/agent/deep_agent.py,sha256=By7IvmYhOWDglXFoy6ZTovz4QaAOAo5RUFrpbOLdhMQ,30578
133
+ sycommon/agent/multi_agent_team.py,sha256=aZvl-GhC9IS9mWTrtl3XJ9tjCG6dp35qFFPyBv7vr_Q,26647
134
+ sycommon/agent/summarization_utils.py,sha256=aHkA2cGmGw39-yvApvu9qQxvd9nFd6aTIyiehB8oAfE,2584
135
135
  sycommon/agent/sandbox/__init__.py,sha256=jR7LlkD4J4Y6QYyRXQClkwmqDBCCPmycV_hQV9p9YHw,4621
136
136
  sycommon/agent/sandbox/file_ops.py,sha256=6ymRMM0WchM7G_YmF1ckrLjf5s_JCh1wrAp2g_-sg8k,23162
137
137
  sycommon/agent/sandbox/http_sandbox_backend.py,sha256=mjiTZnADvUq_rO05ewllo_eGDS4uTdD2e2GGYvBpF-Q,56150
@@ -174,7 +174,7 @@ sycommon/llm/embedding.py,sha256=Xwmg1HcgbdW7OcpYyzu8k7U-27rC5lzjIqbg221CcyY,191
174
174
  sycommon/llm/get_llm.py,sha256=RHfZlbZeuTju9yfWiSIuzwvOyceWICETzZMuAyqwkgo,7376
175
175
  sycommon/llm/llm_logger.py,sha256=LLXiESwDP5f8dB50nFabShVoLKv8UCf2ll69zo1FOso,3365
176
176
  sycommon/llm/llm_tokens.py,sha256=yGEessxfk5wRMrPGyWHhiiIIQFDVT23FSaqnwqHGCoY,4712
177
- sycommon/llm/llm_with_token_tracking.py,sha256=flGN3dbsjw1enal-p5Wh2Fq14F9Z9_O84aOd6kdq4kc,12377
177
+ sycommon/llm/llm_with_token_tracking.py,sha256=vrdH5LlXg1y2glDPJVawT9A-JoXL9qnvMfHAU3CNy70,12928
178
178
  sycommon/llm/native_with_fallback_runnable.py,sha256=8g2q8cRqJv2miY7GrZz_f-zNmHxdb_5WSujD3frqObQ,8035
179
179
  sycommon/llm/output_fixing_runnable.py,sha256=wGHBKRpUjDz4ONJulTvG5UzJxZr1iK3ULkosaKqjF0w,8113
180
180
  sycommon/llm/struct_token.py,sha256=nXNcncRu3HfXxPXaJoG6AFAdFSNb3oJ4t0mz_TLL6Ow,19809
@@ -201,12 +201,12 @@ sycommon/middleware/mq.py,sha256=9X6KKtadFjBXKS5L3kEKujYio9wwGfWgXwWOAHO-HDg,254
201
201
  sycommon/middleware/sandbox.py,sha256=SQnUvVE0gvBo_YrP4fdA-6ZmJxAG9Po1zUynNFrgTI4,61109
202
202
  sycommon/middleware/timeout.py,sha256=KlxOPa8xl2dg6yuRi_EzkVJG8bX4stb5ueYxctzzGM8,1433
203
203
  sycommon/middleware/token_tracking.py,sha256=rEbgV1bgWMdzAERx4aq5XAvOIT6jTY_tK1P0xHJnL3o,6609
204
- sycommon/middleware/tool_result_truncation.py,sha256=p_v3XGYxO7UIrTaxmmFbDYadIHUfXk8HbZ_WVcxJrrQ,7041
204
+ sycommon/middleware/tool_result_truncation.py,sha256=1IfhEwrOHzeSS-MB-43EOts2V_KYAq4T_utvqkhTdbE,7005
205
205
  sycommon/middleware/traceid.py,sha256=HX4zg7Tp_mPNr2eWDDvK3f7GFJ6eOSeW062Xcc-xshc,14340
206
206
  sycommon/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
207
207
  sycommon/models/base_http.py,sha256=EICAAibx3xhjBsLqm35Mi3DCqxp0FME4rD_3iQVjT_E,3051
208
208
  sycommon/models/log.py,sha256=rZpj6VkDRxK3B6H7XSeWdYZshU8F0Sks8bq1p6pPlDw,500
209
- sycommon/models/mqlistener_config.py,sha256=vXp2uMmd0XQ5B9noSRXWHewTy-juQ2y7IsWtISJD5aI,1661
209
+ sycommon/models/mqlistener_config.py,sha256=MjWrEtm_t-JDHTVkEVgXGSLy72_K_eLb-Ec0kuVBZXc,1747
210
210
  sycommon/models/mqmsg_model.py,sha256=Zo-LsDMFuF1Vkx9ZmwBC9E7TrCw-7nAQD2TE4v9-6F4,291
211
211
  sycommon/models/mqsend_config.py,sha256=NQX9dc8PpuquMG36GCVhJe8omAW1KVXXqr6lSRU6D7I,268
212
212
  sycommon/models/sandbox.py,sha256=5QPLqKCDm0UeyC8CHb2G0d7Rb3f7MYaLq12RFRSeOxc,7293
@@ -218,10 +218,10 @@ sycommon/notice/__init__.py,sha256=cVYbKlLLMFHckyDpx21CTZCMTufqZk_uHuEIxUNxwx4,1
218
218
  sycommon/notice/uvicorn_monitor.py,sha256=O4R25z032dAlvlbU0WLo0LJqoL1Z52fMFgFdb1e3Cls,11833
219
219
  sycommon/notice/wecom_message.py,sha256=PsyoQpPiR0OZaUI9KLXd0-zUwp5okd44q71J60QiRm8,11952
220
220
  sycommon/rabbitmq/process_pool_consumer.py,sha256=BFBiK6s5n1wbbj9Mlc_s-z4Gh6JvDN4RyS1qHWfhgCY,29714
221
- sycommon/rabbitmq/rabbitmq_client.py,sha256=8b3vfTac-H_PGaveN4_bkYzYJplFmUMP-d5ZEeHckf4,16474
221
+ sycommon/rabbitmq/rabbitmq_client.py,sha256=DkA50Cvynh1d0F4pu1Tf-BMhAUVPAECfjyDHvWdFFb8,18628
222
222
  sycommon/rabbitmq/rabbitmq_pool.py,sha256=mUo1-Nlj0xXKG9MdBA0hvkt1NIvKD4AGsDouzQDY5nQ,13835
223
223
  sycommon/rabbitmq/rabbitmq_service.py,sha256=q9c9-9RSvJaY_PE62PQ4mX7ropNsGr0Frcrm5gjaPao,9774
224
- sycommon/rabbitmq/rabbitmq_service_client_manager.py,sha256=kYhLuUajSY-42vi3HKf3Z3K92WYtp39NU1hPg6GQwe8,9797
224
+ sycommon/rabbitmq/rabbitmq_service_client_manager.py,sha256=7xgyP9ZLy2nadR1WZjbGdyEerwbluGDKmbCnKjLiSVM,9869
225
225
  sycommon/rabbitmq/rabbitmq_service_connection_monitor.py,sha256=rdXTG-pZg3-un7y1ObTsNiwRH3Ni6oQaPfRNpAZ2A38,4557
226
226
  sycommon/rabbitmq/rabbitmq_service_consumer_manager.py,sha256=S-nU7dGy-yt9SZ3KsMrG_MZMfV7wONLrnEOTIxmeDnc,9962
227
227
  sycommon/rabbitmq/rabbitmq_service_core.py,sha256=kr4MaR4txhCRHUPxofa-Zt6-YJbfCw_vFfFVg-LE5cE,5230
@@ -257,8 +257,8 @@ sycommon/tools/syemail.py,sha256=BDFhgf7WDOQeTcjxJEQdu0dQhnHFPO_p3eI0-Ni3LhQ,561
257
257
  sycommon/tools/timing.py,sha256=OiiE7P07lRoMzX9kzb8sZU9cDb0zNnqIlY5pWqHcnkY,2064
258
258
  sycommon/xxljob/__init__.py,sha256=7eoBlQxv-B39IfRSCY2bkqdGYs1QRe1umAWd88VMEEM,86
259
259
  sycommon/xxljob/xxljob_service.py,sha256=JIEJaGXhqrTLcyxlyynSrsHg9bBnDNzX-D4qIWLRPUE,6815
260
- sycommon_python_lib-0.2.3a2.dist-info/METADATA,sha256=_JyFaU2brTdZJKEKeceWFhgTP1ee62Hr7PurpTSy5rE,7740
261
- sycommon_python_lib-0.2.3a2.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
262
- sycommon_python_lib-0.2.3a2.dist-info/entry_points.txt,sha256=gsR4SssKxDWjRU8ggidzNcdMXDPRSKRS7UaGyNP84Qg,92
263
- sycommon_python_lib-0.2.3a2.dist-info/top_level.txt,sha256=RgphKrg7nJyZ7irJqbxFr-5H2LUYTvI7ivoWZH2hcD0,29
264
- sycommon_python_lib-0.2.3a2.dist-info/RECORD,,
260
+ sycommon_python_lib-0.2.3a4.dist-info/METADATA,sha256=suveAcmu6ymKJX9vHVe6z15ihtgam_fuFjPCTUKJHfk,7741
261
+ sycommon_python_lib-0.2.3a4.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
262
+ sycommon_python_lib-0.2.3a4.dist-info/entry_points.txt,sha256=gsR4SssKxDWjRU8ggidzNcdMXDPRSKRS7UaGyNP84Qg,92
263
+ sycommon_python_lib-0.2.3a4.dist-info/top_level.txt,sha256=RgphKrg7nJyZ7irJqbxFr-5H2LUYTvI7ivoWZH2hcD0,29
264
+ sycommon_python_lib-0.2.3a4.dist-info/RECORD,,