Skip to content

[Feature Request] Bearer-token HTTP client for runtime invocation and InvokeAgentRuntimeCommand #423

@EashanKaushik

Description

@EashanKaushik

Problem

The SDK currently ships bedrock_agentcore.runtime.AgentCoreRuntimeClient, which generates WebSocket URLs and headers (SigV4, SigV4 presigned, and OAuth bearer variants) but does not itself invoke the runtime over HTTP. There is no first-class client in the SDK for:

  1. Calling POST /runtimes/{arn}/invocations with a bearer token (JWT/OAuth) and handling both JSON and SSE (text/event-stream) responses.
  2. Calling POST /runtimes/{arn}/commands — the InvokeAgentRuntimeCommand API — and parsing its AWS EventStream (application/vnd.amazon.eventstream) response.
  3. Calling POST /runtimes/{arn}/stopruntimesession.

Today, callers authenticating via Cognito / OAuth client credentials have to hand-roll urllib3 / requests and a botocore.eventstream.EventStreamBuffer loop, duplicating logic across teams.

Use cases

  • Python apps that authenticate end users via Cognito and need to invoke a deployed agent runtime without passing IAM credentials around.
  • Automated tests that want to exec shell commands inside an AgentCore container via InvokeAgentRuntimeCommand.
  • FastAPI / MCP servers that need to stream tokens from a runtime to a browser (async-for over SSE chunks).

Proposed solution

Extend the existing AgentCoreRuntimeClient with HTTP invocation methods, keeping everything on a single client:

  • invoke (blocking, JSON or SSE)
  • invoke_streaming (sync generator over SSE chunks)
  • invoke_streaming_async (async generator; thread-pumped for use in async frameworks)
  • execute_command (blocking, accumulates stdout / stderr / exitCode / status)
  • execute_command_streaming (yields parsed EventStream events)
  • stop_runtime_session
  • AgentRuntimeError exception type

Design constraints:

  • Per-call bearer auth, matching the shape of the existing generate_ws_connection_oauth. Each method takes (runtime_arn, bearer_token, ...) so the same client can be reused across rotating credentials.
  • Lazy urllib3.PoolManager. The pool is constructed on first HTTP call via a @property, so callers that only use the existing SigV4 URL-generation methods pay zero cost.
  • Reuse existing helpers. URL construction uses _parse_runtime_arn (already on the class) and get_data_plane_endpoint from bedrock_agentcore._utils.endpoints.
  • urllib3 (already an SDK dep) and botocore.eventstream.EventStreamBuffer (transitive through boto3) — no new top-level dependencies.

Proof of concept

Implementation in #422 with 72 new unit tests, 96% branch coverage on the modified class, and the full upstream suite still passing (1505 / 0 failed).

Alternatives considered

  • Users write their own — works today, but the EventStream framing is tricky enough that most implementations I've seen have subtle bugs around chunk boundaries and the chunk envelope.
  • Sibling class AgentCoreRuntimeHttpClient — initial approach in an earlier revision of feat(runtime): add HTTP invocation and execute_command support to AgentCoreRuntimeClient #422. Kept responsibilities cleaner (URL generator vs. network client) but required a second import and discovery point. Reviewer feedback preferred a single-client shape, which the current PR delivers.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions