distributed-a2a 0.1.8__py3-none-any.whl → 0.1.9rc0__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.
@@ -1,16 +1,53 @@
1
+ import json
2
+ import asyncio
1
3
  import boto3
4
+ import requests
2
5
  from langchain_core.tools import StructuredTool
6
+ from a2a.types import AgentCard
3
7
 
4
8
 
9
+ async def registry_heart_beat(name: str, registry_url: str, agent_card: AgentCard, interval_sec: int,
10
+ get_expire_at: callable) -> None:
11
+ registry = AgentRegistryLookup(registry_url=registry_url)
12
+ while True:
13
+ try:
14
+ registry.put_agent_card(name=name, agent_card=agent_card.model_dump(), expire_at=get_expire_at())
15
+ except Exception as e:
16
+ print(f"Failed to send heart beat to registry: {e}")
17
+ await asyncio.sleep(interval_sec)
18
+
19
+
20
+ class AgentRegistryLookup:
21
+ def __init__(self, registry_url: str):
22
+ self.registry_url = registry_url
23
+
24
+ def get_agent_cards(self) -> list[dict]:
25
+ response = requests.get(url=f"{self.registry_url}/agent-cards", timeout=30)
26
+ response.raise_for_status()
27
+ return response.json()
28
+
29
+ def put_agent_card(self, name: str, agent_card: dict, expire_at: int) -> None:
30
+ response = requests.put(
31
+ url=f"{self.registry_url}/agent-card/{name}",
32
+ params={"expire_at": str(expire_at)},
33
+ json=agent_card,
34
+ timeout=30
35
+ )
36
+ response.raise_for_status()
37
+
38
+ def as_tool(self) -> StructuredTool:
39
+ return StructuredTool.from_function(func=lambda: self.get_agent_cards(), name="agent_card_lookup",
40
+ description="Gets all available agent cards")
41
+
5
42
  class DynamoDbRegistryLookup:
6
43
  def __init__(self, agent_card_tabel: str):
7
44
  dynamo = boto3.resource("dynamodb", region_name="eu-central-1")
8
45
  self.table = dynamo.Table(agent_card_tabel)
9
46
 
10
- def get_agent_cards(self) -> list[str]:
47
+ def get_agent_cards(self) -> list[dict]:
11
48
 
12
49
  items = self.table.scan().get("Items", [])
13
- cards: list[str] = [it["card"] for it in items]
50
+ cards: list[dict] = [json.loads(it["card"]) for it in items]
14
51
  return cards
15
52
 
16
53
  def as_tool(self) -> StructuredTool:
distributed_a2a/server.py CHANGED
@@ -13,7 +13,7 @@ from fastapi import FastAPI
13
13
 
14
14
  from .executors import RoutingAgentExecutor
15
15
  from .model import AgentConfig
16
- from .registry import DynamoDbRegistryLookup
16
+ from .registry import DynamoDbRegistryLookup, registry_heart_beat
17
17
 
18
18
  CAPABILITIES = AgentCapabilities(streaming=False, push_notifications=False)
19
19
 
@@ -25,6 +25,8 @@ AGENT_CARD_TABLE = "agent-cards"
25
25
  def get_expire_at() -> int:
26
26
  return int(time.time() + MAX_HEART_BEAT_MISSES * HEART_BEAT_INTERVAL_SEC)
27
27
 
28
+
29
+
28
30
  async def heart_beat(name: str, agent_card_table: str, agent_card: AgentCard) -> None:
29
31
  table = boto3.resource("dynamodb", region_name="eu-central-1").Table(agent_card_table)
30
32
  table.put_item(Item={"id": name, "card": agent_card.model_dump_json(), "expireAt": get_expire_at()})
@@ -75,6 +77,12 @@ def load_app(agent_config: Any) -> FastAPI:
75
77
  @asynccontextmanager
76
78
  async def lifespan(_: FastAPI) -> AsyncGenerator[None, Any]:
77
79
  asyncio.create_task(heart_beat(name=agent_card.name, agent_card_table=AGENT_CARD_TABLE, agent_card=agent_card))
80
+ import os
81
+ registry_url = os.getenv("REGISTRY_URL")
82
+ if registry_url:
83
+ asyncio.create_task(registry_heart_beat(name=agent_card.name, registry_url=registry_url,
84
+ agent_card=agent_card, interval_sec=HEART_BEAT_INTERVAL_SEC,
85
+ get_expire_at=get_expire_at))
78
86
  yield
