feat: Autogen AI framework extension - #830

Merged
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen
Sep 2, 2025
Merged

feat: Autogen AI framework extension#830
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen

Conversation

@taejjing

@taejjingtaejjing commented Aug 26, 2025

Copy link
Copy Markdown
Contributor

Description

  • Added coinbased-agentkit-autogen extensions in python/framework-extension/autogen
    • AutogenTool : An adapter to make a Python function compatible with the AutoGen tool interface.
    • get_autogen_tools() : A helper function to convert agentkit actions into a list of AutoGen-compatible tools.
  • Added an chatbot example using Autogen Agent.
    • python/examples/autogen-cdp-chatbot
  • Closed: Add support for AutoGen framework #813

Tests

Chatbot: python/examples/autogen-cdp-chatbot/chatbot.py
Network: Base Sepolia
Setup: Check crypto price, request Tokens from testnet, check my balance
Prompt: What is the price of BTC? -------------------
The current price of BTC is $110,016.36.
-------------------
Prompt: Request 0.1 ETH from the faucet -------------------
You have successfully received 0.1 ETH from the faucet. Transaction hash: `*********`.
-------------------
Prompt: Show me my wallet balance
-------------------
Your wallet balance is approximately 0.2999 ETH.
-------------------

Checklist

A couple of things to include in your PR for completeness:

  • Added documentation to all relevant README.md files
  • Added a changelog entry

@cb-heimdall

cb-heimdall commented Aug 26, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation example New example agent framework extension New framework extension python labels Aug 26, 2025
@taejjing
taejjing marked this pull request as ready for review August 26, 2025 03:41
tools = get_autogen_tools(agentKit)

agent = AssistantAgent(
name="assistant"

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.

nit:

Suggested change
name="assistant"
name="assistant",

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.

Done :)

@@ -0,0 +1,69 @@
# AgentKit Autogen Extension

Microsoft Autogen extension of AgentKit. Enables agentic workflows to interact with onchain actions.

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.

Could you please add link to Autogen docs 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.

Add autogen docs link below, consistent with other docs.

Comment on lines +128 to +133
# Determine if the callable is asynchronous
if inspect.iscoroutinefunction(self._func):
return await self._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
return await asyncio.to_thread(self._func, **kwargs)

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.

Might be better to wrap in try-catch:

Suggested change
# Determine if the callable is asynchronous
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
returnawaitasyncio.to_thread(self._func, **kwargs)
try:
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
returnawaitasyncio.to_thread(self._func, **kwargs)
exceptExceptionase:
returnf"Error executing tool: {str(e)}"

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.

Add exception handling and corresponding test. (ed2cf32)

Comment on lines +45 to +54
wallet_provider = CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)

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.

please add optional RPC config as in angchain-cdp-chatbot

Suggested change
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet,
rpc_url=config.rpc_url, # Optional RPC URL override
)
)

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.

Done :)

requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.langchain-twitter-chatbot]

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.

Suggested change
[tool.langchain-twitter-chatbot]
[tool.autogen-cdp-chatbot]

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.

Done :)

except KeyboardInterrupt:
print("Goodbye Agent!")
await agent_executor._model_client.close()
sys.exit(0)

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.

this throws error in async function on KeyboardInterrupt, change to:

Suggested change
sys.exit(0)
return

Same at L195

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.

Done with L195 :)

@phdargen

Copy link
Copy Markdown
Contributor

Hi @taejjing, thanks for your contribution! I tested it and it seems to work fine. Please have a look at the few minor comments above

Set the following environment variables:

