beswarm 0.2.83__py3-none-any.whl → 0.2.85__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/agents/planact.py +11 -9
- beswarm/aient/aient/architext/architext/core.py +54 -29
- beswarm/aient/aient/architext/test/test.py +111 -4
- beswarm/aient/aient/models/chatgpt.py +3 -0
- beswarm/prompt.py +8 -6
- {beswarm-0.2.83.dist-info → beswarm-0.2.85.dist-info}/METADATA +1 -1
- {beswarm-0.2.83.dist-info → beswarm-0.2.85.dist-info}/RECORD +9 -9
- {beswarm-0.2.83.dist-info → beswarm-0.2.85.dist-info}/WHEEL +0 -0
- {beswarm-0.2.83.dist-info → beswarm-0.2.85.dist-info}/top_level.txt +0 -0
beswarm/agents/planact.py
CHANGED
@@ -34,12 +34,13 @@ class BaseAgent:
|
|
34
34
|
self.goal = goal
|
35
35
|
self.tools_json = tools_json
|
36
36
|
self.work_dir = work_dir
|
37
|
-
self.
|
37
|
+
self.pkl_file = Path(work_dir) / ".beswarm" / "history.pkl"
|
38
|
+
self.cache_file = Path(work_dir) / ".beswarm" / "work_agent_conversation_history.json"
|
38
39
|
self.config = agent_config
|
39
40
|
self.logger = agent_config.get("logger", None)
|
40
41
|
self.cache_messages = cache_messages
|
41
42
|
if cache_messages and isinstance(cache_messages, bool) and cache_messages == True:
|
42
|
-
self.cache_messages = Messages.load(self.
|
43
|
+
self.cache_messages = Messages.load(self.pkl_file)
|
43
44
|
self.broker = broker
|
44
45
|
self.listen_topic = listen_topic
|
45
46
|
self.error_topic = listen_topic + ".error"
|
@@ -80,13 +81,14 @@ class InstructionAgent(BaseAgent):
|
|
80
81
|
changed_lines.append(line)
|
81
82
|
self.goal_diff = '\n'.join(changed_lines).strip()
|
82
83
|
|
83
|
-
def get_conversation_history(self, raw_conversation_history: List[Dict]):
|
84
|
+
async def get_conversation_history(self, raw_conversation_history: List[Dict]):
|
84
85
|
conversation_history = copy.deepcopy(raw_conversation_history)
|
85
|
-
conversation_history.save(self.
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
86
|
+
conversation_history.save(self.pkl_file)
|
87
|
+
self.cache_file.write_text(json.dumps(await conversation_history.render_latest(), ensure_ascii=False, indent=4), encoding="utf-8")
|
88
|
+
latest_file_content = conversation_history.pop("files")
|
89
|
+
conversation_history.pop(0)
|
90
|
+
if conversation_history and latest_file_content:
|
91
|
+
conversation_history[0] = latest_file_content + conversation_history[0]
|
90
92
|
|
91
93
|
return conversation_history
|
92
94
|
|
@@ -107,7 +109,7 @@ class InstructionAgent(BaseAgent):
|
|
107
109
|
f"这是你上次给assistant的错误格式的指令:\n{self.last_instruction}"
|
108
110
|
)
|
109
111
|
|
110
|
-
self.agent.conversation["default"][1:] = self.get_conversation_history(message["conversation"])
|
112
|
+
self.agent.conversation["default"][1:] = await self.get_conversation_history(message["conversation"])
|
111
113
|
|
112
114
|
if "find_and_click_element" in json.dumps(self.tools_json):
|
113
115
|
instruction_prompt = await get_current_screen_image_message(instruction_prompt)
|
@@ -58,11 +58,11 @@ class ContentBlock:
|
|
58
58
|
|
59
59
|
# 2. 上下文提供者 (带缓存)
|
60
60
|
class ContextProvider(ABC):
|
61
|
-
def __init__(self, name: str):
|
61
|
+
def __init__(self, name: str, visible: bool = True):
|
62
62
|
self.name = name
|
63
63
|
self._cached_content: Optional[str] = None
|
64
64
|
self._is_stale: bool = True
|
65
|
-
self._visible: bool =
|
65
|
+
self._visible: bool = visible
|
66
66
|
|
67
67
|
def __str__(self):
|
68
68
|
# This allows the object to be captured when used inside an f-string.
|
@@ -96,8 +96,15 @@ class ContextProvider(ABC):
|
|
96
96
|
return ContentBlock(self.name, self._cached_content)
|
97
97
|
return None
|
98
98
|
|
99
|
+
def __add__(self, other):
|
100
|
+
if isinstance(other, Message):
|
101
|
+
# Create a new message of the same type as `other`, with `self` prepended.
|
102
|
+
new_items = [self] + other.provider()
|
103
|
+
return type(other)(*new_items)
|
104
|
+
return NotImplemented
|
105
|
+
|
99
106
|
class Texts(ContextProvider):
|
100
|
-
def __init__(self, text: Optional[Union[str, Callable[[], str]]] = None, name: Optional[str] = None):
|
107
|
+
def __init__(self, text: Optional[Union[str, Callable[[], str]]] = None, name: Optional[str] = None, visible: bool = True):
|
101
108
|
if text is None and name is None:
|
102
109
|
raise ValueError("Either 'text' or 'name' must be provided.")
|
103
110
|
|
@@ -119,7 +126,7 @@ class Texts(ContextProvider):
|
|
119
126
|
_name = f"text_{h[:8]}"
|
120
127
|
else:
|
121
128
|
_name = name
|
122
|
-
super().__init__(_name)
|
129
|
+
super().__init__(_name, visible=visible)
|
123
130
|
|
124
131
|
async def refresh(self):
|
125
132
|
if self._is_dynamic:
|
@@ -180,8 +187,8 @@ class Texts(ContextProvider):
|
|
180
187
|
return self.content == other.content
|
181
188
|
|
182
189
|
class Tools(ContextProvider):
|
183
|
-
def __init__(self, tools_json: Optional[List[Dict]] = None, name: str = "tools"):
|
184
|
-
super().__init__(name)
|
190
|
+
def __init__(self, tools_json: Optional[List[Dict]] = None, name: str = "tools", visible: bool = True):
|
191
|
+
super().__init__(name, visible=visible)
|
185
192
|
self._tools_json = tools_json or []
|
186
193
|
def update(self, tools_json: List[Dict]):
|
187
194
|
self._tools_json = tools_json
|
@@ -197,8 +204,8 @@ class Tools(ContextProvider):
|
|
197
204
|
return self._tools_json == other._tools_json
|
198
205
|
|
199
206
|
class Files(ContextProvider):
|
200
|
-
def __init__(self, *paths: Union[str, List[str]], name: str = "files"):
|
201
|
-
super().__init__(name)
|
207
|
+
def __init__(self, *paths: Union[str, List[str]], name: str = "files", visible: bool = True):
|
208
|
+
super().__init__(name, visible=visible)
|
202
209
|
self._files: Dict[str, str] = {}
|
203
210
|
|
204
211
|
file_paths: List[str] = []
|
@@ -278,8 +285,8 @@ class Files(ContextProvider):
|
|
278
285
|
return self._files == other._files
|
279
286
|
|
280
287
|
class Images(ContextProvider):
|
281
|
-
def __init__(self, url: str, name: Optional[str] = None):
|
282
|
-
super().__init__(name or url)
|
288
|
+
def __init__(self, url: str, name: Optional[str] = None, visible: bool = True):
|
289
|
+
super().__init__(name or url, visible=visible)
|
283
290
|
self.url = url
|
284
291
|
def update(self, url: str):
|
285
292
|
self.url = url
|
@@ -665,30 +672,48 @@ class Messages:
|
|
665
672
|
return Messages(*self._messages[index])
|
666
673
|
return self._messages[index]
|
667
674
|
|
668
|
-
def __setitem__(self, index: slice, value: 'Messages'):
|
669
|
-
if
|
670
|
-
|
671
|
-
|
672
|
-
# Basic slice assignment logic.
|
673
|
-
# A more robust implementation would handle step and negative indices.
|
674
|
-
start, stop, step = index.indices(len(self._messages))
|
675
|
+
def __setitem__(self, index: Union[int, slice], value: Union[Message, 'Messages']):
|
676
|
+
if isinstance(index, int):
|
677
|
+
if not isinstance(value, Message):
|
678
|
+
raise TypeError("When assigning to an index, the value must be a Message.")
|
675
679
|
|
676
|
-
|
677
|
-
|
680
|
+
if not (-len(self._messages) <= index < len(self._messages)):
|
681
|
+
raise IndexError("Messages assignment index out of range")
|
678
682
|
|
679
|
-
|
680
|
-
|
681
|
-
for provider in
|
683
|
+
# Get old message to remove its providers
|
684
|
+
old_message = self._messages[index]
|
685
|
+
for provider in old_message.provider():
|
682
686
|
self._notify_provider_removed(provider)
|
683
687
|
|
684
|
-
|
685
|
-
|
688
|
+
# Assign new message
|
689
|
+
self._messages[index] = value
|
690
|
+
value._parent_messages = self
|
691
|
+
for provider in value.provider():
|
692
|
+
self._notify_provider_added(provider, value)
|
693
|
+
|
694
|
+
elif isinstance(index, slice):
|
695
|
+
if not isinstance(value, Messages):
|
696
|
+
raise TypeError("When assigning to a slice, the value must be a Messages object.")
|
686
697
|
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
698
|
+
start, stop, step = index.indices(len(self._messages))
|
699
|
+
if step != 1:
|
700
|
+
raise ValueError("Slice assignment with step is not supported.")
|
701
|
+
|
702
|
+
# Remove old providers from the index
|
703
|
+
for i in range(start, stop):
|
704
|
+
for provider in self._messages[i].provider():
|
705
|
+
self._notify_provider_removed(provider)
|
706
|
+
|
707
|
+
# Replace the slice in the list
|
708
|
+
self._messages[start:stop] = value._messages
|
709
|
+
|
710
|
+
# Add new providers to the index and set parent
|
711
|
+
for msg in value:
|
712
|
+
msg._parent_messages = self
|
713
|
+
for provider in msg.provider():
|
714
|
+
self._notify_provider_added(provider, msg)
|
715
|
+
else:
|
716
|
+
raise TypeError("Unsupported operand type(s) for assignment")
|
692
717
|
|
693
718
|
def __len__(self) -> int: return len(self._messages)
|
694
719
|
def __iter__(self): return iter(self._messages)
|
@@ -1158,7 +1158,46 @@ Current time: {Texts(lambda: datetime.now().strftime("%Y-%m-%d %H:%M:%S"))}
|
|
1158
1158
|
with self.assertRaises(IndexError):
|
1159
1159
|
_ = mess[2]
|
1160
1160
|
|
1161
|
-
async def
|
1161
|
+
async def test_zb_fstring_provider_invisible_on_init(self):
|
1162
|
+
"""测试在f-string中初始化的provider可以被设置为不可见"""
|
1163
|
+
|
1164
|
+
# 1. 在 f-string 中初始化一个 provider 并设置 visible=False
|
1165
|
+
# 在修改前,这会因为 __init__ 不接受 'visible' 参数而失败
|
1166
|
+
message_with_invisible_provider = f"""
|
1167
|
+
Tools: {Tools(tools_json=[{"name": "should_not_appear"}], visible=False)}
|
1168
|
+
Files: {Files(visible=True, name="files")}
|
1169
|
+
"""
|
1170
|
+
|
1171
|
+
messages = Messages(UserMessage(message_with_invisible_provider))
|
1172
|
+
|
1173
|
+
# 2. 准备 Files provider 的内容
|
1174
|
+
test_file = "test_invisible_fstring.txt"
|
1175
|
+
with open(test_file, "w") as f:
|
1176
|
+
f.write("visible content")
|
1177
|
+
|
1178
|
+
try:
|
1179
|
+
files_provider = messages.provider("files")
|
1180
|
+
self.assertIsNotNone(files_provider)
|
1181
|
+
files_provider.update(test_file)
|
1182
|
+
|
1183
|
+
# 3. 渲染并验证
|
1184
|
+
rendered = await messages.render_latest()
|
1185
|
+
self.assertEqual(len(rendered), 1)
|
1186
|
+
content = rendered[0]['content']
|
1187
|
+
|
1188
|
+
# 4. 验证不可见的 provider 的内容没有出现
|
1189
|
+
self.assertNotIn("<tools>", content)
|
1190
|
+
self.assertNotIn("should_not_appear", content)
|
1191
|
+
|
1192
|
+
# 5. 验证可见的 provider 的内容正常出现
|
1193
|
+
self.assertIn("<latest_file_content>", content)
|
1194
|
+
self.assertIn("visible content", content)
|
1195
|
+
|
1196
|
+
finally:
|
1197
|
+
if os.path.exists(test_file):
|
1198
|
+
os.remove(test_file)
|
1199
|
+
|
1200
|
+
async def test_zc_message_provider_by_name(self):
|
1162
1201
|
"""测试是否可以通过名称从 Message 对象中获取 provider"""
|
1163
1202
|
# 1. 创建一个包含命名 provider 的 Message
|
1164
1203
|
message = UserMessage(
|
@@ -1182,7 +1221,7 @@ Current time: {Texts(lambda: datetime.now().strftime("%Y-%m-%d %H:%M:%S"))}
|
|
1182
1221
|
non_existent_provider = message.provider("non_existent")
|
1183
1222
|
self.assertIsNone(non_existent_provider)
|
1184
1223
|
|
1185
|
-
async def
|
1224
|
+
async def test_zd_slicing_support(self):
|
1186
1225
|
"""测试 Messages 对象是否支持切片操作"""
|
1187
1226
|
m1 = SystemMessage("1")
|
1188
1227
|
m2 = UserMessage("2")
|
@@ -1217,7 +1256,7 @@ Current time: {Texts(lambda: datetime.now().strftime("%Y-%m-%d %H:%M:%S"))}
|
|
1217
1256
|
self.assertEqual(len(sliced_single), 1)
|
1218
1257
|
self.assertIs(sliced_single[0], m3)
|
1219
1258
|
|
1220
|
-
async def
|
1259
|
+
async def test_ze_slice_assignment(self):
|
1221
1260
|
"""测试 Messages 对象的切片赋值功能"""
|
1222
1261
|
# 1. Setup initial Messages objects
|
1223
1262
|
m1 = SystemMessage("1")
|
@@ -1258,7 +1297,7 @@ Current time: {Texts(lambda: datetime.now().strftime("%Y-%m-%d %H:%M:%S"))}
|
|
1258
1297
|
self.assertEqual(messages3[2].content, "C")
|
1259
1298
|
self.assertIsInstance(messages3[1], AssistantMessage)
|
1260
1299
|
|
1261
|
-
async def
|
1300
|
+
async def test_zf_fstring_lambda_serialization(self):
|
1262
1301
|
"""测试包含 lambda 的 f-string 消息是否可以被序列化和反序列化"""
|
1263
1302
|
import platform
|
1264
1303
|
import os
|
@@ -1302,6 +1341,74 @@ Current time: {Texts(lambda: datetime.now().strftime("%Y-%m-%d %H:%M:%S"))}
|
|
1302
1341
|
if os.path.exists(test_file_path):
|
1303
1342
|
os.remove(test_file_path)
|
1304
1343
|
|
1344
|
+
async def test_zg_provider_plus_message_addition(self):
|
1345
|
+
"""测试所有 ContextProvider 子类与 Message 子类相加的功能"""
|
1346
|
+
# 1. 准备 providers
|
1347
|
+
text_provider = Texts("Some text.")
|
1348
|
+
tools_provider = Tools([{"name": "a_tool"}])
|
1349
|
+
|
1350
|
+
test_file = "test_provider_addition.txt"
|
1351
|
+
with open(test_file, "w") as f: f.write("File content.")
|
1352
|
+
files_provider = Files(test_file)
|
1353
|
+
|
1354
|
+
providers_to_test = [text_provider, tools_provider, files_provider]
|
1355
|
+
|
1356
|
+
# 2. 准备 message aclsdd
|
1357
|
+
messages_to_test = [
|
1358
|
+
UserMessage(Texts("Initial user message.")),
|
1359
|
+
SystemMessage(Texts("Initial system message.")),
|
1360
|
+
AssistantMessage(Texts("Initial assistant message."))
|
1361
|
+
]
|
1362
|
+
|
1363
|
+
try:
|
1364
|
+
for provider in providers_to_test:
|
1365
|
+
for message in messages_to_test:
|
1366
|
+
with self.subTest(provider=type(provider).__name__, message=type(message).__name__):
|
1367
|
+
# 执行加法操作
|
1368
|
+
result_message = provider + message
|
1369
|
+
|
1370
|
+
# 验证结果类型是否与原始 message 相同
|
1371
|
+
self.assertIsInstance(result_message, type(message), f"结果应为 {type(message).__name__} 类型")
|
1372
|
+
|
1373
|
+
# 验证 provider 数量
|
1374
|
+
self.assertEqual(len(result_message), 2, "结果消息应包含两个 provider")
|
1375
|
+
|
1376
|
+
# 验证 provider 的类型和顺序
|
1377
|
+
result_providers = result_message.provider()
|
1378
|
+
self.assertIsInstance(result_providers[0], type(provider), f"第一个 provider 应为 {type(provider).__name__} 类型")
|
1379
|
+
self.assertIsInstance(result_providers[1], Texts, "第二个 provider 应为 Texts 类型")
|
1380
|
+
|
1381
|
+
# 验证原始消息没有被修改
|
1382
|
+
self.assertEqual(len(message), 1)
|
1383
|
+
|
1384
|
+
finally:
|
1385
|
+
# 3. 清理文件
|
1386
|
+
if os.path.exists(test_file):
|
1387
|
+
os.remove(test_file)
|
1388
|
+
|
1389
|
+
async def test_zh_provider_plus_message_assignment(self):
|
1390
|
+
"""测试 ContextProvider + Message 的结果可以赋值回 Messages 列表"""
|
1391
|
+
# 1. 准备 provider 和 messages
|
1392
|
+
text_provider = Texts("Prefix text.")
|
1393
|
+
messages = Messages(
|
1394
|
+
UserMessage("Initial user message.")
|
1395
|
+
)
|
1396
|
+
|
1397
|
+
# 2. 执行操作
|
1398
|
+
# 这行代码在修改 __setitem__ 之前应该会失败
|
1399
|
+
messages[0] = text_provider + messages[0]
|
1400
|
+
|
1401
|
+
# 3. 验证结果
|
1402
|
+
self.assertEqual(len(messages), 1)
|
1403
|
+
self.assertEqual(len(messages[0]), 2) # Now UserMessage has two providers
|
1404
|
+
|
1405
|
+
# 4. 验证内容
|
1406
|
+
rendered = await messages.render_latest()
|
1407
|
+
self.assertEqual(rendered[0]['content'], "Prefix text.Initial user message.")
|
1408
|
+
|
1409
|
+
# 5. 验证 provider 索引
|
1410
|
+
self.assertIsNotNone(messages.provider(text_provider.name))
|
1411
|
+
|
1305
1412
|
|
1306
1413
|
# ==============================================================================
|
1307
1414
|
# 6. 演示
|
@@ -586,6 +586,9 @@ class chatgpt(BaseLLM):
|
|
586
586
|
if tool_name == "read_file" and "<tool_error>" not in tool_response:
|
587
587
|
self.conversation[convo_id].provider("files").update(tool_info['parameter']["file_path"], tool_response)
|
588
588
|
all_responses.append(f"[{tool_name}({tool_args}) Result]:\n\nRead file successfully! The file content has been updated in the tag <latest_file_content>.")
|
589
|
+
if tool_name == "get_knowledge_graph_tree" and "<tool_error>" not in tool_response:
|
590
|
+
self.conversation[convo_id].provider("knowledge_graph").visible = True
|
591
|
+
all_responses.append(f"[{tool_name}({tool_args}) Result]:\n\nGet knowledge graph tree successfully! The knowledge graph tree has been updated in the tag <knowledge_graph_tree>.")
|
589
592
|
elif tool_name == "write_to_file" and "<tool_error>" not in tool_response:
|
590
593
|
all_responses.append(f"[{tool_name} Result]:\n\n{tool_response}")
|
591
594
|
elif tool_name == "read_image" and "<tool_error>" not in tool_response:
|
beswarm/prompt.py
CHANGED
@@ -19,14 +19,14 @@ class Goal(Texts):
|
|
19
19
|
return f"<goal>{content}</goal>"
|
20
20
|
|
21
21
|
class KnowledgeGraph(Texts):
|
22
|
-
def __init__(self, text: Optional[Union[str, Callable[[], str]]] = None, name: str = "knowledge_graph"):
|
23
|
-
super().__init__(text=text, name=name)
|
22
|
+
def __init__(self, text: Optional[Union[str, Callable[[], str]]] = None, name: str = "knowledge_graph", visible: bool = False):
|
23
|
+
super().__init__(text=text, name=name, visible=visible)
|
24
24
|
|
25
25
|
async def render(self) -> Optional[str]:
|
26
26
|
content = await super().render()
|
27
27
|
if content is None:
|
28
28
|
return None
|
29
|
-
return f"<
|
29
|
+
return f"<knowledge_graph_tree>{content}</knowledge_graph_tree>"
|
30
30
|
|
31
31
|
worker_system_prompt = SystemMessage(f"""
|
32
32
|
<communication>
|
@@ -123,6 +123,10 @@ Always adhere to this format for all tool uses to ensure proper parsing and exec
|
|
123
123
|
You can use tools as follows:
|
124
124
|
|
125
125
|
{Tools()}
|
126
|
+
|
127
|
+
{Files()}
|
128
|
+
|
129
|
+
{KnowledgeGraph(name="knowledge_graph", text=lambda: kgm.render_tree(), visible=False)}
|
126
130
|
""")
|
127
131
|
|
128
132
|
instruction_system_prompt = SystemMessage(f"""
|
@@ -242,9 +246,7 @@ git clone https://github.com/username/project-name.git
|
|
242
246
|
工作智能体仅可以使用如下工具:
|
243
247
|
{Tools()}
|
244
248
|
|
245
|
-
{
|
246
|
-
|
247
|
-
{KnowledgeGraph(name="knowledge_graph", text=lambda: kgm.render_tree())}
|
249
|
+
{KnowledgeGraph(name="knowledge_graph", text=lambda: kgm.render_tree(), visible=False)}
|
248
250
|
<work_agent_conversation_start>""")
|
249
251
|
|
250
252
|
definition = """
|
@@ -2,16 +2,16 @@ beswarm/__init__.py,sha256=HZjUOJtZR5QhMuDbq-wukQQn1VrBusNWai_ysGo-VVI,20
|
|
2
2
|
beswarm/broker.py,sha256=64Y-djrKYaZfBQ8obwHOmr921QgZeu9BtScZWaYLfDo,9887
|
3
3
|
beswarm/core.py,sha256=jKStpTTOu6Ojond_i-okTZLrvSAJ4yUoTZwtDfFTiRs,553
|
4
4
|
beswarm/knowledge_graph.py,sha256=oiOMknAJzGrOHc2AyQgvrCcZAkGLhFnsnvSBdfFBWMw,14831
|
5
|
-
beswarm/prompt.py,sha256=
|
5
|
+
beswarm/prompt.py,sha256=yuIDzFnU4nFmaZ4st_tS14W7RI_bvDDpaoTJYEuZTo4,34285
|
6
6
|
beswarm/taskmanager.py,sha256=vMmcoZ4FlNvjEliRkv3AniPji50NcY4Q1_2HETzR0DU,12226
|
7
7
|
beswarm/utils.py,sha256=0J-b38P5QGT-A_38co7FjzaUNJykaskI7mbbcQ4w_68,8215
|
8
8
|
beswarm/agents/chatgroup.py,sha256=PzrmRcDKAbB7cxL16nMod_CzPosDV6bfTmXxQVuv-AQ,12012
|
9
|
-
beswarm/agents/planact.py,sha256=
|
9
|
+
beswarm/agents/planact.py,sha256=3Fu1fd7byZ1_wsK1KntMSfU-BnMgn5mjHLGnX59yGIs,18205
|
10
10
|
beswarm/aient/aient/__init__.py,sha256=SRfF7oDVlOOAi6nGKiJIUK6B_arqYLO9iSMp-2IZZps,21
|
11
11
|
beswarm/aient/aient/architext/architext/__init__.py,sha256=79Ih1151rfcqZdr7F8HSZSTs_iT2SKd1xCkehMsXeXs,19
|
12
|
-
beswarm/aient/aient/architext/architext/core.py,sha256=
|
12
|
+
beswarm/aient/aient/architext/architext/core.py,sha256=IHN1d8Pe1oqaFSS1EQ3OpxCJydiLB3goL5n2uohr5Q8,29737
|
13
13
|
beswarm/aient/aient/architext/test/openai_client.py,sha256=Dqtbmubv6vwF8uBqcayG0kbsiO65of7sgU2-DRBi-UM,4590
|
14
|
-
beswarm/aient/aient/architext/test/test.py,sha256=
|
14
|
+
beswarm/aient/aient/architext/test/test.py,sha256=o_lxUYqGnt3gAlIKBqxNe9OrqT5v7sjlPXKMVO6e5uw,65629
|
15
15
|
beswarm/aient/aient/architext/test/test_save_load.py,sha256=o8DqH6gDYZkFkQy-a7blqLtJTRj5e4a-Lil48pJ0V3g,3260
|
16
16
|
beswarm/aient/aient/core/__init__.py,sha256=NxjebTlku35S4Dzr16rdSqSTWUvvwEeACe8KvHJnjPg,34
|
17
17
|
beswarm/aient/aient/core/log_config.py,sha256=kz2_yJv1p-o3lUQOwA3qh-LSc3wMHv13iCQclw44W9c,274
|
@@ -26,7 +26,7 @@ beswarm/aient/aient/core/test/test_payload.py,sha256=8jBiJY1uidm1jzL-EiK0s6UGmW9
|
|
26
26
|
beswarm/aient/aient/models/__init__.py,sha256=ZTiZgbfBPTjIPSKURE7t6hlFBVLRS9lluGbmqc1WjxQ,43
|
27
27
|
beswarm/aient/aient/models/audio.py,sha256=kRd-8-WXzv4vwvsTGwnstK-WR8--vr9CdfCZzu8y9LA,1934
|
28
28
|
beswarm/aient/aient/models/base.py,sha256=-nnihYnx-vHZMqeVO9ljjt3k4FcD3n-iMk4tT-10nRQ,7232
|
29
|
-
beswarm/aient/aient/models/chatgpt.py,sha256=
|
29
|
+
beswarm/aient/aient/models/chatgpt.py,sha256=gEOwukH-t9bHbW9ctyYiQ671NeHyIz8yP1QG4fLTKY8,42604
|
30
30
|
beswarm/aient/aient/plugins/__init__.py,sha256=p3KO6Aa3Lupos4i2SjzLQw1hzQTigOAfEHngsldrsyk,986
|
31
31
|
beswarm/aient/aient/plugins/arXiv.py,sha256=yHjb6PS3GUWazpOYRMKMzghKJlxnZ5TX8z9F6UtUVow,1461
|
32
32
|
beswarm/aient/aient/plugins/config.py,sha256=TGgZ5SnNKZ8MmdznrZ-TEq7s2ulhAAwTSKH89bci3dA,7079
|
@@ -121,7 +121,7 @@ beswarm/tools/search_web.py,sha256=0fTeczXiOX_LJQGaLEGbuJtIPzofeuquGWEt3yDMtVw,1
|
|
121
121
|
beswarm/tools/subtasks.py,sha256=4wJWNAqRFgvwmDOP12SddYo_OteWBU5cLhLBh6xILk8,10492
|
122
122
|
beswarm/tools/worker.py,sha256=mQ1qdrQ8MgL99byAbTvxfEByFFGN9mty3UHqHjARMQ8,2331
|
123
123
|
beswarm/tools/write_csv.py,sha256=u0Hq18Ksfheb52MVtyLNCnSDHibITpsYBPs2ub7USYA,1466
|
124
|
-
beswarm-0.2.
|
125
|
-
beswarm-0.2.
|
126
|
-
beswarm-0.2.
|
127
|
-
beswarm-0.2.
|
124
|
+
beswarm-0.2.85.dist-info/METADATA,sha256=Kgu_r1BYQXoJwR0QQZ1c_-sTpDvSovAQDRvlx2aISDw,3878
|
125
|
+
beswarm-0.2.85.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
126
|
+
beswarm-0.2.85.dist-info/top_level.txt,sha256=pJw4O87wvt5882smuSO6DfByJz7FJ8SxxT8h9fHCmpo,8
|
127
|
+
beswarm-0.2.85.dist-info/RECORD,,
|
File without changes
|
File without changes
|