79
87
 
80
88
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: distributed_a2a
3
- Version: 0.1.8
3
+ Version: 0.1.9rc0
4
4
  Summary: A library for building A2A agents with routing capabilities
5
5
  Home-page: https://github.com/Barra-Technologies/distributed-a2a
6
6
  Author: Fabian Bell
@@ -0,0 +1,13 @@
1
+ distributed_a2a/__init__.py,sha256=gO8sTT20O6XvDRzj7B322O9v6HxV-_eIlJD1wMlPYoI,171
2
+ distributed_a2a/agent.py,sha256=qY775N3Br2YMuaHLALU4t6MO47syuEoTtFLLPRr8TyA,2910
3
+ distributed_a2a/client.py,sha256=3tEBqu3HKEQyOFk5vsO1YiuKP2pZx-n6SCzsJUYNcyc,4601
4
+ distributed_a2a/executors.py,sha256=1toayqLUan0f1INyMo5v02L9uCHMq6hp1gf0jVdjX6I,7152
5
+ distributed_a2a/model.py,sha256=K4ltuBHTm_r5I-viITDt4GrxntwcUj1sOjLenHYB79k,2981
6
+ distributed_a2a/registry.py,sha256=hwG3f2eqny6eSNsPdJnxlf6jFA-K8flO3loJXGmc5bg,2144
7
+ distributed_a2a/router.py,sha256=NV8aKraFNrI53PxJAGXI5NtG3-Oy7x5ofHfgqeqsnsI,1780
8
+ distributed_a2a/server.py,sha256=IZjDBBLYXYDYPFqBTyMxvGW20qMVweWXGSTP5jtgJKg,3540
9
+ distributed_a2a-0.1.9rc0.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
10
+ distributed_a2a-0.1.9rc0.dist-info/METADATA,sha256=zbcnqeXDcB8H88TT4apM50DRH7ZBAu9Clbka4UhEz2Y,3198
11
+ distributed_a2a-0.1.9rc0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
12
+ distributed_a2a-0.1.9rc0.dist-info/top_level.txt,sha256=23qJ8n5k7796BHDK7a58uuO-X4GV0EgUWcGi8NIn-0k,16
13
+ distributed_a2a-0.1.9rc0.dist-info/RECORD,,
@@ -1,13 +0,0 @@
1
- distributed_a2a/__init__.py,sha256=gO8sTT20O6XvDRzj7B322O9v6HxV-_eIlJD1wMlPYoI,171
2
- distributed_a2a/agent.py,sha256=qY775N3Br2YMuaHLALU4t6MO47syuEoTtFLLPRr8TyA,2910
3
- distributed_a2a/client.py,sha256=3tEBqu3HKEQyOFk5vsO1YiuKP2pZx-n6SCzsJUYNcyc,4601
4
- distributed_a2a/executors.py,sha256=1toayqLUan0f1INyMo5v02L9uCHMq6hp1gf0jVdjX6I,7152
5
- distributed_a2a/model.py,sha256=K4ltuBHTm_r5I-viITDt4GrxntwcUj1sOjLenHYB79k,2981
6
- distributed_a2a/registry.py,sha256=197eZVR6TW0isOUE0VjWSWs7aCqbWqnBzcV8EVXAxrI,677
7
- distributed_a2a/router.py,sha256=NV8aKraFNrI53PxJAGXI5NtG3-Oy7x5ofHfgqeqsnsI,1780
8
- distributed_a2a/server.py,sha256=6DWLHc4ju5WK5IdmPteetn7V8dnCttAYEf5W8bryTpk,3131
9
- distributed_a2a-0.1.8.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
10
- distributed_a2a-0.1.8.dist-info/METADATA,sha256=MReZhC86KBh_gV5fvDka98UIgIsuVE0EkzPAZ2DIKZc,3195
11
- distributed_a2a-0.1.8.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
12
- distributed_a2a-0.1.8.dist-info/top_level.txt,sha256=23qJ8n5k7796BHDK7a58uuO-X4GV0EgUWcGi8NIn-0k,16
13
- distributed_a2a-0.1.8.dist-info/RECORD,,