meshagent-agents 0.5.3__py3-none-any.whl → 0.5.5__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.

Potentially problematic release.


This version of meshagent-agents might be problematic. Click here for more details.

meshagent/agents/chat.py CHANGED
@@ -1,4 +1,4 @@
1
- from .agent import SingleRoomAgent, AgentChatContext
1
+ from meshagent.agents.agent import SingleRoomAgent, AgentChatContext
2
2
  from meshagent.api.chan import Chan
3
3
  from meshagent.api import (
4
4
  RoomMessage,
@@ -10,7 +10,7 @@ from meshagent.api import (
10
10
  MeshDocument,
11
11
  )
12
12
  from meshagent.tools import Toolkit, ToolContext
13
- from .adapter import LLMAdapter, ToolResponseAdapter
13
+ from meshagent.agents.adapter import LLMAdapter, ToolResponseAdapter
14
14
  from meshagent.openai.tools.responses_adapter import ImageGenerationTool, LocalShellTool
15
15
  import asyncio
16
16
  from typing import Optional
@@ -22,6 +22,7 @@ from typing import Literal
22
22
  import base64
23
23
  from openai.types.responses import ResponseStreamEvent
24
24
  from asyncio import CancelledError
25
+ from meshagent.api import RoomException
25
26
 
26
27
  from opentelemetry import trace
27
28
  import shlex
@@ -52,6 +53,7 @@ class ChatBotThreadLocalShellTool(LocalShellTool):
52
53
  for prop in self.thread_context.thread.root.get_children():
53
54
  if prop.tag_name == "messages":
54
55
  messages = prop
56
+ break
55
57
 
56
58
  exec_element = messages.append_child(
57
59
  tag_name="exec",
@@ -135,6 +137,7 @@ class ChatBotThreadOpenAIImageGenerationTool(ImageGenerationTool):
135
137
  for prop in self.thread_context.thread.root.get_children():
136
138
  if prop.tag_name == "messages":
137
139
  messages = prop
140
+ break
138
141
 
139
142
  for child in messages.get_children():
140
143
  if child.get_attribute("id") == item_id:
@@ -184,6 +187,7 @@ class ChatBotThreadOpenAIImageGenerationTool(ImageGenerationTool):
184
187
  for prop in self.thread_context.thread.root.get_children():
185
188
  if prop.tag_name == "messages":
186
189
  messages = prop
190
+ break
187
191
 
188
192
  for child in messages.get_children():
189
193
  if child.get_attribute("id") == item_id:
@@ -307,13 +311,23 @@ class ChatBot(SingleRoomAgent):
307
311
 
308
312
  async def _send_and_save_chat(
309
313
  self,
310
- messages: Element,
314
+ thread: MeshDocument,
311
315
  path: str,
312
316
  to: RemoteParticipant,
313
317
  id: str,
314
318
  text: str,
315
319
  thread_attributes: dict,
316
320
  ):
321
+ messages = None
322
+
323
+ for prop in thread.root.get_children():
324
+ if prop.tag_name == "messages":
325
+ messages = prop
326
+ break
327
+
328
+ if messages is None:
329
+ raise RoomException("messages element was not found in thread document")
330
+
317
331
  with tracer.start_as_current_span("chatbot.thread.message") as span:
318
332
  span.set_attributes(thread_attributes)
319
333
  span.set_attribute("role", "assistant")
@@ -339,10 +353,10 @@ class ChatBot(SingleRoomAgent):
339
353
  },
340
354
  )
341
355
 
