From 40c0b88d780eb69257b80327493cc04d142826c1 Mon Sep 17 00:00:00 2001 From: Stas Moreinis Date: Mon, 8 Sep 2025 13:14:28 -0700 Subject: [PATCH 1/2] init --- src/agentex/lib/environment_variables.py | 7 +++++++ src/agentex/lib/sdk/fastacp/fastacp.py | 25 ++++++++++++++++++++++++ src/agentex/lib/utils/registration.py | 5 +++++ 3 files changed, 37 insertions(+) diff --git a/src/agentex/lib/environment_variables.py b/src/agentex/lib/environment_variables.py index 43f402e4..0503cb44 100644 --- a/src/agentex/lib/environment_variables.py +++ b/src/agentex/lib/environment_variables.py @@ -34,6 +34,10 @@ class EnvVarKeys(str, Enum): WORKFLOW_TASK_QUEUE = "WORKFLOW_TASK_QUEUE" # Auth Configuration AUTH_PRINCIPAL_B64 = "AUTH_PRINCIPAL_B64" + # Build Information + AGENT_COMMIT = "AGENT_COMMIT" + # The URL of the agent's source code + AGENT_CODE_URL = "AGENT_CODE_URL" class Environment(str, Enum): @@ -63,6 +67,9 @@ class EnvironmentVariables(BaseModel): WORKFLOW_TASK_QUEUE: str | None = None WORKFLOW_NAME: str | None = None AUTH_PRINCIPAL_B64: str | None = None + # Build Information + AGENT_COMMIT: str | None = None + AGENT_CODE_URL: str | None = None @classmethod def refresh(cls) -> EnvironmentVariables: diff --git a/src/agentex/lib/sdk/fastacp/fastacp.py b/src/agentex/lib/sdk/fastacp/fastacp.py index 493e9b49..802cbd27 100644 --- a/src/agentex/lib/sdk/fastacp/fastacp.py +++ b/src/agentex/lib/sdk/fastacp/fastacp.py @@ -1,3 +1,8 @@ +import inspect +import json +import os +from pathlib import Path + from typing import Literal from agentex.lib.sdk.fastacp.base.base_acp_server import BaseACPServer from agentex.lib.sdk.fastacp.impl.agentic_base_acp import AgenticBaseACP @@ -8,6 +13,7 @@ BaseACPConfig, SyncACPConfig, ) +from agentex.lib.utils.logging import make_logger # Add new mappings between ACP types and configs here # Add new mappings between ACP types and implementations here @@ -16,6 +22,7 @@ "base": AgenticBaseACP, } +logger = make_logger(__name__) class FastACP: """Factory for creating FastACP instances @@ -51,6 +58,22 @@ def create_agentic_acp(config: AgenticACPConfig, **kwargs) -> BaseACPServer: else: return implementation_class.create(**kwargs) + @staticmethod + def maybe_get_build_info() -> None: + """If a build-info.json file is present, load it and set the AGENT_COMMIT and AGENT_CODE_URL environment variables""" + acp_root = Path(inspect.stack()[1].filename).resolve().parents[0] + build_info_path = acp_root / "build-info.json" + if build_info_path.exists(): + try: + with open(build_info_path, "r") as f: + build_info = json.load(f) + if build_info.get("agent_commit"): + os.environ["AGENT_COMMIT"] = build_info.get("agent_commit") + if build_info.get("agent_repo") and build_info.get("agent_path"): + os.environ["AGENT_CODE_URL"] = build_info.get("agent_repo") + "/" + build_info.get("agent_path") + except Exception as e: + logger.error(f"Error loading build info: {e}") + @staticmethod def create( acp_type: Literal["sync", "agentic"], config: BaseACPConfig | None = None, **kwargs @@ -63,6 +86,8 @@ def create( **kwargs: Additional configuration parameters """ + FastACP.maybe_get_build_info() + if acp_type == "sync": sync_config = config if isinstance(config, SyncACPConfig) else None return FastACP.create_sync_acp(sync_config, **kwargs) diff --git a/src/agentex/lib/utils/registration.py b/src/agentex/lib/utils/registration.py index 8b149d46..59c579d4 100644 --- a/src/agentex/lib/utils/registration.py +++ b/src/agentex/lib/utils/registration.py @@ -44,6 +44,11 @@ async def register_agent(env_vars: EnvironmentVariables): if env_vars.AGENT_ID: registration_data["agent_id"] = env_vars.AGENT_ID + if env_vars.AGENT_COMMIT: + registration_data["commit_hash"] = env_vars.AGENT_COMMIT + if env_vars.AGENT_CODE_URL: + registration_data["code_url"] = env_vars.AGENT_CODE_URL + # Make the registration request registration_url = f"{env_vars.AGENTEX_BASE_URL.rstrip('/')}/agents/register" # Retry logic with configurable attempts and delay From b4966551c7b740bb4f92df506289513b7e353d01 Mon Sep 17 00:00:00 2001 From: Stas Moreinis Date: Mon, 8 Sep 2025 14:59:38 -0700 Subject: [PATCH 2/2] send registration metadata --- src/agentex/lib/environment_variables.py | 7 ++----- src/agentex/lib/sdk/fastacp/fastacp.py | 18 +++++------------- src/agentex/lib/utils/registration.py | 18 ++++++++++++------ 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/src/agentex/lib/environment_variables.py b/src/agentex/lib/environment_variables.py index 0503cb44..a369c867 100644 --- a/src/agentex/lib/environment_variables.py +++ b/src/agentex/lib/environment_variables.py @@ -35,9 +35,7 @@ class EnvVarKeys(str, Enum): # Auth Configuration AUTH_PRINCIPAL_B64 = "AUTH_PRINCIPAL_B64" # Build Information - AGENT_COMMIT = "AGENT_COMMIT" - # The URL of the agent's source code - AGENT_CODE_URL = "AGENT_CODE_URL" + BUILD_INFO_PATH = "BUILD_INFO_PATH" class Environment(str, Enum): @@ -68,8 +66,7 @@ class EnvironmentVariables(BaseModel): WORKFLOW_NAME: str | None = None AUTH_PRINCIPAL_B64: str | None = None # Build Information - AGENT_COMMIT: str | None = None - AGENT_CODE_URL: str | None = None + BUILD_INFO_PATH: str | None = None @classmethod def refresh(cls) -> EnvironmentVariables: diff --git a/src/agentex/lib/sdk/fastacp/fastacp.py b/src/agentex/lib/sdk/fastacp/fastacp.py index 802cbd27..d66732ce 100644 --- a/src/agentex/lib/sdk/fastacp/fastacp.py +++ b/src/agentex/lib/sdk/fastacp/fastacp.py @@ -59,20 +59,12 @@ def create_agentic_acp(config: AgenticACPConfig, **kwargs) -> BaseACPServer: return implementation_class.create(**kwargs) @staticmethod - def maybe_get_build_info() -> None: - """If a build-info.json file is present, load it and set the AGENT_COMMIT and AGENT_CODE_URL environment variables""" - acp_root = Path(inspect.stack()[1].filename).resolve().parents[0] + def locate_build_info_path() -> None: + """If a build-info.json file is present, set the BUILD_INFO_PATH environment variable""" + acp_root = Path(inspect.stack()[2].filename).resolve().parents[0] build_info_path = acp_root / "build-info.json" if build_info_path.exists(): - try: - with open(build_info_path, "r") as f: - build_info = json.load(f) - if build_info.get("agent_commit"): - os.environ["AGENT_COMMIT"] = build_info.get("agent_commit") - if build_info.get("agent_repo") and build_info.get("agent_path"): - os.environ["AGENT_CODE_URL"] = build_info.get("agent_repo") + "/" + build_info.get("agent_path") - except Exception as e: - logger.error(f"Error loading build info: {e}") + os.environ["BUILD_INFO_PATH"] = str(build_info_path) @staticmethod def create( @@ -86,7 +78,7 @@ def create( **kwargs: Additional configuration parameters """ - FastACP.maybe_get_build_info() + FastACP.locate_build_info_path() if acp_type == "sync": sync_config = config if isinstance(config, SyncACPConfig) else None diff --git a/src/agentex/lib/utils/registration.py b/src/agentex/lib/utils/registration.py index 59c579d4..dfc28448 100644 --- a/src/agentex/lib/utils/registration.py +++ b/src/agentex/lib/utils/registration.py @@ -19,6 +19,16 @@ def get_auth_principal(env_vars: EnvironmentVariables): except Exception: return None +def get_build_info(env_vars: EnvironmentVariables): + logger.info(f"Getting build info from {env_vars.BUILD_INFO_PATH}") + if not env_vars.BUILD_INFO_PATH: + return None + try: + with open(env_vars.BUILD_INFO_PATH, "r") as f: + return json.load(f) + except Exception: + return None + async def register_agent(env_vars: EnvironmentVariables): """Register this agent with the Agentex server""" if not env_vars.AGENTEX_BASE_URL: @@ -38,17 +48,13 @@ async def register_agent(env_vars: EnvironmentVariables): "description": description, "acp_url": full_acp_url, "acp_type": env_vars.ACP_TYPE, - "principal_context": get_auth_principal(env_vars) + "principal_context": get_auth_principal(env_vars), + "registration_metadata": get_build_info(env_vars) } if env_vars.AGENT_ID: registration_data["agent_id"] = env_vars.AGENT_ID - if env_vars.AGENT_COMMIT: - registration_data["commit_hash"] = env_vars.AGENT_COMMIT - if env_vars.AGENT_CODE_URL: - registration_data["code_url"] = env_vars.AGENT_CODE_URL - # Make the registration request registration_url = f"{env_vars.AGENTEX_BASE_URL.rstrip('/')}/agents/register" # Retry logic with configurable attempts and delay