```bash
# TODO ENV check

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.

remove unnecessary comment

@phdargen

Copy link
Copy Markdown
Contributor

Thanks for the update @taejjing, looks good!

This is tested and good to go imo @CarsonRoscoe

@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.

Thank you @taejjing for the framework, looks great! And thank you @phdargen for the review

@CarsonRoscoe
CarsonRoscoe merged commit 3aec114 into coinbase:mainSep 2, 2025
26 checks passed
@taejjing

Copy link
Copy Markdown
ContributorAuthor

Thanks a lot for your detailed review! @phdargen@CarsonRoscoe
I really appreciate your help in getting this merged. :)

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.

Add support for AutoGen framework

4 participants

@taejjing@cb-heimdall@phdargen@CarsonRoscoe
, '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

feat: Autogen AI framework extension - #830

Merged
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen
Sep 2, 2025
Merged

feat: Autogen AI framework extension#830
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen

Conversation

@taejjing

@taejjingtaejjing commented Aug 26, 2025

Copy link
Copy Markdown
Contributor

Description

  • Added coinbased-agentkit-autogen extensions in python/framework-extension/autogen
    • AutogenTool : An adapter to make a Python function compatible with the AutoGen tool interface.
    • get_autogen_tools() : A helper function to convert agentkit actions into a list of AutoGen-compatible tools.
  • Added an chatbot example using Autogen Agent.
    • python/examples/autogen-cdp-chatbot
  • Closed: Add support for AutoGen framework #813

Tests

Chatbot: python/examples/autogen-cdp-chatbot/chatbot.py
Network: Base Sepolia
Setup: Check crypto price, request Tokens from testnet, check my balance
Prompt: What is the price of BTC? -------------------
The current price of BTC is $110,016.36.
-------------------
Prompt: Request 0.1 ETH from the faucet -------------------
You have successfully received 0.1 ETH from the faucet. Transaction hash: `*********`.
-------------------
Prompt: Show me my wallet balance
-------------------
Your wallet balance is approximately 0.2999 ETH.
-------------------

Checklist

A couple of things to include in your PR for completeness:

  • Added documentation to all relevant README.md files
  • Added a changelog entry

@cb-heimdall

cb-heimdall commented Aug 26, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation example New example agent framework extension New framework extension python labels Aug 26, 2025
@taejjing
taejjing marked this pull request as ready for review August 26, 2025 03:41
tools = get_autogen_tools(agentKit)

agent = AssistantAgent(
name="assistant"

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.

nit:

Suggested change
name="assistant"
name="assistant",

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.

Done :)

@@ -0,0 +1,69 @@
# AgentKit Autogen Extension

Microsoft Autogen extension of AgentKit. Enables agentic workflows to interact with onchain actions.

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.

Could you please add link to Autogen docs 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.

Add autogen docs link below, consistent with other docs.

Comment on lines +128 to +133
# Determine if the callable is asynchronous
if inspect.iscoroutinefunction(self._func):
return await self._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
return await asyncio.to_thread(self._func, **kwargs)

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.

Might be better to wrap in try-catch:

Suggested change
# Determine if the callable is asynchronous
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
returnawaitasyncio.to_thread(self._func, **kwargs)
try:
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
returnawaitasyncio.to_thread(self._func, **kwargs)
exceptExceptionase:
returnf"Error executing tool: {str(e)}"

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.

Add exception handling and corresponding test. (ed2cf32)

Comment on lines +45 to +54
wallet_provider = CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)

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.

please add optional RPC config as in angchain-cdp-chatbot

Suggested change
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet,
rpc_url=config.rpc_url, # Optional RPC URL override
)
)

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.

Done :)

requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.langchain-twitter-chatbot]

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.

Suggested change
[tool.langchain-twitter-chatbot]
[tool.autogen-cdp-chatbot]

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.

Done :)

except KeyboardInterrupt:
print("Goodbye Agent!")
await agent_executor._model_client.close()
sys.exit(0)

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.

this throws error in async function on KeyboardInterrupt, change to:

Suggested change
sys.exit(0)
return

Same at L195

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.

Done with L195 :)

@phdargen

Copy link
Copy Markdown
Contributor

Hi @taejjing, thanks for your contribution! I tested it and it seems to work fine. Please have a look at the few minor comments above

Set the following environment variables:

```bash
# TODO ENV check

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.

remove unnecessary comment

@phdargen

Copy link
Copy Markdown
Contributor

Thanks for the update @taejjing, looks good!

This is tested and good to go imo @CarsonRoscoe

@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.

Thank you @taejjing for the framework, looks great! And thank you @phdargen for the review

@CarsonRoscoe
CarsonRoscoe merged commit 3aec114 into coinbase:mainSep 2, 2025
26 checks passed
@taejjing

Copy link
Copy Markdown
ContributorAuthor

Thanks a lot for your detailed review! @phdargen@CarsonRoscoe
I really appreciate your help in getting this merged. :)

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.

Add support for AutoGen framework

4 participants

@taejjing@cb-heimdall@phdargen@CarsonRoscoe
, '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

feat: Autogen AI framework extension - #830

Merged
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen
Sep 2, 2025
Merged

feat: Autogen AI framework extension#830
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen

Conversation

@taejjing

@taejjingtaejjing commented Aug 26, 2025

Copy link
Copy Markdown
Contributor

Description

  • Added coinbased-agentkit-autogen extensions in python/framework-extension/autogen
    • AutogenTool : An adapter to make a Python function compatible with the AutoGen tool interface.
    • get_autogen_tools() : A helper function to convert agentkit actions into a list of AutoGen-compatible tools.
  • Added an chatbot example using Autogen Agent.
    • python/examples/autogen-cdp-chatbot
  • Closed: Add support for AutoGen framework #813

Tests

Chatbot: python/examples/autogen-cdp-chatbot/chatbot.py
Network: Base Sepolia
Setup: Check crypto price, request Tokens from testnet, check my balance
Prompt: What is the price of BTC? -------------------
The current price of BTC is $110,016.36.
-------------------
Prompt: Request 0.1 ETH from the faucet -------------------
You have successfully received 0.1 ETH from the faucet. Transaction hash: `*********`.
-------------------
Prompt: Show me my wallet balance
-------------------
Your wallet balance is approximately 0.2999 ETH.
-------------------

Checklist

A couple of things to include in your PR for completeness:

  • Added documentation to all relevant README.md files
  • Added a changelog entry

@cb-heimdall

cb-heimdall commented Aug 26, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation example New example agent framework extension New framework extension python labels Aug 26, 2025
@taejjing
taejjing marked this pull request as ready for review August 26, 2025 03:41
tools = get_autogen_tools(agentKit)

agent = AssistantAgent(
name="assistant"

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.

nit:

Suggested change
name="assistant"
name="assistant",

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.

Done :)

@@ -0,0 +1,69 @@
# AgentKit Autogen Extension

Microsoft Autogen extension of AgentKit. Enables agentic workflows to interact with onchain actions.

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.

Could you please add link to Autogen docs 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.

Add autogen docs link below, consistent with other docs.

Comment on lines +128 to +133
# Determine if the callable is asynchronous
if inspect.iscoroutinefunction(self._func):
return await self._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
return await asyncio.to_thread(self._func, **kwargs)

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.

Might be better to wrap in try-catch:

Suggested change
# Determine if the callable is asynchronous
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
returnawaitasyncio.to_thread(self._func, **kwargs)
try:
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
returnawaitasyncio.to_thread(self._func, **kwargs)
exceptExceptionase:
returnf"Error executing tool: {str(e)}"

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.

Add exception handling and corresponding test. (ed2cf32)

Comment on lines +45 to +54
wallet_provider = CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)

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.

please add optional RPC config as in angchain-cdp-chatbot

Suggested change
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet,
rpc_url=config.rpc_url, # Optional RPC URL override
)
)

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.

Done :)

requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.langchain-twitter-chatbot]

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.

Suggested change
[tool.langchain-twitter-chatbot]
[tool.autogen-cdp-chatbot]

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.

Done :)

except KeyboardInterrupt:
print("Goodbye Agent!")
await agent_executor._model_client.close()
sys.exit(0)

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.

this throws error in async function on KeyboardInterrupt, change to:

Suggested change
sys.exit(0)
return

Same at L195

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.

Done with L195 :)

@phdargen

Copy link
Copy Markdown
Contributor

Hi @taejjing, thanks for your contribution! I tested it and it seems to work fine. Please have a look at the few minor comments above

Set the following environment variables:

