sycommon-python-lib 0.2.3a5__py3-none-any.whl → 0.2.3a6__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.
@@ -31,8 +31,7 @@ class RabbitMQListenerConfig(BaseModel):
31
31
  durable: bool = Field(True, description="是否持久化")
32
32
  auto_delete: bool = Field(False, description="是否自动删除队列")
33
33
  auto_parse_json: bool = Field(True, description="是否自动解析JSON消息")
34
- prefetch_count: int = Field(2, description="mq同时消费数量")
35
- max_concurrent_tasks: int = Field(5, description="handler 最大并发任务数")
34
+ prefetch_count: int = Field(2, description="同时消费并发数(控制MQ预取与handler并发上限)")
36
35
 
37
36
  class Config:
38
37
  """模型配置"""
@@ -42,7 +42,6 @@ class RabbitMQClient:
42
42
  auto_delete: bool = False,
43
43
  auto_parse_json: bool = True,
44
44
  create_if_not_exists: bool = True,
45
- max_concurrent_tasks: int = 5,
46
45
  **kwargs,
47
46
  ):
48
47
  self.connection_pool = connection_pool
@@ -75,8 +74,9 @@ class RabbitMQClient:
75
74
  self._connect_lock = asyncio.Lock()
76
75
  self._reconnect_semaphore = asyncio.Semaphore(1)
77
76
 
78
- # 异步任务并发控制(方案C:收到即ACK + create_task)
79
- self._task_semaphore = asyncio.Semaphore(max_concurrent_tasks)
77
+ # 异步任务并发控制(方案C:收到即ACK + create_task,复用 prefetch_count
78
+ self.prefetch_count = kwargs.get('prefetch_count', 2)
79
+ self._task_semaphore = asyncio.Semaphore(self.prefetch_count)
80
80
  self._running_tasks: set = set()
81
81
 
82
82
  @property
@@ -158,7 +158,6 @@ 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),
162
161
  )
163
162
 
164
163
  # 4. 连接客户端
