Hightower's AI Harness Engineering

Hightower's AI Harness Engineering

AWS AgentCore III: Using two Harnesses on One Substrate: LangChain DeepAgents on Bedrock AgentCore

Part 3: You can use the same decorator to host a totally different agent using a totally different framework. AgentCore does not care which harness you use. It provides the hyperscaler for agent

Rick Hightower's avatar
Rick Hightower
Jul 24, 2026
∙ Paid

Cover image for “Two Harnesses, One Substrate: LangChain DeepAgents on Bedrock AgentCore” by Rick Hightower

The same decorator hosts a completely different agent. What matters is not that both work; it is where each one hides the harness.

Unlike the last article, where we used the Claude Agent SDK, we're going to use LangChain DeepAgents, just to show that you can plug in whatever agent framework you need. AgentCore handles the scaling. This makes switching frameworks or harnesses boring. It's pretty simple. This is truly AgentCore: bring your own agent harness.

In this article: Unlike the last article, where we used the Claude Agent SDK, we're going to use LangChain DeepAgents just to show that you can plug in whatever agent framework you need, and AgentCore will handle the scaling. That makes switching frameworks or harnesses boring. It is a bring-your-own agent harness on one substrate.


This is part 3 of the AgentCore series. Subscribe so you don’t miss any, and share if you liked the article.

Share


A single data point is not statistically significant. It’s only an anecdote. So if we just hosted a Claude Agent SDK harness on the AgentCore Runtime, we couldn’t really prove that AgentCore was “framework-agnostic”. It would just be marketing.

So let’s try the same thing with LangChain DeepAgents. This time we’re going to take a completely different harness, from LangGraph, and plug that in using the same AgentCore decorator we used in the first article. If the claim is true, this should be a boring activity. It should be pretty easy. For the rest of this article, we’re going to show that you can use a different agent framework, a different agent harness, and that is LangGraph DeepAgents.

The other harness

LangChain DeepAgents does not really call itself a framework. It calls itself an agent harness. The README puts it this way: “an opinionated agent that runs out of the box,” built on LangChain’s create_agent on LangGraph. Like the Claude Agent SDK, it has subagents, a filesystem, context management, persistent memory, human-in-the-loop, agentic skills, and the ability to map in tools like MCP. Unlike the Claude Agent SDK, it is model-agnostic, so it can work with any model from AWS Bedrock when it runs in AgentCore. It is truly without ceremony, and it will work with many different integrations.

One integration is langchain-aws. That’s ChatBedrockConverse. It drops right in and helps you stay on the AWS stack with no environment-variable tricks at all. This is not a coincidence. ChatBedrockConverse is the model class the AgentCore SDK’s own LangGraph A2A examples use. AWS already shows this combination. It does not even call it an integration, because it is already there, already one of the plugins that come with LangChain DeepAgents. That is why you do not need an environment variable like CLAUDE_CODE_USE_BEDROCK. AWS already supports LangChain DeepAgents out of the box, or LangChain DeepAgents already supports AWS Bedrock out of the box.

Unlike LangChain and LangGraph, which are agentic frameworks, LangChain DeepAgents truly is a harness. It is an opinionated way to configure those core frameworks into an agentic harness, just like the Claude Agent SDK. Except, unlike the Claude Agent SDK, it is not tied to just the Claude models.

The next code listing is like seeing a DeepAgents embryo. It shows how to wire a Bedrock chat model into a DeepAgent when you call create_deep_agent, then run one method, invoke. The model object is the only AWS-specific line in the following code.

# local_agent.py
from langchain_aws import ChatBedrockConverse
from deepagents import create_deep_agent

llm = ChatBedrockConverse(model="us.anthropic.claude-sonnet-4-20250514")  # ①

agent = create_deep_agent(  # ②
    model=llm,
    tools=[],
    system_prompt="You are a market-intelligence analyst.",
)

result = agent.invoke({"messages": "Summarize the pricing tiers in ./pricing-snapshot.html"})  # ③
print(result["messages"][-1].content)  # ④

① ChatBedrockConverse is a LangChain chat model. For this example, we point it to AWS Bedrock. This keeps inference inside AWS, so we don’t need a separate Anthropic API key.

② create_deep_agent builds the agent harness, passing it the model, tools, and system prompt. This harness is backed by LangGraph.

③ invoke runs the agent loop to completion on a single user message about the local pricing snapshot.

④ The final answer is the last message’s content on the result state, the same shape as any LangGraph runnable.

Note: The full extracted listing at code/agent-core/part-03-deepagents-same-substrate/listings/01-local-agent.py is the complete runnable program.

create_deep_agent returns a LangGraph runnable with .invoke() and .astream(). That object is what every later integration wraps, augments, or serves.


If you are a paid subscriber, thank you. Your support makes this work possible.

If you are a free subscriber and find these articles useful, please consider upgrading. A paid subscription is $80 per year or $8 per month.

Share Hightower's AI Harness Engineering

User's avatar

Continue reading this post for free, courtesy of Rick Hightower.

Or purchase a paid subscription.
© 2026 Rick Hightower · Privacy ∙ Terms ∙ Collection notice
Start your SubstackGet the app
Substack is the home for great culture