diff --git a/docs/commands.md b/docs/commands.md index fbfd5c7f3..3588c9333 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -72,7 +72,7 @@ agentcore create \ | `--no-agent` | Skip agent creation | | `--type ` | `create` (default) or `import` | | `--language ` | `Python` (default) | -| `--framework ` | `Strands`, `LangChain_LangGraph`, `CrewAI`, `GoogleADK`, `OpenAIAgents` | +| `--framework ` | `Strands`, `LangChain_LangGraph`, `GoogleADK`, `OpenAIAgents` | | `--model-provider

` | `Bedrock`, `Anthropic`, `OpenAI`, `Gemini` | | `--build ` | `CodeZip` (default) or `Container` (see [Container Builds](container-builds.md)) | | `--api-key ` | API key for non-Bedrock providers | @@ -199,7 +199,7 @@ agentcore add agent \ | `--type ` | `create` (default), `byo`, or `import` | | `--build ` | `CodeZip` (default) or `Container` (see [Container Builds](container-builds.md)) | | `--language ` | `Python` (create); `Python`, `TypeScript`, `Other` (BYO) | -| `--framework ` | `Strands`, `LangChain_LangGraph`, `CrewAI`, `GoogleADK`, `OpenAIAgents` | +| `--framework ` | `Strands`, `LangChain_LangGraph`, `GoogleADK`, `OpenAIAgents` | | `--model-provider

` | `Bedrock`, `Anthropic`, `OpenAI`, `Gemini` | | `--api-key ` | API key for non-Bedrock providers | | `--memory ` | `none`, `shortTerm`, `longAndShortTerm` (create and import; see [Memory Shorthand Mapping](memory.md#--memory-shorthand-mapping)) | diff --git a/integ-tests/create-frameworks.test.ts b/integ-tests/create-frameworks.test.ts index 344d4e414..d91e0dcfb 100644 --- a/integ-tests/create-frameworks.test.ts +++ b/integ-tests/create-frameworks.test.ts @@ -63,46 +63,6 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create with differen expect(agents[0]!.name).toBe(agentName); }); - it('creates CrewAI project', async () => { - const name = `Crew${Date.now().toString().slice(-6)}`; - const result = await runCLI( - [ - 'create', - '--name', - name, - '--language', - 'Python', - '--framework', - 'CrewAI', - '--model-provider', - 'Bedrock', - '--memory', - 'none', - '--json', - ], - testDir - ); - - expect(result.exitCode, `stderr: ${result.stderr}`).toBe(0); - const json = JSON.parse(result.stdout); - expect(json.success).toBe(true); - - const agentName = json.agentName || name; - const agentDir = join(json.projectPath, 'app', agentName); - - expect(await exists(agentDir), 'Agent directory should exist').toBe(true); - expect(await exists(join(agentDir, 'pyproject.toml')), 'pyproject.toml should exist').toBe(true); - - // Verify pyproject.toml references crewai - const pyproject = await readFile(join(agentDir, 'pyproject.toml'), 'utf-8'); - expect(pyproject.toLowerCase().includes('crewai'), 'pyproject.toml should reference crewai').toBeTruthy(); - - const config = await readProjectConfig(json.projectPath); - const agents = config.agents as Record[]; - expect(agents.length).toBe(1); - expect(agents[0]!.name).toBe(agentName); - }); - it('creates GoogleADK project with Gemini provider', async () => { const name = `Gadk${Date.now().toString().slice(-6)}`; const result = await runCLI( diff --git a/integ-tests/create-protocols.test.ts b/integ-tests/create-protocols.test.ts index b752ab274..0a08177da 100644 --- a/integ-tests/create-protocols.test.ts +++ b/integ-tests/create-protocols.test.ts @@ -142,31 +142,6 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create with protocol expect(result.exitCode).not.toBe(0); }); - - it('rejects A2A with unsupported framework (CrewAI)', async () => { - const name = `A2aCrew${Date.now().toString().slice(-6)}`; - const result = await runCLI( - [ - 'create', - '--name', - name, - '--language', - 'Python', - '--protocol', - 'A2A', - '--framework', - 'CrewAI', - '--model-provider', - 'Bedrock', - '--memory', - 'none', - '--json', - ], - testDir - ); - - expect(result.exitCode).not.toBe(0); - }); }); describe.skipIf(!prereqs.npm || !prereqs.git)('integration: add agent with protocol modes', () => { diff --git a/src/assets/AGENTS.md b/src/assets/AGENTS.md index 04441afde..9c583f4d7 100644 --- a/src/assets/AGENTS.md +++ b/src/assets/AGENTS.md @@ -12,7 +12,6 @@ assets/ ├── python/ # Framework templates (one per SDK) │ ├── strands/ │ ├── langchain_langgraph/ -│ ├── crewai/ │ ├── googleadk/ │ ├── openaiagents/ │ └── autogen/ diff --git a/src/assets/__tests__/__snapshots__/assets.snapshot.test.ts.snap b/src/assets/__tests__/__snapshots__/assets.snapshot.test.ts.snap index be2543b6a..2aaf157ee 100644 --- a/src/assets/__tests__/__snapshots__/assets.snapshot.test.ts.snap +++ b/src/assets/__tests__/__snapshots__/assets.snapshot.test.ts.snap @@ -480,12 +480,6 @@ exports[`Assets Directory Snapshots > File listing > should match the expected f "python/http/autogen/base/model/__init__.py", "python/http/autogen/base/model/load.py", "python/http/autogen/base/pyproject.toml", - "python/http/crewai/base/README.md", - "python/http/crewai/base/gitignore.template", - "python/http/crewai/base/main.py", - "python/http/crewai/base/model/__init__.py", - "python/http/crewai/base/model/load.py", - "python/http/crewai/base/pyproject.toml", "python/http/googleadk/base/README.md", "python/http/googleadk/base/gitignore.template", "python/http/googleadk/base/main.py", @@ -2089,330 +2083,6 @@ packages = ["."] " `; -exports[`Assets Directory Snapshots > Python framework assets > python/python/http/crewai/base/README.md should match snapshot 1`] = ` -"This is a project generated by the agentcore create CLI tool! - -# Layout - -The generated application code lives at the agent root directory. At the root, there is a \`.gitignore\` file, an -\`agentcore/\` folder which represents the configurations and state associated with this project. Other \`agentcore\` -commands like \`deploy\`, \`dev\`, and \`invoke\` rely on the configuration stored here. - -## Agent Root - -The main entrypoint to your app is defined in \`main.py\`. Using the AgentCore SDK \`@app.entrypoint\` decorator, this -file defines a Starlette ASGI app with the CrewAI framework running within. - -\`model/load.py\` instantiates your chosen model provider. - -## Environment Variables - -| Variable | Required | Description | -| --- | --- | --- | -{{#if hasIdentity}}| \`{{identityProviders.[0].envVarName}}\` | Yes | {{modelProvider}} API key (local) or Identity provider name (deployed) | -{{/if}}| \`LOCAL_DEV\` | No | Set to \`1\` to use \`.env.local\` instead of AgentCore Identity | - -# Developing locally - -If installation was successful, a virtual environment is already created with dependencies installed. - -Run \`source .venv/bin/activate\` before developing. - -\`agentcore dev\` will start a local server on 0.0.0.0:8080. - -In a new terminal, you can invoke that server with: - -\`agentcore invoke --dev "What can you do"\` - -# Deployment - -After providing credentials, \`agentcore deploy\` will deploy your project into Amazon Bedrock AgentCore. - -Use \`agentcore invoke\` to invoke your deployed agent. -" -`; - -exports[`Assets Directory Snapshots > Python framework assets > python/python/http/crewai/base/gitignore.template should match snapshot 1`] = ` -"# Environment variables -.env - -# Python -__pycache__/ -*.py[cod] -*$py.class -*.so -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg - -# Virtual environments -.venv/ -venv/ -ENV/ -env/ - -# IDE -.vscode/ -.idea/ -*.swp -*.swo -*~ - -# OS -.DS_Store -Thumbs.db -" -`; - -exports[`Assets Directory Snapshots > Python framework assets > python/python/http/crewai/base/main.py should match snapshot 1`] = ` -"from crewai import Agent, Crew, Task, Process -from crewai.tools import tool -from bedrock_agentcore.runtime import BedrockAgentCoreApp -from model.load import load_model - -app = BedrockAgentCoreApp() -log = app.logger - - -# Define a simple function tool -@tool -def add_numbers(a: int, b: int) -> int: - """Return the sum of two numbers""" - return a + b - - -# Define a collection of tools used by the model -tools = [add_numbers] - - -@app.entrypoint -def invoke(payload, context): - log.info("Invoking Agent.....") - - # Define the Agent with Tools - agent = Agent( - role="Question Answering Assistant", - goal="Answer the users questions", - backstory="Always eager to answer any questions", - llm=load_model(), - tools=tools, - ) - - # Define the Task - task = Task( - agent=agent, - description="Answer the users question: {prompt}", - expected_output="An answer to the users question", - ) - - # Create the Crew - crew = Crew(agents=[agent], tasks=[task], process=Process.sequential) - - # Process the user prompt - prompt = payload.get("prompt", "What can you help me with?") - - # Run the crew - result = crew.kickoff(inputs={"prompt": prompt}) - - # Return result - return {"result": result.raw} - - -if __name__ == "__main__": - app.run() -" -`; - -exports[`Assets Directory Snapshots > Python framework assets > python/python/http/crewai/base/model/__init__.py should match snapshot 1`] = ` -"# Package marker -" -`; - -exports[`Assets Directory Snapshots > Python framework assets > python/python/http/crewai/base/model/load.py should match snapshot 1`] = ` -"{{#if (eq modelProvider "Bedrock")}} -from crewai import LLM - -# Uses global inference profile for Claude Sonnet 4.5 -# https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html -MODEL_ID = "bedrock/global.anthropic.claude-sonnet-4-5-20250929-v1:0" - - -def load_model() -> LLM: - """Get Bedrock model client using IAM credentials.""" - return LLM(model=MODEL_ID) -{{/if}} -{{#if (eq modelProvider "Anthropic")}} -import os -from crewai import LLM -from bedrock_agentcore.identity.auth import requires_api_key - -IDENTITY_PROVIDER_NAME = "{{identityProviders.[0].name}}" -IDENTITY_ENV_VAR = "{{identityProviders.[0].envVarName}}" - - -@requires_api_key(provider_name=IDENTITY_PROVIDER_NAME) -def _agentcore_identity_api_key_provider(api_key: str) -> str: - """Fetch API key from AgentCore Identity.""" - return api_key - - -def _get_api_key() -> str: - """ - Uses AgentCore Identity for API key management in deployed environments. - For local development, run via 'agentcore dev' which loads agentcore/.env. - """ - if os.getenv("LOCAL_DEV") == "1": - api_key = os.getenv(IDENTITY_ENV_VAR) - if not api_key: - raise RuntimeError( - f"{IDENTITY_ENV_VAR} not found. Add {IDENTITY_ENV_VAR}=your-key to .env.local" - ) - return api_key - return _agentcore_identity_api_key_provider() - - -def load_model() -> LLM: - """Get authenticated Anthropic model client.""" - api_key = _get_api_key() - # CrewAI requires ANTHROPIC_API_KEY env var (ignores api_key parameter) - os.environ["ANTHROPIC_API_KEY"] = api_key - return LLM( - model="anthropic/claude-sonnet-4-5-20250929", - api_key=api_key, - max_tokens=4096 - ) -{{/if}} -{{#if (eq modelProvider "OpenAI")}} -import os -from crewai import LLM -from bedrock_agentcore.identity.auth import requires_api_key - -IDENTITY_PROVIDER_NAME = "{{identityProviders.[0].name}}" -IDENTITY_ENV_VAR = "{{identityProviders.[0].envVarName}}" - - -@requires_api_key(provider_name=IDENTITY_PROVIDER_NAME) -def _agentcore_identity_api_key_provider(api_key: str) -> str: - """Fetch API key from AgentCore Identity.""" - return api_key - - -def _get_api_key() -> str: - """ - Uses AgentCore Identity for API key management in deployed environments. - For local development, run via 'agentcore dev' which loads agentcore/.env. - """ - if os.getenv("LOCAL_DEV") == "1": - api_key = os.getenv(IDENTITY_ENV_VAR) - if not api_key: - raise RuntimeError( - f"{IDENTITY_ENV_VAR} not found. Add {IDENTITY_ENV_VAR}=your-key to .env.local" - ) - return api_key - return _agentcore_identity_api_key_provider() - - -def load_model() -> LLM: - """Get authenticated OpenAI model client.""" - api_key = _get_api_key() - # CrewAI requires OPENAI_API_KEY env var (ignores api_key parameter) - os.environ["OPENAI_API_KEY"] = api_key - return LLM( - model="openai/gpt-4.1", - api_key=api_key - ) -{{/if}} -{{#if (eq modelProvider "Gemini")}} -import os -from crewai import LLM -from bedrock_agentcore.identity.auth import requires_api_key - -IDENTITY_PROVIDER_NAME = "{{identityProviders.[0].name}}" -IDENTITY_ENV_VAR = "{{identityProviders.[0].envVarName}}" - - -@requires_api_key(provider_name=IDENTITY_PROVIDER_NAME) -def _agentcore_identity_api_key_provider(api_key: str) -> str: - """Fetch API key from AgentCore Identity.""" - return api_key - - -def _get_api_key() -> str: - """ - Uses AgentCore Identity for API key management in deployed environments. - For local development, run via 'agentcore dev' which loads agentcore/.env. - """ - if os.getenv("LOCAL_DEV") == "1": - api_key = os.getenv(IDENTITY_ENV_VAR) - if not api_key: - raise RuntimeError( - f"{IDENTITY_ENV_VAR} not found. Add {IDENTITY_ENV_VAR}=your-key to .env.local" - ) - return api_key - return _agentcore_identity_api_key_provider() - - -def load_model() -> LLM: - """Get authenticated Gemini model client.""" - api_key = _get_api_key() - # CrewAI requires GEMINI_API_KEY env var (ignores api_key parameter) - os.environ["GEMINI_API_KEY"] = api_key - return LLM( - model="gemini/gemini-2.5-flash", - api_key=api_key - ) -{{/if}} -" -`; - -exports[`Assets Directory Snapshots > Python framework assets > python/python/http/crewai/base/pyproject.toml should match snapshot 1`] = ` -"[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[project] -name = "{{ name }}" -version = "0.1.0" -description = "AgentCore Runtime Application using CrewAI SDK" -readme = "README.md" -requires-python = ">=3.11" -dependencies = [ - "opentelemetry-distro", - "opentelemetry-exporter-otlp", - "bedrock-agentcore >= 1.0.3", - "botocore[crt] >= 1.35.0", -{{#if (eq modelProvider "Bedrock")}} - "crewai[tools,bedrock] >= 1.3.0", -{{/if}} -{{#if (eq modelProvider "Anthropic")}} - "crewai[tools,anthropic] >= 1.3.0", -{{/if}} -{{#if (eq modelProvider "OpenAI")}} - "crewai[tools,openai] >= 1.3.0", -{{/if}} -{{#if (eq modelProvider "Gemini")}} - "crewai[tools,google-genai] >= 1.3.0", -{{/if}} -] - -[tool.hatch.build.targets.wheel] -packages = ["."] -" -`; - exports[`Assets Directory Snapshots > Python framework assets > python/python/http/googleadk/base/README.md should match snapshot 1`] = ` "This is a project generated by the agentcore create CLI tool! @@ -4165,7 +3835,6 @@ assets/ ├── python/ # Framework templates (one per SDK) │ ├── strands/ │ ├── langchain_langgraph/ -│ ├── crewai/ │ ├── googleadk/ │ ├── openaiagents/ │ └── autogen/ @@ -4355,7 +4024,6 @@ file maps to a JSON config file and includes validation constraints as comments. - **Strands** - Works with Bedrock, Anthropic, OpenAI, Gemini - **LangChain_LangGraph** - Works with Bedrock, Anthropic, OpenAI, Gemini -- **CrewAI** - Works with Bedrock, Anthropic, OpenAI, Gemini - **GoogleADK** - Gemini only - **OpenAIAgents** - OpenAI only - **AutoGen** - Works with Bedrock, Anthropic, OpenAI, Gemini diff --git a/src/assets/agents/AGENTS.md b/src/assets/agents/AGENTS.md index 253b184e7..86351f3f5 100644 --- a/src/assets/agents/AGENTS.md +++ b/src/assets/agents/AGENTS.md @@ -77,7 +77,6 @@ file maps to a JSON config file and includes validation constraints as comments. - **Strands** - Works with Bedrock, Anthropic, OpenAI, Gemini - **LangChain_LangGraph** - Works with Bedrock, Anthropic, OpenAI, Gemini -- **CrewAI** - Works with Bedrock, Anthropic, OpenAI, Gemini - **GoogleADK** - Gemini only - **OpenAIAgents** - OpenAI only - **AutoGen** - Works with Bedrock, Anthropic, OpenAI, Gemini diff --git a/src/assets/python/http/crewai/base/README.md b/src/assets/python/http/crewai/base/README.md deleted file mode 100644 index 3c159da21..000000000 --- a/src/assets/python/http/crewai/base/README.md +++ /dev/null @@ -1,39 +0,0 @@ -This is a project generated by the agentcore create CLI tool! - -# Layout - -The generated application code lives at the agent root directory. At the root, there is a `.gitignore` file, an -`agentcore/` folder which represents the configurations and state associated with this project. Other `agentcore` -commands like `deploy`, `dev`, and `invoke` rely on the configuration stored here. - -## Agent Root - -The main entrypoint to your app is defined in `main.py`. Using the AgentCore SDK `@app.entrypoint` decorator, this -file defines a Starlette ASGI app with the CrewAI framework running within. - -`model/load.py` instantiates your chosen model provider. - -## Environment Variables - -| Variable | Required | Description | -| --- | --- | --- | -{{#if hasIdentity}}| `{{identityProviders.[0].envVarName}}` | Yes | {{modelProvider}} API key (local) or Identity provider name (deployed) | -{{/if}}| `LOCAL_DEV` | No | Set to `1` to use `.env.local` instead of AgentCore Identity | - -# Developing locally - -If installation was successful, a virtual environment is already created with dependencies installed. - -Run `source .venv/bin/activate` before developing. - -`agentcore dev` will start a local server on 0.0.0.0:8080. - -In a new terminal, you can invoke that server with: - -`agentcore invoke --dev "What can you do"` - -# Deployment - -After providing credentials, `agentcore deploy` will deploy your project into Amazon Bedrock AgentCore. - -Use `agentcore invoke` to invoke your deployed agent. diff --git a/src/assets/python/http/crewai/base/gitignore.template b/src/assets/python/http/crewai/base/gitignore.template deleted file mode 100644 index fa1c60aea..000000000 --- a/src/assets/python/http/crewai/base/gitignore.template +++ /dev/null @@ -1,41 +0,0 @@ -# Environment variables -.env - -# Python -__pycache__/ -*.py[cod] -*$py.class -*.so -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg - -# Virtual environments -.venv/ -venv/ -ENV/ -env/ - -# IDE -.vscode/ -.idea/ -*.swp -*.swo -*~ - -# OS -.DS_Store -Thumbs.db diff --git a/src/assets/python/http/crewai/base/main.py b/src/assets/python/http/crewai/base/main.py deleted file mode 100644 index 51e3c2cd9..000000000 --- a/src/assets/python/http/crewai/base/main.py +++ /dev/null @@ -1,55 +0,0 @@ -from crewai import Agent, Crew, Task, Process -from crewai.tools import tool -from bedrock_agentcore.runtime import BedrockAgentCoreApp -from model.load import load_model - -app = BedrockAgentCoreApp() -log = app.logger - - -# Define a simple function tool -@tool -def add_numbers(a: int, b: int) -> int: - """Return the sum of two numbers""" - return a + b - - -# Define a collection of tools used by the model -tools = [add_numbers] - - -@app.entrypoint -def invoke(payload, context): - log.info("Invoking Agent.....") - - # Define the Agent with Tools - agent = Agent( - role="Question Answering Assistant", - goal="Answer the users questions", - backstory="Always eager to answer any questions", - llm=load_model(), - tools=tools, - ) - - # Define the Task - task = Task( - agent=agent, - description="Answer the users question: {prompt}", - expected_output="An answer to the users question", - ) - - # Create the Crew - crew = Crew(agents=[agent], tasks=[task], process=Process.sequential) - - # Process the user prompt - prompt = payload.get("prompt", "What can you help me with?") - - # Run the crew - result = crew.kickoff(inputs={"prompt": prompt}) - - # Return result - return {"result": result.raw} - - -if __name__ == "__main__": - app.run() diff --git a/src/assets/python/http/crewai/base/model/__init__.py b/src/assets/python/http/crewai/base/model/__init__.py deleted file mode 100644 index 0e632e10c..000000000 --- a/src/assets/python/http/crewai/base/model/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Package marker diff --git a/src/assets/python/http/crewai/base/model/load.py b/src/assets/python/http/crewai/base/model/load.py deleted file mode 100644 index 4e834e420..000000000 --- a/src/assets/python/http/crewai/base/model/load.py +++ /dev/null @@ -1,133 +0,0 @@ -{{#if (eq modelProvider "Bedrock")}} -from crewai import LLM - -# Uses global inference profile for Claude Sonnet 4.5 -# https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html -MODEL_ID = "bedrock/global.anthropic.claude-sonnet-4-5-20250929-v1:0" - - -def load_model() -> LLM: - """Get Bedrock model client using IAM credentials.""" - return LLM(model=MODEL_ID) -{{/if}} -{{#if (eq modelProvider "Anthropic")}} -import os -from crewai import LLM -from bedrock_agentcore.identity.auth import requires_api_key - -IDENTITY_PROVIDER_NAME = "{{identityProviders.[0].name}}" -IDENTITY_ENV_VAR = "{{identityProviders.[0].envVarName}}" - - -@requires_api_key(provider_name=IDENTITY_PROVIDER_NAME) -def _agentcore_identity_api_key_provider(api_key: str) -> str: - """Fetch API key from AgentCore Identity.""" - return api_key - - -def _get_api_key() -> str: - """ - Uses AgentCore Identity for API key management in deployed environments. - For local development, run via 'agentcore dev' which loads agentcore/.env. - """ - if os.getenv("LOCAL_DEV") == "1": - api_key = os.getenv(IDENTITY_ENV_VAR) - if not api_key: - raise RuntimeError( - f"{IDENTITY_ENV_VAR} not found. Add {IDENTITY_ENV_VAR}=your-key to .env.local" - ) - return api_key - return _agentcore_identity_api_key_provider() - - -def load_model() -> LLM: - """Get authenticated Anthropic model client.""" - api_key = _get_api_key() - # CrewAI requires ANTHROPIC_API_KEY env var (ignores api_key parameter) - os.environ["ANTHROPIC_API_KEY"] = api_key - return LLM( - model="anthropic/claude-sonnet-4-5-20250929", - api_key=api_key, - max_tokens=4096 - ) -{{/if}} -{{#if (eq modelProvider "OpenAI")}} -import os -from crewai import LLM -from bedrock_agentcore.identity.auth import requires_api_key - -IDENTITY_PROVIDER_NAME = "{{identityProviders.[0].name}}" -IDENTITY_ENV_VAR = "{{identityProviders.[0].envVarName}}" - - -@requires_api_key(provider_name=IDENTITY_PROVIDER_NAME) -def _agentcore_identity_api_key_provider(api_key: str) -> str: - """Fetch API key from AgentCore Identity.""" - return api_key - - -def _get_api_key() -> str: - """ - Uses AgentCore Identity for API key management in deployed environments. - For local development, run via 'agentcore dev' which loads agentcore/.env. - """ - if os.getenv("LOCAL_DEV") == "1": - api_key = os.getenv(IDENTITY_ENV_VAR) - if not api_key: - raise RuntimeError( - f"{IDENTITY_ENV_VAR} not found. Add {IDENTITY_ENV_VAR}=your-key to .env.local" - ) - return api_key - return _agentcore_identity_api_key_provider() - - -def load_model() -> LLM: - """Get authenticated OpenAI model client.""" - api_key = _get_api_key() - # CrewAI requires OPENAI_API_KEY env var (ignores api_key parameter) - os.environ["OPENAI_API_KEY"] = api_key - return LLM( - model="openai/gpt-4.1", - api_key=api_key - ) -{{/if}} -{{#if (eq modelProvider "Gemini")}} -import os -from crewai import LLM -from bedrock_agentcore.identity.auth import requires_api_key - -IDENTITY_PROVIDER_NAME = "{{identityProviders.[0].name}}" -IDENTITY_ENV_VAR = "{{identityProviders.[0].envVarName}}" - - -@requires_api_key(provider_name=IDENTITY_PROVIDER_NAME) -def _agentcore_identity_api_key_provider(api_key: str) -> str: - """Fetch API key from AgentCore Identity.""" - return api_key - - -def _get_api_key() -> str: - """ - Uses AgentCore Identity for API key management in deployed environments. - For local development, run via 'agentcore dev' which loads agentcore/.env. - """ - if os.getenv("LOCAL_DEV") == "1": - api_key = os.getenv(IDENTITY_ENV_VAR) - if not api_key: - raise RuntimeError( - f"{IDENTITY_ENV_VAR} not found. Add {IDENTITY_ENV_VAR}=your-key to .env.local" - ) - return api_key - return _agentcore_identity_api_key_provider() - - -def load_model() -> LLM: - """Get authenticated Gemini model client.""" - api_key = _get_api_key() - # CrewAI requires GEMINI_API_KEY env var (ignores api_key parameter) - os.environ["GEMINI_API_KEY"] = api_key - return LLM( - model="gemini/gemini-2.5-flash", - api_key=api_key - ) -{{/if}} diff --git a/src/assets/python/http/crewai/base/pyproject.toml b/src/assets/python/http/crewai/base/pyproject.toml deleted file mode 100644 index 03fc53523..000000000 --- a/src/assets/python/http/crewai/base/pyproject.toml +++ /dev/null @@ -1,31 +0,0 @@ -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[project] -name = "{{ name }}" -version = "0.1.0" -description = "AgentCore Runtime Application using CrewAI SDK" -readme = "README.md" -requires-python = ">=3.11" -dependencies = [ - "opentelemetry-distro", - "opentelemetry-exporter-otlp", - "bedrock-agentcore >= 1.0.3", - "botocore[crt] >= 1.35.0", -{{#if (eq modelProvider "Bedrock")}} - "crewai[tools,bedrock] >= 1.3.0", -{{/if}} -{{#if (eq modelProvider "Anthropic")}} - "crewai[tools,anthropic] >= 1.3.0", -{{/if}} -{{#if (eq modelProvider "OpenAI")}} - "crewai[tools,openai] >= 1.3.0", -{{/if}} -{{#if (eq modelProvider "Gemini")}} - "crewai[tools,google-genai] >= 1.3.0", -{{/if}} -] - -[tool.hatch.build.targets.wheel] -packages = ["."] diff --git a/src/cli/commands/add/__tests__/validate.test.ts b/src/cli/commands/add/__tests__/validate.test.ts index 809e3be51..68c5c098d 100644 --- a/src/cli/commands/add/__tests__/validate.test.ts +++ b/src/cli/commands/add/__tests__/validate.test.ts @@ -1141,20 +1141,6 @@ describe('validate', () => { expect(result.valid).toBe(true); }); - it('A2A: fails with --framework CrewAI', () => { - const result = validateAddAgentOptions({ - name: 'A2aAgent', - type: 'byo', - language: 'Python', - protocol: 'A2A', - framework: 'CrewAI', - modelProvider: 'Bedrock', - codeLocation: '/path/to/code', - }); - expect(result.valid).toBe(false); - expect(result.error).toContain('does not support A2A protocol'); - }); - it('A2A: fails with --framework OpenAIAgents', () => { const result = validateAddAgentOptions({ name: 'A2aAgent', diff --git a/src/cli/primitives/AgentPrimitive.tsx b/src/cli/primitives/AgentPrimitive.tsx index 07ff8481b..d46f3630e 100644 --- a/src/cli/primitives/AgentPrimitive.tsx +++ b/src/cli/primitives/AgentPrimitive.tsx @@ -202,10 +202,7 @@ export class AgentPrimitive extends BasePrimitive', 'Agent type: create, byo, or import [non-interactive]', 'create') .option('--build ', 'Build type: CodeZip or Container (default: CodeZip) [non-interactive]') .option('--language ', 'Language: Python (create), or Python/TypeScript/Other (BYO) [non-interactive]') - .option( - '--framework ', - 'Framework: Strands, LangChain_LangGraph, CrewAI, GoogleADK, OpenAIAgents [non-interactive]' - ) + .option('--framework ', 'Framework: Strands, LangChain_LangGraph, GoogleADK, OpenAIAgents [non-interactive]') .option('--model-provider ', 'Model provider: Bedrock, Anthropic, OpenAI, Gemini [non-interactive]') .option('--api-key ', 'API key for non-Bedrock providers [non-interactive]') .option( diff --git a/src/cli/templates/CrewAIRenderer.ts b/src/cli/templates/CrewAIRenderer.ts deleted file mode 100644 index 295bcd952..000000000 --- a/src/cli/templates/CrewAIRenderer.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { BaseRenderer } from './BaseRenderer'; -import { TEMPLATE_ROOT } from './templateRoot'; -import type { AgentRenderConfig } from './types'; - -export class CrewAIRenderer extends BaseRenderer { - constructor(config: AgentRenderConfig) { - super(config, 'crewai', TEMPLATE_ROOT, config.protocol ?? 'http'); - } -} diff --git a/src/cli/templates/index.ts b/src/cli/templates/index.ts index b3d52f052..3e57beb8d 100644 --- a/src/cli/templates/index.ts +++ b/src/cli/templates/index.ts @@ -1,5 +1,4 @@ import type { BaseRenderer } from './BaseRenderer'; -import { CrewAIRenderer } from './CrewAIRenderer'; import { GoogleADKRenderer } from './GoogleADKRenderer'; import { LangGraphRenderer } from './LangGraphRenderer'; import { McpRenderer } from './McpRenderer'; @@ -10,7 +9,6 @@ import type { AgentRenderConfig } from './types'; export { BaseRenderer, type RendererContext } from './BaseRenderer'; export { CDKRenderer, type CDKRendererContext } from './CDKRenderer'; export { renderGatewayTargetTemplate } from './GatewayTargetRenderer'; -export { CrewAIRenderer } from './CrewAIRenderer'; export { GoogleADKRenderer } from './GoogleADKRenderer'; export { LangGraphRenderer } from './LangGraphRenderer'; export { McpRenderer } from './McpRenderer'; @@ -30,8 +28,6 @@ export function createRenderer(config: AgentRenderConfig): BaseRenderer { switch (config.sdkFramework) { case 'Strands': return new StrandsRenderer(config); - case 'CrewAI': - return new CrewAIRenderer(config); case 'GoogleADK': return new GoogleADKRenderer(config); case 'LangChain_LangGraph': diff --git a/src/cli/tui/screens/generate/types.ts b/src/cli/tui/screens/generate/types.ts index 595408305..24b5d673b 100644 --- a/src/cli/tui/screens/generate/types.ts +++ b/src/cli/tui/screens/generate/types.ts @@ -122,7 +122,7 @@ export const SDK_OPTIONS = [ */ export function getSDKOptionsForProtocol(protocol: ProtocolMode) { const supportedFrameworks = PROTOCOL_FRAMEWORK_MATRIX[protocol]; - return SDK_OPTIONS.filter(option => supportedFrameworks.includes(option.id as SDKFramework)); + return SDK_OPTIONS.filter(option => supportedFrameworks.includes(option.id)); } export const MODEL_PROVIDER_OPTIONS = [ diff --git a/src/schema/__tests__/constants.test.ts b/src/schema/__tests__/constants.test.ts index b9ba68940..affa85b58 100644 --- a/src/schema/__tests__/constants.test.ts +++ b/src/schema/__tests__/constants.test.ts @@ -39,7 +39,7 @@ describe('matchEnumValue', () => { }); describe('SDKFrameworkSchema', () => { - it.each(['Strands', 'LangChain_LangGraph', 'CrewAI', 'GoogleADK', 'OpenAIAgents'])('accepts "%s"', framework => { + it.each(['Strands', 'LangChain_LangGraph', 'GoogleADK', 'OpenAIAgents'])('accepts "%s"', framework => { expect(SDKFrameworkSchema.safeParse(framework).success).toBe(true); }); @@ -167,9 +167,9 @@ describe('PROTOCOL_FRAMEWORK_MATRIX', () => { expect(Object.keys(PROTOCOL_FRAMEWORK_MATRIX)).toHaveLength(3); }); - it('HTTP supports all frameworks', () => { + it('HTTP supports all visible frameworks', () => { expect(PROTOCOL_FRAMEWORK_MATRIX.HTTP).toEqual( - expect.arrayContaining(['Strands', 'LangChain_LangGraph', 'CrewAI', 'GoogleADK', 'OpenAIAgents']) + expect.arrayContaining(['Strands', 'LangChain_LangGraph', 'GoogleADK', 'OpenAIAgents']) ); }); @@ -177,10 +177,9 @@ describe('PROTOCOL_FRAMEWORK_MATRIX', () => { expect(PROTOCOL_FRAMEWORK_MATRIX.MCP).toEqual([]); }); - it('A2A includes Strands and GoogleADK but not CrewAI or OpenAIAgents', () => { + it('A2A includes Strands and GoogleADK but not OpenAIAgents', () => { expect(PROTOCOL_FRAMEWORK_MATRIX.A2A).toContain('Strands'); expect(PROTOCOL_FRAMEWORK_MATRIX.A2A).toContain('GoogleADK'); - expect(PROTOCOL_FRAMEWORK_MATRIX.A2A).not.toContain('CrewAI'); expect(PROTOCOL_FRAMEWORK_MATRIX.A2A).not.toContain('OpenAIAgents'); }); }); @@ -189,7 +188,6 @@ describe('getSupportedFrameworksForProtocol', () => { it('returns all frameworks for HTTP', () => { const frameworks = getSupportedFrameworksForProtocol('HTTP'); expect(frameworks).toContain('Strands'); - expect(frameworks).toContain('CrewAI'); expect(frameworks.length).toBeGreaterThan(0); }); @@ -213,16 +211,12 @@ describe('isFrameworkSupportedForProtocol', () => { expect(isFrameworkSupportedForProtocol('A2A', 'Strands')).toBe(true); }); - it('returns false for CrewAI + A2A', () => { - expect(isFrameworkSupportedForProtocol('A2A', 'CrewAI')).toBe(false); - }); - it('returns false for OpenAIAgents + A2A', () => { expect(isFrameworkSupportedForProtocol('A2A', 'OpenAIAgents')).toBe(false); }); it('returns false for any framework + MCP', () => { expect(isFrameworkSupportedForProtocol('MCP', 'Strands')).toBe(false); - expect(isFrameworkSupportedForProtocol('MCP', 'CrewAI')).toBe(false); + expect(isFrameworkSupportedForProtocol('MCP', 'OpenAIAgents')).toBe(false); }); }); diff --git a/src/schema/constants.ts b/src/schema/constants.ts index 5f1d2ecd0..ea159ec21 100644 --- a/src/schema/constants.ts +++ b/src/schema/constants.ts @@ -4,7 +4,7 @@ import { z } from 'zod'; // Feature Constants (shared across all schemas) // ============================================================================ -export const SDKFrameworkSchema = z.enum(['Strands', 'LangChain_LangGraph', 'CrewAI', 'GoogleADK', 'OpenAIAgents']); +export const SDKFrameworkSchema = z.enum(['Strands', 'LangChain_LangGraph', 'GoogleADK', 'OpenAIAgents']); export type SDKFramework = z.infer; export const TargetLanguageSchema = z.enum(['Python', 'TypeScript', 'Other']); @@ -45,7 +45,6 @@ export const DEFAULT_MODEL_IDS: Record = { export const SDK_MODEL_PROVIDER_MATRIX: Record = { Strands: ['Bedrock', 'Anthropic', 'OpenAI', 'Gemini'] as const, LangChain_LangGraph: ['Bedrock', 'Anthropic', 'OpenAI', 'Gemini'] as const, - CrewAI: ['Bedrock', 'Anthropic', 'OpenAI', 'Gemini'] as const, GoogleADK: ['Gemini'] as const, OpenAIAgents: ['OpenAI'] as const, }; @@ -85,8 +84,6 @@ export const RESERVED_PROJECT_NAMES: readonly string[] = [ 'autogenext', 'bedrock', 'bedrockagentcore', - 'crewai', - 'crewaitools', 'googleadk', 'googlegenerativeai', 'langchain', @@ -165,7 +162,7 @@ export type ProtocolMode = z.infer; * MCP is a standalone tool server with no framework. */ export const PROTOCOL_FRAMEWORK_MATRIX: Record = { - HTTP: ['Strands', 'LangChain_LangGraph', 'CrewAI', 'GoogleADK', 'OpenAIAgents'] as const, + HTTP: ['Strands', 'LangChain_LangGraph', 'GoogleADK', 'OpenAIAgents'] as const, MCP: [] as const, A2A: ['Strands', 'GoogleADK', 'LangChain_LangGraph'] as const, };