Skip to content

Commit 1ea6e5e

Browse files
feat(a2a): support remote agent auth (#223)
1 parent 924d7cf commit 1ea6e5e

File tree

1 file changed

+63
-6
lines changed

1 file changed

+63
-6
lines changed

veadk/a2a/remote_ve_agent.py

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,78 @@
1313
# limitations under the License.
1414

1515
import json
16+
from typing import Literal
1617

18+
import httpx
1719
import requests
1820
from a2a.types import AgentCard
1921
from google.adk.agents.remote_a2a_agent import RemoteA2aAgent
2022

23+
from veadk.utils.logger import get_logger
24+
25+
logger = get_logger(__name__)
26+
2127
AGENT_CARD_WELL_KNOWN_PATH = "/.well-known/agent-card.json"
2228

2329

30+
def _convert_agent_card_dict_to_obj(agent_card_dict: dict) -> AgentCard:
31+
agent_card_json_str = json.dumps(agent_card_dict, ensure_ascii=False, indent=2)
32+
agent_card_object = AgentCard.model_validate_json(str(agent_card_json_str))
33+
return agent_card_object
34+
35+
2436
class RemoteVeAgent(RemoteA2aAgent):
25-
def __init__(self, name: str, url: str):
26-
agent_card_dict = requests.get(url + AGENT_CARD_WELL_KNOWN_PATH).json()
27-
agent_card_dict["url"] = url
37+
"""Connect to remote agent on VeFaaS platform."""
38+
39+
def __init__(
40+
self,
41+
name: str,
42+
url: str,
43+
auth_token: str | None = None,
44+
auth_method: Literal["header", "querystring"] | None = None,
45+
):
46+
if not auth_token:
47+
agent_card_dict = requests.get(url + AGENT_CARD_WELL_KNOWN_PATH).json()
48+
# replace agent_card_url with actual host
49+
agent_card_dict["url"] = url
50+
51+
agent_card_object = _convert_agent_card_dict_to_obj(agent_card_dict)
52+
53+
logger.debug(f"Agent card of {name}: {agent_card_object}")
54+
super().__init__(name=name, agent_card=agent_card_object)
55+
else:
56+
if auth_method == "header":
57+
headers = {"Authorization": f"Bearer {auth_token}"}
58+
agent_card_dict = requests.get(
59+
url + AGENT_CARD_WELL_KNOWN_PATH, headers=headers
60+
).json()
61+
agent_card_dict["url"] = url
62+
63+
agent_card_object = _convert_agent_card_dict_to_obj(agent_card_dict)
64+
httpx_client = httpx.AsyncClient(
65+
base_url=url, headers=headers, timeout=600
66+
)
2867

29-
agent_card_json_str = json.dumps(agent_card_dict, ensure_ascii=False, indent=2)
68+
logger.debug(f"Agent card of {name}: {agent_card_object}")
69+
super().__init__(
70+
name=name, agent_card=agent_card_object, httpx_client=httpx_client
71+
)
72+
elif auth_method == "querystring":
73+
agent_card_dict = requests.get(
74+
url + AGENT_CARD_WELL_KNOWN_PATH + f"?token={auth_token}"
75+
).json()
76+
agent_card_dict["url"] = url
3077

31-
agent_card_object = AgentCard.model_validate_json(str(agent_card_json_str))
78+
agent_card_object = _convert_agent_card_dict_to_obj(agent_card_dict)
79+
httpx_client = httpx.AsyncClient(
80+
base_url=url, params={"token": auth_token}, timeout=600
81+
)
3282

33-
super().__init__(name=name, agent_card=agent_card_object)
83+
logger.debug(f"Agent card of {name}: {agent_card_object}")
84+
super().__init__(
85+
name=name, agent_card=agent_card_object, httpx_client=httpx_client
86+
)
87+
else:
88+
raise ValueError(
89+
f"Unsupported auth method {auth_method}, use `header` or `querystring` instead."
90+
)

0 commit comments

Comments
 (0)