```bash
# TODO ENV check

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.

remove unnecessary comment

@phdargen

Copy link
Copy Markdown
Contributor

Thanks for the update @taejjing, looks good!

This is tested and good to go imo @CarsonRoscoe

@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.

Thank you @taejjing for the framework, looks great! And thank you @phdargen for the review

@CarsonRoscoe
CarsonRoscoe merged commit 3aec114 into coinbase:mainSep 2, 2025
26 checks passed
@taejjing

Copy link
Copy Markdown
ContributorAuthor

Thanks a lot for your detailed review! @phdargen@CarsonRoscoe
I really appreciate your help in getting this merged. :)

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.

Add support for AutoGen framework

4 participants

@taejjing@cb-heimdall@phdargen@CarsonRoscoe
, '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

feat: Autogen AI framework extension - #830

Merged
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen
Sep 2, 2025
Merged

feat: Autogen AI framework extension#830
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen

Conversation

@taejjing

@taejjingtaejjing commented Aug 26, 2025

Copy link
Copy Markdown
Contributor

Description

  • Added coinbased-agentkit-autogen extensions in python/framework-extension/autogen
    • AutogenTool : An adapter to make a Python function compatible with the AutoGen tool interface.
    • get_autogen_tools() : A helper function to convert agentkit actions into a list of AutoGen-compatible tools.
  • Added an chatbot example using Autogen Agent.
    • python/examples/autogen-cdp-chatbot
  • Closed: Add support for AutoGen framework #813

Tests

Chatbot: python/examples/autogen-cdp-chatbot/chatbot.py
Network: Base Sepolia
Setup: Check crypto price, request Tokens from testnet, check my balance
Prompt: What is the price of BTC? -------------------
The current price of BTC is $110,016.36.
-------------------
Prompt: Request 0.1 ETH from the faucet -------------------
You have successfully received 0.1 ETH from the faucet. Transaction hash: `*********`.
-------------------
Prompt: Show me my wallet balance
-------------------
Your wallet balance is approximately 0.2999 ETH.
-------------------

Checklist

A couple of things to include in your PR for completeness:

  • Added documentation to all relevant README.md files
  • Added a changelog entry

@cb-heimdall

cb-heimdall commented Aug 26, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation example New example agent framework extension New framework extension python labels Aug 26, 2025
@taejjing
taejjing marked this pull request as ready for review August 26, 2025 03:41
tools = get_autogen_tools(agentKit)

agent = AssistantAgent(
name="assistant"

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.

nit:

Suggested change
name="assistant"
name="assistant",

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.

Done :)

@@ -0,0 +1,69 @@
# AgentKit Autogen Extension

Microsoft Autogen extension of AgentKit. Enables agentic workflows to interact with onchain actions.

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.

Could you please add link to Autogen docs 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.

Add autogen docs link below, consistent with other docs.

Comment on lines +128 to +133
# Determine if the callable is asynchronous
if inspect.iscoroutinefunction(self._func):
return await self._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
return await asyncio.to_thread(self._func, **kwargs)

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.

Might be better to wrap in try-catch:

Suggested change
# Determine if the callable is asynchronous
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
returnawaitasyncio.to_thread(self._func, **kwargs)
try:
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
returnawaitasyncio.to_thread(self._func, **kwargs)
exceptExceptionase:
returnf"Error executing tool: {str(e)}"

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.

Add exception handling and corresponding test. (ed2cf32)

Comment on lines +45 to +54
wallet_provider = CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)

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.

please add optional RPC config as in angchain-cdp-chatbot

Suggested change
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet,
rpc_url=config.rpc_url, # Optional RPC URL override
)
)

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.

Done :)

requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.langchain-twitter-chatbot]

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.

Suggested change
[tool.langchain-twitter-chatbot]
[tool.autogen-cdp-chatbot]

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.

Done :)

except KeyboardInterrupt:
print("Goodbye Agent!")
await agent_executor._model_client.close()
sys.exit(0)

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.

this throws error in async function on KeyboardInterrupt, change to:

Suggested change
sys.exit(0)
return

Same at L195

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.

Done with L195 :)

@phdargen

Copy link
Copy Markdown
Contributor

Hi @taejjing, thanks for your contribution! I tested it and it seems to work fine. Please have a look at the few minor comments above

Set the following environment variables:

```bash
# TODO ENV check

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.

remove unnecessary comment

@phdargen

Copy link
Copy Markdown
Contributor

Thanks for the update @taejjing, looks good!

This is tested and good to go imo @CarsonRoscoe

@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.

Thank you @taejjing for the framework, looks great! And thank you @phdargen for the review

@CarsonRoscoe
CarsonRoscoe merged commit 3aec114 into coinbase:mainSep 2, 2025
26 checks passed
@taejjing

Copy link
Copy Markdown
ContributorAuthor

Thanks a lot for your detailed review! @phdargen@CarsonRoscoe
I really appreciate your help in getting this merged. :)

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.

Add support for AutoGen framework

4 participants

@taejjing@cb-heimdall@phdargen@CarsonRoscoe
, '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

feat: Autogen AI framework extension - #830

Merged
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen
Sep 2, 2025
Merged

feat: Autogen AI framework extension#830
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen

Conversation

@taejjing

@taejjingtaejjing commented Aug 26, 2025

Copy link
Copy Markdown
Contributor

