@@ -160,6 +160,7 @@ class _RefreshContext:
160160 agent_name : str
161161 server_url : str
162162 api_key : str | None
163+ api_key_header : str | None
163164 target_type : str | None
164165 target_id : str | None
165166
@@ -221,6 +222,7 @@ def _snapshot_refresh_context() -> _RefreshContext:
221222 agent = state .current_agent
222223 server_url = state .server_url
223224 api_key = state .api_key
225+ api_key_header = state .api_key_header
224226 target_type = state .target_type
225227 target_id = state .target_id
226228
@@ -234,6 +236,7 @@ def _snapshot_refresh_context() -> _RefreshContext:
234236 agent_name = agent .agent_name ,
235237 server_url = server_url ,
236238 api_key = api_key ,
239+ api_key_header = api_key_header ,
237240 target_type = target_type ,
238241 target_id = target_id ,
239242 )
@@ -244,6 +247,7 @@ async def _fetch_controls_for_context_async(context: _RefreshContext) -> list[di
244247 async with AgentControlClient (
245248 base_url = context .server_url ,
246249 api_key = context .api_key ,
250+ api_key_header = context .api_key_header ,
247251 ) as client :
248252 response = await agents .list_agent_controls (
249253 client ,
@@ -430,6 +434,7 @@ def init(
430434 agent_version : str | None = None ,
431435 server_url : str | None = None ,
432436 api_key : str | None = None ,
437+ api_key_header : str | None = None ,
433438 controls_file : str | None = None ,
434439 steps : list [StepSchemaDict ] | None = None ,
435440 conflict_mode : Literal ["strict" , "overwrite" ] = "overwrite" ,
@@ -468,6 +473,8 @@ def init(
468473 server_url: Optional server URL (defaults to AGENT_CONTROL_URL env var
469474 or http://localhost:8000)
470475 api_key: Optional API key for authentication (defaults to AGENT_CONTROL_API_KEY env var)
476+ api_key_header: Optional HTTP header name for API key authentication
477+ (defaults to AGENT_CONTROL_API_KEY_HEADER env var or X-API-Key)
471478 controls_file: Optional explicit path to controls.yaml (auto-discovered if not provided)
472479 steps: Optional list of step schemas for registration:
473480 [{"type": "tool", "name": "search", "input_schema": {...}, "output_schema": {...}}]
@@ -562,6 +569,7 @@ async def handle(message: str):
562569 state .current_agent = next_agent
563570 state .server_url = server_url or os .getenv ('AGENT_CONTROL_URL' ) or 'http://localhost:8000'
564571 state .api_key = api_key
572+ state .api_key_header = api_key_header
565573 state .runtime_token_cache .clear ()
566574 state .target_type = target_type
567575 state .target_id = target_id
@@ -600,6 +608,7 @@ async def register() -> list[dict[str, Any]] | None:
600608 async with AgentControlClient (
601609 base_url = state .server_url ,
602610 api_key = state .api_key ,
611+ api_key_header = state .api_key_header ,
603612 ) as client :
604613 # Check server health first
605614 try :
@@ -686,6 +695,7 @@ def run_in_thread() -> None:
686695 batcher = init_observability (
687696 server_url = state .server_url ,
688697 api_key = state .api_key ,
698+ api_key_header = state .api_key_header ,
689699 enabled = observability_enabled ,
690700 sink_name = observability_sink_name ,
691701 sink_config = observability_sink_config ,
@@ -717,6 +727,7 @@ def _reset_state() -> None:
717727 state .server_controls = None
718728 state .server_url = None
719729 state .api_key = None
730+ state .api_key_header = None
720731 state .runtime_token_cache .clear ()
721732 state .target_type = None
722733 state .target_id = None
0 commit comments