Strands Agents framework integration with AgentKit - #757

Closed
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main
Closed

Strands Agents framework integration with AgentKit#757
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main

Conversation

@ucegbe

Copy link
Copy Markdown
Contributor

Description


Changes:

  • Added coinbase-agentkit-strands-agents package in python/framework-extensions/strands-agents/
  • Provides get_strands_tools() function to convert AgentKit actions into Strands-Agents-compatible tools
  • Added example chatbot demonstrating the integration in python/examples/strands-agents-cdp-server-chatbot/
  • Includes automatic type hint inference from AgentKit action schemas
  • Follows established patterns from other framework extensions (langchain, openai-agents-sdk)

This enables developers using Strands Agents to leverage all existing AgentKit CDP actions (wallet operations, token transfers, trading, etc.) with minimal setup.

Tests


Chatbot: python/examples/strands-agents-cdp-server-chatbot/chatbot.py
Network: Base Sepolia
Setup: Configured with CDP API credentials
Prompt: request tokens from faucet
<thinking>The user wants to request tokens from the faucet. First, I need to determine which network the wallet is connected to. The faucet is only available on base-sepolia, ethereum-sepolia, and solana-devnet networks. If the wallet is on one of these networks, I can proceed with the faucet request. If not, I'll need to inform the user and suggest alternative funding methods.
According to the policy:
- Must check wallet network before any faucet operations
- Faucet only allowed on specified testnets
- Need to verify network ID via wallet details
Next step: Get wallet details to check current network ID and confirm eligibility for faucet usage.</thinking>
Tool #1: WalletActionProvider_get_wallet_details
<thinking>The wallet is connected to the base-sepolia network, which is eligible for faucet requests. The user hasn't specified an asset, so I'll default to ETH per faucet policy. Next step: Use the faucet tool to request ETH tokens since base-sepolia allows ETH faucets.</thinking> Tool #2: CdpApiActionProvider_request_faucet_funds
<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86a966fa23211245exxxxxxxxx<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86xxxxxx

Checklist


  • Added documentation to all relevant README.md files
  • Added a changelog entry
  • Code follows the project's style guidelines
  • Self-review of code completed
  • No breaking changes introduced