@@ -0,0 +1,166 @@
1
+ """快速验证自动压缩是否触发。
2
+
3
+ 用极小 maxTokens 使 1 轮对话即超过阈值,验证 deepagents 内置的
4
+ SummarizationMiddleware 自动压缩机制。
5
+ """
6
+ import asyncio
7
+ import sys
8
+ import os
9
+ import time
10
+ import tempfile
11
+
12
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
13
+
14
+ from unittest.mock import AsyncMock, MagicMock, patch
15
+ from langgraph.checkpoint.memory import MemorySaver
16
+ from pathlib import Path
17
+
18
+ from sycommon.agent.deep_agent import AgentConfig
19
+
20
+
21
+ def make_mock_sandbox():
22
+ sandbox = AsyncMock()
23
+ sandbox.async_sync = AsyncMock(return_value={})
24
+ sandbox.akill_all_processes = AsyncMock()
25
+ sandbox.atree = AsyncMock(return_value=None)
26
+ sandbox.async_sync_dirs = AsyncMock()
27
+ return sandbox
28
+
29
+
30
+ def make_model():
31
+ from langchain.chat_models import init_chat_model
32
+ return init_chat_model(
33
+ model="glm-5.1", model_provider="openai", streaming=False,
34
+ base_url="http://10.10.6.132:3000/v1",
35
+ api_key="sk-3hXhO7uCG5CRi7t3THE2cWTKVJqesXJ38cKstHZhDVXHQOIn",
36
+ temperature=0.7, max_retries=2, timeout=120,
37
+ )
38
+
39
+
40
+ # Monkey-patch 检测自动压缩
41
+ auto_triggered_flags = {}
42
+
43
+
44
+ async def run_test(nacos_max_tokens: int):
45
+ """1 轮对话 + 极小 maxTokens"""
46
+ trigger_threshold = int(nacos_max_tokens * 0.85)
47
+ auto_triggered_flags["latest"] = False
48
+ print(f"\n{'='*60}")
49
+ print(f" maxTokens={nacos_max_tokens}, 自动压缩阈值={trigger_threshold} tokens")
50
+ print(f"{'='*60}")
51
+
52
+ mock_llm_cfg = {
53
+ "model": "glm-5.1",
54
+ "provider": "openai",
55
+ "baseUrl": "http://10.10.6.132:3000/v1",
56
+ "maxTokens": nacos_max_tokens,
57
+ "vision": False,
58
+ "callFunction": True,
59
+ "default": True,
60
+ "apiKey": "sk-3hXhO7uCG5CRi7t3THE2cWTKVJqesXJ38cKstHZhDVXHQOIn",
61
+ }
62
+
63
+ model = make_model()
64
+
65
+ # Monkey-patch awrap_model_call 检测自动压缩
66
+ from deepagents.middleware import summarization as summ_module
67
+ _orig_awrap = summ_module._DeepAgentsSummarizationMiddleware.awrap_model_call
68
+
69
+ async def _patched_awrap(self_inner, request, handler):
70
+ result = await _orig_awrap(self_inner, request, handler)
71
+ from deepagents.middleware.summarization import ExtendedModelResponse
72
+ if isinstance(result, ExtendedModelResponse):
73
+ auto_triggered_flags["latest"] = True
74
+ print(f" >>> 自动压缩触发! <<<")
75
+ return result
76
+
77
+ summ_module._DeepAgentsSummarizationMiddleware.awrap_model_call = _patched_awrap
78
+
79
+ try:
80
+ with patch("sycommon.config.Config.Config") as mock_config_cls, \
81
+ patch("sycommon.config.LLMConfig.LLMConfig") as mock_llmconfig_cls, \
82
+ patch("sycommon.agent.deep_agent.get_llm", return_value=model):
83
+
84
+ config_instance = MagicMock()
85
+ config_instance.get_llm_config = MagicMock(return_value=mock_llm_cfg)
86
+ config_instance.get_default_llm_model_name = MagicMock(return_value="glm-5.1")
87
+ mock_config_cls.return_value = config_instance
88
+
89
+ from sycommon.config.LLMConfig import LLMConfig
90
+ mock_llmconfig_cls.from_config = MagicMock(return_value=LLMConfig(**mock_llm_cfg))
91
+
92
+ agent_config = AgentConfig(
93
+ model_name="glm-5.1",
94
+ system_prompt="你是测试助手。用中文回答,写500字以上。",
95
+ tools=[],
96
+ debug=False,
97
+ )
98
+
99
+ sandbox = make_mock_sandbox()
100
+ checkpointer = MemorySaver()
101
+
102
+ with patch("sycommon.agent.summarization_utils.build_summarization_middleware") as mock_build:
103
+ from deepagents.middleware.summarization import SummarizationMiddleware, SummarizationToolMiddleware
104
+ from deepagents.backends.filesystem import FilesystemBackend
105
+
106
+ fs_backend = FilesystemBackend(
107
+ root_dir=f"/tmp/test_summ_{int(time.time())}", virtual_mode=True,
108
+ )
109
+ summ = SummarizationMiddleware(
110
+ model=model, backend=fs_backend,
111
+ trigger=("tokens", int(nacos_max_tokens * 0.70)),
112
+ keep=("tokens", int(nacos_max_tokens * 0.10)),
113
+ )
114
+ mock_build.return_value = (summ, SummarizationToolMiddleware(summ))
115
+
116
+ from sycommon.agent.deep_agent import create_deep_agent
117
+ deep_agent = await create_deep_agent(
118
+ user_id=f"test_{int(time.time())}",
119
+ config=agent_config,
120
+ sandbox_backend=sandbox,
121
+ checkpointer=checkpointer,
122
+ project_root=Path(tempfile.mkdtemp()),
123
+ )
124
+
125
+ print(f" Agent 创建成功")
126
+
127
+ question = "请详细介绍中国古代四大发明,每个发明至少写200字。"
128
+ print(f" Q: {question}")
129
+
130
+ try:
131
+ async for event in deep_agent.chat(question):
132
+ if event.type == "tool_call":
133
+ tn = event.data.get("name", "") if isinstance(event.data, dict) else str(event.data)
134
+ print(f" [tool_call] {tn}")
135
+ if "compact" in tn.lower():
136
+ print(f" >>> compact_conversation 工具调用! <<<")
137
+ except Exception as e:
138
+ print(f" chat 出错: {e}")
139
+
140
+ finally:
141
+ summ_module._DeepAgentsSummarizationMiddleware.awrap_model_call = _orig_awrap
142
+
143
+ triggered = auto_triggered_flags.get("latest", False)
144
+ print(f" 结果: 自动压缩 {'已触发' if triggered else '未触发'}")
145
+ return triggered
146
+
147
+
148
+ async def main():
149
+ print(f"快速验证自动压缩 - {time.strftime('%H:%M:%S')}")
150
+
151
+ r1 = await run_test(nacos_max_tokens=3000)
152
+ r2 = await run_test(nacos_max_tokens=1000)
153
+
154
+ print(f"\n{'='*60}")
155
+ print(f" maxTokens=3000 (阈值2550): {'已触发' if r1 else '未触发'}")
156
+ print(f" maxTokens=1000 (阈值850): {'已触发' if r2 else '未触发'}")
157
+ print(f"{'='*60}")
158
+
159
+ if r1 or r2:
160
+ print(f"\n 结论: 自动压缩机制工作正常!")
161
+ else:
162
+ print(f"\n 结论: 未触发,需要排查")
163
+
164
+
165
+ if __name__ == "__main__":
166
+ asyncio.run(main())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.3a5
3
+ Version: 0.2.3a6
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -206,7 +206,7 @@ sycommon/middleware/traceid.py,sha256=HX4zg7Tp_mPNr2eWDDvK3f7GFJ6eOSeW062Xcc-xsh
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=MjWrEtm_t-JDHTVkEVgXGSLy72_K_eLb-Ec0kuVBZXc,1747
209
+ sycommon/models/mqlistener_config.py,sha256=japihb4kmP5ZqvqQEs6C7CmcrPlE1UmhAtCimoL61xI,1704
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=DkA50Cvynh1d0F4pu1Tf-BMhAUVPAECfjyDHvWdFFb8,18628
221
+ sycommon/rabbitmq/rabbitmq_client.py,sha256=IbuXEHa70e4V2KUHDE9MK4WxphDCJDOWy5Z3GGT3KjM,18674
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=7xgyP9ZLy2nadR1WZjbGdyEerwbluGDKmbCnKjLiSVM,9869
224
+ sycommon/rabbitmq/rabbitmq_service_client_manager.py,sha256=kYhLuUajSY-42vi3HKf3Z3K92WYtp39NU1hPg6GQwe8,9797
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
@@ -247,6 +247,7 @@ sycommon/tests/deep_agent_server.py,sha256=t7snT2J6KWZrjJsYVi4TU5jpfvXNz4iuzMk4c
247
247
  sycommon/tests/test_deep_agent.py,sha256=34gP2KL8SSmtqqhaA9OV97OAl_I0T4TfEutZrR_0srM,5874