342
- async def greet(
356
+ async def _greet(
343
357
  self,
344
358
  *,
345
- messages: Element,
359
+ thread: MeshDocument,
346
360
  path: str,
347
361
  chat_context: AgentChatContext,
348
362
  participant: RemoteParticipant,
@@ -353,7 +367,7 @@ class ChatBot(SingleRoomAgent):
353
367
  await self._send_and_save_chat(
354
368
  id=str(uuid.uuid4()),
355
369
  to=RemoteParticipant(id=participant.id),
356
- messages=messages,
370
+ thread=thread,
357
371
  path=path,
358
372
  text=self._auto_greet_message,
359
373
  thread_attributes=thread_attributes,
@@ -403,107 +417,152 @@ class ChatBot(SingleRoomAgent):
403
417
  async def close_thread(self, *, path: str):
404
418
  return await self.room.sync.close(path=path)
405
419
 
406
- async def _spawn_thread(self, path: str, messages: Chan[RoomMessage]):
407
- self.room.developer.log_nowait(
408
- type="chatbot.thread.started", data={"path": path}
409
- )
410
- chat_context = await self.init_chat_context()
411
- opened = False
420
+ async def load_thread_context(self, *, thread_context: ChatThreadContext):
421
+ """
422
+ load the thread from the thread document by inserting the current messages in the thread into the chat context
423
+ """
424
+ thread = thread_context.thread
425
+ chat_context = thread_context.chat
426
+ for prop in thread.root.get_children():
427
+ if prop.tag_name == "messages":
428
+ doc_messages = prop
429
+
430
+ for element in doc_messages.get_children():
431
+ if isinstance(element, Element) and element.tag_name == "message":
432
+ msg = element["text"]
433
+ if element[
434
+ "author_name"
435
+ ] == self.room.local_participant.get_attribute("name"):
436
+ chat_context.append_assistant_message(msg)
437
+ else:
438
+ chat_context.append_user_message(msg)
439
+
440
+ for child in element.get_children():
441
+ if child.tag_name == "file":
442
+ chat_context.append_assistant_message(
443
+ f"the user attached a file with the path '{child.get_attribute('path')}'"
444
+ )
445
+
446
+ break
412
447
 
448
+ if doc_messages is None:
449
+ raise Exception("thread was not properly initialized")
450
+
451
+ async def prepare_llm_context(self, *, context: ChatThreadContext):
452
+ """
453
+ called prior to sending the request to the LLM in case the agent needs to modify the context prior to sending
454
+ """
455
+ pass
456
+
457
+ async def _process_llm_events(
458
+ self,
459
+ *,
460
+ thread_context: ChatThreadContext,
461
+ llm_messages: asyncio.Queue,
462
+ thread_attributes: dict,
463
+ ):
464
+ thread = thread_context.thread
413
465
  doc_messages = None
414
- current_file = None
415
- llm_messages = Chan[ResponseStreamEvent]()
416
- thread_context = None
466
+ for prop in thread.root.get_children():
467
+ if prop.tag_name == "messages":
468
+ doc_messages = prop
469
+ break
417
470
 
418
- thread_attributes = None
471
+ if doc_messages is None:
472
+ raise RoomException("messages element is missing from thread document")
473
+
474
+ context_message = None
475
+ updates = asyncio.Queue()
419
476
 
420
- def done_processing_llm_events(task: asyncio.Task):
477
+ # throttle updates so we don't send too many syncs over the wire at once
478
+ async def update_thread():
421
479
  try:
422
- task.result()
423
- except Exception as e:
424
- logger.error("error sending delta", exc_info=e)
425
-
426
- async def process_llm_events():
427
- context_message = None
428
- updates = asyncio.Queue()
429
-
430
- # throttle updates so we don't send too many syncs over the wire at once
431
- async def update_thread():
432
- try:
433
- changes = {}
434
- while True:
435
- try:
436
- element, partial = updates.get_nowait()
437
- changes[element] = partial
480
+ changes = {}
481
+ while True:
482
+ try:
483
+ element, partial = updates.get_nowait()
484
+ changes[element] = partial
438
485
 
439
- except asyncio.QueueEmpty:
440
- for e, p in changes.items():
441
- e["text"] = p
486
+ except asyncio.QueueEmpty:
487
+ for e, p in changes.items():
488
+ e["text"] = p
442
489
 
443
- changes.clear()
490
+ changes.clear()
444
491
 
445
- e, p = await updates.get()
446
- changes[e] = p
492
+ e, p = await updates.get()
493
+ changes[e] = p
447
494
 
448
- await asyncio.sleep(0.1)
495
+ await asyncio.sleep(0.1)
449
496
 
450
- except asyncio.QueueShutDown:
451
- pass
497
+ except asyncio.QueueShutDown:
498
+ # flush any pending changes
499
+ for e, p in changes.items():
500
+ e["text"] = p
452
501
 
453
- update_thread_task = asyncio.create_task(update_thread())
454
- try:
455
- async for evt in llm_messages:
456
- for participant in self._room.messaging.get_participants():
457
- logger.debug(
458
- f"sending event {evt.type} to {participant.get_attribute('name')}"
459
- )
502
+ changes.clear()
503
+ pass
460
504
 
461
- # self.room.messaging.send_message_nowait(to=participant, type="llm.event", message=json.loads(evt.to_json()))
505
+ update_thread_task = asyncio.create_task(update_thread())
506
+ try:
507
+ while True:
508
+ evt = await llm_messages.get()
509
+ for participant in self._room.messaging.get_participants():
510
+ logger.debug(
511
+ f"sending event {evt.type} to {participant.get_attribute('name')}"
512
+ )
462
513
 
463
- if evt.type == "response.content_part.added":
464
- partial = ""
465
- content_element = doc_messages.append_child(
466
- tag_name="message",
467
- attributes={
468
- "text": "",
469
- "created_at": datetime.datetime.now(
470
- datetime.timezone.utc
471
- )
472
- .isoformat()
473
- .replace("+00:00", "Z"),
474
- "author_name": self.room.local_participant.get_attribute(
475
- "name"
476
- ),
477
- },
478
- )
514
+ # self.room.messaging.send_message_nowait(to=participant, type="llm.event", message=json.loads(evt.to_json()))
515
+
516
+ if evt.type == "response.content_part.added":
517
+ partial = ""
518
+
519
+ content_element = doc_messages.append_child(
520
+ tag_name="message",
521
+ attributes={
522
+ "text": "",
523
+ "created_at": datetime.datetime.now(datetime.timezone.utc)
524
+ .isoformat()
525
+ .replace("+00:00", "Z"),
526
+ "author_name": self.room.local_participant.get_attribute(
527
+ "name"
528
+ ),
529
+ },
530
+ )
479
531
 
480
- context_message = {"role": "assistant", "content": ""}
481
- chat_context.messages.append(context_message)
532
+ context_message = {"role": "assistant", "content": ""}
533
+ thread_context.chat.messages.append(context_message)
482
534
 
483
- elif evt.type == "response.output_text.delta":
484
- partial += evt.delta
485
- updates.put_nowait((content_element, partial))
486
- context_message["content"] = partial
535
+ elif evt.type == "response.output_text.delta":
536
+ partial += evt.delta
537
+ updates.put_nowait((content_element, partial))
538
+ context_message["content"] = partial
487
539
 
488
- elif evt.type == "response.output_text.done":
489
- content_element = None
540
+ elif evt.type == "response.output_text.done":
541
+ content_element = None
490
542
 
491
- with tracer.start_as_current_span(
492
- "chatbot.thread.message"
493
- ) as span:
494
- span.set_attribute(
495
- "from_participant_name",
496
- self.room.local_participant.get_attribute("name"),
497
- )
498
- span.set_attribute("role", "assistant")
499
- span.set_attributes(thread_attributes)
500
- span.set_attributes({"text": evt.text})
501
- finally:
502
- updates.shutdown()
503
- await update_thread_task
543
+ with tracer.start_as_current_span("chatbot.thread.message") as span:
544
+ span.set_attribute(
545
+ "from_participant_name",
546
+ self.room.local_participant.get_attribute("name"),
547
+ )
548
+ span.set_attribute("role", "assistant")
549
+ span.set_attributes(thread_attributes)
550
+ span.set_attributes({"text": evt.text})
551
+ except asyncio.QueueShutDown:
552
+ pass
553
+ finally:
554
+ updates.shutdown()
555
+ await update_thread_task
504
556
 
505
- llm_task = asyncio.create_task(process_llm_events())
506
- llm_task.add_done_callback(done_processing_llm_events)
557
+ async def _spawn_thread(self, path: str, messages: Chan[RoomMessage]):
558
+ logger.debug("chatbot is starting a thread", extra={"path": path})
559
+ chat_context = await self.init_chat_context()
560
+ opened = False
561
+
562
+ current_file = None
563
+ thread_context = None
564
+
565
+ thread_attributes = None
507
566
 
508
567
  thread = None
509
568
 
@@ -512,9 +571,9 @@ class ChatBot(SingleRoomAgent):
512
571
 
513
572
  while True:
514
573
  while True:
515
- logger.info(f"waiting for message on thread {path}")
574
+ logger.debug(f"waiting for message on thread {path}")
516
575
  received = await messages.recv()
517
- logger.info(f"received message on thread {path}: {received.type}")
576
+ logger.debug(f"received message on thread {path}: {received.type}")
518
577
 
519
578
  chat_with_participant = None
520
579
  for participant in self._room.messaging.get_participants():
@@ -569,83 +628,57 @@ class ChatBot(SingleRoomAgent):
569
628
 
570
629
  thread = await self.open_thread(path=path)
571
630
 
572
- for prop in thread.root.get_children():
573
- if prop.tag_name == "messages":
574
- doc_messages = prop
575
-
576
- for element in doc_messages.get_children():
577
- if (
578
- isinstance(element, Element)
579
- and element.tag_name == "message"
580
- ):
581
- msg = element["text"]
582
- if (
583
- element["author_name"]
584
- == self.room.local_participant.get_attribute(
585
- "name"
586
- )
587
- ):
588
- chat_context.append_assistant_message(
589
- msg
590
- )
591
- else:
592
- chat_context.append_user_message(msg)
593
-
594
- for child in element.get_children():
595
- if child.tag_name == "file":
596
- chat_context.append_assistant_message(
597
- f"the user attached a file with the path '{child.get_attribute('path')}'"
598
- )
599
-
600
- if doc_messages is None:
601
- raise Exception("thread was not properly initialized")
631
+ thread_context = ChatThreadContext(
632
+ path=path,
633
+ chat=chat_context,
634
+ thread=thread,
635
+ participants=get_thread_participants(
636
+ room=self.room, thread=thread
637
+ ),
638
+ )
639
+
640
+ await self.load_thread_context(
641
+ thread_context=thread_context
642
+ )
602
643
 
603
644
  if received.type == "opened":
604
645
  if not opened:
605
646
  opened = True
606
647
 
607
- await self.greet(
648
+ await self._greet(
608
649
  path=path,
609
650
  chat_context=chat_context,
610
651
  participant=chat_with_participant,
611
- messages=doc_messages,
652
+ thread=thread,
612
653
  thread_attributes=thread_attributes,
613
654
  )
614
655
 
615
656
  if received.type == "chat":
616
657
  if thread is None:
617
- self.room.developer.log_nowait(
618
- type="thread is not open", data={}
619
- )
658
+ logger.info("thread is not open", extra={"path": path})
620
659
  break
621
660
 
622
- if chat_with_participant.id == received.from_participant_id:
623
- self.room.developer.log_nowait(
624
- type="llm.message",
625
- data={
626
- "context": chat_context.id,
627
- "participant_id": self.room.local_participant.id,
628
- "participant_name": self.room.local_participant.get_attribute(
629
- "name"
630
- ),
631
- "message": {
632
- "content": {
633
- "role": "user",
634
- "text": received.message["text"],
635
- }
636
- },
637
- },
638
- )
661
+ logger.debug(
662
+ "chatbot received a chat",
663
+ extra={
664
+ "context": chat_context.id,
665
+ "participant_id": self.room.local_participant.id,
666
+ "participant_name": self.room.local_participant.get_attribute(
667
+ "name"
668
+ ),
669
+ "text": received.message["text"],
670
+ },
671
+ )
639
672
 
640
- attachments = received.message.get("attachments", [])
641
- text = received.message["text"]
673
+ attachments = received.message.get("attachments", [])
674
+ text = received.message["text"]
642
675
 
643
- for attachment in attachments:
644
- chat_context.append_assistant_message(
645
- message=f"the user attached a file at the path '{attachment['path']}'"
646
- )
676
+ for attachment in attachments:
677
+ chat_context.append_assistant_message(
678
+ message=f"the user attached a file at the path '{attachment['path']}'"
679
+ )
647
680
 
648
- chat_context.append_user_message(message=text)
681
+ chat_context.append_user_message(message=text)
649
682
 
650
683
  if messages.empty():
651
684
  break
@@ -690,9 +723,6 @@ class ChatBot(SingleRoomAgent):
690
723
  room=self.room, thread=thread
691
724
  )
692
725
 
693
- def handle_event(evt):
694
- llm_messages.send_nowait(evt)
695
-
696
726
  with tracer.start_as_current_span("chatbot.llm") as span:
697
727
  try:
698
728
  with tracer.start_as_current_span(
@@ -705,6 +735,23 @@ class ChatBot(SingleRoomAgent):
705
735
  )
706
736
  )
707
737
 
738
+ await self.prepare_llm_context(
739
+ context=thread_context
740
+ )
741
+
742
+ llm_messages = asyncio.Queue[ResponseStreamEvent]()
743
+
744
+ def handle_event(evt):
745
+ llm_messages.put_nowait(evt)
746
+
747
+ llm_task = asyncio.create_task(
748
+ self._process_llm_events(
749
+ thread_context=thread_context,
750
+ llm_messages=llm_messages,
751
+ thread_attributes=thread_attributes,
752
+ )
753
+ )
754
+
708
755
  await self._llm_adapter.next(
709
756
  context=chat_context,
710
757
  room=self._room,
@@ -713,10 +760,13 @@ class ChatBot(SingleRoomAgent):
713
760
  event_handler=handle_event,
714
761
  )
715
762
 
763
+ llm_messages.shutdown()
764
+ await llm_task
765
+
716
766
  except Exception as e:
717
767
  logger.error("An error was encountered", exc_info=e)
718
768
  await self._send_and_save_chat(
719
- messages=doc_messages,
769
+ thread=thread,
720
770
  to=chat_with_participant,
721
771
  path=path,
722
772
  id=str(uuid.uuid4()),
@@ -741,13 +791,9 @@ class ChatBot(SingleRoomAgent):
741
791
  finally:
742
792
 
743
793
  async def cleanup():
744
- llm_messages.close()
745
-
746
794
  if self.room is not None:
747
795
  logger.info(f"thread was ended {path}")
748
- self.room.developer.log_nowait(
749
- type="chatbot.thread.ended", data={"path": path}
750
- )
796
+ logger.info("chatbot thread ended", extra={"path": path})
751
797
 
752
798
  if thread is not None:
753
799
  await self.close_thread(path=path)
@@ -786,7 +832,7 @@ class ChatBot(SingleRoomAgent):
786
832
 
787
833
  messages = self._get_message_channel(path)
788
834
 
789
- logger.info(
835
+ logger.debug(
790
836
  f"queued incoming message for thread {path}: {message.type}"
791
837
  )
792
838
 
@@ -806,7 +852,7 @@ class ChatBot(SingleRoomAgent):
806
852
  f"The chat thread ended with an error {e}", exc_info=e
807
853
  )
808
854
 
809
- logger.info(f"spawning chat thread for {path}")
855
+ logger.debug(f"spawning chat thread for {path}")
810
856
  task = asyncio.create_task(
811
857
  self._spawn_thread(messages=messages, path=path)
812
858
  )
@@ -1 +1 @@
1
- __version__ = "0.5.3"
1
+ __version__ = "0.5.5"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-agents
3
- Version: 0.5.3
3
+ Version: 0.5.5
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.5.3
16
- Requires-Dist: meshagent-tools~=0.5.3
17
- Requires-Dist: meshagent-openai~=0.5.3
15
+ Requires-Dist: meshagent-api~=0.5.5
16
+ Requires-Dist: meshagent-tools~=0.5.5
17
+ Requires-Dist: meshagent-openai~=0.5.5
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.5.3; extra == "all"
21
+ Requires-Dist: meshagent-api[all]~=0.5.5; 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.5.3; extra == "sync"
27
+ Requires-Dist: meshagent-api[sync]~=0.5.5; extra == "sync"
28
28
  Provides-Extra: mail
29
29
  Requires-Dist: aiosmtplib~=4.0.1; extra == "mail"
30
30
  Provides-Extra: rag
@@ -1,7 +1,7 @@
1
1
  meshagent/agents/__init__.py,sha256=d2cplyLH8xqDWqP_GoPQ8ApHzuv8Iiq4rz-vYBlGMTw,706
2
2
  meshagent/agents/adapter.py,sha256=dMuejpjl__bdZ-Qmt-k4e81g-i10vZup7WE1JCZ_Sy4,1392
3
3
  meshagent/agents/agent.py,sha256=w14hM63YXiH15VEF1T2eZCvggvrUkE00a1kQkaMRBM0,20354
4
- meshagent/agents/chat.py,sha256=137LU0qkVxF53SQDV1gSHq2QeSFh4m17sGmXg_Ym77U,31964
4
+ meshagent/agents/chat.py,sha256=5WmvIVlw83r2TucwNZASHKEUFwW6uB-Jw_2nIRgb-V4,32882
5
5
  meshagent/agents/context.py,sha256=6txCXA22aHQaikvIKED6YjPyasM_bPqGqCE4HGj04_E,4035
6
6
  meshagent/agents/development.py,sha256=AEBkkycNZDRLYIdmX2LkrVZv715ALswiwSR9CiV3HE4,894
7
7
  meshagent/agents/hosting.py,sha256=tCcswAweEhlMxGaBR_m2YvUkwZiaHbTBT64urRHfK7I,5446
@@ -14,7 +14,7 @@ meshagent/agents/pydantic.py,sha256=RrdOESZg-n_FyxbfkOBwRPVxV39IOjxK2unsyAGn9as,
14
14
  meshagent/agents/single_shot_writer.py,sha256=miWVMo4NX8Hib0yHwDmiwuk8GraJwg1JzljsgFyTl4Y,3237
15
15
  meshagent/agents/thread_schema.py,sha256=OGQ-H5c2fJgNOYHC3Pas8iqTi2RUSxP2bytf0SK-SYc,4208
16
16
  meshagent/agents/utils.py,sha256=6D9GXpYu9xx5XlfD3DiGFdyOwq46e5-sTYOF_FYep1o,1446
17
- meshagent/agents/version.py,sha256=tgzuqHKcEdKBaP57F5oXxq4XlW2n9J4Fj8ZGu7nGOZg,22
17
+ meshagent/agents/version.py,sha256=78mfpLewKVki6c9UONSUdlVme_JsN9ZwIfp4Hf4jmG0,22
18
18
  meshagent/agents/worker.py,sha256=SkrPhxIQ-Chyjg-eZGOlehkbrVYmsas8zmZnrTsAl3o,3910
19
19
  meshagent/agents/writer.py,sha256=dXglYgHwBrBJIaapMqBDyD3kmwSyi94tOdHH44itODc,2682
20
20
  meshagent/agents/schemas/__init__.py,sha256=_xAhrkxvFdfer3NolrynragGxcLElGR51LSribT3deU,299
@@ -23,8 +23,8 @@ meshagent/agents/schemas/gallery.py,sha256=65IsrH2wiFIR-DNo8est-nCOC72i1Aa5EmVNU
23
23
  meshagent/agents/schemas/presentation.py,sha256=aaMzkFQryurbHd1fbzTQPdN7v8QIhsjXuvbE8ZiuXNY,1589
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
- meshagent_agents-0.5.3.dist-info/licenses/LICENSE,sha256=eTt0SPW-sVNdkZe9PS_S8WfCIyLjRXRl7sUBWdlteFg,10254
27
- meshagent_agents-0.5.3.dist-info/METADATA,sha256=_Fi7KmyntVN55jJ73d6eLDgs8a6QoljVVH-SCOVx9zE,3773
28
- meshagent_agents-0.5.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
29
- meshagent_agents-0.5.3.dist-info/top_level.txt,sha256=GlcXnHtRP6m7zlG3Df04M35OsHtNXy_DY09oFwWrH74,10
30
- meshagent_agents-0.5.3.dist-info/RECORD,,
26
+ meshagent_agents-0.5.5.dist-info/licenses/LICENSE,sha256=eTt0SPW-sVNdkZe9PS_S8WfCIyLjRXRl7sUBWdlteFg,10254
27
+ meshagent_agents-0.5.5.dist-info/METADATA,sha256=Sbl15zXJrdYQCJ13oq14lBtlzI7Ji886p98rG6fs92M,3773
28
+ meshagent_agents-0.5.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
29
+ meshagent_agents-0.5.5.dist-info/top_level.txt,sha256=GlcXnHtRP6m7zlG3Df04M35OsHtNXy_DY09oFwWrH74,10
30
+ meshagent_agents-0.5.5.dist-info/RECORD,,