Description

  • Added coinbased-agentkit-autogen extensions in python/framework-extension/autogen
    • AutogenTool : An adapter to make a Python function compatible with the AutoGen tool interface.
    • get_autogen_tools() : A helper function to convert agentkit actions into a list of AutoGen-compatible tools.
  • Added an chatbot example using Autogen Agent.
    • python/examples/autogen-cdp-chatbot
  • Closed: Add support for AutoGen framework #813

Tests

Chatbot: python/examples/autogen-cdp-chatbot/chatbot.py
Network: Base Sepolia
Setup: Check crypto price, request Tokens from testnet, check my balance
Prompt: What is the price of BTC? -------------------
The current price of BTC is $110,016.36.
-------------------
Prompt: Request 0.1 ETH from the faucet -------------------
You have successfully received 0.1 ETH from the faucet. Transaction hash: `*********`.
-------------------
Prompt: Show me my wallet balance
-------------------
Your wallet balance is approximately 0.2999 ETH.
-------------------

Checklist

A couple of things to include in your PR for completeness:

  • Added documentation to all relevant README.md files
  • Added a changelog entry

@cb-heimdall

cb-heimdall commented Aug 26, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation example New example agent framework extension New framework extension python labels Aug 26, 2025
@taejjing
taejjing marked this pull request as ready for review August 26, 2025 03:41
tools = get_autogen_tools(agentKit)

agent = AssistantAgent(
name="assistant"

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.

nit:

Suggested change
name="assistant"
name="assistant",

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.

Done :)

@@ -0,0 +1,69 @@
# AgentKit Autogen Extension

Microsoft Autogen extension of AgentKit. Enables agentic workflows to interact with onchain actions.

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.

Could you please add link to Autogen docs 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.

Add autogen docs link below, consistent with other docs.

Comment on lines +128 to +133
# Determine if the callable is asynchronous
if inspect.iscoroutinefunction(self._func):
return await self._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
return await asyncio.to_thread(self._func, **kwargs)

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.

Might be better to wrap in try-catch:

Suggested change
# Determine if the callable is asynchronous
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
returnawaitasyncio.to_thread(self._func, **kwargs)
try:
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
returnawaitasyncio.to_thread(self._func, **kwargs)
exceptExceptionase:
returnf"Error executing tool: {str(e)}"

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.

Add exception handling and corresponding test. (ed2cf32)

Comment on lines +45 to +54
wallet_provider = CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)

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.

please add optional RPC config as in angchain-cdp-chatbot

Suggested change
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet,
rpc_url=config.rpc_url, # Optional RPC URL override
)
)

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.

Done :)

requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.langchain-twitter-chatbot]

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.

Suggested change
[tool.langchain-twitter-chatbot]
[tool.autogen-cdp-chatbot]

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.

Done :)

except KeyboardInterrupt:
print("Goodbye Agent!")
await agent_executor._model_client.close()
sys.exit(0)

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.

this throws error in async function on KeyboardInterrupt, change to:

Suggested change
sys.exit(0)
return

Same at L195

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.

Done with L195 :)

@phdargen

Copy link
Copy Markdown
Contributor

Hi @taejjing, thanks for your contribution! I tested it and it seems to work fine. Please have a look at the few minor comments above

Set the following environment variables:

```bash
# TODO ENV check

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.

remove unnecessary comment

@phdargen

Copy link
Copy Markdown
Contributor

Thanks for the update @taejjing, looks good!

This is tested and good to go imo @CarsonRoscoe

@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.

Thank you @taejjing for the framework, looks great! And thank you @phdargen for the review

@CarsonRoscoe
CarsonRoscoe merged commit 3aec114 into coinbase:mainSep 2, 2025
26 checks passed
@taejjing

Copy link
Copy Markdown
ContributorAuthor

Thanks a lot for your detailed review! @phdargen@CarsonRoscoe
I really appreciate your help in getting this merged. :)

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.

Add support for AutoGen framework

4 participants

@taejjing@cb-heimdall@phdargen@CarsonRoscoe
, '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

feat: Autogen AI framework extension - #830

Merged
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen
Sep 2, 2025
Merged

feat: Autogen AI framework extension#830
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen

Conversation

@taejjing

@taejjingtaejjing commented Aug 26, 2025

Copy link
Copy Markdown
Contributor

Description

  • Added coinbased-agentkit-autogen extensions in python/framework-extension/autogen
    • AutogenTool : An adapter to make a Python function compatible with the AutoGen tool interface.
    • get_autogen_tools() : A helper function to convert agentkit actions into a list of AutoGen-compatible tools.
  • Added an chatbot example using Autogen Agent.
    • python/examples/autogen-cdp-chatbot
  • Closed: Add support for AutoGen framework #813

Tests

Chatbot: python/examples/autogen-cdp-chatbot/chatbot.py
Network: Base Sepolia
Setup: Check crypto price, request Tokens from testnet, check my balance
Prompt: What is the price of BTC? -------------------
The current price of BTC is $110,016.36.
-------------------
Prompt: Request 0.1 ETH from the faucet -------------------
You have successfully received 0.1 ETH from the faucet. Transaction hash: `*********`.
-------------------
Prompt: Show me my wallet balance
-------------------
Your wallet balance is approximately 0.2999 ETH.
-------------------

Checklist

A couple of things to include in your PR for completeness:

  • Added documentation to all relevant README.md files
  • Added a changelog entry

@cb-heimdall

cb-heimdall commented Aug 26, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation example New example agent framework extension New framework extension python labels Aug 26, 2025
@taejjing
taejjing marked this pull request as ready for review August 26, 2025 03:41
tools = get_autogen_tools(agentKit)

agent = AssistantAgent(
name="assistant"

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.

nit:

Suggested change
name="assistant"
name="assistant",

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.

Done :)

@@ -0,0 +1,69 @@
# AgentKit Autogen Extension

Microsoft Autogen extension of AgentKit. Enables agentic workflows to interact with onchain actions.

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.

Could you please add link to Autogen docs 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.

Add autogen docs link below, consistent with other docs.

Comment on lines +128 to +133
# Determine if the callable is asynchronous
if inspect.iscoroutinefunction(self._func):
return await self._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
return await asyncio.to_thread(self._func, **kwargs)

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.

Might be better to wrap in try-catch:

Suggested change
# Determine if the callable is asynchronous
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
returnawaitasyncio.to_thread(self._func, **kwargs)
try:
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
returnawaitasyncio.to_thread(self._func, **kwargs)
exceptExceptionase:
returnf"Error executing tool: {str(e)}"

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.

Add exception handling and corresponding test. (ed2cf32)

Comment on lines +45 to +54
wallet_provider = CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)

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.

please add optional RPC config as in angchain-cdp-chatbot

Suggested change
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet,
rpc_url=config.rpc_url, # Optional RPC URL override
)
)

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.

Done :)

requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.langchain-twitter-chatbot]

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.

Suggested change
[tool.langchain-twitter-chatbot]
[tool.autogen-cdp-chatbot]

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.

Done :)

except KeyboardInterrupt:
print("Goodbye Agent!")
await agent_executor._model_client.close()
sys.exit(0)

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.

this throws error in async function on KeyboardInterrupt, change to:

Suggested change
sys.exit(0)
return

Same at L195

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.

Done with L195 :)

@phdargen

Copy link
Copy Markdown
Contributor

Hi @taejjing, thanks for your contribution! I tested it and it seems to work fine. Please have a look at the few minor comments above

Set the following environment variables:

```bash
# TODO ENV check

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.

remove unnecessary comment

@phdargen

Copy link
Copy Markdown
Contributor

Thanks for the update @taejjing, looks good!

This is tested and good to go imo @CarsonRoscoe

@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.

Thank you @taejjing for the framework, looks great! And thank you @phdargen for the review

@CarsonRoscoe
CarsonRoscoe merged commit 3aec114 into coinbase:mainSep 2, 2025
26 checks passed
@taejjing

Copy link
Copy Markdown
ContributorAuthor

Thanks a lot for your detailed review! @phdargen@CarsonRoscoe
I really appreciate your help in getting this merged. :)

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.

Add support for AutoGen framework

4 participants

@taejjing@cb-heimdall@phdargen@CarsonRoscoe
, '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

feat: Autogen AI framework extension - #830

Merged
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen
Sep 2, 2025
Merged

feat: Autogen AI framework extension#830
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen

Conversation

@taejjing

@taejjingtaejjing commented Aug 26, 2025

Copy link
Copy Markdown
Contributor

Description

  • Added coinbased-agentkit-autogen extensions in python/framework-extension/autogen
    • AutogenTool : An adapter to make a Python function compatible with the AutoGen tool interface.
    • get_autogen_tools() : A helper function to convert agentkit actions into a list of AutoGen-compatible tools.
  • Added an chatbot example using Autogen Agent.
    • python/examples/autogen-cdp-chatbot
  • Closed: Add support for AutoGen framework #813

