@aws/nx-plugin 1.0.0-rc.56 → 1.0.0-rc.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/migrations.json +7 -2
- package/package.json +1 -1
- package/src/migrations/latest/ts-agent-session-management-support/migration.d.ts +6 -0
- package/src/migrations/latest/ts-agent-session-management-support/migration.js +449 -0
- package/src/migrations/latest/ts-agent-session-management-support/migration.js.map +1 -0
- package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +3 -1
- package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +12 -12
- package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +1 -1
- package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +2 -1
- package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client_strands.py.template +2 -1
- package/src/py/agent/a2a-connection/files/langchain/agent-connection/app/__targetAgentSnakeCase___client_langchain.py.template +2 -1
- package/src/py/agent/generator.js +4 -0
- package/src/py/agent/generator.js.map +1 -1
- package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +2 -1
- package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client_strands.py.template +2 -1
- package/src/py/agent/mcp-connection/files/langchain/agent-connection/app/__mcpServerSnakeCase___client_langchain.py.template +2 -1
- package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +6 -0
- package/src/py/agent/schema.d.js.map +1 -1
- package/src/py/agent/schema.d.ts +3 -0
- package/src/py/agent/schema.json +8 -0
- package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +4 -2
- package/src/ts/agent/__snapshots__/generator.spec.ts.snap +663 -19
- package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +2 -1
- package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +1 -1
- package/src/ts/agent/files/ag-ui/index.ts.template +10 -1
- package/src/ts/agent/files/common/agent.ts.template +11 -3
- package/src/ts/agent/files/common/session.ts.template +43 -0
- package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +1 -0
- package/src/ts/agent/generator.d.ts +4 -0
- package/src/ts/agent/generator.js +21 -0
- package/src/ts/agent/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +2 -1
- package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +2 -1
- package/src/ts/agent/react-connection/__snapshots__/generator.spec.ts.snap +8 -4
- package/src/ts/agent/react-connection/files/src/components/__agentNameClassName__AgentClientProvider.tsx.template +2 -1
- package/src/ts/agent/schema.d.js.map +1 -1
- package/src/ts/agent/schema.d.ts +3 -0
- package/src/ts/agent/schema.json +8 -0
- package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +4 -2
- package/src/utils/agent-chat/files/common/agentcore.ts.template +2 -2
- package/src/utils/agent-connection/agent-connection.js +4 -0
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-connection/files/core-runtime-config/runtime-config.ts.template +11 -1
- package/src/utils/agent-connection/files/core-strands/base/model-errors-strands.ts.template +26 -15
- package/src/utils/agent-connection/files/core-strands/base/tool-errors-strands.ts.template +23 -16
- package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +4 -3
- package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +4 -0
- package/src/utils/agent-core-constructs/agent-core-constructs.js +7 -1
- package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
- package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +131 -3
- package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +180 -1
- package/src/utils/ast.d.ts +5 -0
- package/src/utils/ast.js +25 -0
- package/src/utils/ast.js.map +1 -1
- package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +2 -0
|
@@ -29,8 +29,8 @@ export const resolveRemoteAgent = async (): Promise<
|
|
|
29
29
|
application,
|
|
30
30
|
environment: 'default',
|
|
31
31
|
transform: 'json',
|
|
32
|
-
})) as { agentRuntimes?: Record<string, string> };
|
|
33
|
-
const arn = config?.agentRuntimes?.['TestProjectAgent'];
|
|
32
|
+
})) as { agentRuntimes?: Record<string, { arn: string }> };
|
|
33
|
+
const arn = config?.agentRuntimes?.['TestProjectAgent']?.arn;
|
|
34
34
|
if (!arn) {
|
|
35
35
|
throw new Error(
|
|
36
36
|
\`No deployed agent named 'TestProjectAgent' found in runtime configuration (application \${application}).\`,
|
|
@@ -131,8 +131,8 @@ export const resolveRemoteAgent = async (): Promise<
|
|
|
131
131
|
application,
|
|
132
132
|
environment: 'default',
|
|
133
133
|
transform: 'json',
|
|
134
|
-
})) as { agentRuntimes?: Record<string, string> };
|
|
135
|
-
const arn = config?.agentRuntimes?.['TestProjectAgent'];
|
|
134
|
+
})) as { agentRuntimes?: Record<string, { arn: string }> };
|
|
135
|
+
const arn = config?.agentRuntimes?.['TestProjectAgent']?.arn;
|
|
136
136
|
if (!arn) {
|
|
137
137
|
throw new Error(
|
|
138
138
|
\`No deployed agent named 'TestProjectAgent' found in runtime configuration (application \${application}).\`,
|
|
@@ -224,8 +224,8 @@ export const resolveRemoteAgent = async (): Promise<
|
|
|
224
224
|
application,
|
|
225
225
|
environment: 'default',
|
|
226
226
|
transform: 'json',
|
|
227
|
-
})) as { agentRuntimes?: Record<string, string> };
|
|
228
|
-
const arn = config?.agentRuntimes?.['TestProjectAgent'];
|
|
227
|
+
})) as { agentRuntimes?: Record<string, { arn: string }> };
|
|
228
|
+
const arn = config?.agentRuntimes?.['TestProjectAgent']?.arn;
|
|
229
229
|
if (!arn) {
|
|
230
230
|
throw new Error(
|
|
231
231
|
\`No deployed agent named 'TestProjectAgent' found in runtime configuration (application \${application}).\`,
|
|
@@ -308,8 +308,8 @@ export const resolveRemoteAgent = async (): Promise<
|
|
|
308
308
|
application,
|
|
309
309
|
environment: 'default',
|
|
310
310
|
transform: 'json',
|
|
311
|
-
})) as { agentRuntimes?: Record<string, string> };
|
|
312
|
-
const arn = config?.agentRuntimes?.['TestProjectAgent'];
|
|
311
|
+
})) as { agentRuntimes?: Record<string, { arn: string }> };
|
|
312
|
+
const arn = config?.agentRuntimes?.['TestProjectAgent']?.arn;
|
|
313
313
|
if (!arn) {
|
|
314
314
|
throw new Error(
|
|
315
315
|
\`No deployed agent named 'TestProjectAgent' found in runtime configuration (application \${application}).\`,
|
|
@@ -383,8 +383,8 @@ export const resolveRemoteAgent = async (): Promise<
|
|
|
383
383
|
application,
|
|
384
384
|
environment: 'default',
|
|
385
385
|
transform: 'json',
|
|
386
|
-
})) as { agentRuntimes?: Record<string, string> };
|
|
387
|
-
const arn = config?.agentRuntimes?.['TestProjectAgent'];
|
|
386
|
+
})) as { agentRuntimes?: Record<string, { arn: string }> };
|
|
387
|
+
const arn = config?.agentRuntimes?.['TestProjectAgent']?.arn;
|
|
388
388
|
if (!arn) {
|
|
389
389
|
throw new Error(
|
|
390
390
|
\`No deployed agent named 'TestProjectAgent' found in runtime configuration (application \${application}).\`,
|
|
@@ -495,8 +495,8 @@ export const resolveRemoteAgent = async (): Promise<
|
|
|
495
495
|
application,
|
|
496
496
|
environment: 'default',
|
|
497
497
|
transform: 'json',
|
|
498
|
-
})) as { agentRuntimes?: Record<string, string> };
|
|
499
|
-
const arn = config?.agentRuntimes?.['TestProjectAgent'];
|
|
498
|
+
})) as { agentRuntimes?: Record<string, { arn: string }> };
|
|
499
|
+
const arn = config?.agentRuntimes?.['TestProjectAgent']?.arn;
|
|
500
500
|
if (!arn) {
|
|
501
501
|
throw new Error(
|
|
502
502
|
\`No deployed agent named 'TestProjectAgent' found in runtime configuration (application \${application}).\`,
|
|
@@ -95,7 +95,7 @@ module "add_agent_runtime_to_runtime_config" {
|
|
|
95
95
|
|
|
96
96
|
namespace = "agentcore"
|
|
97
97
|
key = "agentRuntimes"
|
|
98
|
-
value = { "TerraformSnapshotAgent" = module.agent_core_runtime.agent_core_runtime_arn }
|
|
98
|
+
value = { "TerraformSnapshotAgent" = { arn = module.agent_core_runtime.agent_core_runtime_arn } }
|
|
99
99
|
|
|
100
100
|
depends_on = [module.agent_core_runtime]
|
|
101
101
|
}
|
|
@@ -128,7 +128,8 @@ class RemoteClientStrands:
|
|
|
128
128
|
if os.environ.get("LOCAL_DEV") == "true":
|
|
129
129
|
return AgentCoreA2aClientStrands.without_auth("http://localhost:9001/")
|
|
130
130
|
config = get_agentcore_runtime_config()
|
|
131
|
-
|
|
131
|
+
agent_runtime = config.get("agentRuntimes", {}).get("Remote")
|
|
132
|
+
agent_runtime_arn = agent_runtime.get("arn") if agent_runtime else None
|
|
132
133
|
if not agent_runtime_arn:
|
|
133
134
|
raise RuntimeError("No connected agent runtime named 'Remote' found in runtime configuration.")
|
|
134
135
|
return AgentCoreA2aClientStrands.with_iam_auth(agent_runtime_arn)
|
|
@@ -20,9 +20,10 @@ class <%- targetAgentClassName %>ClientStrands:
|
|
|
20
20
|
"http://localhost:<%- targetAgentPort %>/"
|
|
21
21
|
)
|
|
22
22
|
config = get_agentcore_runtime_config()
|
|
23
|
-
|
|
23
|
+
agent_runtime = config.get("agentRuntimes", {}).get(
|
|
24
24
|
"<%- targetAgentClassName %>"
|
|
25
25
|
)
|
|
26
|
+
agent_runtime_arn = agent_runtime.get("arn") if agent_runtime else None
|
|
26
27
|
if not agent_runtime_arn:
|
|
27
28
|
raise RuntimeError(
|
|
28
29
|
"No connected agent runtime named '<%- targetAgentClassName %>' found in runtime configuration."
|
|
@@ -18,9 +18,10 @@ class <%- targetAgentClassName %>ClientLangChain:
|
|
|
18
18
|
"http://localhost:<%- targetAgentPort %>/"
|
|
19
19
|
)
|
|
20
20
|
config = get_agentcore_runtime_config()
|
|
21
|
-
|
|
21
|
+
agent_runtime = config.get("agentRuntimes", {}).get(
|
|
22
22
|
"<%- targetAgentClassName %>"
|
|
23
23
|
)
|
|
24
|
+
agent_runtime_arn = agent_runtime.get("arn") if agent_runtime else None
|
|
24
25
|
if not agent_runtime_arn:
|
|
25
26
|
raise RuntimeError(
|
|
26
27
|
"No connected agent runtime named '<%- targetAgentClassName %>' found in runtime configuration."
|
|
@@ -193,6 +193,9 @@ export const pyAgentGenerator = async (tree, options)=>{
|
|
|
193
193
|
console.warn('Warning: auth is ignored when no infrastructure is configured (no infrastructure is generated)');
|
|
194
194
|
}
|
|
195
195
|
const auth = options.auth ?? 'iam';
|
|
196
|
+
// Only 'in-memory' is currently supported for Python agents (session manager
|
|
197
|
+
// support for Python is not yet implemented).
|
|
198
|
+
const session = options.session ?? 'in-memory';
|
|
196
199
|
// Ensure the shared agent-connection project exists so the server entry
|
|
197
200
|
// point can import `session_id_context` and propagate the AgentCore
|
|
198
201
|
// session ID to any downstream MCP / A2A clients a later connection
|
|
@@ -310,6 +313,7 @@ export const pyAgentGenerator = async (tree, options)=>{
|
|
|
310
313
|
iac,
|
|
311
314
|
projectName: project.name,
|
|
312
315
|
auth,
|
|
316
|
+
session,
|
|
313
317
|
serverProtocol: infraProtocol,
|
|
314
318
|
containers
|
|
315
319
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/py/agent/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { ensureLicenseExceptions } from '../../license/config';\nimport { AG_UI_LANGGRAPH_EXCEPTIONS } from '../../license/known-exceptions';\nimport {\n addPyDependencies,\n addTsDependencies,\n} from '../../utils/add-dependencies';\nimport { addAgentChatScripts } from '../../utils/agent-chat/agent-chat';\nimport {\n AGENT_CONNECTION_PY_DEPENDENCIES,\n addPythonFrameworkBase,\n ensurePythonAgentConnectionProject,\n getPythonAgentConnectionModuleName,\n getPythonAgentConnectionProject,\n} from '../../utils/agent-connection/agent-connection';\nimport { addAgentInfra } from '../../utils/agent-core-constructs/agent-core-constructs';\nimport { addPythonBundleTarget } from '../../utils/bundle/bundle';\nimport { resolveContainers } from '../../utils/containers';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies';\nimport { addDockerScanTarget, DOCKER_DEPENDENCIES } from '../../utils/docker';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { FS_DEPENDENCIES, FsCommands } from '../../utils/fs';\nimport { updateGitIgnore } from '../../utils/git';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { kebabCase, toClassName, toSnakeCase } from '../../utils/names';\nimport { getNpmScope } from '../../utils/npm-scope';\nimport {\n addComponentDevTarget,\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n normalizeTargetKeyOrder,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport { toProjectRelativePath } from '../../utils/paths';\nimport { assignPort } from '../../utils/port';\nimport { addWorkspaceDependencyToPyProject } from '../../utils/py';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs';\nimport type { IacMetadata } from '../../utils/shared-constructs-constants';\nimport { BASE_IMAGES } from '../../utils/versions';\nimport type {\n AgentProtocol,\n PyAgentFramework,\n PyAgentGeneratorSchema,\n} from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface PyAgentMetadata extends IacMetadata {\n readonly port: number;\n readonly rc: string;\n readonly auth: string;\n readonly protocol: AgentProtocol;\n /**\n * The mcp / gateway connection generators dispatch on this field to pick the\n * Strands vs LangChain Layer-2 client + agent.py transform.\n */\n readonly framework: PyAgentFramework;\n}\n\n/** Whether the chat CLI signs its requests, which only IAM auth needs. */\nconst isIam = (m: PyAgentMetadata) => m.auth === 'iam';\n\n// Each entry names the framework and protocol branch it belongs to, so the same\n// declaration drives both adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<PyAgentMetadata>()({\n ts: [\n // The chat CLI, which runs standalone via tsx for every protocol and\n // resolves the deployed agent from AppConfig. `agent-chat-cli` transitively\n // bundles the protocol clients (@a2a-js/sdk, @ag-ui/client).\n { name: 'agent-chat-cli', dev: true, root: true },\n { name: 'tsx', dev: true, root: true },\n { name: '@types/node', dev: true, root: true },\n { name: '@aws-lambda-powertools/parameters', dev: true, root: true },\n { name: '@aws-sdk/client-appconfigdata', dev: true, root: true },\n { name: 'aws4fetch', when: isIam, dev: true, root: true },\n {\n name: '@aws-sdk/credential-providers',\n when: isIam,\n dev: true,\n root: true,\n },\n {\n name: '@a2a-js/sdk',\n when: (m) => m.protocol === 'a2a',\n dev: true,\n root: true,\n },\n // Added by the helpers that own the projects they belong to.\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ],\n py: [\n { name: 'aws-lambda-powertools' },\n { name: 'aws-opentelemetry-distro' },\n { name: 'bedrock-agentcore' },\n { name: 'boto3' },\n { name: 'fastapi' },\n { name: 'mcp' },\n // langchain pulls no Strands dependencies — the langchain model binding\n // plus the per-protocol server adapter: ag-ui-langgraph for AG-UI, a2a-sdk\n // for A2A, nothing extra for HTTP (FastAPI is added for every agent).\n { name: 'langchain', when: (m) => m.framework === 'langchain' },\n { name: 'langchain-aws', when: (m) => m.framework === 'langchain' },\n { name: 'langgraph', when: (m) => m.framework === 'langchain' },\n {\n name: 'ag-ui-protocol',\n when: (m) => m.framework === 'langchain' && m.protocol === 'ag-ui',\n },\n {\n name: 'ag-ui-langgraph',\n when: (m) => m.framework === 'langchain' && m.protocol === 'ag-ui',\n },\n {\n name: 'a2a-sdk',\n when: (m) => m.framework === 'langchain' && m.protocol === 'a2a',\n },\n {\n name: 'strands-agents[a2a]',\n when: (m) => m.framework !== 'langchain' && m.protocol === 'a2a',\n },\n {\n name: 'strands-agents',\n when: (m) => m.framework !== 'langchain' && m.protocol !== 'a2a',\n },\n {\n name: 'strands-agents-tools',\n when: (m) => m.framework !== 'langchain',\n },\n // Declared again here so a Strands AG-UI agent lists it in the same order\n // the generated pyproject.toml had before.\n {\n name: 'ag-ui-protocol',\n when: (m) => m.framework !== 'langchain' && m.protocol === 'ag-ui',\n },\n {\n name: 'ag-ui-strands',\n when: (m) => m.framework !== 'langchain' && m.protocol === 'ag-ui',\n },\n { name: 'uvicorn' },\n // `fastapi dev` runs the local server for every protocol.\n { name: 'fastapi[standard]', group: 'dev' },\n // The agent-connection helper adds these to its own project.\n ...ownedElsewhere(AGENT_CONNECTION_PY_DEPENDENCIES),\n ],\n});\n\nexport const PY_AGENT_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const pyAgentGenerator = async (\n tree: Tree,\n options: PyAgentGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const project = readProjectConfigurationUnqualified(tree, options.project);\n\n const pyProjectPath = joinPathFragments(project.root, 'pyproject.toml');\n\n // Check if the project has a pyproject.toml file\n if (!pyProjectPath) {\n throw new Error(\n `Unsupported project ${options.project}. Expected a Python project (with a pyproject.toml)`,\n );\n }\n\n if (!project.sourceRoot) {\n throw new Error(\n `This project does not have a source root. Please add a source root to the project configuration before running this generator.`,\n );\n }\n\n // Module name is the last part of the source root,\n const sourceParts = project.sourceRoot.split('/');\n const moduleName = sourceParts[sourceParts.length - 1];\n\n const name = kebabCase(\n options.name || `${kebabCase(project.name.split('.').pop())}-agent`,\n );\n const agentTargetPrefix = options.name ? name : 'agent';\n\n const agentNameSnakeCase = toSnakeCase(options.name || 'agent');\n const agentNameClassName = toClassName(name);\n\n const targetSourceDir = joinPathFragments(\n project.sourceRoot,\n agentNameSnakeCase,\n );\n\n const infra = options.infra ?? 'agentcore';\n const protocol = options.protocol ?? 'http';\n const framework = options.framework ?? 'strands';\n\n // Recorded in the metadata below so the version sync can tell a CDK\n // project from a Terraform one; undefined when no infrastructure was\n // generated, in which case neither provider's packages were added.\n const iac =\n infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n if (infra === 'none' && options.auth && options.auth !== 'iam') {\n console.warn(\n 'Warning: auth is ignored when no infrastructure is configured (no infrastructure is generated)',\n );\n }\n\n const auth = options.auth ?? 'iam';\n\n // Ensure the shared agent-connection project exists so the server entry\n // point can import `session_id_context` and propagate the AgentCore\n // session ID to any downstream MCP / A2A clients a later connection\n // generator wires into this agent.\n await ensurePythonAgentConnectionProject(tree, DEPENDENCIES);\n // The agent server imports the framework base helpers (session cache + model\n // error logging) regardless of whether a connection client is wired in. The\n // langchain framework has no base layer (its AG-UI foundation reuses only the\n // framework-agnostic session context), so this is a no-op for langchain.\n await addPythonFrameworkBase(tree, DEPENDENCIES, framework);\n const agentConnectionModuleName = getPythonAgentConnectionModuleName(tree);\n addWorkspaceDependencyToPyProject(\n tree,\n project,\n getPythonAgentConnectionProject(tree),\n );\n\n const templateContext = {\n name,\n agentNameSnakeCase,\n agentNameClassName,\n moduleName,\n agentConnectionModuleName,\n framework,\n };\n\n // Generate common files shared by both protocols. The agent module (agent.py)\n // is framework-specific (Strands yields a contextmanaged Agent; LangChain\n // returns a compiled create_agent graph), so it comes from a per-framework\n // dir. The package __init__.py is framework-agnostic (it stays in `common`).\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n framework === 'langchain' ? 'common-langchain' : 'common',\n ),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n if (framework === 'langchain') {\n // common-langchain only carries agent.py; the empty package __init__.py is\n // framework-agnostic, so emit it from the shared `common` dir.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'common'),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n }\n\n // Generate protocol-specific files. Each protocol's server entry point is\n // framework-specific (Strands yields a contextmanaged Agent; LangChain drives\n // a compiled create_agent graph), so it comes from a per-framework dir\n // `<protocol>-langchain` for LangChain, or `<protocol>` for Strands.\n const protocolLower = protocol.toLowerCase();\n const protocolTemplateDir =\n framework === 'langchain' ? `${protocolLower}-langchain` : protocolLower;\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', protocolTemplateDir),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n // The HTTP server's init.py (the FastAPI app + JsonStreamingResponse) is\n // framework-agnostic and the LangChain http main.py reuses it, so emit it\n // from the shared `http` dir. Emitted after the langchain main.py above so\n // KeepExisting preserves that main.py and only adds init.py (the shared dir's\n // own Strands main.py is skipped).\n if (protocolLower === 'http' && framework === 'langchain') {\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'http'),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n }\n\n if (infra === 'agentcore') {\n const containers = await resolveContainers(tree, 'inherit');\n const dockerImageTag = `${getNpmScope(tree)}-${name}:latest`;\n\n // Add bundle target\n const { bundleTargetName, bundleOutputDir } = addPythonBundleTarget(\n project,\n {\n pythonPlatform: 'aarch64-manylinux_2_28',\n },\n );\n\n // Add the Dockerfile\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'deploy'),\n targetSourceDir,\n {\n agentNameSnakeCase,\n moduleName,\n bundleOutputDir,\n protocol,\n pythonBaseImage: BASE_IMAGES.python,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n const dockerOutputDir = joinPathFragments(\n 'dist',\n project.root,\n 'docker',\n name,\n );\n const dockerTargetName = `${agentTargetPrefix}-docker`;\n\n // Add a docker target that prepares the docker context and builds the image\n const fs = new FsCommands(tree, DEPENDENCIES);\n project.targets[dockerTargetName] = {\n cache: true,\n executor: 'nx:run-commands',\n options: {\n commands: [\n fs.rm(dockerOutputDir),\n fs.mkdir(dockerOutputDir),\n fs.cp(bundleOutputDir, dockerOutputDir),\n fs.cp(\n `${targetSourceDir}/Dockerfile`,\n `${dockerOutputDir}/Dockerfile`,\n ),\n `${containers} build --platform linux/arm64 -t ${dockerImageTag} ${dockerOutputDir}`,\n ],\n parallel: false,\n },\n dependsOn: [bundleTargetName],\n };\n\n addDependencyToTargetIfNotPresent(project, 'docker', dockerTargetName);\n addDependencyToTargetIfNotPresent(project, 'build', 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project,\n containerEngine: containers,\n trivyTargetName: `${agentTargetPrefix}-trivy`,\n dockerTargetName,\n imageTags: [dockerImageTag],\n },\n DEPENDENCIES,\n );\n\n // Add shared constructs\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n\n // Add the construct to deploy the agent.\n // AG-UI uses HTTP as the AgentCore protocol type (AG-UI is HTTP-based with SSE over POST).\n const infraProtocol =\n protocol === 'ag-ui' ? ('http' as const) : (protocol as 'http' | 'a2a');\n await addAgentInfra(tree, {\n agentNameKebabCase: name,\n agentNameClassName,\n dockerImageTag,\n dockerOutputDir,\n iac,\n projectName: project.name,\n auth,\n serverProtocol: infraProtocol,\n containers,\n });\n }\n\n // A2A servers use port 9000 as per the Strands A2A SDK default and AgentCore A2A contract.\n // HTTP and AG-UI agents use port 8081+ to avoid conflict with VS Code server on 8080.\n const localDevPortStart = protocol === 'a2a' ? 9000 : 8081;\n const localDevPort = assignPort(tree, project, localDevPortStart, {\n component: { info: PY_AGENT_GENERATOR_INFO, name: agentTargetPrefix },\n });\n\n // Recorded below and read by the declaration's predicates, so the packages\n // added here are exactly the ones the version sync will own.\n const metadata: PyAgentMetadata = {\n port: localDevPort,\n rc: agentNameClassName,\n auth,\n protocol,\n framework,\n ...(iac ? { iac } : {}),\n };\n\n addPyDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: project.root,\n });\n addTsDependencies(tree, DEPENDENCIES, { metadata });\n\n // All protocols use fastapi dev for hot reload:\n // - HTTP: FastAPI app directly defined in init.py\n // - A2A: A2AServer.to_fastapi_app() creates a FastAPI app in main.py\n // - AG-UI: create_strands_app() creates a FastAPI app in main.py\n const serveCommand = `uv run fastapi dev ${moduleName}/${agentNameSnakeCase}/main.py --port ${localDevPort}`;\n\n // HTTP chat uses the type-safe TypeScript client generated from the\n // agent's OpenAPI spec (same generated client the react-connection\n // generator produces). A2A and AG-UI speak standard protocols, so\n // we can run `agent-chat-cli` directly as a binary.\n const openApiTargetName = `${agentTargetPrefix}-openapi`;\n const clientGenTargetName = `${agentTargetPrefix}-generate-client`;\n\n const scriptsDir = joinPathFragments(\n project.root,\n 'scripts',\n agentTargetPrefix,\n );\n\n if (protocol === 'http') {\n // Emit the OpenAPI spec generator script (shared with react-connection)\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'react-connection',\n 'files',\n 'agent',\n ),\n project.root,\n {\n moduleName,\n agentNameSnakeCase,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Ignore the generated client directory\n updateGitIgnore(tree, project.root, (patterns) => [\n ...patterns,\n `scripts/${agentTargetPrefix}/generated/`,\n ]);\n }\n\n // Every protocol gets a standalone `chat.ts`. It connects to the local\n // `dev` server by default, or to the deployed agent (with the\n // appropriate auth) when `RUNTIME_CONFIG_APP_ID` is set.\n addAgentChatScripts(tree, {\n scriptsDir,\n protocol,\n language: 'py',\n agentNameClassName,\n auth,\n });\n\n const chatUrl =\n protocol === 'ag-ui'\n ? `http://localhost:${localDevPort}/invocations`\n : `http://localhost:${localDevPort}`;\n const chatCommand = `tsx ./scripts/${agentTargetPrefix}/chat.ts`;\n\n const httpOnlyTargets =\n protocol === 'http'\n ? {\n [openApiTargetName]: {\n cache: true,\n executor: 'nx:run-commands',\n outputs: [\n `{workspaceRoot}/dist/{projectRoot}/openapi/${agentNameSnakeCase}`,\n ],\n options: {\n commands: [\n `uv run python {projectRoot}/scripts/${agentNameSnakeCase}_openapi.py \"dist/{projectRoot}/openapi/${agentNameSnakeCase}/openapi.json\"`,\n ],\n },\n },\n [clientGenTargetName]: {\n cache: true,\n executor: 'nx:run-commands',\n dependsOn: [openApiTargetName],\n inputs: [\n {\n dependentTasksOutputFiles: '**/*.json',\n },\n ],\n outputs: [`{projectRoot}/scripts/${agentTargetPrefix}/generated`],\n options: {\n commands: [\n `nx g @aws/nx-plugin:open-api#ts-client --openApiSpecPath=\"dist/${project.root}/openapi/${agentNameSnakeCase}/openapi.json\" --outputPath=\"${project.root}/scripts/${agentTargetPrefix}/generated\" --no-interactive`,\n ],\n },\n },\n }\n : {};\n\n const agentTargets = {\n ...project.targets,\n ...httpOnlyTargets,\n [`${agentTargetPrefix}-serve`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [serveCommand],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n },\n },\n },\n [`${agentTargetPrefix}-dev`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [serveCommand],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n LOCAL_DEV: 'true',\n },\n },\n },\n // HTTP chat imports the generated client, so ensure it's built first.\n // No dev dependency — chat runs standalone against a local or\n // deployed agent. normalizeTargetKeyOrder keeps the conditional dependsOn\n // in Nx 23's serialization order so re-runs stay byte-identical.\n [`${agentTargetPrefix}-chat`]: normalizeTargetKeyOrder({\n executor: 'nx:run-commands',\n options: {\n commands: [chatCommand],\n cwd: '{projectRoot}',\n env: {\n URL: chatUrl,\n },\n },\n ...(protocol === 'http' ? { dependsOn: [clientGenTargetName] } : {}),\n }),\n };\n\n // Aggregate `<agent>-dev` under the project-level `dev` target.\n addComponentDevTarget(agentTargets, `${agentTargetPrefix}-dev`);\n\n updateProjectConfiguration(tree, project.name, {\n ...project,\n targets: sortObjectKeys(agentTargets),\n });\n\n addComponentGeneratorMetadata(\n tree,\n project.name,\n PY_AGENT_GENERATOR_INFO,\n toProjectRelativePath(project, targetSourceDir),\n agentTargetPrefix,\n metadata,\n );\n\n await addGeneratorMetricsIfApplicable(tree, [PY_AGENT_GENERATOR_INFO]);\n\n // langchain-core (pulled by every langchain agent regardless of protocol)\n // brings jsonpatch/jsonpointer, whose wheels ship without resolvable SPDX\n // license metadata, so register those exceptions so the workspace license\n // check still passes.\n if (framework === 'langchain') {\n await ensureLicenseExceptions(tree, AG_UI_LANGGRAPH_EXCEPTIONS);\n }\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript', 'python'],\n });\n};\n\nexport default pyAgentGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","ensureLicenseExceptions","AG_UI_LANGGRAPH_EXCEPTIONS","addPyDependencies","addTsDependencies","addAgentChatScripts","AGENT_CONNECTION_PY_DEPENDENCIES","addPythonFrameworkBase","ensurePythonAgentConnectionProject","getPythonAgentConnectionModuleName","getPythonAgentConnectionProject","addAgentInfra","addPythonBundleTarget","resolveContainers","declareDependencies","ownedElsewhere","addDockerScanTarget","DOCKER_DEPENDENCIES","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","updateGitIgnore","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","toClassName","toSnakeCase","getNpmScope","addComponentDevTarget","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","normalizeTargetKeyOrder","readProjectConfigurationUnqualified","sortObjectKeys","toProjectRelativePath","assignPort","addWorkspaceDependencyToPyProject","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","BASE_IMAGES","isIam","m","auth","DEPENDENCIES","ts","name","dev","root","when","protocol","py","framework","group","PY_AGENT_GENERATOR_INFO","filename","pyAgentGenerator","tree","options","project","pyProjectPath","Error","sourceRoot","sourceParts","split","moduleName","length","pop","agentTargetPrefix","agentNameSnakeCase","agentNameClassName","targetSourceDir","infra","iac","undefined","console","warn","agentConnectionModuleName","templateContext","dirname","overwriteStrategy","KeepExisting","protocolLower","toLowerCase","protocolTemplateDir","containers","dockerImageTag","bundleTargetName","bundleOutputDir","pythonPlatform","pythonBaseImage","python","dockerOutputDir","dockerTargetName","fs","targets","cache","executor","commands","rm","mkdir","cp","parallel","dependsOn","containerEngine","trivyTargetName","imageTags","infraProtocol","agentNameKebabCase","projectName","serverProtocol","localDevPortStart","localDevPort","component","info","metadata","port","rc","projectRoot","serveCommand","openApiTargetName","clientGenTargetName","scriptsDir","patterns","language","chatUrl","chatCommand","httpOnlyTargets","outputs","inputs","dependentTasksOutputFiles","agentTargets","continuous","cwd","env","PORT","LOCAL_DEV","URL","preferInstallDependencies","languages"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/py/agent/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { ensureLicenseExceptions } from '../../license/config';\nimport { AG_UI_LANGGRAPH_EXCEPTIONS } from '../../license/known-exceptions';\nimport {\n addPyDependencies,\n addTsDependencies,\n} from '../../utils/add-dependencies';\nimport { addAgentChatScripts } from '../../utils/agent-chat/agent-chat';\nimport {\n AGENT_CONNECTION_PY_DEPENDENCIES,\n addPythonFrameworkBase,\n ensurePythonAgentConnectionProject,\n getPythonAgentConnectionModuleName,\n getPythonAgentConnectionProject,\n} from '../../utils/agent-connection/agent-connection';\nimport { addAgentInfra } from '../../utils/agent-core-constructs/agent-core-constructs';\nimport { addPythonBundleTarget } from '../../utils/bundle/bundle';\nimport { resolveContainers } from '../../utils/containers';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies';\nimport { addDockerScanTarget, DOCKER_DEPENDENCIES } from '../../utils/docker';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { FS_DEPENDENCIES, FsCommands } from '../../utils/fs';\nimport { updateGitIgnore } from '../../utils/git';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { kebabCase, toClassName, toSnakeCase } from '../../utils/names';\nimport { getNpmScope } from '../../utils/npm-scope';\nimport {\n addComponentDevTarget,\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n normalizeTargetKeyOrder,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport { toProjectRelativePath } from '../../utils/paths';\nimport { assignPort } from '../../utils/port';\nimport { addWorkspaceDependencyToPyProject } from '../../utils/py';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs';\nimport type { IacMetadata } from '../../utils/shared-constructs-constants';\nimport { BASE_IMAGES } from '../../utils/versions';\nimport type {\n AgentProtocol,\n PyAgentFramework,\n PyAgentGeneratorSchema,\n} from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface PyAgentMetadata extends IacMetadata {\n readonly port: number;\n readonly rc: string;\n readonly auth: string;\n readonly protocol: AgentProtocol;\n /**\n * The mcp / gateway connection generators dispatch on this field to pick the\n * Strands vs LangChain Layer-2 client + agent.py transform.\n */\n readonly framework: PyAgentFramework;\n}\n\n/** Whether the chat CLI signs its requests, which only IAM auth needs. */\nconst isIam = (m: PyAgentMetadata) => m.auth === 'iam';\n\n// Each entry names the framework and protocol branch it belongs to, so the same\n// declaration drives both adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<PyAgentMetadata>()({\n ts: [\n // The chat CLI, which runs standalone via tsx for every protocol and\n // resolves the deployed agent from AppConfig. `agent-chat-cli` transitively\n // bundles the protocol clients (@a2a-js/sdk, @ag-ui/client).\n { name: 'agent-chat-cli', dev: true, root: true },\n { name: 'tsx', dev: true, root: true },\n { name: '@types/node', dev: true, root: true },\n { name: '@aws-lambda-powertools/parameters', dev: true, root: true },\n { name: '@aws-sdk/client-appconfigdata', dev: true, root: true },\n { name: 'aws4fetch', when: isIam, dev: true, root: true },\n {\n name: '@aws-sdk/credential-providers',\n when: isIam,\n dev: true,\n root: true,\n },\n {\n name: '@a2a-js/sdk',\n when: (m) => m.protocol === 'a2a',\n dev: true,\n root: true,\n },\n // Added by the helpers that own the projects they belong to.\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ],\n py: [\n { name: 'aws-lambda-powertools' },\n { name: 'aws-opentelemetry-distro' },\n { name: 'bedrock-agentcore' },\n { name: 'boto3' },\n { name: 'fastapi' },\n { name: 'mcp' },\n // langchain pulls no Strands dependencies — the langchain model binding\n // plus the per-protocol server adapter: ag-ui-langgraph for AG-UI, a2a-sdk\n // for A2A, nothing extra for HTTP (FastAPI is added for every agent).\n { name: 'langchain', when: (m) => m.framework === 'langchain' },\n { name: 'langchain-aws', when: (m) => m.framework === 'langchain' },\n { name: 'langgraph', when: (m) => m.framework === 'langchain' },\n {\n name: 'ag-ui-protocol',\n when: (m) => m.framework === 'langchain' && m.protocol === 'ag-ui',\n },\n {\n name: 'ag-ui-langgraph',\n when: (m) => m.framework === 'langchain' && m.protocol === 'ag-ui',\n },\n {\n name: 'a2a-sdk',\n when: (m) => m.framework === 'langchain' && m.protocol === 'a2a',\n },\n {\n name: 'strands-agents[a2a]',\n when: (m) => m.framework !== 'langchain' && m.protocol === 'a2a',\n },\n {\n name: 'strands-agents',\n when: (m) => m.framework !== 'langchain' && m.protocol !== 'a2a',\n },\n {\n name: 'strands-agents-tools',\n when: (m) => m.framework !== 'langchain',\n },\n // Declared again here so a Strands AG-UI agent lists it in the same order\n // the generated pyproject.toml had before.\n {\n name: 'ag-ui-protocol',\n when: (m) => m.framework !== 'langchain' && m.protocol === 'ag-ui',\n },\n {\n name: 'ag-ui-strands',\n when: (m) => m.framework !== 'langchain' && m.protocol === 'ag-ui',\n },\n { name: 'uvicorn' },\n // `fastapi dev` runs the local server for every protocol.\n { name: 'fastapi[standard]', group: 'dev' },\n // The agent-connection helper adds these to its own project.\n ...ownedElsewhere(AGENT_CONNECTION_PY_DEPENDENCIES),\n ],\n});\n\nexport const PY_AGENT_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const pyAgentGenerator = async (\n tree: Tree,\n options: PyAgentGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const project = readProjectConfigurationUnqualified(tree, options.project);\n\n const pyProjectPath = joinPathFragments(project.root, 'pyproject.toml');\n\n // Check if the project has a pyproject.toml file\n if (!pyProjectPath) {\n throw new Error(\n `Unsupported project ${options.project}. Expected a Python project (with a pyproject.toml)`,\n );\n }\n\n if (!project.sourceRoot) {\n throw new Error(\n `This project does not have a source root. Please add a source root to the project configuration before running this generator.`,\n );\n }\n\n // Module name is the last part of the source root,\n const sourceParts = project.sourceRoot.split('/');\n const moduleName = sourceParts[sourceParts.length - 1];\n\n const name = kebabCase(\n options.name || `${kebabCase(project.name.split('.').pop())}-agent`,\n );\n const agentTargetPrefix = options.name ? name : 'agent';\n\n const agentNameSnakeCase = toSnakeCase(options.name || 'agent');\n const agentNameClassName = toClassName(name);\n\n const targetSourceDir = joinPathFragments(\n project.sourceRoot,\n agentNameSnakeCase,\n );\n\n const infra = options.infra ?? 'agentcore';\n const protocol = options.protocol ?? 'http';\n const framework = options.framework ?? 'strands';\n\n // Recorded in the metadata below so the version sync can tell a CDK\n // project from a Terraform one; undefined when no infrastructure was\n // generated, in which case neither provider's packages were added.\n const iac =\n infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n if (infra === 'none' && options.auth && options.auth !== 'iam') {\n console.warn(\n 'Warning: auth is ignored when no infrastructure is configured (no infrastructure is generated)',\n );\n }\n\n const auth = options.auth ?? 'iam';\n\n // Only 'in-memory' is currently supported for Python agents (session manager\n // support for Python is not yet implemented).\n const session = options.session ?? 'in-memory';\n\n // Ensure the shared agent-connection project exists so the server entry\n // point can import `session_id_context` and propagate the AgentCore\n // session ID to any downstream MCP / A2A clients a later connection\n // generator wires into this agent.\n await ensurePythonAgentConnectionProject(tree, DEPENDENCIES);\n // The agent server imports the framework base helpers (session cache + model\n // error logging) regardless of whether a connection client is wired in. The\n // langchain framework has no base layer (its AG-UI foundation reuses only the\n // framework-agnostic session context), so this is a no-op for langchain.\n await addPythonFrameworkBase(tree, DEPENDENCIES, framework);\n const agentConnectionModuleName = getPythonAgentConnectionModuleName(tree);\n addWorkspaceDependencyToPyProject(\n tree,\n project,\n getPythonAgentConnectionProject(tree),\n );\n\n const templateContext = {\n name,\n agentNameSnakeCase,\n agentNameClassName,\n moduleName,\n agentConnectionModuleName,\n framework,\n };\n\n // Generate common files shared by both protocols. The agent module (agent.py)\n // is framework-specific (Strands yields a contextmanaged Agent; LangChain\n // returns a compiled create_agent graph), so it comes from a per-framework\n // dir. The package __init__.py is framework-agnostic (it stays in `common`).\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n framework === 'langchain' ? 'common-langchain' : 'common',\n ),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n if (framework === 'langchain') {\n // common-langchain only carries agent.py; the empty package __init__.py is\n // framework-agnostic, so emit it from the shared `common` dir.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'common'),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n }\n\n // Generate protocol-specific files. Each protocol's server entry point is\n // framework-specific (Strands yields a contextmanaged Agent; LangChain drives\n // a compiled create_agent graph), so it comes from a per-framework dir\n // `<protocol>-langchain` for LangChain, or `<protocol>` for Strands.\n const protocolLower = protocol.toLowerCase();\n const protocolTemplateDir =\n framework === 'langchain' ? `${protocolLower}-langchain` : protocolLower;\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', protocolTemplateDir),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n // The HTTP server's init.py (the FastAPI app + JsonStreamingResponse) is\n // framework-agnostic and the LangChain http main.py reuses it, so emit it\n // from the shared `http` dir. Emitted after the langchain main.py above so\n // KeepExisting preserves that main.py and only adds init.py (the shared dir's\n // own Strands main.py is skipped).\n if (protocolLower === 'http' && framework === 'langchain') {\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'http'),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n }\n\n if (infra === 'agentcore') {\n const containers = await resolveContainers(tree, 'inherit');\n const dockerImageTag = `${getNpmScope(tree)}-${name}:latest`;\n\n // Add bundle target\n const { bundleTargetName, bundleOutputDir } = addPythonBundleTarget(\n project,\n {\n pythonPlatform: 'aarch64-manylinux_2_28',\n },\n );\n\n // Add the Dockerfile\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'deploy'),\n targetSourceDir,\n {\n agentNameSnakeCase,\n moduleName,\n bundleOutputDir,\n protocol,\n pythonBaseImage: BASE_IMAGES.python,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n const dockerOutputDir = joinPathFragments(\n 'dist',\n project.root,\n 'docker',\n name,\n );\n const dockerTargetName = `${agentTargetPrefix}-docker`;\n\n // Add a docker target that prepares the docker context and builds the image\n const fs = new FsCommands(tree, DEPENDENCIES);\n project.targets[dockerTargetName] = {\n cache: true,\n executor: 'nx:run-commands',\n options: {\n commands: [\n fs.rm(dockerOutputDir),\n fs.mkdir(dockerOutputDir),\n fs.cp(bundleOutputDir, dockerOutputDir),\n fs.cp(\n `${targetSourceDir}/Dockerfile`,\n `${dockerOutputDir}/Dockerfile`,\n ),\n `${containers} build --platform linux/arm64 -t ${dockerImageTag} ${dockerOutputDir}`,\n ],\n parallel: false,\n },\n dependsOn: [bundleTargetName],\n };\n\n addDependencyToTargetIfNotPresent(project, 'docker', dockerTargetName);\n addDependencyToTargetIfNotPresent(project, 'build', 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project,\n containerEngine: containers,\n trivyTargetName: `${agentTargetPrefix}-trivy`,\n dockerTargetName,\n imageTags: [dockerImageTag],\n },\n DEPENDENCIES,\n );\n\n // Add shared constructs\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n\n // Add the construct to deploy the agent.\n // AG-UI uses HTTP as the AgentCore protocol type (AG-UI is HTTP-based with SSE over POST).\n const infraProtocol =\n protocol === 'ag-ui' ? ('http' as const) : (protocol as 'http' | 'a2a');\n await addAgentInfra(tree, {\n agentNameKebabCase: name,\n agentNameClassName,\n dockerImageTag,\n dockerOutputDir,\n iac,\n projectName: project.name,\n auth,\n session,\n serverProtocol: infraProtocol,\n containers,\n });\n }\n\n // A2A servers use port 9000 as per the Strands A2A SDK default and AgentCore A2A contract.\n // HTTP and AG-UI agents use port 8081+ to avoid conflict with VS Code server on 8080.\n const localDevPortStart = protocol === 'a2a' ? 9000 : 8081;\n const localDevPort = assignPort(tree, project, localDevPortStart, {\n component: { info: PY_AGENT_GENERATOR_INFO, name: agentTargetPrefix },\n });\n\n // Recorded below and read by the declaration's predicates, so the packages\n // added here are exactly the ones the version sync will own.\n const metadata: PyAgentMetadata = {\n port: localDevPort,\n rc: agentNameClassName,\n auth,\n protocol,\n framework,\n ...(iac ? { iac } : {}),\n };\n\n addPyDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: project.root,\n });\n addTsDependencies(tree, DEPENDENCIES, { metadata });\n\n // All protocols use fastapi dev for hot reload:\n // - HTTP: FastAPI app directly defined in init.py\n // - A2A: A2AServer.to_fastapi_app() creates a FastAPI app in main.py\n // - AG-UI: create_strands_app() creates a FastAPI app in main.py\n const serveCommand = `uv run fastapi dev ${moduleName}/${agentNameSnakeCase}/main.py --port ${localDevPort}`;\n\n // HTTP chat uses the type-safe TypeScript client generated from the\n // agent's OpenAPI spec (same generated client the react-connection\n // generator produces). A2A and AG-UI speak standard protocols, so\n // we can run `agent-chat-cli` directly as a binary.\n const openApiTargetName = `${agentTargetPrefix}-openapi`;\n const clientGenTargetName = `${agentTargetPrefix}-generate-client`;\n\n const scriptsDir = joinPathFragments(\n project.root,\n 'scripts',\n agentTargetPrefix,\n );\n\n if (protocol === 'http') {\n // Emit the OpenAPI spec generator script (shared with react-connection)\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'react-connection',\n 'files',\n 'agent',\n ),\n project.root,\n {\n moduleName,\n agentNameSnakeCase,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Ignore the generated client directory\n updateGitIgnore(tree, project.root, (patterns) => [\n ...patterns,\n `scripts/${agentTargetPrefix}/generated/`,\n ]);\n }\n\n // Every protocol gets a standalone `chat.ts`. It connects to the local\n // `dev` server by default, or to the deployed agent (with the\n // appropriate auth) when `RUNTIME_CONFIG_APP_ID` is set.\n addAgentChatScripts(tree, {\n scriptsDir,\n protocol,\n language: 'py',\n agentNameClassName,\n auth,\n });\n\n const chatUrl =\n protocol === 'ag-ui'\n ? `http://localhost:${localDevPort}/invocations`\n : `http://localhost:${localDevPort}`;\n const chatCommand = `tsx ./scripts/${agentTargetPrefix}/chat.ts`;\n\n const httpOnlyTargets =\n protocol === 'http'\n ? {\n [openApiTargetName]: {\n cache: true,\n executor: 'nx:run-commands',\n outputs: [\n `{workspaceRoot}/dist/{projectRoot}/openapi/${agentNameSnakeCase}`,\n ],\n options: {\n commands: [\n `uv run python {projectRoot}/scripts/${agentNameSnakeCase}_openapi.py \"dist/{projectRoot}/openapi/${agentNameSnakeCase}/openapi.json\"`,\n ],\n },\n },\n [clientGenTargetName]: {\n cache: true,\n executor: 'nx:run-commands',\n dependsOn: [openApiTargetName],\n inputs: [\n {\n dependentTasksOutputFiles: '**/*.json',\n },\n ],\n outputs: [`{projectRoot}/scripts/${agentTargetPrefix}/generated`],\n options: {\n commands: [\n `nx g @aws/nx-plugin:open-api#ts-client --openApiSpecPath=\"dist/${project.root}/openapi/${agentNameSnakeCase}/openapi.json\" --outputPath=\"${project.root}/scripts/${agentTargetPrefix}/generated\" --no-interactive`,\n ],\n },\n },\n }\n : {};\n\n const agentTargets = {\n ...project.targets,\n ...httpOnlyTargets,\n [`${agentTargetPrefix}-serve`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [serveCommand],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n },\n },\n },\n [`${agentTargetPrefix}-dev`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [serveCommand],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n LOCAL_DEV: 'true',\n },\n },\n },\n // HTTP chat imports the generated client, so ensure it's built first.\n // No dev dependency — chat runs standalone against a local or\n // deployed agent. normalizeTargetKeyOrder keeps the conditional dependsOn\n // in Nx 23's serialization order so re-runs stay byte-identical.\n [`${agentTargetPrefix}-chat`]: normalizeTargetKeyOrder({\n executor: 'nx:run-commands',\n options: {\n commands: [chatCommand],\n cwd: '{projectRoot}',\n env: {\n URL: chatUrl,\n },\n },\n ...(protocol === 'http' ? { dependsOn: [clientGenTargetName] } : {}),\n }),\n };\n\n // Aggregate `<agent>-dev` under the project-level `dev` target.\n addComponentDevTarget(agentTargets, `${agentTargetPrefix}-dev`);\n\n updateProjectConfiguration(tree, project.name, {\n ...project,\n targets: sortObjectKeys(agentTargets),\n });\n\n addComponentGeneratorMetadata(\n tree,\n project.name,\n PY_AGENT_GENERATOR_INFO,\n toProjectRelativePath(project, targetSourceDir),\n agentTargetPrefix,\n metadata,\n );\n\n await addGeneratorMetricsIfApplicable(tree, [PY_AGENT_GENERATOR_INFO]);\n\n // langchain-core (pulled by every langchain agent regardless of protocol)\n // brings jsonpatch/jsonpointer, whose wheels ship without resolvable SPDX\n // license metadata, so register those exceptions so the workspace license\n // check still passes.\n if (framework === 'langchain') {\n await ensureLicenseExceptions(tree, AG_UI_LANGGRAPH_EXCEPTIONS);\n }\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript', 'python'],\n });\n};\n\nexport default pyAgentGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","ensureLicenseExceptions","AG_UI_LANGGRAPH_EXCEPTIONS","addPyDependencies","addTsDependencies","addAgentChatScripts","AGENT_CONNECTION_PY_DEPENDENCIES","addPythonFrameworkBase","ensurePythonAgentConnectionProject","getPythonAgentConnectionModuleName","getPythonAgentConnectionProject","addAgentInfra","addPythonBundleTarget","resolveContainers","declareDependencies","ownedElsewhere","addDockerScanTarget","DOCKER_DEPENDENCIES","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","updateGitIgnore","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","toClassName","toSnakeCase","getNpmScope","addComponentDevTarget","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","normalizeTargetKeyOrder","readProjectConfigurationUnqualified","sortObjectKeys","toProjectRelativePath","assignPort","addWorkspaceDependencyToPyProject","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","BASE_IMAGES","isIam","m","auth","DEPENDENCIES","ts","name","dev","root","when","protocol","py","framework","group","PY_AGENT_GENERATOR_INFO","filename","pyAgentGenerator","tree","options","project","pyProjectPath","Error","sourceRoot","sourceParts","split","moduleName","length","pop","agentTargetPrefix","agentNameSnakeCase","agentNameClassName","targetSourceDir","infra","iac","undefined","console","warn","session","agentConnectionModuleName","templateContext","dirname","overwriteStrategy","KeepExisting","protocolLower","toLowerCase","protocolTemplateDir","containers","dockerImageTag","bundleTargetName","bundleOutputDir","pythonPlatform","pythonBaseImage","python","dockerOutputDir","dockerTargetName","fs","targets","cache","executor","commands","rm","mkdir","cp","parallel","dependsOn","containerEngine","trivyTargetName","imageTags","infraProtocol","agentNameKebabCase","projectName","serverProtocol","localDevPortStart","localDevPort","component","info","metadata","port","rc","projectRoot","serveCommand","openApiTargetName","clientGenTargetName","scriptsDir","patterns","language","chatUrl","chatCommand","httpOnlyTargets","outputs","inputs","dependentTasksOutputFiles","agentTargets","continuous","cwd","env","PORT","LOCAL_DEV","URL","preferInstallDependencies","languages"],"mappings":"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"}
|
|
@@ -140,7 +140,8 @@ class InventoryMcpClientStrands:
|
|
|
140
140
|
if os.environ.get("LOCAL_DEV") == "true":
|
|
141
141
|
return AgentCoreMCPClientStrands.without_auth("http://localhost:8082/mcp")
|
|
142
142
|
config = get_agentcore_runtime_config()
|
|
143
|
-
|
|
143
|
+
agent_runtime = config.get("agentRuntimes", {}).get("InventoryMcp")
|
|
144
|
+
agent_runtime_arn = agent_runtime.get("arn") if agent_runtime else None
|
|
144
145
|
if not agent_runtime_arn:
|
|
145
146
|
raise RuntimeError("No connected MCP server runtime named 'InventoryMcp' found in runtime configuration.")
|
|
146
147
|
return AgentCoreMCPClientStrands.with_iam_auth(agent_runtime_arn)
|
|
@@ -20,9 +20,10 @@ class <%- mcpServerClassName %>ClientStrands:
|
|
|
20
20
|
"http://localhost:<%- mcpServerPort %>/mcp"
|
|
21
21
|
)
|
|
22
22
|
config = get_agentcore_runtime_config()
|
|
23
|
-
|
|
23
|
+
agent_runtime = config.get("agentRuntimes", {}).get(
|
|
24
24
|
"<%- mcpServerClassName %>"
|
|
25
25
|
)
|
|
26
|
+
agent_runtime_arn = agent_runtime.get("arn") if agent_runtime else None
|
|
26
27
|
if not agent_runtime_arn:
|
|
27
28
|
raise RuntimeError(
|
|
28
29
|
"No connected MCP server runtime named '<%- mcpServerClassName %>' found in runtime configuration."
|
|
@@ -20,9 +20,10 @@ class <%- mcpServerClassName %>ClientLangChain:
|
|
|
20
20
|
"http://localhost:<%- mcpServerPort %>/mcp"
|
|
21
21
|
)
|
|
22
22
|
config = get_agentcore_runtime_config()
|
|
23
|
-
|
|
23
|
+
agent_runtime = config.get("agentRuntimes", {}).get(
|
|
24
24
|
"<%- mcpServerClassName %>"
|
|
25
25
|
)
|
|
26
|
+
agent_runtime_arn = agent_runtime.get("arn") if agent_runtime else None
|
|
26
27
|
if not agent_runtime_arn:
|
|
27
28
|
raise RuntimeError(
|
|
28
29
|
"No connected MCP server runtime named '<%- mcpServerClassName %>' found in runtime configuration."
|
|
@@ -39,6 +39,8 @@ export const TestAgentClientContext = createContext<TestAgent | undefined>(
|
|
|
39
39
|
const useCreateTestAgentClient = (): TestAgent => {
|
|
40
40
|
const runtimeConfig = useRuntimeConfig();
|
|
41
41
|
const agentRuntimeValue = runtimeConfig.agentRuntimes.TestAgent;
|
|
42
|
+
// A local-dev override is a plain URL; otherwise it's the agent's runtime
|
|
43
|
+
// ARN, so build the invocation URL from it.
|
|
42
44
|
const apiUrl = agentRuntimeValue.startsWith('arn:')
|
|
43
45
|
? buildAgentCoreHttpUrl(agentRuntimeValue)
|
|
44
46
|
: agentRuntimeValue;
|
|
@@ -99,6 +101,8 @@ export const TestAgentClientContext = createContext<TestAgent | undefined>(
|
|
|
99
101
|
const useCreateTestAgentClient = (): TestAgent => {
|
|
100
102
|
const runtimeConfig = useRuntimeConfig();
|
|
101
103
|
const agentRuntimeValue = runtimeConfig.agentRuntimes.TestAgent;
|
|
104
|
+
// A local-dev override is a plain URL; otherwise it's the agent's runtime
|
|
105
|
+
// ARN, so build the invocation URL from it.
|
|
102
106
|
const apiUrl = agentRuntimeValue.startsWith('arn:')
|
|
103
107
|
? buildAgentCoreHttpUrl(agentRuntimeValue)
|
|
104
108
|
: agentRuntimeValue;
|
|
@@ -165,6 +169,8 @@ export const TestAgentClientContext = createContext<TestAgent | undefined>(
|
|
|
165
169
|
const useCreateTestAgentClient = (): TestAgent => {
|
|
166
170
|
const runtimeConfig = useRuntimeConfig();
|
|
167
171
|
const agentRuntimeValue = runtimeConfig.agentRuntimes.TestAgent;
|
|
172
|
+
// A local-dev override is a plain URL; otherwise it's the agent's runtime
|
|
173
|
+
// ARN, so build the invocation URL from it.
|
|
168
174
|
const apiUrl = agentRuntimeValue.startsWith('arn:')
|
|
169
175
|
? buildAgentCoreHttpUrl(agentRuntimeValue)
|
|
170
176
|
: agentRuntimeValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/py/agent/schema.d.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IacOption } from '../../utils/iac';\n\nexport type PyAgentFramework = 'strands' | 'langchain';\nexport type PyAgentInfra = 'agentcore' | 'none';\nexport type AgentProtocol = 'http' | 'a2a' | 'ag-ui';\n\nexport type PyAgentAuth = 'iam' | 'cognito';\n\nexport interface PyAgentGeneratorSchema {\n project: string;\n framework?: PyAgentFramework;\n name?: string;\n infra?: PyAgentInfra;\n auth?: PyAgentAuth;\n protocol?: AgentProtocol;\n iac: IacOption;\n preferInstallDependencies?: boolean;\n}\n"],"names":[],"mappings":"AAAA;;;CAGC,
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/py/agent/schema.d.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IacOption } from '../../utils/iac';\n\nexport type PyAgentFramework = 'strands' | 'langchain';\nexport type PyAgentInfra = 'agentcore' | 'none';\nexport type AgentProtocol = 'http' | 'a2a' | 'ag-ui';\n\nexport type PyAgentAuth = 'iam' | 'cognito';\n\nexport type PyAgentSession = 'in-memory';\n\nexport interface PyAgentGeneratorSchema {\n project: string;\n framework?: PyAgentFramework;\n name?: string;\n infra?: PyAgentInfra;\n auth?: PyAgentAuth;\n protocol?: AgentProtocol;\n session?: PyAgentSession;\n iac: IacOption;\n preferInstallDependencies?: boolean;\n}\n"],"names":[],"mappings":"AAAA;;;CAGC,GAYD,WAUC"}
|
package/src/py/agent/schema.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export type AgentProtocol = 'http' | 'a2a' | 'ag-ui';
|
|
|
11
11
|
|
|
12
12
|
export type PyAgentAuth = 'iam' | 'cognito';
|
|
13
13
|
|
|
14
|
+
export type PyAgentSession = 'in-memory';
|
|
15
|
+
|
|
14
16
|
export interface PyAgentGeneratorSchema {
|
|
15
17
|
project: string;
|
|
16
18
|
framework?: PyAgentFramework;
|
|
@@ -18,6 +20,7 @@ export interface PyAgentGeneratorSchema {
|
|
|
18
20
|
infra?: PyAgentInfra;
|
|
19
21
|
auth?: PyAgentAuth;
|
|
20
22
|
protocol?: AgentProtocol;
|
|
23
|
+
session?: PyAgentSession;
|
|
21
24
|
iac: IacOption;
|
|
22
25
|
preferInstallDependencies?: boolean;
|
|
23
26
|
}
|
package/src/py/agent/schema.json
CHANGED
|
@@ -60,6 +60,14 @@
|
|
|
60
60
|
"default": "agentcore",
|
|
61
61
|
"x-priority": "important"
|
|
62
62
|
},
|
|
63
|
+
"session": {
|
|
64
|
+
"type": "string",
|
|
65
|
+
"description": "The storage used to persist session for your Agent. Only 'in-memory' is currently supported for Python agents.",
|
|
66
|
+
"x-prompt": "How would you like to persist session for your Agent?",
|
|
67
|
+
"enum": ["in-memory"],
|
|
68
|
+
"default": "in-memory",
|
|
69
|
+
"x-priority": "important"
|
|
70
|
+
},
|
|
63
71
|
"preferInstallDependencies": {
|
|
64
72
|
"type": "boolean",
|
|
65
73
|
"description": "Whether to prefer installing dependencies after the generator runs. Set to false to defer installing when batching multiple generators (an install still runs if needed so subsequent generators can compute the Nx project graph); install once at the end.",
|
|
@@ -85,7 +85,9 @@ export class SnapshotBedrockServer
|
|
|
85
85
|
|
|
86
86
|
rc.set('agentcore', 'agentRuntimes', {
|
|
87
87
|
...rc.get('agentcore').agentRuntimes,
|
|
88
|
-
SnapshotBedrockServer:
|
|
88
|
+
SnapshotBedrockServer: {
|
|
89
|
+
arn: this.agentCoreRuntime.agentRuntimeArn,
|
|
90
|
+
},
|
|
89
91
|
});
|
|
90
92
|
}
|
|
91
93
|
|
|
@@ -738,7 +740,7 @@ module "add_agent_runtime_to_runtime_config" {
|
|
|
738
740
|
|
|
739
741
|
namespace = "agentcore"
|
|
740
742
|
key = "agentRuntimes"
|
|
741
|
-
value = { "TerraformSnapshotServer" = module.agent_core_runtime.agent_core_runtime_arn }
|
|
743
|
+
value = { "TerraformSnapshotServer" = { arn = module.agent_core_runtime.agent_core_runtime_arn } }
|
|
742
744
|
|
|
743
745
|
depends_on = [module.agent_core_runtime]
|
|
744
746
|
}
|