beswarm 0.3.11__py3-none-any.whl → 0.3.12__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.
- beswarm/aient/aient/core/request.py +7 -7
- beswarm/utils.py +40 -12
- {beswarm-0.3.11.dist-info → beswarm-0.3.12.dist-info}/METADATA +1 -1
- {beswarm-0.3.11.dist-info → beswarm-0.3.12.dist-info}/RECORD +7 -7
- {beswarm-0.3.11.dist-info → beswarm-0.3.12.dist-info}/WHEEL +0 -0
- {beswarm-0.3.11.dist-info → beswarm-0.3.12.dist-info}/entry_points.txt +0 -0
- {beswarm-0.3.11.dist-info → beswarm-0.3.12.dist-info}/top_level.txt +0 -0
@@ -295,7 +295,7 @@ async def get_gemini_payload(request, engine, provider, api_key=None):
|
|
295
295
|
if key == request.model:
|
296
296
|
for k, v in value.items():
|
297
297
|
payload[k] = v
|
298
|
-
elif all(_model not in request.model.lower() for _model in
|
298
|
+
elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
|
299
299
|
payload[key] = value
|
300
300
|
|
301
301
|
return url, headers, payload
|
@@ -591,7 +591,7 @@ async def get_vertex_gemini_payload(request, engine, provider, api_key=None):
|
|
591
591
|
if key == request.model:
|
592
592
|
for k, v in value.items():
|
593
593
|
payload[k] = v
|
594
|
-
elif all(_model not in request.model.lower() for _model in
|
594
|
+
elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
|
595
595
|
payload[key] = value
|
596
596
|
|
597
597
|
return url, headers, payload
|
@@ -1149,7 +1149,7 @@ async def get_gpt_payload(request, engine, provider, api_key=None):
|
|
1149
1149
|
if key == request.model:
|
1150
1150
|
for k, v in value.items():
|
1151
1151
|
payload[k] = v
|
1152
|
-
elif all(_model not in request.model.lower() for _model in
|
1152
|
+
elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
|
1153
1153
|
payload[key] = value
|
1154
1154
|
|
1155
1155
|
return url, headers, payload
|
@@ -1247,7 +1247,7 @@ async def get_azure_payload(request, engine, provider, api_key=None):
|
|
1247
1247
|
if key == request.model:
|
1248
1248
|
for k, v in value.items():
|
1249
1249
|
payload[k] = v
|
1250
|
-
elif all(_model not in request.model.lower() for _model in
|
1250
|
+
elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
|
1251
1251
|
payload[key] = value
|
1252
1252
|
|
1253
1253
|
return url, headers, payload
|
@@ -1367,7 +1367,7 @@ async def get_azure_databricks_payload(request, engine, provider, api_key=None):
|
|
1367
1367
|
if key == request.model:
|
1368
1368
|
for k, v in value.items():
|
1369
1369
|
payload[k] = v
|
1370
|
-
elif all(_model not in request.model.lower() for _model in
|
1370
|
+
elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
|
1371
1371
|
payload[key] = value
|
1372
1372
|
|
1373
1373
|
return url, headers, payload
|
@@ -1454,7 +1454,7 @@ async def get_openrouter_payload(request, engine, provider, api_key=None):
|
|
1454
1454
|
if key == request.model:
|
1455
1455
|
for k, v in value.items():
|
1456
1456
|
payload[k] = v
|
1457
|
-
elif all(_model not in request.model.lower() for _model in
|
1457
|
+
elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
|
1458
1458
|
payload[key] = value
|
1459
1459
|
|
1460
1460
|
return url, headers, payload
|
@@ -1820,7 +1820,7 @@ async def get_claude_payload(request, engine, provider, api_key=None):
|
|
1820
1820
|
if key == request.model:
|
1821
1821
|
for k, v in value.items():
|
1822
1822
|
payload[k] = v
|
1823
|
-
elif all(_model not in request.model.lower() for _model in
|
1823
|
+
elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
|
1824
1824
|
payload[key] = value
|
1825
1825
|
|
1826
1826
|
return url, headers, payload
|
beswarm/utils.py
CHANGED
@@ -2,6 +2,9 @@ import re
|
|
2
2
|
import sys
|
3
3
|
import logging
|
4
4
|
from pathlib import Path
|
5
|
+
import queue
|
6
|
+
import atexit
|
7
|
+
from logging.handlers import QueueHandler, QueueListener
|
5
8
|
|
6
9
|
def extract_xml_content(text, xml_tag):
|
7
10
|
result = ''
|
@@ -167,9 +170,17 @@ async def {tool_name}({params_str}):
|
|
167
170
|
print(f"Failed to create or register function for tool '{tool_name}': {e}")
|
168
171
|
traceback.print_exc()
|
169
172
|
|
173
|
+
# For asynchronous logging
|
174
|
+
_listeners = []
|
175
|
+
_atexit_registered = False
|
176
|
+
|
177
|
+
def _stop_all_listeners():
|
178
|
+
for listener in _listeners:
|
179
|
+
listener.stop()
|
180
|
+
|
170
181
|
def setup_logger(logger_name: str, log_file: Path):
|
171
182
|
"""
|
172
|
-
|
183
|
+
用异步方式设置一个 logger,使其同时输出到文件和终端,避免IO阻塞。
|
173
184
|
|
174
185
|
Args:
|
175
186
|
logger_name (str): Logger 的唯一名称。
|
@@ -178,35 +189,52 @@ def setup_logger(logger_name: str, log_file: Path):
|
|
178
189
|
Returns:
|
179
190
|
logging.Logger: 配置好的 logger 实例。
|
180
191
|
"""
|
192
|
+
global _atexit_registered
|
193
|
+
|
181
194
|
# 1. 获取 Logger 实例
|
182
195
|
logger = logging.getLogger(logger_name)
|
183
196
|
logger.setLevel(logging.INFO) # 设置 logger 的最低处理级别为 INFO
|
184
197
|
logger.propagate = False
|
185
198
|
|
199
|
+
# 如果已经配置了异步 handler,直接返回
|
200
|
+
if any(isinstance(h, QueueHandler) for h in logger.handlers):
|
201
|
+
return logger
|
202
|
+
|
203
|
+
# 如果有其他 handler,说明被其他方式配置过,也直接返回
|
186
204
|
if logger.hasHandlers():
|
187
205
|
return logger
|
188
206
|
|
189
|
-
# 2.
|
207
|
+
# 2. 创建用于 Listener 的 Handler(文件和终端)
|
190
208
|
# 确保日志文件所在的目录存在
|
191
209
|
log_file.parent.mkdir(parents=True, exist_ok=True)
|
192
210
|
file_handler = logging.FileHandler(log_file, mode='a', encoding='utf-8')
|
193
|
-
|
194
|
-
# 3. 创建终端 Handler
|
195
|
-
# 使用 sys.stdout 可以确保输出在标准输出流,与 print() 行为一致
|
196
211
|
stream_handler = logging.StreamHandler(sys.stdout)
|
197
212
|
|
198
|
-
#
|
213
|
+
# 3. 创建一个通用的 Formatter
|
199
214
|
formatter = logging.Formatter('%(asctime)s - %(name)s - [%(levelname)s] - %(message)s')
|
200
215
|
|
201
|
-
#
|
216
|
+
# 4. 为两个 Handler 设置 Formatter
|
202
217
|
file_handler.setFormatter(formatter)
|
203
218
|
stream_handler.setFormatter(formatter)
|
204
219
|
|
205
|
-
#
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
220
|
+
# 5. 设置 Queue、QueueHandler 和 QueueListener
|
221
|
+
log_queue = queue.Queue(-1)
|
222
|
+
# listener 在后台线程中从 queue 读取日志,并分发给 file_handler 和 stream_handler
|
223
|
+
listener = QueueListener(log_queue, file_handler, stream_handler, respect_handler_level=True)
|
224
|
+
|
225
|
+
# queue_handler 是一个非阻塞的 handler,它把日志消息放到 queue 中
|
226
|
+
queue_handler = QueueHandler(log_queue)
|
227
|
+
|
228
|
+
# 6. 将 QueueHandler 添加到 Logger
|
229
|
+
logger.addHandler(queue_handler)
|
230
|
+
|
231
|
+
# 7. 启动 listener 并注册 atexit 钩子以确保程序退出时停止
|
232
|
+
_listeners.append(listener)
|
233
|
+
listener.start()
|
234
|
+
|
235
|
+
if not _atexit_registered:
|
236
|
+
atexit.register(_stop_all_listeners)
|
237
|
+
_atexit_registered = True
|
210
238
|
|
211
239
|
return logger
|
212
240
|
|
@@ -5,7 +5,7 @@ beswarm/core.py,sha256=jKStpTTOu6Ojond_i-okTZLrvSAJ4yUoTZwtDfFTiRs,553
|
|
5
5
|
beswarm/knowledge_graph.py,sha256=oiOMknAJzGrOHc2AyQgvrCcZAkGLhFnsnvSBdfFBWMw,14831
|
6
6
|
beswarm/prompt.py,sha256=45onnyoY9plKM86KQefbPw5z9QJMn-mVnjlFQZcrjz0,34373
|
7
7
|
beswarm/taskmanager.py,sha256=2Uz_cthW9rWkQMJdzgsXAMlfN8Ni2Qj_DOq_L-p6XZc,12662
|
8
|
-
beswarm/utils.py,sha256=
|
8
|
+
beswarm/utils.py,sha256=mtWzksvdar7dR8oRGvFBEAFXjigk4m1MD1arrx9wEuU,9157
|
9
9
|
beswarm/agents/chatgroup.py,sha256=PzrmRcDKAbB7cxL16nMod_CzPosDV6bfTmXxQVuv-AQ,12012
|
10
10
|
beswarm/agents/planact.py,sha256=dhPkMUaZLc1dO0TrI1Orr_i60iLzJHQIYBI_QjjSJwI,18723
|
11
11
|
beswarm/aient/aient/__init__.py,sha256=SRfF7oDVlOOAi6nGKiJIUK6B_arqYLO9iSMp-2IZZps,21
|
@@ -17,7 +17,7 @@ beswarm/aient/aient/architext/test/test_save_load.py,sha256=o8DqH6gDYZkFkQy-a7bl
|
|
17
17
|
beswarm/aient/aient/core/__init__.py,sha256=NxjebTlku35S4Dzr16rdSqSTWUvvwEeACe8KvHJnjPg,34
|
18
18
|
beswarm/aient/aient/core/log_config.py,sha256=kz2_yJv1p-o3lUQOwA3qh-LSc3wMHv13iCQclw44W9c,274
|
19
19
|
beswarm/aient/aient/core/models.py,sha256=KMlCRLjtq1wQHZTJGqnbWhPS2cHq6eLdnk7peKDrzR8,7490
|
20
|
-
beswarm/aient/aient/core/request.py,sha256=
|
20
|
+
beswarm/aient/aient/core/request.py,sha256=u9wkesp0JMQoJdLoDCNQQgiAB7a_W4Hs38uX6Ppqpi8,77836
|
21
21
|
beswarm/aient/aient/core/response.py,sha256=VYpXfF6RO3Y-fTZMGV2p-bcrd73BPAKlz33gQkOcqjE,38462
|
22
22
|
beswarm/aient/aient/core/utils.py,sha256=9T6Ze9sMnsX4NBWeYCgY3AlZdhh6HFV1LI5SojzZars,31751
|
23
23
|
beswarm/aient/aient/core/test/test_base_api.py,sha256=pWnycRJbuPSXKKU9AQjWrMAX1wiLC_014Qc9hh5C2Pw,524
|
@@ -121,8 +121,8 @@ beswarm/tools/subtasks.py,sha256=Fsf_542CkECcwFwxD-F38_IUsmk06xe1P7e6pBPTy4Y,128
|
|
121
121
|
beswarm/tools/worker.py,sha256=mQ1qdrQ8MgL99byAbTvxfEByFFGN9mty3UHqHjARMQ8,2331
|
122
122
|
beswarm/tools/write_csv.py,sha256=u0Hq18Ksfheb52MVtyLNCnSDHibITpsYBPs2ub7USYA,1466
|
123
123
|
beswarm/tools/write_file.py,sha256=L2coBqz-aRFxPBvJBrbWbUJhu7p3oKAAGb9R144bFtk,4926
|
124
|
-
beswarm-0.3.
|
125
|
-
beswarm-0.3.
|
126
|
-
beswarm-0.3.
|
127
|
-
beswarm-0.3.
|
128
|
-
beswarm-0.3.
|
124
|
+
beswarm-0.3.12.dist-info/METADATA,sha256=lsjwHlJwRdbZPGPqsihISy5xKb1Rim2bsiTcQaYJXVo,3878
|
125
|
+
beswarm-0.3.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
126
|
+
beswarm-0.3.12.dist-info/entry_points.txt,sha256=URK7Y4PDzBgxIecQnxsWTu4O-eaFa1CoAcNTWh5R7LM,45
|
127
|
+
beswarm-0.3.12.dist-info/top_level.txt,sha256=pJw4O87wvt5882smuSO6DfByJz7FJ8SxxT8h9fHCmpo,8
|
128
|
+
beswarm-0.3.12.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|