Tests

Chatbot: python/examples/autogen-cdp-chatbot/chatbot.py
Network: Base Sepolia
Setup: Check crypto price, request Tokens from testnet, check my balance
Prompt: What is the price of BTC? -------------------
The current price of BTC is $110,016.36.
-------------------
Prompt: Request 0.1 ETH from the faucet -------------------
You have successfully received 0.1 ETH from the faucet. Transaction hash: `*********`.
-------------------
Prompt: Show me my wallet balance
-------------------
Your wallet balance is approximately 0.2999 ETH.
-------------------

Checklist

A couple of things to include in your PR for completeness:

  • Added documentation to all relevant README.md files
  • Added a changelog entry

@cb-heimdall

cb-heimdall commented Aug 26, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation example New example agent framework extension New framework extension python labels Aug 26, 2025
@taejjing
taejjing marked this pull request as ready for review August 26, 2025 03:41
tools = get_autogen_tools(agentKit)

agent = AssistantAgent(
name="assistant"

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.

nit:

Suggested change
name="assistant"
name="assistant",

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.

Done :)

@@ -0,0 +1,69 @@
# AgentKit Autogen Extension

Microsoft Autogen extension of AgentKit. Enables agentic workflows to interact with onchain actions.

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.

Could you please add link to Autogen docs 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.

Add autogen docs link below, consistent with other docs.

Comment on lines +128 to +133
# Determine if the callable is asynchronous
if inspect.iscoroutinefunction(self._func):
return await self._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
return await asyncio.to_thread(self._func, **kwargs)

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.

Might be better to wrap in try-catch:

Suggested change
# Determine if the callable is asynchronous
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
returnawaitasyncio.to_thread(self._func, **kwargs)
try:
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
returnawaitasyncio.to_thread(self._func, **kwargs)
exceptExceptionase:
returnf"Error executing tool: {str(e)}"

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.

Add exception handling and corresponding test. (ed2cf32)

Comment on lines +45 to +54
wallet_provider = CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)

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.

please add optional RPC config as in angchain-cdp-chatbot

Suggested change
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet,
rpc_url=config.rpc_url, # Optional RPC URL override
)
)

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.

Done :)

requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.langchain-twitter-chatbot]

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.

Suggested change
[tool.langchain-twitter-chatbot]
[tool.autogen-cdp-chatbot]

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.

Done :)

except KeyboardInterrupt:
print("Goodbye Agent!")
await agent_executor._model_client.close()
sys.exit(0)

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.

this throws error in async function on KeyboardInterrupt, change to:

Suggested change
sys.exit(0)
return

Same at L195

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.

Done with L195 :)

@phdargen

Copy link
Copy Markdown
Contributor

Hi @taejjing, thanks for your contribution! I tested it and it seems to work fine. Please have a look at the few minor comments above

Set the following environment variables:

