@@ -159,6 +159,7 @@ class _RefreshContext:
159159 agent_name : str
160160 server_url : str
161161 api_key : str | None
162+ api_key_header : str | None
162163 target_type : str | None
163164 target_id : str | None
164165
@@ -220,6 +221,7 @@ def _snapshot_refresh_context() -> _RefreshContext:
220221 agent = state .current_agent
221222 server_url = state .server_url
222223 api_key = state .api_key
224+ api_key_header = state .api_key_header
223225 target_type = state .target_type
224226 target_id = state .target_id
225227
@@ -233,6 +235,7 @@ def _snapshot_refresh_context() -> _RefreshContext:
233235 agent_name = agent .agent_name ,
234236 server_url = server_url ,
235237 api_key = api_key ,
238+ api_key_header = api_key_header ,
236239 target_type = target_type ,
237240 target_id = target_id ,
238241 )
@@ -243,6 +246,7 @@ async def _fetch_controls_for_context_async(context: _RefreshContext) -> list[di
243246 async with AgentControlClient (
244247 base_url = context .server_url ,
245248 api_key = context .api_key ,
249+ api_key_header = context .api_key_header ,
246250 ) as client :
247251 response = await agents .list_agent_controls (
248252 client ,
@@ -429,6 +433,7 @@ def init(
429433 agent_version : str | None = None ,
430434 server_url : str | None = None ,
431435 api_key : str | None = None ,
436+ api_key_header : str | None = None ,
432437 controls_file : str | None = None ,
433438 steps : list [StepSchemaDict ] | None = None ,
434439 conflict_mode : Literal ["strict" , "overwrite" ] = "overwrite" ,
@@ -467,6 +472,8 @@ def init(
467472 server_url: Optional server URL (defaults to AGENT_CONTROL_URL env var
468473 or http://localhost:8000)
469474 api_key: Optional API key for authentication (defaults to AGENT_CONTROL_API_KEY env var)
475+ api_key_header: Optional HTTP header name for API key authentication
476+ (defaults to AGENT_CONTROL_API_KEY_HEADER env var or X-API-Key)
470477 controls_file: Optional explicit path to controls.yaml (auto-discovered if not provided)
471478 steps: Optional list of step schemas for registration:
472479 [{"type": "tool", "name": "search", "input_schema": {...}, "output_schema": {...}}]
@@ -561,6 +568,7 @@ async def handle(message: str):
561568 state .current_agent = next_agent
562569 state .server_url = server_url or os .getenv ('AGENT_CONTROL_URL' ) or 'http://localhost:8000'
563570 state .api_key = api_key
571+ state .api_key_header = api_key_header
564572 state .runtime_token_cache .clear ()
565573 state .target_type = target_type
566574 state .target_id = target_id
@@ -599,6 +607,7 @@ async def register() -> list[dict[str, Any]] | None:
599607 async with AgentControlClient (
600608 base_url = state .server_url ,
601609 api_key = state .api_key ,
610+ api_key_header = state .api_key_header ,
602611 ) as client :
603612 # Check server health first
604613 try :
@@ -685,6 +694,7 @@ def run_in_thread() -> None:
685694 batcher = init_observability (
686695 server_url = state .server_url ,
687696 api_key = state .api_key ,
697+ api_key_header = state .api_key_header ,
688698 enabled = observability_enabled ,
689699 sink_name = observability_sink_name ,
690700 sink_config = observability_sink_config ,
@@ -716,6 +726,7 @@ def _reset_state() -> None:
716726 state .server_controls = None
717727 state .server_url = None
718728 state .api_key = None
729+ state .api_key_header = None
719730 state .runtime_token_cache .clear ()
720731 state .target_type = None
721732 state .target_id = None
0 commit comments