Skip to content

Commit 2c2b079

Browse files
committed
fix: defer load_model() to first invocation for Container build compatibility
In Container builds, the Python module loads at container startup before any request context exists. API-key-based providers use @requires_api_key which needs a workload access token only available within request context, causing ValueError at import time. Defer load_model() using lazy initialization in all affected templates: - Strands: get_or_create_agent() singleton - LangChain/LangGraph: get_or_create_model() singleton - Google ADK / OpenAI Agents: ensure_credentials_loaded() guard
1 parent b9d4e4c commit 2c2b079

5 files changed

Lines changed: 86 additions & 36 deletions

File tree

src/assets/__tests__/__snapshots__/assets.snapshot.test.ts.snap

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,12 +1555,18 @@ def add_numbers(a: int, b: int) -> int:
15551555
return a + b
15561556
15571557
1558-
# Set environment variables for model authentication
1559-
load_model()
1560-
15611558
# Get MCP Toolset
15621559
mcp_toolset = [get_streamable_http_mcp_client()]
15631560
1561+
_credentials_loaded = False
1562+
1563+
def ensure_credentials_loaded():
1564+
global _credentials_loaded
1565+
if not _credentials_loaded:
1566+
load_model()
1567+
_credentials_loaded = True
1568+
1569+
15641570
# Agent Definition
15651571
agent = Agent(
15661572
model=MODEL_ID,
@@ -1573,6 +1579,7 @@ agent = Agent(
15731579
15741580
# Session and Runner
15751581
async def setup_session_and_runner(user_id, session_id):
1582+
ensure_credentials_loaded()
15761583
session_service = InMemorySessionService()
15771584
session = await session_service.create_session(
15781585
app_name=APP_NAME, user_id=user_id, session_id=session_id
@@ -1808,8 +1815,13 @@ from mcp_client.client import get_streamable_http_mcp_client
18081815
app = BedrockAgentCoreApp()
18091816
log = app.logger
18101817
1811-
# Instantiate model
1812-
llm = load_model()
1818+
_llm = None
1819+
1820+
def get_or_create_model():
1821+
global _llm
1822+
if _llm is None:
1823+
_llm = load_model()
1824+
return _llm
18131825
18141826
18151827
# Define a simple function tool
@@ -1834,7 +1846,7 @@ async def invoke(payload, context):
18341846
mcp_tools = await mcp_client.get_tools()
18351847
18361848
# Define the agent using create_react_agent
1837-
graph = create_react_agent(llm, tools=mcp_tools + tools)
1849+
graph = create_react_agent(get_or_create_model(), tools=mcp_tools + tools)
18381850
18391851
# Process the user prompt
18401852
prompt = payload.get("prompt", "What can you help me with?")
@@ -2139,12 +2151,17 @@ from mcp_client.client import get_streamable_http_mcp_client
21392151
app = BedrockAgentCoreApp()
21402152
log = app.logger
21412153
2142-
# Set environment variables for model authentication
2143-
load_model()
2144-
21452154
# Get MCP Server
21462155
mcp_server = get_streamable_http_mcp_client()
21472156
2157+
_credentials_loaded = False
2158+
2159+
def ensure_credentials_loaded():
2160+
global _credentials_loaded
2161+
if not _credentials_loaded:
2162+
load_model()
2163+
_credentials_loaded = True
2164+
21482165
21492166
# Define a simple function tool
21502167
@function_tool
@@ -2155,6 +2172,7 @@ def add_numbers(a: int, b: int) -> int:
21552172
21562173
# Define the agent execution
21572174
async def main(query):
2175+
ensure_credentials_loaded()
21582176
try:
21592177
async with mcp_server as server:
21602178
active_servers = [server] if server else []
@@ -2406,14 +2424,19 @@ def agent_factory():
24062424
return get_or_create_agent
24072425
get_or_create_agent = agent_factory()
24082426
{{else}}
2409-
# Create agent
2410-
agent = Agent(
2411-
model=load_model(),
2412-
system_prompt="""
2413-
You are a helpful assistant. Use tools when appropriate.
2414-
""",
2415-
tools=tools+[mcp_client]
2416-
)
2427+
_agent = None
2428+
2429+
def get_or_create_agent():
2430+
global _agent
2431+
if _agent is None:
2432+
_agent = Agent(
2433+
model=load_model(),
2434+
system_prompt="""
2435+
You are a helpful assistant. Use tools when appropriate.
2436+
""",
2437+
tools=tools+[mcp_client]
2438+
)
2439+
return _agent
24172440
{{/if}}
24182441
24192442
@@ -2425,8 +2448,10 @@ async def invoke(payload, context):
24252448
session_id = getattr(context, 'session_id', 'default-session')
24262449
user_id = getattr(context, 'user_id', 'default-user')
24272450
agent = get_or_create_agent(session_id, user_id)
2428-
2451+
{{else}}
2452+
agent = get_or_create_agent()
24292453
{{/if}}
2454+
24302455
# Execute and format response
24312456
stream = agent.stream_async(payload.get("prompt"))
24322457

src/assets/python/googleadk/base/main.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,18 @@ def add_numbers(a: int, b: int) -> int:
2222
return a + b
2323

2424

25-
# Set environment variables for model authentication
26-
load_model()
27-
2825
# Get MCP Toolset
2926
mcp_toolset = [get_streamable_http_mcp_client()]
3027

28+
_credentials_loaded = False
29+
30+
def ensure_credentials_loaded():
31+
global _credentials_loaded
32+
if not _credentials_loaded:
33+
load_model()
34+
_credentials_loaded = True
35+
36+
3137
# Agent Definition
3238
agent = Agent(
3339
model=MODEL_ID,
@@ -40,6 +46,7 @@ def add_numbers(a: int, b: int) -> int:
4046

4147
# Session and Runner
4248
async def setup_session_and_runner(user_id, session_id):
49+
ensure_credentials_loaded()
4350
session_service = InMemorySessionService()
4451
session = await session_service.create_session(
4552
app_name=APP_NAME, user_id=user_id, session_id=session_id

src/assets/python/langchain_langgraph/base/main.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,13 @@
99
app = BedrockAgentCoreApp()
1010
log = app.logger
1111

12-
# Instantiate model
13-
llm = load_model()
12+
_llm = None
13+
14+
def get_or_create_model():
15+
global _llm
16+
if _llm is None:
17+
_llm = load_model()
18+
return _llm
1419

1520

1621
# Define a simple function tool
@@ -35,7 +40,7 @@ async def invoke(payload, context):
3540
mcp_tools = await mcp_client.get_tools()
3641

3742
# Define the agent using create_react_agent
38-
graph = create_react_agent(llm, tools=mcp_tools + tools)
43+
graph = create_react_agent(get_or_create_model(), tools=mcp_tools + tools)
3944

4045
# Process the user prompt
4146
prompt = payload.get("prompt", "What can you help me with?")

src/assets/python/openaiagents/base/main.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,17 @@
77
app = BedrockAgentCoreApp()
88
log = app.logger
99

10-
# Set environment variables for model authentication
11-
load_model()
12-
1310
# Get MCP Server
1411
mcp_server = get_streamable_http_mcp_client()
1512

13+
_credentials_loaded = False
14+
15+
def ensure_credentials_loaded():
16+
global _credentials_loaded
17+
if not _credentials_loaded:
18+
load_model()
19+
_credentials_loaded = True
20+
1621

1722
# Define a simple function tool
1823
@function_tool
@@ -23,6 +28,7 @@ def add_numbers(a: int, b: int) -> int:
2328

2429
# Define the agent execution
2530
async def main(query):
31+
ensure_credentials_loaded()
2632
try:
2733
async with mcp_server as server:
2834
active_servers = [server] if server else []

src/assets/python/strands/base/main.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,19 @@ def get_or_create_agent(session_id, user_id):
4242
return get_or_create_agent
4343
get_or_create_agent = agent_factory()
4444
{{else}}
45-
# Create agent
46-
agent = Agent(
47-
model=load_model(),
48-
system_prompt="""
49-
You are a helpful assistant. Use tools when appropriate.
50-
""",
51-
tools=tools+[mcp_client]
52-
)
45+
_agent = None
46+
47+
def get_or_create_agent():
48+
global _agent
49+
if _agent is None:
50+
_agent = Agent(
51+
model=load_model(),
52+
system_prompt="""
53+
You are a helpful assistant. Use tools when appropriate.
54+
""",
55+
tools=tools+[mcp_client]
56+
)
57+
return _agent
5358
{{/if}}
5459

5560

@@ -61,8 +66,10 @@ async def invoke(payload, context):
6166
session_id = getattr(context, 'session_id', 'default-session')
6267
user_id = getattr(context, 'user_id', 'default-user')
6368
agent = get_or_create_agent(session_id, user_id)
64-
69+
{{else}}
70+
agent = get_or_create_agent()
6571
{{/if}}
72+
6673
# Execute and format response
6774
stream = agent.stream_async(payload.get("prompt"))
6875

0 commit comments

Comments
 (0)