```bash
# TODO ENV check

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.

remove unnecessary comment

@phdargen

Copy link
Copy Markdown
Contributor

Thanks for the update @taejjing, looks good!

This is tested and good to go imo @CarsonRoscoe

@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.

Thank you @taejjing for the framework, looks great! And thank you @phdargen for the review

@CarsonRoscoe
CarsonRoscoe merged commit 3aec114 into coinbase:mainSep 2, 2025
26 checks passed
@taejjing

Copy link
Copy Markdown
ContributorAuthor

Thanks a lot for your detailed review! @phdargen@CarsonRoscoe
I really appreciate your help in getting this merged. :)

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.

Add support for AutoGen framework

4 participants

@taejjing@cb-heimdall@phdargen@CarsonRoscoe
, '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

feat: Autogen AI framework extension - #830

Merged
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen
Sep 2, 2025
Merged

feat: Autogen AI framework extension#830
CarsonRoscoe merged 8 commits into
coinbase:mainfrom
taejjing:autogen

Conversation

@taejjing

@taejjingtaejjing commented Aug 26, 2025

Copy link
Copy Markdown
Contributor

Description

  • Added coinbased-agentkit-autogen extensions in python/framework-extension/autogen
    • AutogenTool : An adapter to make a Python function compatible with the AutoGen tool interface.
    • get_autogen_tools() : A helper function to convert agentkit actions into a list of AutoGen-compatible tools.
  • Added an chatbot example using Autogen Agent.
    • python/examples/autogen-cdp-chatbot
  • Closed: Add support for AutoGen framework #813

Tests

Chatbot: python/examples/autogen-cdp-chatbot/chatbot.py
Network: Base Sepolia
Setup: Check crypto price, request Tokens from testnet, check my balance
Prompt: What is the price of BTC? -------------------
The current price of BTC is $110,016.36.
-------------------
Prompt: Request 0.1 ETH from the faucet -------------------
You have successfully received 0.1 ETH from the faucet. Transaction hash: `*********`.
-------------------
Prompt: Show me my wallet balance
-------------------
Your wallet balance is approximately 0.2999 ETH.
-------------------

Checklist

A couple of things to include in your PR for completeness:

  • Added documentation to all relevant README.md files
  • Added a changelog entry

@cb-heimdall

cb-heimdall commented Aug 26, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation example New example agent framework extension New framework extension python labels Aug 26, 2025
@taejjing
taejjing marked this pull request as ready for review August 26, 2025 03:41
tools = get_autogen_tools(agentKit)

agent = AssistantAgent(
name="assistant"

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.

nit:

Suggested change
name="assistant"
name="assistant",

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.

Done :)

@@ -0,0 +1,69 @@
# AgentKit Autogen Extension

Microsoft Autogen extension of AgentKit. Enables agentic workflows to interact with onchain actions.

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.

Could you please add link to Autogen docs 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.

Add autogen docs link below, consistent with other docs.

Comment on lines +128 to +133
# Determine if the callable is asynchronous
if inspect.iscoroutinefunction(self._func):
return await self._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
return await asyncio.to_thread(self._func, **kwargs)

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.

Might be better to wrap in try-catch:

Suggested change
# Determine if the callable is asynchronous
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
# Run sync func in a thread to avoid blocking the event loop
returnawaitasyncio.to_thread(self._func, **kwargs)
try:
ifinspect.iscoroutinefunction(self._func):
returnawaitself._func(**kwargs)
else:
returnawaitasyncio.to_thread(self._func, **kwargs)
exceptExceptionase:
returnf"Error executing tool: {str(e)}"

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.

Add exception handling and corresponding test. (ed2cf32)

Comment on lines +45 to +54
wallet_provider = CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)

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.

please add optional RPC config as in angchain-cdp-chatbot

Suggested change
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet
)
)
wallet_provider=CdpEvmWalletProvider(
CdpEvmWalletProviderConfig(
api_key_id=config.api_key_id, # CDP API Key ID
api_key_secret=config.api_key_secret, # CDP API Key Secret
wallet_secret=config.wallet_secret, # CDP Wallet Secret
network_id=config.network_id, # Network ID - Optional, will default to 'base-sepolia'
address=config.address, # Wallet Address - Optional, will trigger idempotency flow if not provided
idempotency_key=config.idempotency_key, # Idempotency Key - Optional, seeds generation of a new wallet,
rpc_url=config.rpc_url, # Optional RPC URL override
)
)

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.

Done :)

requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.langchain-twitter-chatbot]

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.

Suggested change
[tool.langchain-twitter-chatbot]
[tool.autogen-cdp-chatbot]

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.

Done :)

except KeyboardInterrupt:
print("Goodbye Agent!")
await agent_executor._model_client.close()
sys.exit(0)

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.

this throws error in async function on KeyboardInterrupt, change to:

Suggested change
sys.exit(0)
return

Same at L195

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.

Done with L195 :)

@phdargen

Copy link
Copy Markdown
Contributor

Hi @taejjing, thanks for your contribution! I tested it and it seems to work fine. Please have a look at the few minor comments above

Set the following environment variables:

```bash
# TODO ENV check

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.

remove unnecessary comment

@phdargen

Copy link
Copy Markdown
Contributor

Thanks for the update @taejjing, looks good!

This is tested and good to go imo @CarsonRoscoe

@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.

Thank you @taejjing for the framework, looks great! And thank you @phdargen for the review

@CarsonRoscoe
CarsonRoscoe merged commit 3aec114 into coinbase:mainSep 2, 2025
26 checks passed
@taejjing

Copy link
Copy Markdown
ContributorAuthor

Thanks a lot for your detailed review! @phdargen@CarsonRoscoe
I really appreciate your help in getting this merged. :)

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.

Add support for AutoGen framework

4 participants

@taejjing@cb-heimdall@phdargen@CarsonRoscoe