248
248
  sycommon/tests/test_email.py,sha256=-oPtYVGQzJ3Cv-op3ZNRMeyYOF-UNidGJC35CHRgjGQ,5442
249
249
  sycommon/tests/test_mq.py,sha256=Gpr9Eep-osRkcnlwGeshROEf83Ai3qYbAMHwpoML68o,4366
250
+ sycommon/tests/test_real_summarization.py,sha256=7B89es7-UwULk-kq9xUiWH1ylXUO3QDJm4oZWzJNPk0,6193
250
251
  sycommon/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
251
252
  sycommon/tools/async_utils.py,sha256=e2Bp8v0LDrnViBIZ3zcCWtm_01w67vG34VhnAyGu9ZM,1015
252
253
  sycommon/tools/docs.py,sha256=OPj2ETheuWjXLyaXtaZPbwmJKfJaYXV5s4XMVAUNrms,1607
@@ -257,8 +258,8 @@ sycommon/tools/syemail.py,sha256=BDFhgf7WDOQeTcjxJEQdu0dQhnHFPO_p3eI0-Ni3LhQ,561
257
258
  sycommon/tools/timing.py,sha256=OiiE7P07lRoMzX9kzb8sZU9cDb0zNnqIlY5pWqHcnkY,2064
258
259
  sycommon/xxljob/__init__.py,sha256=7eoBlQxv-B39IfRSCY2bkqdGYs1QRe1umAWd88VMEEM,86
259
260
  sycommon/xxljob/xxljob_service.py,sha256=JIEJaGXhqrTLcyxlyynSrsHg9bBnDNzX-D4qIWLRPUE,6815
260
- sycommon_python_lib-0.2.3a5.dist-info/METADATA,sha256=O7-_W5Sdlc-5kGYwoS6vAbcut-FzljS1tGY4wSVr0gU,7741
261
- sycommon_python_lib-0.2.3a5.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
262
- sycommon_python_lib-0.2.3a5.dist-info/entry_points.txt,sha256=gsR4SssKxDWjRU8ggidzNcdMXDPRSKRS7UaGyNP84Qg,92
263
- sycommon_python_lib-0.2.3a5.dist-info/top_level.txt,sha256=RgphKrg7nJyZ7irJqbxFr-5H2LUYTvI7ivoWZH2hcD0,29
264
- sycommon_python_lib-0.2.3a5.dist-info/RECORD,,
261
+ sycommon_python_lib-0.2.3a6.dist-info/METADATA,sha256=ql7nW3cSs3U-REXMv-nYh1A5eks3i-YkktTX891cZC8,7741
262
+ sycommon_python_lib-0.2.3a6.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
263
+ sycommon_python_lib-0.2.3a6.dist-info/entry_points.txt,sha256=gsR4SssKxDWjRU8ggidzNcdMXDPRSKRS7UaGyNP84Qg,92
264
+ sycommon_python_lib-0.2.3a6.dist-info/top_level.txt,sha256=RgphKrg7nJyZ7irJqbxFr-5H2LUYTvI7ivoWZH2hcD0,29
265
+ sycommon_python_lib-0.2.3a6.dist-info/RECORD,,