0xRAGand others added 30 commits February 19, 2025 18:50
* add privy and moonwell logos
* Update privy.svg
* Update privy.svg
* Update README.md
* readme mnemonic phrase import updates
* expanding upon import description
* chore: fix publish_nightly
* chore: update readme
* supported networks updates
* adding section graphic
* feedback
* enabling light/dark mode, adding ethereum, zora
* evm support note
* adding light mode to moonwell
* Created base create-onchain-agent package
* Added base templates/next template
* Improved CLI handling of wallet provider
* Improve responsiveness of UI
* Finished working out what a agent route looks like
* Implemented API routes for CDV, Viem, Privy and Solana routes
* Refactored naming of route configuration and options
* Setup CLI for testing
* Added branching to CLI for network -> wallet provider selection
* chore: handling defaults in CLI
* chore: refactored api routes to better reflect network/walletProvider combinations
* fix: changes after rebase
* chore: cleanup files better after refactor
* feat: improve CLI display
* fix: adressed feedback
* feat: improved the cli logged messages
* refactor: types and constants out of utils
* refactor: refactored constants and types out of utils
* refactor: fileSystem out of cli
* feat: coinbase branding improvements
* feat: improved .env.local created format
* feat: improved .env.local created format
* feat: parse markdown when displaying agent messages
* chore: added comments to files where agents get created
* chore: refactored useAgent and commented
* chore: added base project README
* feat: added wallet provider descriptions to cli
* bump: 0.1.0
* fix: added files for npm
* chore: improved readme
* chore: removed @coinbase from package.json
* chore: added basis for prettier and lint
* chore: cli readme feedback
* chore: template readme feedback
* chore: add coinbase to package description
* chore: fixed prettier and ran
* chore: fixed lint and ran
* fix: package.lock
* bump: 0.1.1
* chore: typescript readme
* chore: fix constants lint error
* feat: add dynamic message modifier and faucet to template
* chore: comment regarding faucet
* chore: fixed package.lock
* fix: typo in readme
* chore: updated readme to better reflect the outcome of create-onchain-agent
* bump: 0.1.2
* feat: added wallet persistance for cdp
* chore: updated package-lock after bump
* feat: initial python cli tool
* feat: chatbot.ts generation via templating
* feat: overhaul cli for devx and branding
* chore: improved readme in template
* chore: readme for create-onchain-agent
* chore: commented generated chatbot.py
* feat: pyproject.toml passes in package name from cli
* chore: cleaned up some new lines creating by templating engine
* chore: updated readmes and comments
* chore: fix copier ignoring poetry.lock and copier.yml
* chore: updated python readme
* fix: typo in readme
* bump: release 0.1.3 hotfix
* chore: update package-lock
* fix: cli tool does not bundle template, and must read them from somewhere. temp fix is github
* chore: created/updated changelog
* bump: python create-onchain-agent to 0.1.1
* fix: rename variable for python code style
* feat: added guard to cli to ensure python supported version
* fix: readme
* fix: removed 12 from allowed_minors list. Was there for testing
* chore: updated requirement docs
* feat: added gha for npm create-onchain-agent
* chore: updated secret to NPM_TOKEN_CREATE_ONCHAIN_AGENT
* chore: pr feedback
* chore: reverted env secret to shared NPM_TOKEN
* chore: updated gha name
* chore: pr feedback
* chore: added changelog to create-onchain-agent
* chore: updated package-lock
…checksum to avoid errors (#460)
Sometimes the address given by explorers/wallets isn't in the right format
@phdargen

Copy link
Copy Markdown
Contributor

Hi @ucegbe, this looks great to me, thanks for the integration! Just a few comments:

  • please rebase against main, note that following feat: validate CDP/x402 upgrades #785 CdpEvmServerWalletProvider needs to be renamed to CdpEvmWalletProvider in the chatbot example

  • add a .env.local as in other examples

  • I could not find how to activate model support for us.amazon.nova-premier-v1:0. Maybe its not available in my region? In that case, it might be better to use a model that is more broadly accessible like nova pro

  • please make sure to run make format/lint before you commit

# Create a BedrockModel
bedrock_model = BedrockModel(
model_id="us.amazon.nova-premier-v1:0",
region_name='us-east-1',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this use AWS_REGION from env here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for spotting, made the change to use the region variable

user_input = input("\nPrompt: ")
if user_input.lower() == "exit":
break

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For empty prompts (pressing enter by accident), the chatbot crashes with botocore.errorfactory.ValidationException: An error occurred (ValidationException) when calling the ConverseStream operation: The text field in the ContentBlock object at messages.0.content.0 is blank. Add text to the text field, and try again.

Suggest to add:

if not user_input.strip(): continue

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was an oversight, fixed!

ucegbeand others added 3 commits July 23, 2025 14:50
proper CD wallet library import
included direction for Bedrock API keys
lint check
modification to strands chatbot example
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

I have made teh changes requested above, rebased against main and applied my commits.
Also did a lint check on required files.
Please let me know if I missed anything else.
Cheers.

validate_environment()

# Load environment variables
load_dotenv()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think load_dotenv() needs to be before validate_environment()

@phdargen

Copy link
Copy Markdown
Contributor

I have made teh changes requested above, rebased against main and applied my commits. Also did a lint check on required files. Please let me know if I missed anything else. Cheers.

Thanks for the quick turnaround! Changes look good, only one follow up above.

Also would be appreciated if you could add the framework extension to the project README (https://github.com/coinbase/agentkit/blob/main/python/README.md)

@ucegbe

Copy link
Copy Markdown
ContributorAuthor

sorry about that! Made all the changes.

Cheers

enforcing region env variable to be set
@phdargen

Copy link
Copy Markdown
Contributor

sorry about that! Made all the changes.

Cheers

Great, thanks! I tested it once more and think we are ready to go @CarsonRoscoe

* unwrap weth action
* updated docs
* description fix, updated README
* changeset updated

@CarsonRoscoeCarsonRoscoe left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ucegbe It looks great, thank you for the contribution!

One last thing to resolve, we require signed commits, and sadly, the first two commits in this PR (3242330,095c3f7) were not signed, and then there's two other commits scattered in there that are not being associated with your account, but they are to your name.

Please rebase against main and resign all commits. That should resolve it

@ucegbeucegbe closed this Jul 25, 2025
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

Updated PR at #798

@ucegbeucegbe mentioned this pull request Jul 25, 2025
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationexampleNew example agentframework extensionNew framework extensionpython

Development

Successfully merging this pull request may close these issues.

20 participants

@ucegbe@cb-heimdall@phdargen@CarsonRoscoe@0xRAG@murrlincoln@stat@John-peterson-coinbase@RezaRahemtola@mikeghen@leopardracer@omahs@hexcow@fernandofcampos@Olexandr88@ozzy35410@cypherpepe@pemulis@aleskrin@wwwehr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Strands Agents framework integration with AgentKit - #757

Closed
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main
Closed

Strands Agents framework integration with AgentKit#757
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main

Conversation

@ucegbe

Copy link
Copy Markdown
Contributor

Description


Changes:

  • Added coinbase-agentkit-strands-agents package in python/framework-extensions/strands-agents/
  • Provides get_strands_tools() function to convert AgentKit actions into Strands-Agents-compatible tools
  • Added example chatbot demonstrating the integration in python/examples/strands-agents-cdp-server-chatbot/
  • Includes automatic type hint inference from AgentKit action schemas
  • Follows established patterns from other framework extensions (langchain, openai-agents-sdk)

This enables developers using Strands Agents to leverage all existing AgentKit CDP actions (wallet operations, token transfers, trading, etc.) with minimal setup.

Tests


Chatbot: python/examples/strands-agents-cdp-server-chatbot/chatbot.py
Network: Base Sepolia
Setup: Configured with CDP API credentials
Prompt: request tokens from faucet
<thinking>The user wants to request tokens from the faucet. First, I need to determine which network the wallet is connected to. The faucet is only available on base-sepolia, ethereum-sepolia, and solana-devnet networks. If the wallet is on one of these networks, I can proceed with the faucet request. If not, I'll need to inform the user and suggest alternative funding methods.
According to the policy:
- Must check wallet network before any faucet operations
- Faucet only allowed on specified testnets
- Need to verify network ID via wallet details
Next step: Get wallet details to check current network ID and confirm eligibility for faucet usage.</thinking>
Tool #1: WalletActionProvider_get_wallet_details
<thinking>The wallet is connected to the base-sepolia network, which is eligible for faucet requests. The user hasn't specified an asset, so I'll default to ETH per faucet policy. Next step: Use the faucet tool to request ETH tokens since base-sepolia allows ETH faucets.</thinking> Tool #2: CdpApiActionProvider_request_faucet_funds
<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86a966fa23211245exxxxxxxxx<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86xxxxxx

Checklist


  • Added documentation to all relevant README.md files
  • Added a changelog entry
  • Code follows the project's style guidelines
  • Self-review of code completed
  • No breaking changes introduced

0xRAGand others added 30 commits February 19, 2025 18:50
* add privy and moonwell logos
* Update privy.svg
* Update privy.svg
* Update README.md
* readme mnemonic phrase import updates
* expanding upon import description
* chore: fix publish_nightly
* chore: update readme
* supported networks updates
* adding section graphic
* feedback
* enabling light/dark mode, adding ethereum, zora
* evm support note
* adding light mode to moonwell
* Created base create-onchain-agent package
* Added base templates/next template
* Improved CLI handling of wallet provider
* Improve responsiveness of UI
* Finished working out what a agent route looks like
* Implemented API routes for CDV, Viem, Privy and Solana routes
* Refactored naming of route configuration and options
* Setup CLI for testing
* Added branching to CLI for network -> wallet provider selection
* chore: handling defaults in CLI
* chore: refactored api routes to better reflect network/walletProvider combinations
* fix: changes after rebase
* chore: cleanup files better after refactor
* feat: improve CLI display
* fix: adressed feedback
* feat: improved the cli logged messages
* refactor: types and constants out of utils
* refactor: refactored constants and types out of utils
* refactor: fileSystem out of cli
* feat: coinbase branding improvements
* feat: improved .env.local created format
* feat: improved .env.local created format
* feat: parse markdown when displaying agent messages
* chore: added comments to files where agents get created
* chore: refactored useAgent and commented
* chore: added base project README
* feat: added wallet provider descriptions to cli
* bump: 0.1.0
* fix: added files for npm
* chore: improved readme
* chore: removed @coinbase from package.json
* chore: added basis for prettier and lint
* chore: cli readme feedback
* chore: template readme feedback
* chore: add coinbase to package description
* chore: fixed prettier and ran
* chore: fixed lint and ran
* fix: package.lock
* bump: 0.1.1
* chore: typescript readme
* chore: fix constants lint error
* feat: add dynamic message modifier and faucet to template
* chore: comment regarding faucet
* chore: fixed package.lock
* fix: typo in readme
* chore: updated readme to better reflect the outcome of create-onchain-agent
* bump: 0.1.2
* feat: added wallet persistance for cdp
* chore: updated package-lock after bump
* feat: initial python cli tool
* feat: chatbot.ts generation via templating
* feat: overhaul cli for devx and branding
* chore: improved readme in template
* chore: readme for create-onchain-agent
* chore: commented generated chatbot.py
* feat: pyproject.toml passes in package name from cli
* chore: cleaned up some new lines creating by templating engine
* chore: updated readmes and comments
* chore: fix copier ignoring poetry.lock and copier.yml
* chore: updated python readme
* fix: typo in readme
* bump: release 0.1.3 hotfix
* chore: update package-lock
* fix: cli tool does not bundle template, and must read them from somewhere. temp fix is github
* chore: created/updated changelog
* bump: python create-onchain-agent to 0.1.1
* fix: rename variable for python code style
* feat: added guard to cli to ensure python supported version
* fix: readme
* fix: removed 12 from allowed_minors list. Was there for testing
* chore: updated requirement docs
* feat: added gha for npm create-onchain-agent
* chore: updated secret to NPM_TOKEN_CREATE_ONCHAIN_AGENT
* chore: pr feedback
* chore: reverted env secret to shared NPM_TOKEN
* chore: updated gha name
* chore: pr feedback
* chore: added changelog to create-onchain-agent
* chore: updated package-lock
…checksum to avoid errors (#460)
Sometimes the address given by explorers/wallets isn't in the right format
@phdargen

Copy link
Copy Markdown
Contributor

Hi @ucegbe, this looks great to me, thanks for the integration! Just a few comments:

  • please rebase against main, note that following feat: validate CDP/x402 upgrades #785 CdpEvmServerWalletProvider needs to be renamed to CdpEvmWalletProvider in the chatbot example

  • add a .env.local as in other examples

  • I could not find how to activate model support for us.amazon.nova-premier-v1:0. Maybe its not available in my region? In that case, it might be better to use a model that is more broadly accessible like nova pro

  • please make sure to run make format/lint before you commit

# Create a BedrockModel
bedrock_model = BedrockModel(
model_id="us.amazon.nova-premier-v1:0",
region_name='us-east-1',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this use AWS_REGION from env here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for spotting, made the change to use the region variable

user_input = input("\nPrompt: ")
if user_input.lower() == "exit":
break

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For empty prompts (pressing enter by accident), the chatbot crashes with botocore.errorfactory.ValidationException: An error occurred (ValidationException) when calling the ConverseStream operation: The text field in the ContentBlock object at messages.0.content.0 is blank. Add text to the text field, and try again.

Suggest to add:

if not user_input.strip(): continue

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was an oversight, fixed!

ucegbeand others added 3 commits July 23, 2025 14:50
proper CD wallet library import
included direction for Bedrock API keys
lint check
modification to strands chatbot example
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

I have made teh changes requested above, rebased against main and applied my commits.
Also did a lint check on required files.
Please let me know if I missed anything else.
Cheers.

validate_environment()

# Load environment variables
load_dotenv()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think load_dotenv() needs to be before validate_environment()

@phdargen

Copy link
Copy Markdown
Contributor

I have made teh changes requested above, rebased against main and applied my commits. Also did a lint check on required files. Please let me know if I missed anything else. Cheers.

Thanks for the quick turnaround! Changes look good, only one follow up above.

Also would be appreciated if you could add the framework extension to the project README (https://github.com/coinbase/agentkit/blob/main/python/README.md)

@ucegbe

Copy link
Copy Markdown
ContributorAuthor

sorry about that! Made all the changes.

Cheers

enforcing region env variable to be set
@phdargen

Copy link
Copy Markdown
Contributor

sorry about that! Made all the changes.

Cheers

Great, thanks! I tested it once more and think we are ready to go @CarsonRoscoe

* unwrap weth action
* updated docs
* description fix, updated README
* changeset updated

@CarsonRoscoeCarsonRoscoe left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ucegbe It looks great, thank you for the contribution!

One last thing to resolve, we require signed commits, and sadly, the first two commits in this PR (3242330,095c3f7) were not signed, and then there's two other commits scattered in there that are not being associated with your account, but they are to your name.

Please rebase against main and resign all commits. That should resolve it

@ucegbeucegbe closed this Jul 25, 2025
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

Updated PR at #798

@ucegbeucegbe mentioned this pull request Jul 25, 2025
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationexampleNew example agentframework extensionNew framework extensionpython

Development

Successfully merging this pull request may close these issues.

20 participants

@ucegbe@cb-heimdall@phdargen@CarsonRoscoe@0xRAG@murrlincoln@stat@John-peterson-coinbase@RezaRahemtola@mikeghen@leopardracer@omahs@hexcow@fernandofcampos@Olexandr88@ozzy35410@cypherpepe@pemulis@aleskrin@wwwehr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Strands Agents framework integration with AgentKit - #757

Closed
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main
Closed

Strands Agents framework integration with AgentKit#757
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main

Conversation

@ucegbe

Copy link
Copy Markdown
Contributor

Description


Changes:

  • Added coinbase-agentkit-strands-agents package in python/framework-extensions/strands-agents/
  • Provides get_strands_tools() function to convert AgentKit actions into Strands-Agents-compatible tools
  • Added example chatbot demonstrating the integration in python/examples/strands-agents-cdp-server-chatbot/
  • Includes automatic type hint inference from AgentKit action schemas
  • Follows established patterns from other framework extensions (langchain, openai-agents-sdk)

This enables developers using Strands Agents to leverage all existing AgentKit CDP actions (wallet operations, token transfers, trading, etc.) with minimal setup.

Tests


Chatbot: python/examples/strands-agents-cdp-server-chatbot/chatbot.py
Network: Base Sepolia
Setup: Configured with CDP API credentials
Prompt: request tokens from faucet
<thinking>The user wants to request tokens from the faucet. First, I need to determine which network the wallet is connected to. The faucet is only available on base-sepolia, ethereum-sepolia, and solana-devnet networks. If the wallet is on one of these networks, I can proceed with the faucet request. If not, I'll need to inform the user and suggest alternative funding methods.
According to the policy:
- Must check wallet network before any faucet operations
- Faucet only allowed on specified testnets
- Need to verify network ID via wallet details
Next step: Get wallet details to check current network ID and confirm eligibility for faucet usage.</thinking>
Tool #1: WalletActionProvider_get_wallet_details
<thinking>The wallet is connected to the base-sepolia network, which is eligible for faucet requests. The user hasn't specified an asset, so I'll default to ETH per faucet policy. Next step: Use the faucet tool to request ETH tokens since base-sepolia allows ETH faucets.</thinking> Tool #2: CdpApiActionProvider_request_faucet_funds
<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86a966fa23211245exxxxxxxxx<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86xxxxxx

Checklist


  • Added documentation to all relevant README.md files
  • Added a changelog entry
  • Code follows the project's style guidelines
  • Self-review of code completed
  • No breaking changes introduced

0xRAGand others added 30 commits February 19, 2025 18:50
* add privy and moonwell logos
* Update privy.svg
* Update privy.svg
* Update README.md
* readme mnemonic phrase import updates
* expanding upon import description
* chore: fix publish_nightly
* chore: update readme
* supported networks updates
* adding section graphic
* feedback
* enabling light/dark mode, adding ethereum, zora
* evm support note
* adding light mode to moonwell
* Created base create-onchain-agent package
* Added base templates/next template
* Improved CLI handling of wallet provider
* Improve responsiveness of UI
* Finished working out what a agent route looks like
* Implemented API routes for CDV, Viem, Privy and Solana routes
* Refactored naming of route configuration and options
* Setup CLI for testing
* Added branching to CLI for network -> wallet provider selection
* chore: handling defaults in CLI
* chore: refactored api routes to better reflect network/walletProvider combinations
* fix: changes after rebase
* chore: cleanup files better after refactor
* feat: improve CLI display
* fix: adressed feedback
* feat: improved the cli logged messages
* refactor: types and constants out of utils
* refactor: refactored constants and types out of utils
* refactor: fileSystem out of cli
* feat: coinbase branding improvements
* feat: improved .env.local created format
* feat: improved .env.local created format
* feat: parse markdown when displaying agent messages
* chore: added comments to files where agents get created
* chore: refactored useAgent and commented
* chore: added base project README
* feat: added wallet provider descriptions to cli
* bump: 0.1.0
* fix: added files for npm
* chore: improved readme
* chore: removed @coinbase from package.json
* chore: added basis for prettier and lint
* chore: cli readme feedback
* chore: template readme feedback
* chore: add coinbase to package description
* chore: fixed prettier and ran
* chore: fixed lint and ran
* fix: package.lock
* bump: 0.1.1
* chore: typescript readme
* chore: fix constants lint error
* feat: add dynamic message modifier and faucet to template
* chore: comment regarding faucet
* chore: fixed package.lock
* fix: typo in readme
* chore: updated readme to better reflect the outcome of create-onchain-agent
* bump: 0.1.2
* feat: added wallet persistance for cdp
* chore: updated package-lock after bump
* feat: initial python cli tool
* feat: chatbot.ts generation via templating
* feat: overhaul cli for devx and branding
* chore: improved readme in template
* chore: readme for create-onchain-agent
* chore: commented generated chatbot.py
* feat: pyproject.toml passes in package name from cli
* chore: cleaned up some new lines creating by templating engine
* chore: updated readmes and comments
* chore: fix copier ignoring poetry.lock and copier.yml
* chore: updated python readme
* fix: typo in readme
* bump: release 0.1.3 hotfix
* chore: update package-lock
* fix: cli tool does not bundle template, and must read them from somewhere. temp fix is github
* chore: created/updated changelog
* bump: python create-onchain-agent to 0.1.1
* fix: rename variable for python code style
* feat: added guard to cli to ensure python supported version
* fix: readme
* fix: removed 12 from allowed_minors list. Was there for testing
* chore: updated requirement docs
* feat: added gha for npm create-onchain-agent
* chore: updated secret to NPM_TOKEN_CREATE_ONCHAIN_AGENT
* chore: pr feedback
* chore: reverted env secret to shared NPM_TOKEN
* chore: updated gha name
* chore: pr feedback
* chore: added changelog to create-onchain-agent
* chore: updated package-lock
…checksum to avoid errors (#460)
Sometimes the address given by explorers/wallets isn't in the right format
@phdargen

Copy link
Copy Markdown
Contributor

Hi @ucegbe, this looks great to me, thanks for the integration! Just a few comments:

  • please rebase against main, note that following feat: validate CDP/x402 upgrades #785 CdpEvmServerWalletProvider needs to be renamed to CdpEvmWalletProvider in the chatbot example

  • add a .env.local as in other examples

  • I could not find how to activate model support for us.amazon.nova-premier-v1:0. Maybe its not available in my region? In that case, it might be better to use a model that is more broadly accessible like nova pro

  • please make sure to run make format/lint before you commit

# Create a BedrockModel
bedrock_model = BedrockModel(
model_id="us.amazon.nova-premier-v1:0",
region_name='us-east-1',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this use AWS_REGION from env here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for spotting, made the change to use the region variable

user_input = input("\nPrompt: ")
if user_input.lower() == "exit":
break

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For empty prompts (pressing enter by accident), the chatbot crashes with botocore.errorfactory.ValidationException: An error occurred (ValidationException) when calling the ConverseStream operation: The text field in the ContentBlock object at messages.0.content.0 is blank. Add text to the text field, and try again.

Suggest to add:

if not user_input.strip(): continue

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was an oversight, fixed!

ucegbeand others added 3 commits July 23, 2025 14:50
proper CD wallet library import
included direction for Bedrock API keys
lint check
modification to strands chatbot example
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

I have made teh changes requested above, rebased against main and applied my commits.
Also did a lint check on required files.
Please let me know if I missed anything else.
Cheers.

validate_environment()

# Load environment variables
load_dotenv()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think load_dotenv() needs to be before validate_environment()

@phdargen

Copy link
Copy Markdown
Contributor

I have made teh changes requested above, rebased against main and applied my commits. Also did a lint check on required files. Please let me know if I missed anything else. Cheers.

Thanks for the quick turnaround! Changes look good, only one follow up above.

Also would be appreciated if you could add the framework extension to the project README (https://github.com/coinbase/agentkit/blob/main/python/README.md)

@ucegbe

Copy link
Copy Markdown
ContributorAuthor

sorry about that! Made all the changes.

Cheers

enforcing region env variable to be set
@phdargen

Copy link
Copy Markdown
Contributor

sorry about that! Made all the changes.

Cheers

Great, thanks! I tested it once more and think we are ready to go @CarsonRoscoe

* unwrap weth action
* updated docs
* description fix, updated README
* changeset updated

@CarsonRoscoeCarsonRoscoe left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ucegbe It looks great, thank you for the contribution!

One last thing to resolve, we require signed commits, and sadly, the first two commits in this PR (3242330,095c3f7) were not signed, and then there's two other commits scattered in there that are not being associated with your account, but they are to your name.

Please rebase against main and resign all commits. That should resolve it

@ucegbeucegbe closed this Jul 25, 2025
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

Updated PR at #798

@ucegbeucegbe mentioned this pull request Jul 25, 2025
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationexampleNew example agentframework extensionNew framework extensionpython

Development

Successfully merging this pull request may close these issues.

20 participants

@ucegbe@cb-heimdall@phdargen@CarsonRoscoe@0xRAG@murrlincoln@stat@John-peterson-coinbase@RezaRahemtola@mikeghen@leopardracer@omahs@hexcow@fernandofcampos@Olexandr88@ozzy35410@cypherpepe@pemulis@aleskrin@wwwehr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Strands Agents framework integration with AgentKit - #757

Closed
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main
Closed

Strands Agents framework integration with AgentKit#757
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main

Conversation

@ucegbe

Copy link
Copy Markdown
Contributor

Description


Changes:

  • Added coinbase-agentkit-strands-agents package in python/framework-extensions/strands-agents/
  • Provides get_strands_tools() function to convert AgentKit actions into Strands-Agents-compatible tools
  • Added example chatbot demonstrating the integration in python/examples/strands-agents-cdp-server-chatbot/
  • Includes automatic type hint inference from AgentKit action schemas
  • Follows established patterns from other framework extensions (langchain, openai-agents-sdk)

This enables developers using Strands Agents to leverage all existing AgentKit CDP actions (wallet operations, token transfers, trading, etc.) with minimal setup.

Tests


Chatbot: python/examples/strands-agents-cdp-server-chatbot/chatbot.py
Network: Base Sepolia
Setup: Configured with CDP API credentials
Prompt: request tokens from faucet
<thinking>The user wants to request tokens from the faucet. First, I need to determine which network the wallet is connected to. The faucet is only available on base-sepolia, ethereum-sepolia, and solana-devnet networks. If the wallet is on one of these networks, I can proceed with the faucet request. If not, I'll need to inform the user and suggest alternative funding methods.
According to the policy:
- Must check wallet network before any faucet operations
- Faucet only allowed on specified testnets
- Need to verify network ID via wallet details
Next step: Get wallet details to check current network ID and confirm eligibility for faucet usage.</thinking>
Tool #1: WalletActionProvider_get_wallet_details
<thinking>The wallet is connected to the base-sepolia network, which is eligible for faucet requests. The user hasn't specified an asset, so I'll default to ETH per faucet policy. Next step: Use the faucet tool to request ETH tokens since base-sepolia allows ETH faucets.</thinking> Tool #2: CdpApiActionProvider_request_faucet_funds
<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86a966fa23211245exxxxxxxxx<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86xxxxxx

Checklist


  • Added documentation to all relevant README.md files
  • Added a changelog entry
  • Code follows the project's style guidelines
  • Self-review of code completed
  • No breaking changes introduced

0xRAGand others added 30 commits February 19, 2025 18:50
* add privy and moonwell logos
* Update privy.svg
* Update privy.svg
* Update README.md
* readme mnemonic phrase import updates
* expanding upon import description
* chore: fix publish_nightly
* chore: update readme
* supported networks updates
* adding section graphic
* feedback
* enabling light/dark mode, adding ethereum, zora
* evm support note
* adding light mode to moonwell
* Created base create-onchain-agent package
* Added base templates/next template
* Improved CLI handling of wallet provider
* Improve responsiveness of UI
* Finished working out what a agent route looks like
* Implemented API routes for CDV, Viem, Privy and Solana routes
* Refactored naming of route configuration and options
* Setup CLI for testing
* Added branching to CLI for network -> wallet provider selection
* chore: handling defaults in CLI
* chore: refactored api routes to better reflect network/walletProvider combinations
* fix: changes after rebase
* chore: cleanup files better after refactor
* feat: improve CLI display
* fix: adressed feedback
* feat: improved the cli logged messages
* refactor: types and constants out of utils
* refactor: refactored constants and types out of utils
* refactor: fileSystem out of cli
* feat: coinbase branding improvements
* feat: improved .env.local created format
* feat: improved .env.local created format
* feat: parse markdown when displaying agent messages
* chore: added comments to files where agents get created
* chore: refactored useAgent and commented
* chore: added base project README
* feat: added wallet provider descriptions to cli
* bump: 0.1.0
* fix: added files for npm
* chore: improved readme
* chore: removed @coinbase from package.json
* chore: added basis for prettier and lint
* chore: cli readme feedback
* chore: template readme feedback
* chore: add coinbase to package description
* chore: fixed prettier and ran
* chore: fixed lint and ran
* fix: package.lock
* bump: 0.1.1
* chore: typescript readme
* chore: fix constants lint error
* feat: add dynamic message modifier and faucet to template
* chore: comment regarding faucet
* chore: fixed package.lock
* fix: typo in readme
* chore: updated readme to better reflect the outcome of create-onchain-agent
* bump: 0.1.2
* feat: added wallet persistance for cdp
* chore: updated package-lock after bump
* feat: initial python cli tool
* feat: chatbot.ts generation via templating
* feat: overhaul cli for devx and branding
* chore: improved readme in template
* chore: readme for create-onchain-agent
* chore: commented generated chatbot.py
* feat: pyproject.toml passes in package name from cli
* chore: cleaned up some new lines creating by templating engine
* chore: updated readmes and comments
* chore: fix copier ignoring poetry.lock and copier.yml
* chore: updated python readme
* fix: typo in readme
* bump: release 0.1.3 hotfix
* chore: update package-lock
* fix: cli tool does not bundle template, and must read them from somewhere. temp fix is github
* chore: created/updated changelog
* bump: python create-onchain-agent to 0.1.1
* fix: rename variable for python code style
* feat: added guard to cli to ensure python supported version
* fix: readme
* fix: removed 12 from allowed_minors list. Was there for testing
* chore: updated requirement docs
* feat: added gha for npm create-onchain-agent
* chore: updated secret to NPM_TOKEN_CREATE_ONCHAIN_AGENT
* chore: pr feedback
* chore: reverted env secret to shared NPM_TOKEN
* chore: updated gha name
* chore: pr feedback
* chore: added changelog to create-onchain-agent
* chore: updated package-lock
…checksum to avoid errors (#460)
Sometimes the address given by explorers/wallets isn't in the right format
@phdargen

Copy link
Copy Markdown
Contributor

Hi @ucegbe, this looks great to me, thanks for the integration! Just a few comments:

  • please rebase against main, note that following feat: validate CDP/x402 upgrades #785 CdpEvmServerWalletProvider needs to be renamed to CdpEvmWalletProvider in the chatbot example

  • add a .env.local as in other examples

  • I could not find how to activate model support for us.amazon.nova-premier-v1:0. Maybe its not available in my region? In that case, it might be better to use a model that is more broadly accessible like nova pro

  • please make sure to run make format/lint before you commit

# Create a BedrockModel
bedrock_model = BedrockModel(
model_id="us.amazon.nova-premier-v1:0",
region_name='us-east-1',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this use AWS_REGION from env here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for spotting, made the change to use the region variable

user_input = input("\nPrompt: ")
if user_input.lower() == "exit":
break

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For empty prompts (pressing enter by accident), the chatbot crashes with botocore.errorfactory.ValidationException: An error occurred (ValidationException) when calling the ConverseStream operation: The text field in the ContentBlock object at messages.0.content.0 is blank. Add text to the text field, and try again.

Suggest to add:

if not user_input.strip(): continue

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was an oversight, fixed!

ucegbeand others added 3 commits July 23, 2025 14:50
proper CD wallet library import
included direction for Bedrock API keys
lint check
modification to strands chatbot example
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

I have made teh changes requested above, rebased against main and applied my commits.
Also did a lint check on required files.
Please let me know if I missed anything else.
Cheers.

validate_environment()

# Load environment variables
load_dotenv()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think load_dotenv() needs to be before validate_environment()

@phdargen

Copy link
Copy Markdown
Contributor

I have made teh changes requested above, rebased against main and applied my commits. Also did a lint check on required files. Please let me know if I missed anything else. Cheers.

Thanks for the quick turnaround! Changes look good, only one follow up above.

Also would be appreciated if you could add the framework extension to the project README (https://github.com/coinbase/agentkit/blob/main/python/README.md)

@ucegbe

Copy link
Copy Markdown
ContributorAuthor

sorry about that! Made all the changes.

Cheers

enforcing region env variable to be set
@phdargen

Copy link
Copy Markdown
Contributor

sorry about that! Made all the changes.

Cheers

Great, thanks! I tested it once more and think we are ready to go @CarsonRoscoe

* unwrap weth action
* updated docs
* description fix, updated README
* changeset updated

@CarsonRoscoeCarsonRoscoe left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ucegbe It looks great, thank you for the contribution!

One last thing to resolve, we require signed commits, and sadly, the first two commits in this PR (3242330,095c3f7) were not signed, and then there's two other commits scattered in there that are not being associated with your account, but they are to your name.

Please rebase against main and resign all commits. That should resolve it

@ucegbeucegbe closed this Jul 25, 2025
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

Updated PR at #798

@ucegbeucegbe mentioned this pull request Jul 25, 2025
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationexampleNew example agentframework extensionNew framework extensionpython

Development

Successfully merging this pull request may close these issues.

20 participants

@ucegbe@cb-heimdall@phdargen@CarsonRoscoe@0xRAG@murrlincoln@stat@John-peterson-coinbase@RezaRahemtola@mikeghen@leopardracer@omahs@hexcow@fernandofcampos@Olexandr88@ozzy35410@cypherpepe@pemulis@aleskrin@wwwehr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Strands Agents framework integration with AgentKit - #757

Closed
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main
Closed

Strands Agents framework integration with AgentKit#757
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main

Conversation

@ucegbe

Copy link
Copy Markdown
Contributor

Description


Changes:

  • Added coinbase-agentkit-strands-agents package in python/framework-extensions/strands-agents/
  • Provides get_strands_tools() function to convert AgentKit actions into Strands-Agents-compatible tools
  • Added example chatbot demonstrating the integration in python/examples/strands-agents-cdp-server-chatbot/
  • Includes automatic type hint inference from AgentKit action schemas
  • Follows established patterns from other framework extensions (langchain, openai-agents-sdk)

This enables developers using Strands Agents to leverage all existing AgentKit CDP actions (wallet operations, token transfers, trading, etc.) with minimal setup.

Tests


Chatbot: python/examples/strands-agents-cdp-server-chatbot/chatbot.py
Network: Base Sepolia
Setup: Configured with CDP API credentials
Prompt: request tokens from faucet
<thinking>The user wants to request tokens from the faucet. First, I need to determine which network the wallet is connected to. The faucet is only available on base-sepolia, ethereum-sepolia, and solana-devnet networks. If the wallet is on one of these networks, I can proceed with the faucet request. If not, I'll need to inform the user and suggest alternative funding methods.
According to the policy:
- Must check wallet network before any faucet operations
- Faucet only allowed on specified testnets
- Need to verify network ID via wallet details
Next step: Get wallet details to check current network ID and confirm eligibility for faucet usage.</thinking>
Tool #1: WalletActionProvider_get_wallet_details
<thinking>The wallet is connected to the base-sepolia network, which is eligible for faucet requests. The user hasn't specified an asset, so I'll default to ETH per faucet policy. Next step: Use the faucet tool to request ETH tokens since base-sepolia allows ETH faucets.</thinking> Tool #2: CdpApiActionProvider_request_faucet_funds
<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86a966fa23211245exxxxxxxxx<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86xxxxxx

Checklist


  • Added documentation to all relevant README.md files
  • Added a changelog entry
  • Code follows the project's style guidelines
  • Self-review of code completed
  • No breaking changes introduced

0xRAGand others added 30 commits February 19, 2025 18:50
* add privy and moonwell logos
* Update privy.svg
* Update privy.svg
* Update README.md
* readme mnemonic phrase import updates
* expanding upon import description
* chore: fix publish_nightly
* chore: update readme
* supported networks updates
* adding section graphic
* feedback
* enabling light/dark mode, adding ethereum, zora
* evm support note
* adding light mode to moonwell
* Created base create-onchain-agent package
* Added base templates/next template
* Improved CLI handling of wallet provider
* Improve responsiveness of UI
* Finished working out what a agent route looks like
* Implemented API routes for CDV, Viem, Privy and Solana routes
* Refactored naming of route configuration and options
* Setup CLI for testing
* Added branching to CLI for network -> wallet provider selection
* chore: handling defaults in CLI
* chore: refactored api routes to better reflect network/walletProvider combinations
* fix: changes after rebase
* chore: cleanup files better after refactor
* feat: improve CLI display
* fix: adressed feedback
* feat: improved the cli logged messages
* refactor: types and constants out of utils
* refactor: refactored constants and types out of utils
* refactor: fileSystem out of cli
* feat: coinbase branding improvements
* feat: improved .env.local created format
* feat: improved .env.local created format
* feat: parse markdown when displaying agent messages
* chore: added comments to files where agents get created
* chore: refactored useAgent and commented
* chore: added base project README
* feat: added wallet provider descriptions to cli
* bump: 0.1.0
* fix: added files for npm
* chore: improved readme
* chore: removed @coinbase from package.json
* chore: added basis for prettier and lint
* chore: cli readme feedback
* chore: template readme feedback
* chore: add coinbase to package description
* chore: fixed prettier and ran
* chore: fixed lint and ran
* fix: package.lock
* bump: 0.1.1
* chore: typescript readme
* chore: fix constants lint error
* feat: add dynamic message modifier and faucet to template
* chore: comment regarding faucet
* chore: fixed package.lock
* fix: typo in readme
* chore: updated readme to better reflect the outcome of create-onchain-agent
* bump: 0.1.2
* feat: added wallet persistance for cdp
* chore: updated package-lock after bump
* feat: initial python cli tool
* feat: chatbot.ts generation via templating
* feat: overhaul cli for devx and branding
* chore: improved readme in template
* chore: readme for create-onchain-agent
* chore: commented generated chatbot.py
* feat: pyproject.toml passes in package name from cli
* chore: cleaned up some new lines creating by templating engine
* chore: updated readmes and comments
* chore: fix copier ignoring poetry.lock and copier.yml
* chore: updated python readme
* fix: typo in readme
* bump: release 0.1.3 hotfix
* chore: update package-lock
* fix: cli tool does not bundle template, and must read them from somewhere. temp fix is github
* chore: created/updated changelog
* bump: python create-onchain-agent to 0.1.1
* fix: rename variable for python code style
* feat: added guard to cli to ensure python supported version
* fix: readme
* fix: removed 12 from allowed_minors list. Was there for testing
* chore: updated requirement docs
* feat: added gha for npm create-onchain-agent
* chore: updated secret to NPM_TOKEN_CREATE_ONCHAIN_AGENT
* chore: pr feedback
* chore: reverted env secret to shared NPM_TOKEN
* chore: updated gha name
* chore: pr feedback
* chore: added changelog to create-onchain-agent
* chore: updated package-lock
…checksum to avoid errors (#460)
Sometimes the address given by explorers/wallets isn't in the right format
@phdargen

Copy link
Copy Markdown
Contributor

Hi @ucegbe, this looks great to me, thanks for the integration! Just a few comments:

  • please rebase against main, note that following feat: validate CDP/x402 upgrades #785 CdpEvmServerWalletProvider needs to be renamed to CdpEvmWalletProvider in the chatbot example

  • add a .env.local as in other examples

  • I could not find how to activate model support for us.amazon.nova-premier-v1:0. Maybe its not available in my region? In that case, it might be better to use a model that is more broadly accessible like nova pro

  • please make sure to run make format/lint before you commit

# Create a BedrockModel
bedrock_model = BedrockModel(
model_id="us.amazon.nova-premier-v1:0",
region_name='us-east-1',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this use AWS_REGION from env here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for spotting, made the change to use the region variable

user_input = input("\nPrompt: ")
if user_input.lower() == "exit":
break

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For empty prompts (pressing enter by accident), the chatbot crashes with botocore.errorfactory.ValidationException: An error occurred (ValidationException) when calling the ConverseStream operation: The text field in the ContentBlock object at messages.0.content.0 is blank. Add text to the text field, and try again.

Suggest to add:

if not user_input.strip(): continue

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was an oversight, fixed!

ucegbeand others added 3 commits July 23, 2025 14:50
proper CD wallet library import
included direction for Bedrock API keys
lint check
modification to strands chatbot example
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

I have made teh changes requested above, rebased against main and applied my commits.
Also did a lint check on required files.
Please let me know if I missed anything else.
Cheers.

validate_environment()

# Load environment variables
load_dotenv()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think load_dotenv() needs to be before validate_environment()

@phdargen

Copy link
Copy Markdown
Contributor

I have made teh changes requested above, rebased against main and applied my commits. Also did a lint check on required files. Please let me know if I missed anything else. Cheers.

Thanks for the quick turnaround! Changes look good, only one follow up above.

Also would be appreciated if you could add the framework extension to the project README (https://github.com/coinbase/agentkit/blob/main/python/README.md)

@ucegbe

Copy link
Copy Markdown
ContributorAuthor

sorry about that! Made all the changes.

Cheers

enforcing region env variable to be set
@phdargen

Copy link
Copy Markdown
Contributor

sorry about that! Made all the changes.

Cheers

Great, thanks! I tested it once more and think we are ready to go @CarsonRoscoe

* unwrap weth action
* updated docs
* description fix, updated README
* changeset updated

@CarsonRoscoeCarsonRoscoe left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ucegbe It looks great, thank you for the contribution!

One last thing to resolve, we require signed commits, and sadly, the first two commits in this PR (3242330,095c3f7) were not signed, and then there's two other commits scattered in there that are not being associated with your account, but they are to your name.

Please rebase against main and resign all commits. That should resolve it

@ucegbeucegbe closed this Jul 25, 2025
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

Updated PR at #798

@ucegbeucegbe mentioned this pull request Jul 25, 2025
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationexampleNew example agentframework extensionNew framework extensionpython

Development

Successfully merging this pull request may close these issues.

20 participants

@ucegbe@cb-heimdall@phdargen@CarsonRoscoe@0xRAG@murrlincoln@stat@John-peterson-coinbase@RezaRahemtola@mikeghen@leopardracer@omahs@hexcow@fernandofcampos@Olexandr88@ozzy35410@cypherpepe@pemulis@aleskrin@wwwehr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Strands Agents framework integration with AgentKit - #757

Closed
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main
Closed

Strands Agents framework integration with AgentKit#757
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main

Conversation

@ucegbe

Copy link
Copy Markdown
Contributor

Description


Changes:

  • Added coinbase-agentkit-strands-agents package in python/framework-extensions/strands-agents/
  • Provides get_strands_tools() function to convert AgentKit actions into Strands-Agents-compatible tools
  • Added example chatbot demonstrating the integration in python/examples/strands-agents-cdp-server-chatbot/
  • Includes automatic type hint inference from AgentKit action schemas
  • Follows established patterns from other framework extensions (langchain, openai-agents-sdk)

This enables developers using Strands Agents to leverage all existing AgentKit CDP actions (wallet operations, token transfers, trading, etc.) with minimal setup.

Tests


Chatbot: python/examples/strands-agents-cdp-server-chatbot/chatbot.py
Network: Base Sepolia
Setup: Configured with CDP API credentials
Prompt: request tokens from faucet
<thinking>The user wants to request tokens from the faucet. First, I need to determine which network the wallet is connected to. The faucet is only available on base-sepolia, ethereum-sepolia, and solana-devnet networks. If the wallet is on one of these networks, I can proceed with the faucet request. If not, I'll need to inform the user and suggest alternative funding methods.
According to the policy:
- Must check wallet network before any faucet operations
- Faucet only allowed on specified testnets
- Need to verify network ID via wallet details
Next step: Get wallet details to check current network ID and confirm eligibility for faucet usage.</thinking>
Tool #1: WalletActionProvider_get_wallet_details
<thinking>The wallet is connected to the base-sepolia network, which is eligible for faucet requests. The user hasn't specified an asset, so I'll default to ETH per faucet policy. Next step: Use the faucet tool to request ETH tokens since base-sepolia allows ETH faucets.</thinking> Tool #2: CdpApiActionProvider_request_faucet_funds
<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86a966fa23211245exxxxxxxxx<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86xxxxxx

Checklist


  • Added documentation to all relevant README.md files
  • Added a changelog entry
  • Code follows the project's style guidelines
  • Self-review of code completed
  • No breaking changes introduced

0xRAGand others added 30 commits February 19, 2025 18:50
* add privy and moonwell logos
* Update privy.svg
* Update privy.svg
* Update README.md
* readme mnemonic phrase import updates
* expanding upon import description
* chore: fix publish_nightly
* chore: update readme
* supported networks updates
* adding section graphic
* feedback
* enabling light/dark mode, adding ethereum, zora
* evm support note
* adding light mode to moonwell
* Created base create-onchain-agent package
* Added base templates/next template
* Improved CLI handling of wallet provider
* Improve responsiveness of UI
* Finished working out what a agent route looks like
* Implemented API routes for CDV, Viem, Privy and Solana routes
* Refactored naming of route configuration and options
* Setup CLI for testing
* Added branching to CLI for network -> wallet provider selection
* chore: handling defaults in CLI
* chore: refactored api routes to better reflect network/walletProvider combinations
* fix: changes after rebase
* chore: cleanup files better after refactor
* feat: improve CLI display
* fix: adressed feedback
* feat: improved the cli logged messages
* refactor: types and constants out of utils
* refactor: refactored constants and types out of utils
* refactor: fileSystem out of cli
* feat: coinbase branding improvements
* feat: improved .env.local created format
* feat: improved .env.local created format
* feat: parse markdown when displaying agent messages
* chore: added comments to files where agents get created
* chore: refactored useAgent and commented
* chore: added base project README
* feat: added wallet provider descriptions to cli
* bump: 0.1.0
* fix: added files for npm
* chore: improved readme
* chore: removed @coinbase from package.json
* chore: added basis for prettier and lint
* chore: cli readme feedback
* chore: template readme feedback
* chore: add coinbase to package description
* chore: fixed prettier and ran
* chore: fixed lint and ran
* fix: package.lock
* bump: 0.1.1
* chore: typescript readme
* chore: fix constants lint error
* feat: add dynamic message modifier and faucet to template
* chore: comment regarding faucet
* chore: fixed package.lock
* fix: typo in readme
* chore: updated readme to better reflect the outcome of create-onchain-agent
* bump: 0.1.2
* feat: added wallet persistance for cdp
* chore: updated package-lock after bump
* feat: initial python cli tool
* feat: chatbot.ts generation via templating
* feat: overhaul cli for devx and branding
* chore: improved readme in template
* chore: readme for create-onchain-agent
* chore: commented generated chatbot.py
* feat: pyproject.toml passes in package name from cli
* chore: cleaned up some new lines creating by templating engine
* chore: updated readmes and comments
* chore: fix copier ignoring poetry.lock and copier.yml
* chore: updated python readme
* fix: typo in readme
* bump: release 0.1.3 hotfix
* chore: update package-lock
* fix: cli tool does not bundle template, and must read them from somewhere. temp fix is github
* chore: created/updated changelog
* bump: python create-onchain-agent to 0.1.1
* fix: rename variable for python code style
* feat: added guard to cli to ensure python supported version
* fix: readme
* fix: removed 12 from allowed_minors list. Was there for testing
* chore: updated requirement docs
* feat: added gha for npm create-onchain-agent
* chore: updated secret to NPM_TOKEN_CREATE_ONCHAIN_AGENT
* chore: pr feedback
* chore: reverted env secret to shared NPM_TOKEN
* chore: updated gha name
* chore: pr feedback
* chore: added changelog to create-onchain-agent
* chore: updated package-lock
…checksum to avoid errors (#460)
Sometimes the address given by explorers/wallets isn't in the right format
@phdargen

Copy link
Copy Markdown
Contributor

Hi @ucegbe, this looks great to me, thanks for the integration! Just a few comments:

  • please rebase against main, note that following feat: validate CDP/x402 upgrades #785 CdpEvmServerWalletProvider needs to be renamed to CdpEvmWalletProvider in the chatbot example

  • add a .env.local as in other examples

  • I could not find how to activate model support for us.amazon.nova-premier-v1:0. Maybe its not available in my region? In that case, it might be better to use a model that is more broadly accessible like nova pro

  • please make sure to run make format/lint before you commit

# Create a BedrockModel
bedrock_model = BedrockModel(
model_id="us.amazon.nova-premier-v1:0",
region_name='us-east-1',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this use AWS_REGION from env here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for spotting, made the change to use the region variable

user_input = input("\nPrompt: ")
if user_input.lower() == "exit":
break

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For empty prompts (pressing enter by accident), the chatbot crashes with botocore.errorfactory.ValidationException: An error occurred (ValidationException) when calling the ConverseStream operation: The text field in the ContentBlock object at messages.0.content.0 is blank. Add text to the text field, and try again.

Suggest to add:

if not user_input.strip(): continue

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was an oversight, fixed!

ucegbeand others added 3 commits July 23, 2025 14:50
proper CD wallet library import
included direction for Bedrock API keys
lint check
modification to strands chatbot example
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

I have made teh changes requested above, rebased against main and applied my commits.
Also did a lint check on required files.
Please let me know if I missed anything else.
Cheers.

validate_environment()

# Load environment variables
load_dotenv()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think load_dotenv() needs to be before validate_environment()

@phdargen

Copy link
Copy Markdown
Contributor

I have made teh changes requested above, rebased against main and applied my commits. Also did a lint check on required files. Please let me know if I missed anything else. Cheers.

Thanks for the quick turnaround! Changes look good, only one follow up above.

Also would be appreciated if you could add the framework extension to the project README (https://github.com/coinbase/agentkit/blob/main/python/README.md)

@ucegbe

Copy link
Copy Markdown
ContributorAuthor

sorry about that! Made all the changes.

Cheers

enforcing region env variable to be set
@phdargen

Copy link
Copy Markdown
Contributor

sorry about that! Made all the changes.

Cheers

Great, thanks! I tested it once more and think we are ready to go @CarsonRoscoe

* unwrap weth action
* updated docs
* description fix, updated README
* changeset updated

@CarsonRoscoeCarsonRoscoe left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ucegbe It looks great, thank you for the contribution!

One last thing to resolve, we require signed commits, and sadly, the first two commits in this PR (3242330,095c3f7) were not signed, and then there's two other commits scattered in there that are not being associated with your account, but they are to your name.

Please rebase against main and resign all commits. That should resolve it

@ucegbeucegbe closed this Jul 25, 2025
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

Updated PR at #798

@ucegbeucegbe mentioned this pull request Jul 25, 2025
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationexampleNew example agentframework extensionNew framework extensionpython

Development

Successfully merging this pull request may close these issues.

20 participants

@ucegbe@cb-heimdall@phdargen@CarsonRoscoe@0xRAG@murrlincoln@stat@John-peterson-coinbase@RezaRahemtola@mikeghen@leopardracer@omahs@hexcow@fernandofcampos@Olexandr88@ozzy35410@cypherpepe@pemulis@aleskrin@wwwehr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Strands Agents framework integration with AgentKit - #757

Closed
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main
Closed

Strands Agents framework integration with AgentKit#757
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main

Conversation

@ucegbe

Copy link
Copy Markdown
Contributor

Description


Changes:

  • Added coinbase-agentkit-strands-agents package in python/framework-extensions/strands-agents/
  • Provides get_strands_tools() function to convert AgentKit actions into Strands-Agents-compatible tools
  • Added example chatbot demonstrating the integration in python/examples/strands-agents-cdp-server-chatbot/
  • Includes automatic type hint inference from AgentKit action schemas
  • Follows established patterns from other framework extensions (langchain, openai-agents-sdk)

This enables developers using Strands Agents to leverage all existing AgentKit CDP actions (wallet operations, token transfers, trading, etc.) with minimal setup.

Tests


Chatbot: python/examples/strands-agents-cdp-server-chatbot/chatbot.py
Network: Base Sepolia
Setup: Configured with CDP API credentials
Prompt: request tokens from faucet
<thinking>The user wants to request tokens from the faucet. First, I need to determine which network the wallet is connected to. The faucet is only available on base-sepolia, ethereum-sepolia, and solana-devnet networks. If the wallet is on one of these networks, I can proceed with the faucet request. If not, I'll need to inform the user and suggest alternative funding methods.
According to the policy:
- Must check wallet network before any faucet operations
- Faucet only allowed on specified testnets
- Need to verify network ID via wallet details
Next step: Get wallet details to check current network ID and confirm eligibility for faucet usage.</thinking>
Tool #1: WalletActionProvider_get_wallet_details
<thinking>The wallet is connected to the base-sepolia network, which is eligible for faucet requests. The user hasn't specified an asset, so I'll default to ETH per faucet policy. Next step: Use the faucet tool to request ETH tokens since base-sepolia allows ETH faucets.</thinking> Tool #2: CdpApiActionProvider_request_faucet_funds
<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86a966fa23211245exxxxxxxxx<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86xxxxxx

Checklist


  • Added documentation to all relevant README.md files
  • Added a changelog entry
  • Code follows the project's style guidelines
  • Self-review of code completed
  • No breaking changes introduced

0xRAGand others added 30 commits February 19, 2025 18:50
* add privy and moonwell logos
* Update privy.svg
* Update privy.svg
* Update README.md
* readme mnemonic phrase import updates
* expanding upon import description
* chore: fix publish_nightly
* chore: update readme
* supported networks updates
* adding section graphic
* feedback
* enabling light/dark mode, adding ethereum, zora
* evm support note
* adding light mode to moonwell
* Created base create-onchain-agent package
* Added base templates/next template
* Improved CLI handling of wallet provider
* Improve responsiveness of UI
* Finished working out what a agent route looks like
* Implemented API routes for CDV, Viem, Privy and Solana routes
* Refactored naming of route configuration and options
* Setup CLI for testing
* Added branching to CLI for network -> wallet provider selection
* chore: handling defaults in CLI
* chore: refactored api routes to better reflect network/walletProvider combinations
* fix: changes after rebase
* chore: cleanup files better after refactor
* feat: improve CLI display
* fix: adressed feedback
* feat: improved the cli logged messages
* refactor: types and constants out of utils
* refactor: refactored constants and types out of utils
* refactor: fileSystem out of cli
* feat: coinbase branding improvements
* feat: improved .env.local created format
* feat: improved .env.local created format
* feat: parse markdown when displaying agent messages
* chore: added comments to files where agents get created
* chore: refactored useAgent and commented
* chore: added base project README
* feat: added wallet provider descriptions to cli
* bump: 0.1.0
* fix: added files for npm
* chore: improved readme
* chore: removed @coinbase from package.json
* chore: added basis for prettier and lint
* chore: cli readme feedback
* chore: template readme feedback
* chore: add coinbase to package description
* chore: fixed prettier and ran
* chore: fixed lint and ran
* fix: package.lock
* bump: 0.1.1
* chore: typescript readme
* chore: fix constants lint error
* feat: add dynamic message modifier and faucet to template
* chore: comment regarding faucet
* chore: fixed package.lock
* fix: typo in readme
* chore: updated readme to better reflect the outcome of create-onchain-agent
* bump: 0.1.2
* feat: added wallet persistance for cdp
* chore: updated package-lock after bump
* feat: initial python cli tool
* feat: chatbot.ts generation via templating
* feat: overhaul cli for devx and branding
* chore: improved readme in template
* chore: readme for create-onchain-agent
* chore: commented generated chatbot.py
* feat: pyproject.toml passes in package name from cli
* chore: cleaned up some new lines creating by templating engine
* chore: updated readmes and comments
* chore: fix copier ignoring poetry.lock and copier.yml
* chore: updated python readme
* fix: typo in readme
* bump: release 0.1.3 hotfix
* chore: update package-lock
* fix: cli tool does not bundle template, and must read them from somewhere. temp fix is github
* chore: created/updated changelog
* bump: python create-onchain-agent to 0.1.1
* fix: rename variable for python code style
* feat: added guard to cli to ensure python supported version
* fix: readme
* fix: removed 12 from allowed_minors list. Was there for testing
* chore: updated requirement docs
* feat: added gha for npm create-onchain-agent
* chore: updated secret to NPM_TOKEN_CREATE_ONCHAIN_AGENT
* chore: pr feedback
* chore: reverted env secret to shared NPM_TOKEN
* chore: updated gha name
* chore: pr feedback
* chore: added changelog to create-onchain-agent
* chore: updated package-lock
…checksum to avoid errors (#460)
Sometimes the address given by explorers/wallets isn't in the right format
@phdargen

Copy link
Copy Markdown
Contributor

Hi @ucegbe, this looks great to me, thanks for the integration! Just a few comments:

  • please rebase against main, note that following feat: validate CDP/x402 upgrades #785 CdpEvmServerWalletProvider needs to be renamed to CdpEvmWalletProvider in the chatbot example

  • add a .env.local as in other examples

  • I could not find how to activate model support for us.amazon.nova-premier-v1:0. Maybe its not available in my region? In that case, it might be better to use a model that is more broadly accessible like nova pro

  • please make sure to run make format/lint before you commit

# Create a BedrockModel
bedrock_model = BedrockModel(
model_id="us.amazon.nova-premier-v1:0",
region_name='us-east-1',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this use AWS_REGION from env here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for spotting, made the change to use the region variable

user_input = input("\nPrompt: ")
if user_input.lower() == "exit":
break

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For empty prompts (pressing enter by accident), the chatbot crashes with botocore.errorfactory.ValidationException: An error occurred (ValidationException) when calling the ConverseStream operation: The text field in the ContentBlock object at messages.0.content.0 is blank. Add text to the text field, and try again.

Suggest to add:

if not user_input.strip(): continue

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was an oversight, fixed!

ucegbeand others added 3 commits July 23, 2025 14:50
proper CD wallet library import
included direction for Bedrock API keys
lint check
modification to strands chatbot example
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

I have made teh changes requested above, rebased against main and applied my commits.
Also did a lint check on required files.
Please let me know if I missed anything else.
Cheers.

validate_environment()

# Load environment variables
load_dotenv()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think load_dotenv() needs to be before validate_environment()

@phdargen

Copy link
Copy Markdown
Contributor

I have made teh changes requested above, rebased against main and applied my commits. Also did a lint check on required files. Please let me know if I missed anything else. Cheers.

Thanks for the quick turnaround! Changes look good, only one follow up above.

Also would be appreciated if you could add the framework extension to the project README (https://github.com/coinbase/agentkit/blob/main/python/README.md)

@ucegbe

Copy link
Copy Markdown
ContributorAuthor

sorry about that! Made all the changes.

Cheers

enforcing region env variable to be set
@phdargen

Copy link
Copy Markdown
Contributor

sorry about that! Made all the changes.

Cheers

Great, thanks! I tested it once more and think we are ready to go @CarsonRoscoe

* unwrap weth action
* updated docs
* description fix, updated README
* changeset updated

@CarsonRoscoeCarsonRoscoe left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ucegbe It looks great, thank you for the contribution!

One last thing to resolve, we require signed commits, and sadly, the first two commits in this PR (3242330,095c3f7) were not signed, and then there's two other commits scattered in there that are not being associated with your account, but they are to your name.

Please rebase against main and resign all commits. That should resolve it

@ucegbeucegbe closed this Jul 25, 2025
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

Updated PR at #798

@ucegbeucegbe mentioned this pull request Jul 25, 2025
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationexampleNew example agentframework extensionNew framework extensionpython

Development

Successfully merging this pull request may close these issues.

20 participants

@ucegbe@cb-heimdall@phdargen@CarsonRoscoe@0xRAG@murrlincoln@stat@John-peterson-coinbase@RezaRahemtola@mikeghen@leopardracer@omahs@hexcow@fernandofcampos@Olexandr88@ozzy35410@cypherpepe@pemulis@aleskrin@wwwehr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Strands Agents framework integration with AgentKit - #757

Closed
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main
Closed

Strands Agents framework integration with AgentKit#757
ucegbe wants to merge 446 commits into
coinbase:mainfrom
ucegbe:main

Conversation

@ucegbe

Copy link
Copy Markdown
Contributor

Description


Changes:

  • Added coinbase-agentkit-strands-agents package in python/framework-extensions/strands-agents/
  • Provides get_strands_tools() function to convert AgentKit actions into Strands-Agents-compatible tools
  • Added example chatbot demonstrating the integration in python/examples/strands-agents-cdp-server-chatbot/
  • Includes automatic type hint inference from AgentKit action schemas
  • Follows established patterns from other framework extensions (langchain, openai-agents-sdk)

This enables developers using Strands Agents to leverage all existing AgentKit CDP actions (wallet operations, token transfers, trading, etc.) with minimal setup.

Tests


Chatbot: python/examples/strands-agents-cdp-server-chatbot/chatbot.py
Network: Base Sepolia
Setup: Configured with CDP API credentials
Prompt: request tokens from faucet
<thinking>The user wants to request tokens from the faucet. First, I need to determine which network the wallet is connected to. The faucet is only available on base-sepolia, ethereum-sepolia, and solana-devnet networks. If the wallet is on one of these networks, I can proceed with the faucet request. If not, I'll need to inform the user and suggest alternative funding methods.
According to the policy:
- Must check wallet network before any faucet operations
- Faucet only allowed on specified testnets
- Need to verify network ID via wallet details
Next step: Get wallet details to check current network ID and confirm eligibility for faucet usage.</thinking>
Tool #1: WalletActionProvider_get_wallet_details
<thinking>The wallet is connected to the base-sepolia network, which is eligible for faucet requests. The user hasn't specified an asset, so I'll default to ETH per faucet policy. Next step: Use the faucet tool to request ETH tokens since base-sepolia allows ETH faucets.</thinking> Tool #2: CdpApiActionProvider_request_faucet_funds
<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86a966fa23211245exxxxxxxxx<thinking>The faucet transaction was successful. The user received ETH tokens on base-sepolia with transaction hash provided. Now I need to inform the user about the completed action and provide the transaction details as confirmation.</thinking> Testnet ETH tokens received via faucet. Transaction hash: 0x2004cc22080b977ba86xxxxxx

Checklist


  • Added documentation to all relevant README.md files
  • Added a changelog entry
  • Code follows the project's style guidelines
  • Self-review of code completed
  • No breaking changes introduced

0xRAGand others added 30 commits February 19, 2025 18:50
* add privy and moonwell logos
* Update privy.svg
* Update privy.svg
* Update README.md
* readme mnemonic phrase import updates
* expanding upon import description
* chore: fix publish_nightly
* chore: update readme
* supported networks updates
* adding section graphic
* feedback
* enabling light/dark mode, adding ethereum, zora
* evm support note
* adding light mode to moonwell
* Created base create-onchain-agent package
* Added base templates/next template
* Improved CLI handling of wallet provider
* Improve responsiveness of UI
* Finished working out what a agent route looks like
* Implemented API routes for CDV, Viem, Privy and Solana routes
* Refactored naming of route configuration and options
* Setup CLI for testing
* Added branching to CLI for network -> wallet provider selection
* chore: handling defaults in CLI
* chore: refactored api routes to better reflect network/walletProvider combinations
* fix: changes after rebase
* chore: cleanup files better after refactor
* feat: improve CLI display
* fix: adressed feedback
* feat: improved the cli logged messages
* refactor: types and constants out of utils
* refactor: refactored constants and types out of utils
* refactor: fileSystem out of cli
* feat: coinbase branding improvements
* feat: improved .env.local created format
* feat: improved .env.local created format
* feat: parse markdown when displaying agent messages
* chore: added comments to files where agents get created
* chore: refactored useAgent and commented
* chore: added base project README
* feat: added wallet provider descriptions to cli
* bump: 0.1.0
* fix: added files for npm
* chore: improved readme
* chore: removed @coinbase from package.json
* chore: added basis for prettier and lint
* chore: cli readme feedback
* chore: template readme feedback
* chore: add coinbase to package description
* chore: fixed prettier and ran
* chore: fixed lint and ran
* fix: package.lock
* bump: 0.1.1
* chore: typescript readme
* chore: fix constants lint error
* feat: add dynamic message modifier and faucet to template
* chore: comment regarding faucet
* chore: fixed package.lock
* fix: typo in readme
* chore: updated readme to better reflect the outcome of create-onchain-agent
* bump: 0.1.2
* feat: added wallet persistance for cdp
* chore: updated package-lock after bump
* feat: initial python cli tool
* feat: chatbot.ts generation via templating
* feat: overhaul cli for devx and branding
* chore: improved readme in template
* chore: readme for create-onchain-agent
* chore: commented generated chatbot.py
* feat: pyproject.toml passes in package name from cli
* chore: cleaned up some new lines creating by templating engine
* chore: updated readmes and comments
* chore: fix copier ignoring poetry.lock and copier.yml
* chore: updated python readme
* fix: typo in readme
* bump: release 0.1.3 hotfix
* chore: update package-lock
* fix: cli tool does not bundle template, and must read them from somewhere. temp fix is github
* chore: created/updated changelog
* bump: python create-onchain-agent to 0.1.1
* fix: rename variable for python code style
* feat: added guard to cli to ensure python supported version
* fix: readme
* fix: removed 12 from allowed_minors list. Was there for testing
* chore: updated requirement docs
* feat: added gha for npm create-onchain-agent
* chore: updated secret to NPM_TOKEN_CREATE_ONCHAIN_AGENT
* chore: pr feedback
* chore: reverted env secret to shared NPM_TOKEN
* chore: updated gha name
* chore: pr feedback
* chore: added changelog to create-onchain-agent
* chore: updated package-lock
…checksum to avoid errors (#460)
Sometimes the address given by explorers/wallets isn't in the right format
@phdargen

Copy link
Copy Markdown
Contributor

Hi @ucegbe, this looks great to me, thanks for the integration! Just a few comments:

  • please rebase against main, note that following feat: validate CDP/x402 upgrades #785 CdpEvmServerWalletProvider needs to be renamed to CdpEvmWalletProvider in the chatbot example

  • add a .env.local as in other examples

  • I could not find how to activate model support for us.amazon.nova-premier-v1:0. Maybe its not available in my region? In that case, it might be better to use a model that is more broadly accessible like nova pro

  • please make sure to run make format/lint before you commit

# Create a BedrockModel
bedrock_model = BedrockModel(
model_id="us.amazon.nova-premier-v1:0",
region_name='us-east-1',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this use AWS_REGION from env here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for spotting, made the change to use the region variable

user_input = input("\nPrompt: ")
if user_input.lower() == "exit":
break

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For empty prompts (pressing enter by accident), the chatbot crashes with botocore.errorfactory.ValidationException: An error occurred (ValidationException) when calling the ConverseStream operation: The text field in the ContentBlock object at messages.0.content.0 is blank. Add text to the text field, and try again.

Suggest to add:

if not user_input.strip(): continue

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was an oversight, fixed!

ucegbeand others added 3 commits July 23, 2025 14:50
proper CD wallet library import
included direction for Bedrock API keys
lint check
modification to strands chatbot example
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

I have made teh changes requested above, rebased against main and applied my commits.
Also did a lint check on required files.
Please let me know if I missed anything else.
Cheers.

validate_environment()

# Load environment variables
load_dotenv()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think load_dotenv() needs to be before validate_environment()

@phdargen

Copy link
Copy Markdown
Contributor

I have made teh changes requested above, rebased against main and applied my commits. Also did a lint check on required files. Please let me know if I missed anything else. Cheers.

Thanks for the quick turnaround! Changes look good, only one follow up above.

Also would be appreciated if you could add the framework extension to the project README (https://github.com/coinbase/agentkit/blob/main/python/README.md)

@ucegbe

Copy link
Copy Markdown
ContributorAuthor

sorry about that! Made all the changes.

Cheers

enforcing region env variable to be set
@phdargen

Copy link
Copy Markdown
Contributor

sorry about that! Made all the changes.

Cheers

Great, thanks! I tested it once more and think we are ready to go @CarsonRoscoe

* unwrap weth action
* updated docs
* description fix, updated README
* changeset updated

@CarsonRoscoeCarsonRoscoe left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ucegbe It looks great, thank you for the contribution!

One last thing to resolve, we require signed commits, and sadly, the first two commits in this PR (3242330,095c3f7) were not signed, and then there's two other commits scattered in there that are not being associated with your account, but they are to your name.

Please rebase against main and resign all commits. That should resolve it

@ucegbeucegbe closed this Jul 25, 2025
@ucegbe

Copy link
Copy Markdown
ContributorAuthor

Updated PR at #798

@ucegbeucegbe mentioned this pull request Jul 25, 2025
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationexampleNew example agentframework extensionNew framework extensionpython

Development

Successfully merging this pull request may close these issues.

20 participants

@ucegbe@cb-heimdall@phdargen@CarsonRoscoe@0xRAG@murrlincoln@stat@John-peterson-coinbase@RezaRahemtola@mikeghen@leopardracer@omahs@hexcow@fernandofcampos@Olexandr88@ozzy35410@cypherpepe@pemulis@aleskrin@wwwehr