beswarm 0.2.77__py3-none-any.whl → 0.2.79__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/models/chatgpt.py +6 -1
- beswarm/core.py +8 -2
- beswarm/tools/search_web.py +44 -7
- beswarm/tools/subtasks.py +6 -1
- beswarm/tools/worker.py +8 -1
- {beswarm-0.2.77.dist-info → beswarm-0.2.79.dist-info}/METADATA +1 -1
- {beswarm-0.2.77.dist-info → beswarm-0.2.79.dist-info}/RECORD +9 -9
- {beswarm-0.2.77.dist-info → beswarm-0.2.79.dist-info}/WHEEL +0 -0
- {beswarm-0.2.77.dist-info → beswarm-0.2.79.dist-info}/top_level.txt +0 -0
@@ -757,6 +757,7 @@ class chatgpt(BaseLLM):
|
|
757
757
|
|
758
758
|
# 发送请求并处理响应
|
759
759
|
retry_times = 0
|
760
|
+
error_to_raise = None
|
760
761
|
while True:
|
761
762
|
tmp_post_json = copy.deepcopy(json_post)
|
762
763
|
if need_done_prompt:
|
@@ -840,7 +841,8 @@ class chatgpt(BaseLLM):
|
|
840
841
|
continue
|
841
842
|
except InputTokenCountExceededError as e:
|
842
843
|
self.logger.error(f"The request body is too long: {e}")
|
843
|
-
|
844
|
+
error_to_raise = e
|
845
|
+
break
|
844
846
|
except BadRequestError as e:
|
845
847
|
self.logger.error(f"Bad request error: {e}")
|
846
848
|
raise
|
@@ -873,6 +875,9 @@ class chatgpt(BaseLLM):
|
|
873
875
|
if retry_times == 9:
|
874
876
|
raise RetryFailedError(str(e))
|
875
877
|
|
878
|
+
if error_to_raise:
|
879
|
+
raise error_to_raise
|
880
|
+
|
876
881
|
def ask_stream(
|
877
882
|
self,
|
878
883
|
prompt: list,
|
beswarm/core.py
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
import contextvars
|
1
2
|
from .broker import MessageBroker
|
2
3
|
from .bemcp.bemcp import MCPManager
|
3
4
|
from .taskmanager import TaskManager
|
@@ -9,5 +10,10 @@ from .knowledge_graph import KnowledgeGraphManager
|
|
9
10
|
|
10
11
|
broker = MessageBroker()
|
11
12
|
mcp_manager = MCPManager()
|
12
|
-
|
13
|
-
|
13
|
+
kgm = KnowledgeGraphManager(broker=broker)
|
14
|
+
current_task_manager = contextvars.ContextVar('current_task_manager')
|
15
|
+
current_work_dir = contextvars.ContextVar('current_work_dir', default=None)
|
16
|
+
|
17
|
+
def get_task_manager():
|
18
|
+
"""Creates a new, isolated TaskManager instance."""
|
19
|
+
return TaskManager()
|
beswarm/tools/search_web.py
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
import re
|
2
2
|
import os
|
3
|
+
import csv
|
4
|
+
import time
|
3
5
|
import json
|
4
6
|
import httpx
|
5
7
|
import threading
|
8
|
+
from pathlib import Path
|
6
9
|
|
7
10
|
from ..aient.aient.plugins import register_tool, get_url_content # Assuming a similar plugin structure
|
11
|
+
from ..core import current_work_dir
|
8
12
|
|
9
13
|
class ThreadWithReturnValue(threading.Thread):
|
10
14
|
def run(self):
|
@@ -19,6 +23,7 @@ class ThreadWithReturnValue(threading.Thread):
|
|
19
23
|
async def search_web(query: str):
|
20
24
|
"""
|
21
25
|
获取 Google 搜索结果。
|
26
|
+
搜索结果将保存在 csv 文件到 .beswarm/cache 目录下
|
22
27
|
|
23
28
|
参数:
|
24
29
|
query (str): 要在 Google 上搜索的查询字符串。
|
@@ -289,13 +294,45 @@ async def search_web(query: str):
|
|
289
294
|
# with open(output_filename, "w", encoding="utf-8") as f:
|
290
295
|
# json.dump(final_web_content, f, indent=2, ensure_ascii=False)
|
291
296
|
# print(f"Filtered web content saved to {output_filename}")
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
297
|
+
|
298
|
+
if final_web_content:
|
299
|
+
work_dir = current_work_dir.get()
|
300
|
+
if work_dir:
|
301
|
+
output_path = Path(work_dir) / ".beswarm" / "cache"
|
302
|
+
else:
|
303
|
+
output_path = Path(".")
|
304
|
+
|
305
|
+
output_path.mkdir(parents=True, exist_ok=True)
|
306
|
+
|
307
|
+
# 使用时间戳生成唯一的文件名
|
308
|
+
timestamp = time.strftime("%Y%m%d-%H%M%S")
|
309
|
+
csv_filename = f"web_content_{timestamp}.csv"
|
310
|
+
csv_filepath = output_path / csv_filename
|
311
|
+
|
312
|
+
with open(csv_filepath, "w", newline="", encoding="utf-8") as csvfile:
|
313
|
+
# 根据字典中的键定义字段名
|
314
|
+
fieldnames = ["query", "url", "content"]
|
315
|
+
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
|
316
|
+
|
317
|
+
# 写入标题行
|
318
|
+
writer.writeheader()
|
319
|
+
|
320
|
+
# 写入数据行
|
321
|
+
for item in final_web_content:
|
322
|
+
item['query'] = query
|
323
|
+
if 'content' in item and isinstance(item['content'], str):
|
324
|
+
item['content'] = item['content'].encode('unicode_escape').decode('utf-8')
|
325
|
+
writer.writerow(item)
|
326
|
+
return f"已将筛选后的网页内容保存到 {csv_filepath.absolute()}"
|
327
|
+
return "No web content"
|
328
|
+
|
329
|
+
|
330
|
+
# for item in final_web_content:
|
331
|
+
# final_result += item["content"]
|
332
|
+
# final_result += "\n\n"
|
333
|
+
# if not final_result:
|
334
|
+
# return "No web content"
|
335
|
+
# return final_result
|
299
336
|
|
300
337
|
import difflib
|
301
338
|
|
beswarm/tools/subtasks.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
import ast
|
2
2
|
from pathlib import Path
|
3
|
-
from ..core import
|
3
|
+
from ..core import current_task_manager
|
4
4
|
from ..aient.aient.plugins import register_tool, registry
|
5
5
|
|
6
6
|
worker_fun = registry.tools["worker"]
|
@@ -23,6 +23,7 @@ def create_task(goal, tools, work_dir):
|
|
23
23
|
Returns:
|
24
24
|
str: 当任务成功完成时,返回字符串 "任务已完成"。
|
25
25
|
"""
|
26
|
+
task_manager = current_task_manager.get()
|
26
27
|
# 获取 worker 函数,这是正确的
|
27
28
|
worker_fun = registry.tools["worker"]
|
28
29
|
|
@@ -50,6 +51,7 @@ def resume_task(task_id, goal):
|
|
50
51
|
"""
|
51
52
|
恢复一个子任务。
|
52
53
|
"""
|
54
|
+
task_manager = current_task_manager.get()
|
53
55
|
if task_id not in task_manager.tasks_cache:
|
54
56
|
return f"任务 {task_id} 不存在"
|
55
57
|
tasks_params = task_manager.tasks_cache[task_id]["args"]
|
@@ -67,6 +69,7 @@ def get_all_tasks_status():
|
|
67
69
|
Returns:
|
68
70
|
str: 所有任务的状态。每个任务的id,状态,结果。
|
69
71
|
"""
|
72
|
+
task_manager = current_task_manager.get()
|
70
73
|
return task_manager.tasks_cache
|
71
74
|
|
72
75
|
@register_tool()
|
@@ -91,6 +94,7 @@ async def get_task_result(reduce: bool = False):
|
|
91
94
|
- 当 `reduce=False` 时,返回单个子任务的执行结果。
|
92
95
|
- 当 `reduce=True` 时,返回一个包含所有任务最终状态和结果的汇总字符串。
|
93
96
|
"""
|
97
|
+
task_manager = current_task_manager.get()
|
94
98
|
def get_running_tasks_count():
|
95
99
|
return len([
|
96
100
|
task_id for task_id, task in task_manager.tasks_cache.items()
|
@@ -155,6 +159,7 @@ def create_tasks_from_csv(goal_template: str, csv_file_path: str, tools_json_str
|
|
155
159
|
Returns:
|
156
160
|
str: 批量创建任务的执行摘要,或在发生错误时返回错误信息。
|
157
161
|
"""
|
162
|
+
task_manager = current_task_manager.get()
|
158
163
|
# 1. 校验输入参数
|
159
164
|
if not os.path.exists(csv_file_path):
|
160
165
|
return f"<tool_error>CSV文件不存在: {csv_file_path}</tool_error>"
|
beswarm/tools/worker.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
from datetime import datetime
|
2
2
|
from typing import List, Dict, Union
|
3
3
|
|
4
|
-
from ..core import mcp_manager, broker,
|
4
|
+
from ..core import mcp_manager, broker, kgm, get_task_manager, current_task_manager, current_work_dir
|
5
5
|
from ..agents.planact import BrokerWorker
|
6
6
|
from ..agents.chatgroup import ChatGroupWorker
|
7
7
|
from ..aient.aient.plugins import register_tool
|
@@ -10,6 +10,9 @@ from ..aient.aient.plugins import register_tool
|
|
10
10
|
@register_tool()
|
11
11
|
async def worker(goal: str, tools: List[Union[str, Dict]], work_dir: str, cache_messages: Union[bool, List[Dict]] = None):
|
12
12
|
start_time = datetime.now()
|
13
|
+
task_manager = get_task_manager()
|
14
|
+
current_task_manager.set(task_manager)
|
15
|
+
current_work_dir.set(work_dir)
|
13
16
|
worker_instance = BrokerWorker(goal, tools, work_dir, cache_messages, broker, mcp_manager, task_manager, kgm)
|
14
17
|
result = await worker_instance.run()
|
15
18
|
end_time = datetime.now()
|
@@ -21,6 +24,8 @@ async def worker(goal: str, tools: List[Union[str, Dict]], work_dir: str, cache_
|
|
21
24
|
@register_tool()
|
22
25
|
async def worker_gen(goal: str, tools: List[Union[str, Dict]], work_dir: str, cache_messages: Union[bool, List[Dict]] = None):
|
23
26
|
start_time = datetime.now()
|
27
|
+
task_manager = get_task_manager()
|
28
|
+
current_task_manager.set(task_manager)
|
24
29
|
worker_instance = BrokerWorker(goal, tools, work_dir, cache_messages, broker, mcp_manager, task_manager, kgm)
|
25
30
|
async for result in worker_instance.stream_run():
|
26
31
|
yield result
|
@@ -32,6 +37,8 @@ async def worker_gen(goal: str, tools: List[Union[str, Dict]], work_dir: str, ca
|
|
32
37
|
@register_tool()
|
33
38
|
async def chatgroup(tools: List[Union[str, Dict]], work_dir: str, cache_messages: Union[bool, List[Dict]] = None):
|
34
39
|
start_time = datetime.now()
|
40
|
+
task_manager = get_task_manager()
|
41
|
+
current_task_manager.set(task_manager)
|
35
42
|
worker_instance = ChatGroupWorker(tools, work_dir, cache_messages, broker, mcp_manager, task_manager, kgm)
|
36
43
|
result = await worker_instance.run()
|
37
44
|
end_time = datetime.now()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
beswarm/__init__.py,sha256=HZjUOJtZR5QhMuDbq-wukQQn1VrBusNWai_ysGo-VVI,20
|
2
2
|
beswarm/broker.py,sha256=64Y-djrKYaZfBQ8obwHOmr921QgZeu9BtScZWaYLfDo,9887
|
3
|
-
beswarm/core.py,sha256=
|
3
|
+
beswarm/core.py,sha256=jKStpTTOu6Ojond_i-okTZLrvSAJ4yUoTZwtDfFTiRs,553
|
4
4
|
beswarm/knowledge_graph.py,sha256=oiOMknAJzGrOHc2AyQgvrCcZAkGLhFnsnvSBdfFBWMw,14831
|
5
5
|
beswarm/prompt.py,sha256=qlH-yYCGv9j9-5grnMXl0B53CDZgfTpe4ncwBwgWg7o,32816
|
6
6
|
beswarm/taskmanager.py,sha256=vMmcoZ4FlNvjEliRkv3AniPji50NcY4Q1_2HETzR0DU,12226
|
@@ -21,7 +21,7 @@ beswarm/aient/aient/core/test/test_payload.py,sha256=8jBiJY1uidm1jzL-EiK0s6UGmW9
|
|
21
21
|
beswarm/aient/aient/models/__init__.py,sha256=ZTiZgbfBPTjIPSKURE7t6hlFBVLRS9lluGbmqc1WjxQ,43
|
22
22
|
beswarm/aient/aient/models/audio.py,sha256=kRd-8-WXzv4vwvsTGwnstK-WR8--vr9CdfCZzu8y9LA,1934
|
23
23
|
beswarm/aient/aient/models/base.py,sha256=-nnihYnx-vHZMqeVO9ljjt3k4FcD3n-iMk4tT-10nRQ,7232
|
24
|
-
beswarm/aient/aient/models/chatgpt.py,sha256=
|
24
|
+
beswarm/aient/aient/models/chatgpt.py,sha256=2RaObZmliqJlGveOSWbwgpscjPWk7R1RmxwbEAH0xXo,47315
|
25
25
|
beswarm/aient/aient/plugins/__init__.py,sha256=p3KO6Aa3Lupos4i2SjzLQw1hzQTigOAfEHngsldrsyk,986
|
26
26
|
beswarm/aient/aient/plugins/arXiv.py,sha256=yHjb6PS3GUWazpOYRMKMzghKJlxnZ5TX8z9F6UtUVow,1461
|
27
27
|
beswarm/aient/aient/plugins/config.py,sha256=TGgZ5SnNKZ8MmdznrZ-TEq7s2ulhAAwTSKH89bci3dA,7079
|
@@ -112,11 +112,11 @@ beswarm/tools/repomap.py,sha256=w98aHmjNjtvcUVc5maWORqzKqDy2KVGLooOe__uJVCU,4523
|
|
112
112
|
beswarm/tools/request_input.py,sha256=3n2UW8m8Q7dxGhd7L7hzSJ1kk4ekMbtdtNZZT3dJf20,938
|
113
113
|
beswarm/tools/screenshot.py,sha256=hyL6F8_k9Y03Nb_X18cY-klCpWWdkqyC-iGXfKX-7jc,1007
|
114
114
|
beswarm/tools/search_arxiv.py,sha256=NLiJV1B7Um6EuZXLxnL950d837_he2LGG7qaGACSgwg,10750
|
115
|
-
beswarm/tools/search_web.py,sha256=
|
116
|
-
beswarm/tools/subtasks.py,sha256=
|
117
|
-
beswarm/tools/worker.py,sha256=
|
115
|
+
beswarm/tools/search_web.py,sha256=juFbife765vRZXpTHOV_6ki4h6NpSmZbBcWJ8Fp-uiE,17497
|
116
|
+
beswarm/tools/subtasks.py,sha256=UI9QznALmZNbNOSoR_2AdlnDAkZBuKMq0GifnBCgpLo,10458
|
117
|
+
beswarm/tools/worker.py,sha256=mQ1qdrQ8MgL99byAbTvxfEByFFGN9mty3UHqHjARMQ8,2331
|
118
118
|
beswarm/tools/write_csv.py,sha256=u0Hq18Ksfheb52MVtyLNCnSDHibITpsYBPs2ub7USYA,1466
|
119
|
-
beswarm-0.2.
|
120
|
-
beswarm-0.2.
|
121
|
-
beswarm-0.2.
|
122
|
-
beswarm-0.2.
|
119
|
+
beswarm-0.2.79.dist-info/METADATA,sha256=owpFd3kO5L7n5-r1RpUs25emR-2kpRJ4SIasXxExmbQ,3878
|
120
|
+
beswarm-0.2.79.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
121
|
+
beswarm-0.2.79.dist-info/top_level.txt,sha256=pJw4O87wvt5882smuSO6DfByJz7FJ8SxxT8h9fHCmpo,8
|
122
|
+
beswarm-0.2.79.dist-info/RECORD,,
|
File without changes
|
File without changes
|