meshagent-agents 0.6.2__py3-none-any.whl → 0.6.3__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.
- meshagent/agents/agent.py +34 -31
- meshagent/agents/mail.py +190 -176
- meshagent/agents/version.py +1 -1
- {meshagent_agents-0.6.2.dist-info → meshagent_agents-0.6.3.dist-info}/METADATA +6 -6
- {meshagent_agents-0.6.2.dist-info → meshagent_agents-0.6.3.dist-info}/RECORD +8 -8
- {meshagent_agents-0.6.2.dist-info → meshagent_agents-0.6.3.dist-info}/WHEEL +0 -0
- {meshagent_agents-0.6.2.dist-info → meshagent_agents-0.6.3.dist-info}/licenses/LICENSE +0 -0
- {meshagent_agents-0.6.2.dist-info → meshagent_agents-0.6.3.dist-info}/top_level.txt +0 -0
meshagent/agents/agent.py
CHANGED
|
@@ -194,46 +194,49 @@ class SingleRoomAgent(Agent):
|
|
|
194
194
|
builtin_agents_url = "http://localhost:8080"
|
|
195
195
|
|
|
196
196
|
for requirement in self.requires:
|
|
197
|
-
if
|
|
198
|
-
if requirement
|
|
199
|
-
|
|
200
|
-
|
|
197
|
+
if requirement.callable:
|
|
198
|
+
if isinstance(requirement, RequiredToolkit):
|
|
199
|
+
if requirement.name == "ui":
|
|
200
|
+
# TODO: maybe requirements can be marked as non installable?
|
|
201
|
+
continue
|
|
201
202
|
|
|
202
|
-
|
|
203
|
-
|
|
203
|
+
if requirement.name not in toolkits_by_name:
|
|
204
|
+
installed = True
|
|
204
205
|
|
|
205
|
-
|
|
206
|
+
logger.info(
|
|
207
|
+
f"calling required tool into room {requirement.name}"
|
|
208
|
+
)
|
|
206
209
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
210
|
+
if requirement.name.startswith(
|
|
211
|
+
"https://"
|
|
212
|
+
) or requirement.name.startswith("http://"):
|
|
213
|
+
url = requirement.name
|
|
214
|
+
else:
|
|
215
|
+
url = f"{builtin_agents_url}/toolkits/{requirement.name}"
|
|
213
216
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
+
await self._room.agents.make_call(
|
|
218
|
+
url=url, name=requirement.name, arguments={}
|
|
219
|
+
)
|
|
217
220
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
+
elif isinstance(requirement, RequiredSchema):
|
|
222
|
+
if requirement.name not in schemas_by_name:
|
|
223
|
+
installed = True
|
|
221
224
|
|
|
222
|
-
|
|
225
|
+
logger.info(f"Installing required schema {requirement.name}")
|
|
223
226
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
227
|
+
if requirement.name.startswith(
|
|
228
|
+
"https://"
|
|
229
|
+
) or requirement.name.startswith("http://"):
|
|
230
|
+
url = requirement.name
|
|
231
|
+
else:
|
|
232
|
+
url = f"{builtin_agents_url}/schemas/{requirement.name}"
|
|
230
233
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
+
await self._room.agents.make_call(
|
|
235
|
+
url=url, name=requirement.name, arguments={}
|
|
236
|
+
)
|
|
234
237
|
|
|
235
|
-
|
|
236
|
-
|
|
238
|
+
else:
|
|
239
|
+
raise RoomException("unsupported requirement")
|
|
237
240
|
|
|
238
241
|
if installed:
|
|
239
242
|
await asyncio.sleep(5)
|
meshagent/agents/mail.py
CHANGED
|
@@ -31,172 +31,6 @@ class MailThreadContext:
|
|
|
31
31
|
self.message = message
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
def create_reply_email_message(
|
|
35
|
-
*, message: dict, from_address: str, body: str
|
|
36
|
-
) -> EmailMessage:
|
|
37
|
-
subject: str = message.get("subject")
|
|
38
|
-
|
|
39
|
-
if not subject.startswith("RE:"):
|
|
40
|
-
subject = "RE: " + subject
|
|
41
|
-
|
|
42
|
-
_, addr = email.utils.parseaddr(from_address)
|
|
43
|
-
domain = addr.split("@")[-1].lower()
|
|
44
|
-
id = f"<{uuid.uuid4()}@{domain}>"
|
|
45
|
-
|
|
46
|
-
msg = EmailMessage()
|
|
47
|
-
msg["Message-ID"] = id
|
|
48
|
-
msg["Subject"] = subject
|
|
49
|
-
msg["From"] = from_address
|
|
50
|
-
msg["To"] = message.get("reply_to")
|
|
51
|
-
msg["In-Reply-To"] = message.get("id")
|
|
52
|
-
msg.set_content(body)
|
|
53
|
-
|
|
54
|
-
return msg
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def message_to_json(*, message: EmailMessage, role: MessageRole):
|
|
58
|
-
body_part = message.get_body(
|
|
59
|
-
("plain", "html")
|
|
60
|
-
) # returns the “best” part :contentReference[oaicite:0]{index=0}
|
|
61
|
-
if body_part:
|
|
62
|
-
body = body_part.get_content()
|
|
63
|
-
else: # simple, non-MIME message
|
|
64
|
-
body = message.get_content()
|
|
65
|
-
|
|
66
|
-
id = message.get("Message-ID")
|
|
67
|
-
if id is None:
|
|
68
|
-
mfrom = message.get("From")
|
|
69
|
-
_, addr = email.utils.parseaddr(mfrom)
|
|
70
|
-
domain = addr.split("@")[-1].lower()
|
|
71
|
-
id = f"{uuid.uuid4()}@{domain}"
|
|
72
|
-
|
|
73
|
-
return {
|
|
74
|
-
"id": id,
|
|
75
|
-
"in_reply_to": message.get("In-Reply-To"),
|
|
76
|
-
"reply_to": message.get("Reply-To", message.get("From")),
|
|
77
|
-
"references": message.get("References"),
|
|
78
|
-
"from": message.get("From"),
|
|
79
|
-
"to": message.get_all("To"),
|
|
80
|
-
"subject": message.get("Subject"),
|
|
81
|
-
"body": body,
|
|
82
|
-
"attachments": [],
|
|
83
|
-
"role": role,
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
async def load_message(*, room: RoomClient, message_id: str) -> dict | None:
|
|
88
|
-
messages = await room.database.search(table="emails", where={"id": message_id})
|
|
89
|
-
|
|
90
|
-
if len(messages) == 0:
|
|
91
|
-
return None
|
|
92
|
-
|
|
93
|
-
return json.loads(messages[0]["json"])
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
async def save_email_message(
|
|
97
|
-
*, room: RoomClient, content: bytes, role: MessageRole
|
|
98
|
-
) -> dict:
|
|
99
|
-
message = message_from_bytes(content, policy=default)
|
|
100
|
-
|
|
101
|
-
now = datetime.now(timezone.utc)
|
|
102
|
-
|
|
103
|
-
folder_path = (
|
|
104
|
-
now.strftime("%Y/%m/%d")
|
|
105
|
-
+ "/"
|
|
106
|
-
+ now.strftime("%H/%M/%S")
|
|
107
|
-
+ "/"
|
|
108
|
-
+ secrets.token_hex(3)
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
queued_message = message_to_json(message=message, role=role)
|
|
112
|
-
message_id = queued_message["id"]
|
|
113
|
-
|
|
114
|
-
queued_message["role"] = role
|
|
115
|
-
|
|
116
|
-
queued_message["path"] = f".emails/{message_id}/message.json"
|
|
117
|
-
|
|
118
|
-
for part in (
|
|
119
|
-
message.iter_attachments()
|
|
120
|
-
): # ↔ only the “real” attachments :contentReference[oaicite:0]{index=0}
|
|
121
|
-
fname = (
|
|
122
|
-
part.get_filename() or "attachment.bin"
|
|
123
|
-
) # RFC 2183 filename, if any :contentReference[oaicite:1]{index=1}
|
|
124
|
-
|
|
125
|
-
# get_content() auto-decodes transfer-encodings; returns
|
|
126
|
-
# *str* for text/*, *bytes* for everything else :contentReference[oaicite:2]{index=2}
|
|
127
|
-
data = part.get_content()
|
|
128
|
-
|
|
129
|
-
# make sure we write binary data
|
|
130
|
-
bin_data = (
|
|
131
|
-
data.encode(part.get_content_charset("utf-8"))
|
|
132
|
-
if isinstance(data, str)
|
|
133
|
-
else data
|
|
134
|
-
)
|
|
135
|
-
|
|
136
|
-
path = f".emails/{folder_path}/attachments/{fname}"
|
|
137
|
-
handle = await room.storage.open(path=path)
|
|
138
|
-
try:
|
|
139
|
-
logger.info(f"writing content to {path}")
|
|
140
|
-
await room.storage.write(handle=handle, data=bin_data)
|
|
141
|
-
finally:
|
|
142
|
-
await room.storage.close(handle=handle)
|
|
143
|
-
|
|
144
|
-
queued_message["attachments"].append(path)
|
|
145
|
-
|
|
146
|
-
logger.info(f"received mail, {queued_message}")
|
|
147
|
-
|
|
148
|
-
# write email
|
|
149
|
-
path = f".emails/{folder_path}/message.eml"
|
|
150
|
-
handle = await room.storage.open(path=path)
|
|
151
|
-
try:
|
|
152
|
-
logger.info(f"writing source message.eml to {path}")
|
|
153
|
-
await room.storage.write(handle=handle, data=content)
|
|
154
|
-
finally:
|
|
155
|
-
await room.storage.close(handle=handle)
|
|
156
|
-
|
|
157
|
-
path = f".emails/{folder_path}/message.json"
|
|
158
|
-
handle = await room.storage.open(path=path)
|
|
159
|
-
try:
|
|
160
|
-
logger.info(f"writing source message.json to {path}")
|
|
161
|
-
await room.storage.write(
|
|
162
|
-
handle=handle, data=json.dumps(queued_message, indent=4).encode("utf-8")
|
|
163
|
-
)
|
|
164
|
-
finally:
|
|
165
|
-
await room.storage.close(handle=handle)
|
|
166
|
-
|
|
167
|
-
# create email table if it doesn't exist
|
|
168
|
-
tables = await room.database.list_tables()
|
|
169
|
-
|
|
170
|
-
if "emails" not in tables:
|
|
171
|
-
await room.database.create_table_with_schema(
|
|
172
|
-
name="emails",
|
|
173
|
-
schema={"id": TextDataType(), "json": TextDataType()},
|
|
174
|
-
mode="create_if_not_exists",
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
await room.database.create_scalar_index(table="emails", column="id")
|
|
178
|
-
|
|
179
|
-
await room.database.insert(
|
|
180
|
-
table="emails", records=[{"id": message_id, "json": json.dumps(queued_message)}]
|
|
181
|
-
)
|
|
182
|
-
|
|
183
|
-
return queued_message
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
async def load_thread(*, room: RoomClient, message: dict, thread: list[dict]):
|
|
187
|
-
in_reply_to = message.get("in_reply_to", None)
|
|
188
|
-
if in_reply_to is not None:
|
|
189
|
-
source = await load_message(room=room, message_id=in_reply_to)
|
|
190
|
-
|
|
191
|
-
if source is not None:
|
|
192
|
-
thread.insert(0, source)
|
|
193
|
-
|
|
194
|
-
await load_thread(room=room, message=source, thread=thread)
|
|
195
|
-
|
|
196
|
-
else:
|
|
197
|
-
logger.warning(f"message not found {in_reply_to}")
|
|
198
|
-
|
|
199
|
-
|
|
200
34
|
class SmtpConfiguration:
|
|
201
35
|
def __init__(
|
|
202
36
|
self,
|
|
@@ -258,11 +92,154 @@ class MailWorker(Worker):
|
|
|
258
92
|
)
|
|
259
93
|
self._email_address = email_address
|
|
260
94
|
|
|
261
|
-
async def
|
|
262
|
-
|
|
95
|
+
async def load_message(self, *, room: RoomClient, message_id: str) -> dict | None:
|
|
96
|
+
messages = await room.database.search(table="emails", where={"id": message_id})
|
|
97
|
+
|
|
98
|
+
if len(messages) == 0:
|
|
99
|
+
return None
|
|
100
|
+
|
|
101
|
+
return json.loads(messages[0]["json"])
|
|
102
|
+
|
|
103
|
+
def message_to_json(self, *, message: EmailMessage, role: MessageRole):
|
|
104
|
+
body_part = message.get_body(
|
|
105
|
+
("plain", "html")
|
|
106
|
+
) # returns the “best” part :contentReference[oaicite:0]{index=0}
|
|
107
|
+
if body_part:
|
|
108
|
+
body = body_part.get_content()
|
|
109
|
+
else: # simple, non-MIME message
|
|
110
|
+
body = message.get_content()
|
|
111
|
+
|
|
112
|
+
id = message.get("Message-ID")
|
|
113
|
+
if id is None:
|
|
114
|
+
mfrom = message.get("From")
|
|
115
|
+
_, addr = email.utils.parseaddr(mfrom)
|
|
116
|
+
domain = addr.split("@")[-1].lower()
|
|
117
|
+
id = f"{uuid.uuid4()}@{domain}"
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
"id": id,
|
|
121
|
+
"in_reply_to": message.get("In-Reply-To"),
|
|
122
|
+
"reply_to": message.get("Reply-To", message.get("From")),
|
|
123
|
+
"references": message.get("References"),
|
|
124
|
+
"from": message.get("From"),
|
|
125
|
+
"to": message.get_all("To"),
|
|
126
|
+
"subject": message.get("Subject"),
|
|
127
|
+
"body": body,
|
|
128
|
+
"attachments": [],
|
|
129
|
+
"role": role,
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
async def save_email_message(
|
|
133
|
+
self, *, room: RoomClient, content: bytes, role: MessageRole
|
|
134
|
+
) -> dict:
|
|
135
|
+
message = message_from_bytes(content, policy=default)
|
|
136
|
+
|
|
137
|
+
now = datetime.now(timezone.utc)
|
|
138
|
+
|
|
139
|
+
folder_path = (
|
|
140
|
+
now.strftime("%Y/%m/%d")
|
|
141
|
+
+ "/"
|
|
142
|
+
+ now.strftime("%H/%M/%S")
|
|
143
|
+
+ "/"
|
|
144
|
+
+ secrets.token_hex(3)
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
queued_message = self.message_to_json(message=message, role=role)
|
|
148
|
+
message_id = queued_message["id"]
|
|
149
|
+
|
|
150
|
+
queued_message["role"] = role
|
|
151
|
+
|
|
152
|
+
queued_message["path"] = f".emails/{message_id}/message.json"
|
|
153
|
+
|
|
154
|
+
for part in (
|
|
155
|
+
message.iter_attachments()
|
|
156
|
+
): # ↔ only the “real” attachments :contentReference[oaicite:0]{index=0}
|
|
157
|
+
fname = (
|
|
158
|
+
part.get_filename() or "attachment.bin"
|
|
159
|
+
) # RFC 2183 filename, if any :contentReference[oaicite:1]{index=1}
|
|
160
|
+
|
|
161
|
+
# get_content() auto-decodes transfer-encodings; returns
|
|
162
|
+
# *str* for text/*, *bytes* for everything else :contentReference[oaicite:2]{index=2}
|
|
163
|
+
data = part.get_content()
|
|
164
|
+
|
|
165
|
+
# make sure we write binary data
|
|
166
|
+
bin_data = (
|
|
167
|
+
data.encode(part.get_content_charset("utf-8"))
|
|
168
|
+
if isinstance(data, str)
|
|
169
|
+
else data
|
|
170
|
+
)
|
|
263
171
|
|
|
264
|
-
|
|
172
|
+
path = f".emails/{folder_path}/attachments/{fname}"
|
|
173
|
+
handle = await room.storage.open(path=path)
|
|
174
|
+
try:
|
|
175
|
+
logger.info(f"writing content to {path}")
|
|
176
|
+
await room.storage.write(handle=handle, data=bin_data)
|
|
177
|
+
finally:
|
|
178
|
+
await room.storage.close(handle=handle)
|
|
265
179
|
|
|
180
|
+
queued_message["attachments"].append(path)
|
|
181
|
+
|
|
182
|
+
logger.info(f"received mail, {queued_message}")
|
|
183
|
+
|
|
184
|
+
# write email
|
|
185
|
+
path = f".emails/{folder_path}/message.eml"
|
|
186
|
+
handle = await room.storage.open(path=path)
|
|
187
|
+
try:
|
|
188
|
+
logger.info(f"writing source message.eml to {path}")
|
|
189
|
+
await room.storage.write(handle=handle, data=content)
|
|
190
|
+
finally:
|
|
191
|
+
await room.storage.close(handle=handle)
|
|
192
|
+
|
|
193
|
+
path = f".emails/{folder_path}/message.json"
|
|
194
|
+
handle = await room.storage.open(path=path)
|
|
195
|
+
try:
|
|
196
|
+
logger.info(f"writing source message.json to {path}")
|
|
197
|
+
await room.storage.write(
|
|
198
|
+
handle=handle, data=json.dumps(queued_message, indent=4).encode("utf-8")
|
|
199
|
+
)
|
|
200
|
+
finally:
|
|
201
|
+
await room.storage.close(handle=handle)
|
|
202
|
+
|
|
203
|
+
# create email table if it doesn't exist
|
|
204
|
+
tables = await room.database.list_tables()
|
|
205
|
+
|
|
206
|
+
if "emails" not in tables:
|
|
207
|
+
await room.database.create_table_with_schema(
|
|
208
|
+
name="emails",
|
|
209
|
+
schema={"id": TextDataType(), "json": TextDataType()},
|
|
210
|
+
mode="create_if_not_exists",
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
await room.database.create_scalar_index(table="emails", column="id")
|
|
214
|
+
|
|
215
|
+
await room.database.insert(
|
|
216
|
+
table="emails",
|
|
217
|
+
records=[{"id": message_id, "json": json.dumps(queued_message)}],
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
return queued_message
|
|
221
|
+
|
|
222
|
+
async def load_thread(self, *, room: RoomClient, message: dict, thread: list[dict]):
|
|
223
|
+
in_reply_to = message.get("in_reply_to", None)
|
|
224
|
+
if in_reply_to is not None:
|
|
225
|
+
source = await self.load_message(room=room, message_id=in_reply_to)
|
|
226
|
+
|
|
227
|
+
if source is not None:
|
|
228
|
+
thread.insert(0, source)
|
|
229
|
+
|
|
230
|
+
await self.load_thread(room=room, message=source, thread=thread)
|
|
231
|
+
|
|
232
|
+
else:
|
|
233
|
+
logger.warning(f"message not found {in_reply_to}")
|
|
234
|
+
|
|
235
|
+
async def append_message_context(
|
|
236
|
+
self,
|
|
237
|
+
*,
|
|
238
|
+
room: RoomClient,
|
|
239
|
+
message: dict,
|
|
240
|
+
chat_context: AgentChatContext,
|
|
241
|
+
thread: list[dict],
|
|
242
|
+
):
|
|
266
243
|
for msg in thread:
|
|
267
244
|
if msg["role"] == "agent":
|
|
268
245
|
chat_context.append_assistant_message(json.dumps(msg))
|
|
@@ -275,18 +252,33 @@ class MailWorker(Worker):
|
|
|
275
252
|
room=room, message=message, chat_context=chat_context
|
|
276
253
|
)
|
|
277
254
|
|
|
278
|
-
async def process_message(
|
|
255
|
+
async def process_message(
|
|
256
|
+
self,
|
|
257
|
+
*,
|
|
258
|
+
chat_context: AgentChatContext,
|
|
259
|
+
room: RoomClient,
|
|
260
|
+
message: dict,
|
|
261
|
+
toolkits: list[Toolkit],
|
|
262
|
+
):
|
|
279
263
|
message_bytes = base64.b64decode(message["base64"])
|
|
280
264
|
|
|
281
|
-
message = await save_email_message(
|
|
265
|
+
message = await self.save_email_message(
|
|
282
266
|
room=room, content=message_bytes, role="agent"
|
|
283
267
|
)
|
|
284
268
|
|
|
285
|
-
|
|
286
|
-
|
|
269
|
+
thread = [message]
|
|
270
|
+
|
|
271
|
+
await self.load_thread(room=room, message=message, thread=thread)
|
|
272
|
+
|
|
287
273
|
await self.append_message_context(
|
|
288
|
-
room=room, message=message, chat_context=chat_context
|
|
274
|
+
room=room, message=message, chat_context=chat_context, thread=thread
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
thread_context = MailThreadContext(
|
|
278
|
+
chat=chat_context, message=message, thread=thread
|
|
289
279
|
)
|
|
280
|
+
toolkits = await self.get_thread_toolkits(thread_context=thread_context)
|
|
281
|
+
|
|
290
282
|
logger.info(f"processing message {message}")
|
|
291
283
|
reply = await super().process_message(
|
|
292
284
|
chat_context=thread_context.chat,
|
|
@@ -296,12 +288,34 @@ class MailWorker(Worker):
|
|
|
296
288
|
)
|
|
297
289
|
return await self.send_reply_message(room=room, message=message, reply=reply)
|
|
298
290
|
|
|
291
|
+
def create_reply_email_message(
|
|
292
|
+
self, *, message: dict, from_address: str, body: str
|
|
293
|
+
) -> EmailMessage:
|
|
294
|
+
subject: str = message.get("subject")
|
|
295
|
+
|
|
296
|
+
if not subject.startswith("RE:"):
|
|
297
|
+
subject = "RE: " + subject
|
|
298
|
+
|
|
299
|
+
_, addr = email.utils.parseaddr(from_address)
|
|
300
|
+
domain = addr.split("@")[-1].lower()
|
|
301
|
+
id = f"<{uuid.uuid4()}@{domain}>"
|
|
302
|
+
|
|
303
|
+
msg = EmailMessage()
|
|
304
|
+
msg["Message-ID"] = id
|
|
305
|
+
msg["Subject"] = subject
|
|
306
|
+
msg["From"] = from_address
|
|
307
|
+
msg["To"] = message.get("reply_to")
|
|
308
|
+
msg["In-Reply-To"] = message.get("id")
|
|
309
|
+
msg.set_content(body)
|
|
310
|
+
|
|
311
|
+
return msg
|
|
312
|
+
|
|
299
313
|
async def send_reply_message(self, *, room: RoomClient, message: dict, reply: str):
|
|
300
|
-
msg = create_reply_email_message(
|
|
314
|
+
msg = self.create_reply_email_message(
|
|
301
315
|
message=message, from_address=self._email_address, body=reply
|
|
302
316
|
)
|
|
303
317
|
|
|
304
|
-
reply_msg_dict = await save_email_message(
|
|
318
|
+
reply_msg_dict = await self.save_email_message(
|
|
305
319
|
room=room, content=msg.as_bytes(), role="agent"
|
|
306
320
|
)
|
|
307
321
|
|
meshagent/agents/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.6.
|
|
1
|
+
__version__ = "0.6.3"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meshagent-agents
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.3
|
|
4
4
|
Summary: Agent Building Blocks for Meshagent
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Documentation, https://docs.meshagent.com
|
|
@@ -12,19 +12,19 @@ License-File: LICENSE
|
|
|
12
12
|
Requires-Dist: pyjwt~=2.10
|
|
13
13
|
Requires-Dist: pytest~=8.4
|
|
14
14
|
Requires-Dist: pytest-asyncio~=0.26
|
|
15
|
-
Requires-Dist: meshagent-api~=0.6.
|
|
16
|
-
Requires-Dist: meshagent-tools~=0.6.
|
|
17
|
-
Requires-Dist: meshagent-openai~=0.6.
|
|
15
|
+
Requires-Dist: meshagent-api~=0.6.3
|
|
16
|
+
Requires-Dist: meshagent-tools~=0.6.3
|
|
17
|
+
Requires-Dist: meshagent-openai~=0.6.3
|
|
18
18
|
Requires-Dist: pydantic~=2.11
|
|
19
19
|
Requires-Dist: opentelemetry-distro~=0.54b1
|
|
20
20
|
Provides-Extra: all
|
|
21
|
-
Requires-Dist: meshagent-api[all]~=0.6.
|
|
21
|
+
Requires-Dist: meshagent-api[all]~=0.6.3; extra == "all"
|
|
22
22
|
Requires-Dist: chonkie~=0.5.1; extra == "all"
|
|
23
23
|
Requires-Dist: chonkie[semantic]~=0.5.1; extra == "all"
|
|
24
24
|
Requires-Dist: chonkie[openai]~=0.5.1; extra == "all"
|
|
25
25
|
Requires-Dist: aiosmtplib~=4.0.1; extra == "all"
|
|
26
26
|
Provides-Extra: sync
|
|
27
|
-
Requires-Dist: meshagent-api[sync]~=0.6.
|
|
27
|
+
Requires-Dist: meshagent-api[sync]~=0.6.3; extra == "sync"
|
|
28
28
|
Provides-Extra: mail
|
|
29
29
|
Requires-Dist: aiosmtplib~=4.0.1; extra == "mail"
|
|
30
30
|
Provides-Extra: rag
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
meshagent/agents/__init__.py,sha256=BcPxGW5__oLXEU2FQxWBAqSYUwXH99nIGaO2dTGyUxQ,634
|
|
2
2
|
meshagent/agents/adapter.py,sha256=enFUYMVaq3XZgqFIxOqeZxJp6YI0yLPQBd5VNQMhq8s,2097
|
|
3
|
-
meshagent/agents/agent.py,sha256=
|
|
3
|
+
meshagent/agents/agent.py,sha256=kMAFCrOSBuioKFR8lotYVvNnUYwcvkmzVwc_JuaGlrk,20701
|
|
4
4
|
meshagent/agents/chat.py,sha256=SOkoJPOAQ4yVPc6ymPZNmXQOe1NvhQzSwI8mVHIqppo,43861
|
|
5
5
|
meshagent/agents/context.py,sha256=MNK3BwtVtFUnMeaUAPDt7tQLrHip39y7rqtOs3KFHv8,4491
|
|
6
6
|
meshagent/agents/development.py,sha256=uWKfwmPEE1Er4KgMtsEzdJEWE8H2c1S7l6q6a8OSDOw,997
|
|
7
7
|
meshagent/agents/indexer.py,sha256=8J_5f127J0jLKlQkPw955nHouqWlQUuRDm4bjyObZfE,19361
|
|
8
8
|
meshagent/agents/listener.py,sha256=q5z216FMVW-a7FBs706u3IuB81VArfucxEHaHvPFHEo,5139
|
|
9
9
|
meshagent/agents/llmrunner.py,sha256=ovHWsAsDqDCjmXLqXvx5B9Zwh9DaZMzvWU2dIL90syw,5739
|
|
10
|
-
meshagent/agents/mail.py,sha256=
|
|
10
|
+
meshagent/agents/mail.py,sha256=1X5D92JbZoEmQ-dnlI5NFYtEM3kyODKOsqrpH7cWxnQ,13170
|
|
11
11
|
meshagent/agents/planning.py,sha256=npu29Z-lXgsJgMr7kXmlfz9gq5CcE0Q6RoZg4IBsfig,21952
|
|
12
12
|
meshagent/agents/prompt.py,sha256=OSSqbzaugyQtuvYxTY5UcZQWyeV73e3GUJz_iC5xZkA,1883
|
|
13
13
|
meshagent/agents/pydantic.py,sha256=Fnjx9fdKRHKeAKw1-Yqrm_emM3UVIpLBOj1tmeSJfwk,6270
|
|
14
14
|
meshagent/agents/single_shot_writer.py,sha256=miWVMo4NX8Hib0yHwDmiwuk8GraJwg1JzljsgFyTl4Y,3237
|
|
15
15
|
meshagent/agents/thread_schema.py,sha256=J5k3PLyrMKSxtmCTGoN3m81t_K_AiymtIqRGqHeOWjI,5987
|
|
16
16
|
meshagent/agents/utils.py,sha256=2Z3r7cUpKDZig8MVCrBwZRBUambeX4esZovDWme9uVE,1353
|
|
17
|
-
meshagent/agents/version.py,sha256=
|
|
17
|
+
meshagent/agents/version.py,sha256=zYiFHqR7JwbvdK9dvKrh-RTNfUqjHUwC4CTcFAPVYLc,22
|
|
18
18
|
meshagent/agents/worker.py,sha256=ACwV5Uq3_Dg0PrwahYQ8EiguW2sru2_Rvg0RwZB1DdE,3932
|
|
19
19
|
meshagent/agents/writer.py,sha256=DdM1YzZyHSh4Cl-OmzU0Hhqg7A8M1ES0hiNTYDu1BS4,2680
|
|
20
20
|
meshagent/agents/schemas/__init__.py,sha256=_xAhrkxvFdfer3NolrynragGxcLElGR51LSribT3deU,299
|
|
@@ -24,8 +24,8 @@ meshagent/agents/schemas/presentation.py,sha256=aaMzkFQryurbHd1fbzTQPdN7v8QIhsjX
|
|
|
24
24
|
meshagent/agents/schemas/schema.py,sha256=8OXGCLVouoPg6eHBU9mgf1pTGTMvVZqiKNq15wkQJe0,5310
|
|
25
25
|
meshagent/agents/schemas/super_editor_document.py,sha256=iRv4Q-DE_5kUdsAD5Rm4GwHek8L_7ZEpxIZ1x2dWjdg,1813
|
|
26
26
|
meshagent/agents/schemas/transcript.py,sha256=-Cj7cT8aZIGiEw9HGV3iivGgTlJYtmtKaO9E-amQiFs,2099
|
|
27
|
-
meshagent_agents-0.6.
|
|
28
|
-
meshagent_agents-0.6.
|
|
29
|
-
meshagent_agents-0.6.
|
|
30
|
-
meshagent_agents-0.6.
|
|
31
|
-
meshagent_agents-0.6.
|
|
27
|
+
meshagent_agents-0.6.3.dist-info/licenses/LICENSE,sha256=eTt0SPW-sVNdkZe9PS_S8WfCIyLjRXRl7sUBWdlteFg,10254
|
|
28
|
+
meshagent_agents-0.6.3.dist-info/METADATA,sha256=Fp350ZgLJNy7Ksyzs1j8QdRVY0bz7lUPsC06iGWwxi4,3762
|
|
29
|
+
meshagent_agents-0.6.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
30
|
+
meshagent_agents-0.6.3.dist-info/top_level.txt,sha256=GlcXnHtRP6m7zlG3Df04M35OsHtNXy_DY09oFwWrH74,10
|
|
31
|
+
meshagent_agents-0.6.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|