1515
1616from __future__ import annotations
1717
18+ import contextlib
1819import os
1920import subprocess
2021import sys
22+ import time
2123
2224import httpx
2325import pytest
3840 reason = "GOOGLE_API_KEY not set" ,
3941)
4042
41-
4243def _run_agent (
4344 script : str ,
4445 otlp_http_port : int ,
@@ -64,6 +65,40 @@ def _run_agent(
6465 )
6566
6667
68+ _AGENTCORE_ENV = {"OTEL_SEMCONV_STABILITY_OPT_IN" : "gen_ai_latest_experimental" }
69+ _AGENTCORE_SCRIPT = "examples/zero-code-examples/agentcore/run.py"
70+
71+
72+ @contextlib .contextmanager
73+ def _agentcore_server (otlp_http_port : int , session_name : str , extra_env : dict | None = None ):
74+ env = {** os .environ ,
75+ "OTEL_EXPORTER_OTLP_ENDPOINT" : f"http://127.0.0.1:{ otlp_http_port } " ,
76+ "OTEL_RESOURCE_ATTRIBUTES" : f"agentevals.eval_set_id=e2e-test,agentevals.session_name={ session_name } " ,
77+ ** (extra_env or {})}
78+ proc = subprocess .Popen ([sys .executable , os .path .join (REPO_ROOT , _AGENTCORE_SCRIPT )], env = env , cwd = REPO_ROOT )
79+ try :
80+ for _ in range (20 ):
81+ if proc .poll () is not None :
82+ raise RuntimeError (f"agentcore server exited early (code { proc .returncode } )" )
83+ try :
84+ httpx .get ("http://127.0.0.1:8080/ping" , timeout = 1 )
85+ break
86+ except Exception :
87+ time .sleep (0.5 )
88+ else :
89+ proc .kill ()
90+ raise RuntimeError ("agentcore server did not start within 10s" )
91+ yield proc
92+ finally :
93+ time .sleep (2 )
94+ proc .terminate ()
95+ try :
96+ proc .wait (timeout = 5 )
97+ except subprocess .TimeoutExpired :
98+ proc .kill ()
99+ proc .wait ()
100+
101+
67102@_skip_no_openai
68103class TestLangchainZeroCode :
69104 """Run the LangChain zero-code OTLP example and verify session grouping."""
@@ -365,6 +400,34 @@ def test_session_visible_via_api(self, live_servers):
365400 assert session_name in session_ids
366401
367402
403+ class TestAgentCoreZeroCode :
404+ def test_session_created_spans_only (self , live_servers ):
405+ main_port , otlp_http_port , mgr = live_servers
406+ session_name = "e2e-agentcore"
407+ with _agentcore_server (otlp_http_port , session_name , extra_env = _AGENTCORE_ENV ):
408+ httpx .post ("http://127.0.0.1:8080/invocations" , json = {"prompt" : "Roll a 20-sided die" }, timeout = 60 )
409+ wait_for_session_complete_sync (mgr , session_name , timeout = 60 )
410+ s = mgr .sessions [session_name ]
411+ assert s .is_complete and s .source == "otlp" and len (s .spans ) > 0
412+
413+ def test_invocations_extracted (self , live_servers ):
414+ main_port , otlp_http_port , mgr = live_servers
415+ session_name = "e2e-agentcore-inv"
416+ with _agentcore_server (otlp_http_port , session_name , extra_env = _AGENTCORE_ENV ):
417+ httpx .post ("http://127.0.0.1:8080/invocations" , json = {"prompt" : "Is 17 prime?" }, timeout = 60 )
418+ wait_for_session_complete_sync (mgr , session_name , timeout = 60 )
419+ assert len (mgr .sessions [session_name ].invocations ) > 0
420+
421+ def test_session_visible_via_api (self , live_servers ):
422+ main_port , otlp_http_port , mgr = live_servers
423+ session_name = "e2e-agentcore-api"
424+ with _agentcore_server (otlp_http_port , session_name , extra_env = _AGENTCORE_ENV ):
425+ httpx .post ("http://127.0.0.1:8080/invocations" , json = {"prompt" : "Hello!" }, timeout = 60 )
426+ wait_for_session_complete_sync (mgr , session_name , timeout = 60 )
427+ data = httpx .get (f"http://127.0.0.1:{ main_port } /api/streaming/sessions" ).json ()["data" ]
428+ assert session_name in [s ["sessionId" ] for s in data ]
429+
430+
368431@_skip_no_openai
369432class TestAgentRerun :
370433 """Verify that re-running an agent with the same session_name creates
0 commit comments