From 0fa93b6d254788a2213708873d46225d6f5132e6 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 02:56:58 +0000 Subject: [PATCH 1/3] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index ee6f43e93..e45c32e4f 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 75 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sgp/agentex-sdk-7acaeb315af90255109ae17afc71e32a8e5851bb8a956a2a284cb4d344dfab51.yml -openapi_spec_hash: 3044e94b48d60311b6048e8df88e7552 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sgp/agentex-sdk-7074b9156acbeefa63e9ca2173e9c22768268e894a48f511ec902fdcff043407.yml +openapi_spec_hash: 400e8dc4ce4d49db45e2943f67fe255a config_hash: 593e89b291976a5e84e4c3c3f8324354 From 84c93ce31fab3fff2ec61d63f995c3446aa14b2f Mon Sep 17 00:00:00 2001 From: Max Parke Date: Fri, 28 Aug 2026 13:58:08 -0400 Subject: [PATCH 2/3] feat(cli): stamp global.agent.version from the image tag on helm deploys With agentex-agent chart >=0.6.0 (sgp#5466) the value lands as the pod's AGENT_VERSION, which the SGP tracing processor stamps onto every span as __agent_version__. Old charts ignore the key, so ordering is free. Co-Authored-By: Claude Fable 5 --- src/agentex/lib/cli/handlers/deploy_handlers.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/agentex/lib/cli/handlers/deploy_handlers.py b/src/agentex/lib/cli/handlers/deploy_handlers.py index 605d91709..218075de9 100644 --- a/src/agentex/lib/cli/handlers/deploy_handlers.py +++ b/src/agentex/lib/cli/handlers/deploy_handlers.py @@ -279,6 +279,9 @@ def merge_deployment_configs( "name": manifest.agent.name, "description": manifest.agent.description, "acp_type": manifest.agent.acp_type, + # Rendered as the pod's AGENT_VERSION (chart >=0.6.0), stamped + # onto every span as __agent_version__ by the SGP processor. + "version": image_tag, }, }, "replicaCount": manifest.deployment.global_config.replicaCount, From 02c1f0245922e674788d78459d2f8c4263d60eaa Mon Sep 17 00:00:00 2001 From: Max Parke Date: Tue, 15 Sep 2026 22:50:34 -0400 Subject: [PATCH 3/3] fix(cli): derive agent version after overrides; defer to AGENT_VERSION global.agent.version was set from the pre-merge tag, so a helm_overrides entry that replaced global.image.tag alone shipped the override image stamped with the earlier tag. It is now derived from the merged tag, via setdefault so an explicit global.agent.version override still wins. Chart >=0.6.0 renders global.agent.version as its own AGENT_VERSION env entry, so a deployment that already declares AGENT_VERSION (manifest agent.env, environments.yaml env, or a credential mapping) received two entries, the operator's winning only by template order. The generated value is skipped in that case: an explicit AGENT_VERSION is a deliberate pin, and skipping rather than rejecting keeps existing manifests that pin it deploying unchanged. Co-Authored-By: Claude Fable 5.1 --- .../lib/cli/handlers/deploy_handlers.py | 13 +++- tests/lib/cli/test_deploy_handlers.py | 64 +++++++++++++++++++ 2 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 tests/lib/cli/test_deploy_handlers.py diff --git a/src/agentex/lib/cli/handlers/deploy_handlers.py b/src/agentex/lib/cli/handlers/deploy_handlers.py index 218075de9..e1cd1965c 100644 --- a/src/agentex/lib/cli/handlers/deploy_handlers.py +++ b/src/agentex/lib/cli/handlers/deploy_handlers.py @@ -279,9 +279,6 @@ def merge_deployment_configs( "name": manifest.agent.name, "description": manifest.agent.description, "acp_type": manifest.agent.acp_type, - # Rendered as the pod's AGENT_VERSION (chart >=0.6.0), stamped - # onto every span as __agent_version__ by the SGP processor. - "version": image_tag, }, }, "replicaCount": manifest.deployment.global_config.replicaCount, @@ -392,6 +389,8 @@ def merge_deployment_configs( _deep_merge(helm_values, agent_env_config.helm_overrides) logger.info(f"After-merge helm values: {helm_values}") + _stamp_agent_version(helm_values, set(all_env_vars) | {var["name"] for var in secret_env_vars}) + # Set final environment variables # Environment variable precedence: manifest -> environments.yaml -> secrets (highest) if all_env_vars: @@ -433,6 +432,14 @@ def _deep_merge(base_dict: dict[str, Any], override_dict: dict[str, Any]) -> Non base_dict[key] = value +def _stamp_agent_version(helm_values: dict[str, Any], declared_env_names: set[str]) -> None: + """Set global.agent.version from the merged image tag unless the deployment declares AGENT_VERSION itself.""" + if EnvVarKeys.AGENT_VERSION.value in declared_env_names: + # Chart >=0.6.0 renders global.agent.version as a second AGENT_VERSION env entry. + return + helm_values["global"]["agent"].setdefault("version", helm_values["global"]["image"]["tag"]) + + def create_helm_values_file(helm_values: dict[str, Any]) -> str: """Create a temporary helm values file""" with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f: diff --git a/tests/lib/cli/test_deploy_handlers.py b/tests/lib/cli/test_deploy_handlers.py new file mode 100644 index 000000000..835b56ae8 --- /dev/null +++ b/tests/lib/cli/test_deploy_handlers.py @@ -0,0 +1,64 @@ +"""Tests for the helm values merge_deployment_configs assembles for `agentex agents deploy`.""" + +from __future__ import annotations + +from typing import Any + +from agentex.config.agent_config import AgentConfig +from agentex.config.build_config import BuildConfig, BuildContext +from agentex.config.agent_manifest import AgentManifest +from agentex.config.deployment_config import ImageConfig, DeploymentConfig +from agentex.config.environment_config import AgentAuthConfig, AgentEnvironmentConfig +from agentex.lib.cli.handlers.deploy_handlers import InputDeployOverrides, merge_deployment_configs + +MANIFEST_TAG = "sha-manifest" + + +def _manifest(env: dict[str, str] | None = None) -> AgentManifest: + return AgentManifest( + build=BuildConfig(context=BuildContext(root=".", dockerfile="Dockerfile", dockerignore=None)), + agent=AgentConfig(name="emu-tax", description="Files emu taxes", acp_type="async", env=env), + deployment=DeploymentConfig(image=ImageConfig(repository="registry.example.com/emu-tax", tag=MANIFEST_TAG)), + ) + + +def _env_config(helm_overrides: dict[str, Any]) -> AgentEnvironmentConfig: + return AgentEnvironmentConfig(auth=AgentAuthConfig(principal={"user_id": "u-1"}), helm_overrides=helm_overrides) + + +def _merge( + manifest: AgentManifest, + env_config: AgentEnvironmentConfig | None = None, + image_tag: str | None = None, +) -> dict[str, Any]: + overrides = InputDeployOverrides(image_tag=image_tag) + return merge_deployment_configs(manifest, env_config, overrides, "/nonexistent/manifest.yaml") + + +class TestAgentVersion: + def test_stamped_from_the_deploy_image_tag(self): + values = _merge(_manifest(), image_tag="sha-cli") + + assert values["global"]["agent"]["version"] == "sha-cli" + + def test_follows_an_image_tag_overridden_in_helm_overrides(self): + values = _merge(_manifest(), _env_config({"global": {"image": {"tag": "sha-env"}}})) + + assert values["global"]["image"]["tag"] == "sha-env" + assert values["global"]["agent"]["version"] == "sha-env" + + def test_explicit_helm_override_of_the_version_wins(self): + values = _merge(_manifest(), _env_config({"global": {"agent": {"version": "pinned"}}})) + + assert values["global"]["agent"]["version"] == "pinned" + + def test_skipped_when_the_manifest_env_declares_agent_version(self): + values = _merge(_manifest(env={"AGENT_VERSION": "v1.2.3"})) + + assert "version" not in values["global"]["agent"] + assert {"name": "AGENT_VERSION", "value": "v1.2.3"} in values["env"] + + def test_skipped_when_the_environment_env_declares_agent_version(self): + values = _merge(_manifest(), _env_config({"env": [{"name": "AGENT_VERSION", "value": "v9"}]})) + + assert "version" not in values["global"]["agent"]