feat:post embeds on Farcaster and media on Twitter (ts) - #675

Merged
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts
Jul 24, 2025
Merged

feat:post embeds on Farcaster and media on Twitter (ts)#675
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts

Conversation

@phdargen

@phdargenphdargen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

Description

Added media upload support for Twitter and embeds support for Farcaster

  • FarcasterActionProvider: post_cast actions takes new optional embeds URL as input
  • TwitterActionProvider:
    • new action to upload upload_media returns media_id
    • post_tweet/post_tweet_reply take new optional media_ids as input

Tests

Chatbot: typescript/examples/langchain-cdp-chatbot/chatbot.ts
Network: Base Sepolia
Prompt: farcaster post with text "Testing in prod" and embeds: "https://true-cast.vercel.app", "https://true-cast.vercel.app/trueCast.png"
-------------------
Successfully posted cast to Farcaster:
{"success":true,"cast":{"hash":"0x4f24e69ed1f51aaeb65e79b9968bd72742bd4899","author":{"object":"user","fid":1046472,"username":"truecastagent","display_name":"TrueCast","pfp_url":"https://imagedelivery.net/BXluQx4ige9GuW0Ia56BHw/bd831a9d-dc68-4de3-a4d8-5337e2e43100/rectcrop3","custody_address":"0x1819005a8e32b2ef3d0fec2f8e0d08517b401d29","profile":{"bio":{"text":""}},"follower_count":16,"following_count":8,"verifications":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"verified_addresses":{"eth_addresses":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"sol_addresses":["7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"],"primary":{"eth_address":"0x8e59886e4bd8b733df54c035d8fb33a982fb07dd","sol_address":"7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"}},"verified_accounts":[{"platform":"x","username":"truecastagent"}],"power_badge":false,"experimental":{"neynar_user_score":0.58,"deprecation_notice":"The `neynar_user_score` field under `experimental` will be deprecated after June 1, 2025, as it will be formally promoted to a stable field named `score` within the user object."},"score":0.58},"text":"Testing in prod"}}
-------------------
The cast "Testing in prod" has been successfully posted to Farcaster with the specified embeds. If you need anything else, feel free to ask!

Cast: https://farcaster.xyz/truecastagent/0x4f24e69e

Prompt: upload file base.png to twitter
-------------------
Successfully uploaded media to Twitter: 1948465451035422720
-------------------
The media has been successfully uploaded to Twitter with the media ID: `1948465451035422720`. Would you like to post a tweet with this media? If so, please provide the text for the tweet.
-------------------
Prompt: Post text "Testing in prod" with this media ID
-------------------
Successfully posted to Twitter:
{"data":{"edit_history_tweet_ids":["1948465523076821024"],"text":"Testing in prod https://t.co/AAYAcCW3gj","id":"1948465523076821024"}}
-------------------
The tweet "Testing in prod" has been successfully posted to Twitter! You can view it [here](https://twitter.com/i/web/status/1948465523076821024). If you need anything else, feel free to ask!
-------------------
Prompt: post again and use this media id twice -------------------
Successfully posted to Twitter:
{"data":{"text":"Testing in prod again https://t.co/ue1UiF2dlg","edit_history_tweet_ids":["1948465987025600547"],"id":"1948465987025600547"}}
-------------------
The tweet "Testing in prod again" has been successfully posted to Twitter using the media twice! You can view it [here](https://twitter.com/i/web/status/1948465987025600547). Let me know if you need anything else!

Posts:

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 Apr 15, 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 action provider New action provider typescript labels Apr 15, 2025
async postTweet(args: z.infer<typeof TwitterPostTweetSchema>): Promise<string> {
try {
const response = await this.client.v2.tweet(args.tweet);
let mediaOptions = {};

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 suggest updating the action's descriptions to mention the newly added mediaIds and how the agent should use them

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.

Good catch, done!

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

Hey @phdargen, this PR is looking good and I'm happy to get this in :)

Can you rebase against main first and address my one comment?
Then I'll do some testing and aim to get this in for this weeks release

@phdargen
phdargenforce-pushed the socials-ts branch 2 times, most recently from 9023d28 to 770df82CompareApril 30, 2025 14:45
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

@phdargen

Copy link
Copy Markdown
ContributorAuthor

Rebased and tested again, see recent posts above. Should be good to go @CarsonRoscoe

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

BTW, this error occurs when running with node v20. I think all the CDP v2 stuff requires v22, while all the READMEs still have node v18 as prerequisite

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

LGTM! Thank you for the contribution

@CarsonRoscoe
CarsonRoscoe merged commit ff02c51 into coinbase:mainJul 24, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerdocumentationImprovements or additions to documentationtypescript

Development

Successfully merging this pull request may close these issues.

3 participants

@phdargen@cb-heimdall@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:post embeds on Farcaster and media on Twitter (ts) - #675

Merged
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts
Jul 24, 2025
Merged

feat:post embeds on Farcaster and media on Twitter (ts)#675
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts

Conversation

@phdargen

@phdargenphdargen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

Description

Added media upload support for Twitter and embeds support for Farcaster

  • FarcasterActionProvider: post_cast actions takes new optional embeds URL as input
  • TwitterActionProvider:
    • new action to upload upload_media returns media_id
    • post_tweet/post_tweet_reply take new optional media_ids as input

Tests

Chatbot: typescript/examples/langchain-cdp-chatbot/chatbot.ts
Network: Base Sepolia
Prompt: farcaster post with text "Testing in prod" and embeds: "https://true-cast.vercel.app", "https://true-cast.vercel.app/trueCast.png"
-------------------
Successfully posted cast to Farcaster:
{"success":true,"cast":{"hash":"0x4f24e69ed1f51aaeb65e79b9968bd72742bd4899","author":{"object":"user","fid":1046472,"username":"truecastagent","display_name":"TrueCast","pfp_url":"https://imagedelivery.net/BXluQx4ige9GuW0Ia56BHw/bd831a9d-dc68-4de3-a4d8-5337e2e43100/rectcrop3","custody_address":"0x1819005a8e32b2ef3d0fec2f8e0d08517b401d29","profile":{"bio":{"text":""}},"follower_count":16,"following_count":8,"verifications":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"verified_addresses":{"eth_addresses":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"sol_addresses":["7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"],"primary":{"eth_address":"0x8e59886e4bd8b733df54c035d8fb33a982fb07dd","sol_address":"7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"}},"verified_accounts":[{"platform":"x","username":"truecastagent"}],"power_badge":false,"experimental":{"neynar_user_score":0.58,"deprecation_notice":"The `neynar_user_score` field under `experimental` will be deprecated after June 1, 2025, as it will be formally promoted to a stable field named `score` within the user object."},"score":0.58},"text":"Testing in prod"}}
-------------------
The cast "Testing in prod" has been successfully posted to Farcaster with the specified embeds. If you need anything else, feel free to ask!

Cast: https://farcaster.xyz/truecastagent/0x4f24e69e

Prompt: upload file base.png to twitter
-------------------
Successfully uploaded media to Twitter: 1948465451035422720
-------------------
The media has been successfully uploaded to Twitter with the media ID: `1948465451035422720`. Would you like to post a tweet with this media? If so, please provide the text for the tweet.
-------------------
Prompt: Post text "Testing in prod" with this media ID
-------------------
Successfully posted to Twitter:
{"data":{"edit_history_tweet_ids":["1948465523076821024"],"text":"Testing in prod https://t.co/AAYAcCW3gj","id":"1948465523076821024"}}
-------------------
The tweet "Testing in prod" has been successfully posted to Twitter! You can view it [here](https://twitter.com/i/web/status/1948465523076821024). If you need anything else, feel free to ask!
-------------------
Prompt: post again and use this media id twice -------------------
Successfully posted to Twitter:
{"data":{"text":"Testing in prod again https://t.co/ue1UiF2dlg","edit_history_tweet_ids":["1948465987025600547"],"id":"1948465987025600547"}}
-------------------
The tweet "Testing in prod again" has been successfully posted to Twitter using the media twice! You can view it [here](https://twitter.com/i/web/status/1948465987025600547). Let me know if you need anything else!

Posts:

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 Apr 15, 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 action provider New action provider typescript labels Apr 15, 2025
async postTweet(args: z.infer<typeof TwitterPostTweetSchema>): Promise<string> {
try {
const response = await this.client.v2.tweet(args.tweet);
let mediaOptions = {};

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 suggest updating the action's descriptions to mention the newly added mediaIds and how the agent should use them

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.

Good catch, done!

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

Hey @phdargen, this PR is looking good and I'm happy to get this in :)

Can you rebase against main first and address my one comment?
Then I'll do some testing and aim to get this in for this weeks release

@phdargen
phdargenforce-pushed the socials-ts branch 2 times, most recently from 9023d28 to 770df82CompareApril 30, 2025 14:45
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

@phdargen

Copy link
Copy Markdown
ContributorAuthor

Rebased and tested again, see recent posts above. Should be good to go @CarsonRoscoe

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

BTW, this error occurs when running with node v20. I think all the CDP v2 stuff requires v22, while all the READMEs still have node v18 as prerequisite

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

LGTM! Thank you for the contribution

@CarsonRoscoe
CarsonRoscoe merged commit ff02c51 into coinbase:mainJul 24, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerdocumentationImprovements or additions to documentationtypescript

Development

Successfully merging this pull request may close these issues.

3 participants

@phdargen@cb-heimdall@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:post embeds on Farcaster and media on Twitter (ts) - #675

Merged
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts
Jul 24, 2025
Merged

feat:post embeds on Farcaster and media on Twitter (ts)#675
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts

Conversation

@phdargen

@phdargenphdargen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

Description

Added media upload support for Twitter and embeds support for Farcaster

  • FarcasterActionProvider: post_cast actions takes new optional embeds URL as input
  • TwitterActionProvider:
    • new action to upload upload_media returns media_id
    • post_tweet/post_tweet_reply take new optional media_ids as input

Tests

Chatbot: typescript/examples/langchain-cdp-chatbot/chatbot.ts
Network: Base Sepolia
Prompt: farcaster post with text "Testing in prod" and embeds: "https://true-cast.vercel.app", "https://true-cast.vercel.app/trueCast.png"
-------------------
Successfully posted cast to Farcaster:
{"success":true,"cast":{"hash":"0x4f24e69ed1f51aaeb65e79b9968bd72742bd4899","author":{"object":"user","fid":1046472,"username":"truecastagent","display_name":"TrueCast","pfp_url":"https://imagedelivery.net/BXluQx4ige9GuW0Ia56BHw/bd831a9d-dc68-4de3-a4d8-5337e2e43100/rectcrop3","custody_address":"0x1819005a8e32b2ef3d0fec2f8e0d08517b401d29","profile":{"bio":{"text":""}},"follower_count":16,"following_count":8,"verifications":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"verified_addresses":{"eth_addresses":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"sol_addresses":["7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"],"primary":{"eth_address":"0x8e59886e4bd8b733df54c035d8fb33a982fb07dd","sol_address":"7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"}},"verified_accounts":[{"platform":"x","username":"truecastagent"}],"power_badge":false,"experimental":{"neynar_user_score":0.58,"deprecation_notice":"The `neynar_user_score` field under `experimental` will be deprecated after June 1, 2025, as it will be formally promoted to a stable field named `score` within the user object."},"score":0.58},"text":"Testing in prod"}}
-------------------
The cast "Testing in prod" has been successfully posted to Farcaster with the specified embeds. If you need anything else, feel free to ask!

Cast: https://farcaster.xyz/truecastagent/0x4f24e69e

Prompt: upload file base.png to twitter
-------------------
Successfully uploaded media to Twitter: 1948465451035422720
-------------------
The media has been successfully uploaded to Twitter with the media ID: `1948465451035422720`. Would you like to post a tweet with this media? If so, please provide the text for the tweet.
-------------------
Prompt: Post text "Testing in prod" with this media ID
-------------------
Successfully posted to Twitter:
{"data":{"edit_history_tweet_ids":["1948465523076821024"],"text":"Testing in prod https://t.co/AAYAcCW3gj","id":"1948465523076821024"}}
-------------------
The tweet "Testing in prod" has been successfully posted to Twitter! You can view it [here](https://twitter.com/i/web/status/1948465523076821024). If you need anything else, feel free to ask!
-------------------
Prompt: post again and use this media id twice -------------------
Successfully posted to Twitter:
{"data":{"text":"Testing in prod again https://t.co/ue1UiF2dlg","edit_history_tweet_ids":["1948465987025600547"],"id":"1948465987025600547"}}
-------------------
The tweet "Testing in prod again" has been successfully posted to Twitter using the media twice! You can view it [here](https://twitter.com/i/web/status/1948465987025600547). Let me know if you need anything else!

Posts:

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 Apr 15, 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 action provider New action provider typescript labels Apr 15, 2025
async postTweet(args: z.infer<typeof TwitterPostTweetSchema>): Promise<string> {
try {
const response = await this.client.v2.tweet(args.tweet);
let mediaOptions = {};

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 suggest updating the action's descriptions to mention the newly added mediaIds and how the agent should use them

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.

Good catch, done!

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

Hey @phdargen, this PR is looking good and I'm happy to get this in :)

Can you rebase against main first and address my one comment?
Then I'll do some testing and aim to get this in for this weeks release

@phdargen
phdargenforce-pushed the socials-ts branch 2 times, most recently from 9023d28 to 770df82CompareApril 30, 2025 14:45
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

@phdargen

Copy link
Copy Markdown
ContributorAuthor

Rebased and tested again, see recent posts above. Should be good to go @CarsonRoscoe

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

BTW, this error occurs when running with node v20. I think all the CDP v2 stuff requires v22, while all the READMEs still have node v18 as prerequisite

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

LGTM! Thank you for the contribution

@CarsonRoscoe
CarsonRoscoe merged commit ff02c51 into coinbase:mainJul 24, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerdocumentationImprovements or additions to documentationtypescript

Development

Successfully merging this pull request may close these issues.

3 participants

@phdargen@cb-heimdall@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:post embeds on Farcaster and media on Twitter (ts) - #675

Merged
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts
Jul 24, 2025
Merged

feat:post embeds on Farcaster and media on Twitter (ts)#675
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts

Conversation

@phdargen

@phdargenphdargen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

Description

Added media upload support for Twitter and embeds support for Farcaster

  • FarcasterActionProvider: post_cast actions takes new optional embeds URL as input
  • TwitterActionProvider:
    • new action to upload upload_media returns media_id
    • post_tweet/post_tweet_reply take new optional media_ids as input

Tests

Chatbot: typescript/examples/langchain-cdp-chatbot/chatbot.ts
Network: Base Sepolia
Prompt: farcaster post with text "Testing in prod" and embeds: "https://true-cast.vercel.app", "https://true-cast.vercel.app/trueCast.png"
-------------------
Successfully posted cast to Farcaster:
{"success":true,"cast":{"hash":"0x4f24e69ed1f51aaeb65e79b9968bd72742bd4899","author":{"object":"user","fid":1046472,"username":"truecastagent","display_name":"TrueCast","pfp_url":"https://imagedelivery.net/BXluQx4ige9GuW0Ia56BHw/bd831a9d-dc68-4de3-a4d8-5337e2e43100/rectcrop3","custody_address":"0x1819005a8e32b2ef3d0fec2f8e0d08517b401d29","profile":{"bio":{"text":""}},"follower_count":16,"following_count":8,"verifications":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"verified_addresses":{"eth_addresses":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"sol_addresses":["7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"],"primary":{"eth_address":"0x8e59886e4bd8b733df54c035d8fb33a982fb07dd","sol_address":"7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"}},"verified_accounts":[{"platform":"x","username":"truecastagent"}],"power_badge":false,"experimental":{"neynar_user_score":0.58,"deprecation_notice":"The `neynar_user_score` field under `experimental` will be deprecated after June 1, 2025, as it will be formally promoted to a stable field named `score` within the user object."},"score":0.58},"text":"Testing in prod"}}
-------------------
The cast "Testing in prod" has been successfully posted to Farcaster with the specified embeds. If you need anything else, feel free to ask!

Cast: https://farcaster.xyz/truecastagent/0x4f24e69e

Prompt: upload file base.png to twitter
-------------------
Successfully uploaded media to Twitter: 1948465451035422720
-------------------
The media has been successfully uploaded to Twitter with the media ID: `1948465451035422720`. Would you like to post a tweet with this media? If so, please provide the text for the tweet.
-------------------
Prompt: Post text "Testing in prod" with this media ID
-------------------
Successfully posted to Twitter:
{"data":{"edit_history_tweet_ids":["1948465523076821024"],"text":"Testing in prod https://t.co/AAYAcCW3gj","id":"1948465523076821024"}}
-------------------
The tweet "Testing in prod" has been successfully posted to Twitter! You can view it [here](https://twitter.com/i/web/status/1948465523076821024). If you need anything else, feel free to ask!
-------------------
Prompt: post again and use this media id twice -------------------
Successfully posted to Twitter:
{"data":{"text":"Testing in prod again https://t.co/ue1UiF2dlg","edit_history_tweet_ids":["1948465987025600547"],"id":"1948465987025600547"}}
-------------------
The tweet "Testing in prod again" has been successfully posted to Twitter using the media twice! You can view it [here](https://twitter.com/i/web/status/1948465987025600547). Let me know if you need anything else!

Posts:

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 Apr 15, 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 action provider New action provider typescript labels Apr 15, 2025
async postTweet(args: z.infer<typeof TwitterPostTweetSchema>): Promise<string> {
try {
const response = await this.client.v2.tweet(args.tweet);
let mediaOptions = {};

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 suggest updating the action's descriptions to mention the newly added mediaIds and how the agent should use them

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.

Good catch, done!

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

Hey @phdargen, this PR is looking good and I'm happy to get this in :)

Can you rebase against main first and address my one comment?
Then I'll do some testing and aim to get this in for this weeks release

@phdargen
phdargenforce-pushed the socials-ts branch 2 times, most recently from 9023d28 to 770df82CompareApril 30, 2025 14:45
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

@phdargen

Copy link
Copy Markdown
ContributorAuthor

Rebased and tested again, see recent posts above. Should be good to go @CarsonRoscoe

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

BTW, this error occurs when running with node v20. I think all the CDP v2 stuff requires v22, while all the READMEs still have node v18 as prerequisite

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

LGTM! Thank you for the contribution

@CarsonRoscoe
CarsonRoscoe merged commit ff02c51 into coinbase:mainJul 24, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerdocumentationImprovements or additions to documentationtypescript

Development

Successfully merging this pull request may close these issues.

3 participants

@phdargen@cb-heimdall@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:post embeds on Farcaster and media on Twitter (ts) - #675

Merged
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts
Jul 24, 2025
Merged

feat:post embeds on Farcaster and media on Twitter (ts)#675
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts

Conversation

@phdargen

@phdargenphdargen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

Description

Added media upload support for Twitter and embeds support for Farcaster

  • FarcasterActionProvider: post_cast actions takes new optional embeds URL as input
  • TwitterActionProvider:
    • new action to upload upload_media returns media_id
    • post_tweet/post_tweet_reply take new optional media_ids as input

Tests

Chatbot: typescript/examples/langchain-cdp-chatbot/chatbot.ts
Network: Base Sepolia
Prompt: farcaster post with text "Testing in prod" and embeds: "https://true-cast.vercel.app", "https://true-cast.vercel.app/trueCast.png"
-------------------
Successfully posted cast to Farcaster:
{"success":true,"cast":{"hash":"0x4f24e69ed1f51aaeb65e79b9968bd72742bd4899","author":{"object":"user","fid":1046472,"username":"truecastagent","display_name":"TrueCast","pfp_url":"https://imagedelivery.net/BXluQx4ige9GuW0Ia56BHw/bd831a9d-dc68-4de3-a4d8-5337e2e43100/rectcrop3","custody_address":"0x1819005a8e32b2ef3d0fec2f8e0d08517b401d29","profile":{"bio":{"text":""}},"follower_count":16,"following_count":8,"verifications":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"verified_addresses":{"eth_addresses":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"sol_addresses":["7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"],"primary":{"eth_address":"0x8e59886e4bd8b733df54c035d8fb33a982fb07dd","sol_address":"7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"}},"verified_accounts":[{"platform":"x","username":"truecastagent"}],"power_badge":false,"experimental":{"neynar_user_score":0.58,"deprecation_notice":"The `neynar_user_score` field under `experimental` will be deprecated after June 1, 2025, as it will be formally promoted to a stable field named `score` within the user object."},"score":0.58},"text":"Testing in prod"}}
-------------------
The cast "Testing in prod" has been successfully posted to Farcaster with the specified embeds. If you need anything else, feel free to ask!

Cast: https://farcaster.xyz/truecastagent/0x4f24e69e

Prompt: upload file base.png to twitter
-------------------
Successfully uploaded media to Twitter: 1948465451035422720
-------------------
The media has been successfully uploaded to Twitter with the media ID: `1948465451035422720`. Would you like to post a tweet with this media? If so, please provide the text for the tweet.
-------------------
Prompt: Post text "Testing in prod" with this media ID
-------------------
Successfully posted to Twitter:
{"data":{"edit_history_tweet_ids":["1948465523076821024"],"text":"Testing in prod https://t.co/AAYAcCW3gj","id":"1948465523076821024"}}
-------------------
The tweet "Testing in prod" has been successfully posted to Twitter! You can view it [here](https://twitter.com/i/web/status/1948465523076821024). If you need anything else, feel free to ask!
-------------------
Prompt: post again and use this media id twice -------------------
Successfully posted to Twitter:
{"data":{"text":"Testing in prod again https://t.co/ue1UiF2dlg","edit_history_tweet_ids":["1948465987025600547"],"id":"1948465987025600547"}}
-------------------
The tweet "Testing in prod again" has been successfully posted to Twitter using the media twice! You can view it [here](https://twitter.com/i/web/status/1948465987025600547). Let me know if you need anything else!

Posts:

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 Apr 15, 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 action provider New action provider typescript labels Apr 15, 2025
async postTweet(args: z.infer<typeof TwitterPostTweetSchema>): Promise<string> {
try {
const response = await this.client.v2.tweet(args.tweet);
let mediaOptions = {};

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 suggest updating the action's descriptions to mention the newly added mediaIds and how the agent should use them

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.

Good catch, done!

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

Hey @phdargen, this PR is looking good and I'm happy to get this in :)

Can you rebase against main first and address my one comment?
Then I'll do some testing and aim to get this in for this weeks release

@phdargen
phdargenforce-pushed the socials-ts branch 2 times, most recently from 9023d28 to 770df82CompareApril 30, 2025 14:45
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

@phdargen

Copy link
Copy Markdown
ContributorAuthor

Rebased and tested again, see recent posts above. Should be good to go @CarsonRoscoe

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

BTW, this error occurs when running with node v20. I think all the CDP v2 stuff requires v22, while all the READMEs still have node v18 as prerequisite

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

LGTM! Thank you for the contribution

@CarsonRoscoe
CarsonRoscoe merged commit ff02c51 into coinbase:mainJul 24, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerdocumentationImprovements or additions to documentationtypescript

Development

Successfully merging this pull request may close these issues.

3 participants

@phdargen@cb-heimdall@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:post embeds on Farcaster and media on Twitter (ts) - #675

Merged
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts
Jul 24, 2025
Merged

feat:post embeds on Farcaster and media on Twitter (ts)#675
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts

Conversation

@phdargen

@phdargenphdargen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

Description

Added media upload support for Twitter and embeds support for Farcaster

  • FarcasterActionProvider: post_cast actions takes new optional embeds URL as input
  • TwitterActionProvider:
    • new action to upload upload_media returns media_id
    • post_tweet/post_tweet_reply take new optional media_ids as input

Tests

Chatbot: typescript/examples/langchain-cdp-chatbot/chatbot.ts
Network: Base Sepolia
Prompt: farcaster post with text "Testing in prod" and embeds: "https://true-cast.vercel.app", "https://true-cast.vercel.app/trueCast.png"
-------------------
Successfully posted cast to Farcaster:
{"success":true,"cast":{"hash":"0x4f24e69ed1f51aaeb65e79b9968bd72742bd4899","author":{"object":"user","fid":1046472,"username":"truecastagent","display_name":"TrueCast","pfp_url":"https://imagedelivery.net/BXluQx4ige9GuW0Ia56BHw/bd831a9d-dc68-4de3-a4d8-5337e2e43100/rectcrop3","custody_address":"0x1819005a8e32b2ef3d0fec2f8e0d08517b401d29","profile":{"bio":{"text":""}},"follower_count":16,"following_count":8,"verifications":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"verified_addresses":{"eth_addresses":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"sol_addresses":["7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"],"primary":{"eth_address":"0x8e59886e4bd8b733df54c035d8fb33a982fb07dd","sol_address":"7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"}},"verified_accounts":[{"platform":"x","username":"truecastagent"}],"power_badge":false,"experimental":{"neynar_user_score":0.58,"deprecation_notice":"The `neynar_user_score` field under `experimental` will be deprecated after June 1, 2025, as it will be formally promoted to a stable field named `score` within the user object."},"score":0.58},"text":"Testing in prod"}}
-------------------
The cast "Testing in prod" has been successfully posted to Farcaster with the specified embeds. If you need anything else, feel free to ask!

Cast: https://farcaster.xyz/truecastagent/0x4f24e69e

Prompt: upload file base.png to twitter
-------------------
Successfully uploaded media to Twitter: 1948465451035422720
-------------------
The media has been successfully uploaded to Twitter with the media ID: `1948465451035422720`. Would you like to post a tweet with this media? If so, please provide the text for the tweet.
-------------------
Prompt: Post text "Testing in prod" with this media ID
-------------------
Successfully posted to Twitter:
{"data":{"edit_history_tweet_ids":["1948465523076821024"],"text":"Testing in prod https://t.co/AAYAcCW3gj","id":"1948465523076821024"}}
-------------------
The tweet "Testing in prod" has been successfully posted to Twitter! You can view it [here](https://twitter.com/i/web/status/1948465523076821024). If you need anything else, feel free to ask!
-------------------
Prompt: post again and use this media id twice -------------------
Successfully posted to Twitter:
{"data":{"text":"Testing in prod again https://t.co/ue1UiF2dlg","edit_history_tweet_ids":["1948465987025600547"],"id":"1948465987025600547"}}
-------------------
The tweet "Testing in prod again" has been successfully posted to Twitter using the media twice! You can view it [here](https://twitter.com/i/web/status/1948465987025600547). Let me know if you need anything else!

Posts:

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 Apr 15, 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 action provider New action provider typescript labels Apr 15, 2025
async postTweet(args: z.infer<typeof TwitterPostTweetSchema>): Promise<string> {
try {
const response = await this.client.v2.tweet(args.tweet);
let mediaOptions = {};

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 suggest updating the action's descriptions to mention the newly added mediaIds and how the agent should use them

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.

Good catch, done!

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

Hey @phdargen, this PR is looking good and I'm happy to get this in :)

Can you rebase against main first and address my one comment?
Then I'll do some testing and aim to get this in for this weeks release

@phdargen
phdargenforce-pushed the socials-ts branch 2 times, most recently from 9023d28 to 770df82CompareApril 30, 2025 14:45
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

@phdargen

Copy link
Copy Markdown
ContributorAuthor

Rebased and tested again, see recent posts above. Should be good to go @CarsonRoscoe

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

BTW, this error occurs when running with node v20. I think all the CDP v2 stuff requires v22, while all the READMEs still have node v18 as prerequisite

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

LGTM! Thank you for the contribution

@CarsonRoscoe
CarsonRoscoe merged commit ff02c51 into coinbase:mainJul 24, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerdocumentationImprovements or additions to documentationtypescript

Development

Successfully merging this pull request may close these issues.

3 participants

@phdargen@cb-heimdall@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:post embeds on Farcaster and media on Twitter (ts) - #675

Merged
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts
Jul 24, 2025
Merged

feat:post embeds on Farcaster and media on Twitter (ts)#675
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts

Conversation

@phdargen

@phdargenphdargen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

Description

Added media upload support for Twitter and embeds support for Farcaster

  • FarcasterActionProvider: post_cast actions takes new optional embeds URL as input
  • TwitterActionProvider:
    • new action to upload upload_media returns media_id
    • post_tweet/post_tweet_reply take new optional media_ids as input

Tests

Chatbot: typescript/examples/langchain-cdp-chatbot/chatbot.ts
Network: Base Sepolia
Prompt: farcaster post with text "Testing in prod" and embeds: "https://true-cast.vercel.app", "https://true-cast.vercel.app/trueCast.png"
-------------------
Successfully posted cast to Farcaster:
{"success":true,"cast":{"hash":"0x4f24e69ed1f51aaeb65e79b9968bd72742bd4899","author":{"object":"user","fid":1046472,"username":"truecastagent","display_name":"TrueCast","pfp_url":"https://imagedelivery.net/BXluQx4ige9GuW0Ia56BHw/bd831a9d-dc68-4de3-a4d8-5337e2e43100/rectcrop3","custody_address":"0x1819005a8e32b2ef3d0fec2f8e0d08517b401d29","profile":{"bio":{"text":""}},"follower_count":16,"following_count":8,"verifications":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"verified_addresses":{"eth_addresses":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"sol_addresses":["7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"],"primary":{"eth_address":"0x8e59886e4bd8b733df54c035d8fb33a982fb07dd","sol_address":"7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"}},"verified_accounts":[{"platform":"x","username":"truecastagent"}],"power_badge":false,"experimental":{"neynar_user_score":0.58,"deprecation_notice":"The `neynar_user_score` field under `experimental` will be deprecated after June 1, 2025, as it will be formally promoted to a stable field named `score` within the user object."},"score":0.58},"text":"Testing in prod"}}
-------------------
The cast "Testing in prod" has been successfully posted to Farcaster with the specified embeds. If you need anything else, feel free to ask!

Cast: https://farcaster.xyz/truecastagent/0x4f24e69e

Prompt: upload file base.png to twitter
-------------------
Successfully uploaded media to Twitter: 1948465451035422720
-------------------
The media has been successfully uploaded to Twitter with the media ID: `1948465451035422720`. Would you like to post a tweet with this media? If so, please provide the text for the tweet.
-------------------
Prompt: Post text "Testing in prod" with this media ID
-------------------
Successfully posted to Twitter:
{"data":{"edit_history_tweet_ids":["1948465523076821024"],"text":"Testing in prod https://t.co/AAYAcCW3gj","id":"1948465523076821024"}}
-------------------
The tweet "Testing in prod" has been successfully posted to Twitter! You can view it [here](https://twitter.com/i/web/status/1948465523076821024). If you need anything else, feel free to ask!
-------------------
Prompt: post again and use this media id twice -------------------
Successfully posted to Twitter:
{"data":{"text":"Testing in prod again https://t.co/ue1UiF2dlg","edit_history_tweet_ids":["1948465987025600547"],"id":"1948465987025600547"}}
-------------------
The tweet "Testing in prod again" has been successfully posted to Twitter using the media twice! You can view it [here](https://twitter.com/i/web/status/1948465987025600547). Let me know if you need anything else!

Posts:

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 Apr 15, 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 action provider New action provider typescript labels Apr 15, 2025
async postTweet(args: z.infer<typeof TwitterPostTweetSchema>): Promise<string> {
try {
const response = await this.client.v2.tweet(args.tweet);
let mediaOptions = {};

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 suggest updating the action's descriptions to mention the newly added mediaIds and how the agent should use them

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.

Good catch, done!

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

Hey @phdargen, this PR is looking good and I'm happy to get this in :)

Can you rebase against main first and address my one comment?
Then I'll do some testing and aim to get this in for this weeks release

@phdargen
phdargenforce-pushed the socials-ts branch 2 times, most recently from 9023d28 to 770df82CompareApril 30, 2025 14:45
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

@phdargen

Copy link
Copy Markdown
ContributorAuthor

Rebased and tested again, see recent posts above. Should be good to go @CarsonRoscoe

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

BTW, this error occurs when running with node v20. I think all the CDP v2 stuff requires v22, while all the READMEs still have node v18 as prerequisite

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

LGTM! Thank you for the contribution

@CarsonRoscoe
CarsonRoscoe merged commit ff02c51 into coinbase:mainJul 24, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerdocumentationImprovements or additions to documentationtypescript

Development

Successfully merging this pull request may close these issues.

3 participants

@phdargen@cb-heimdall@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:post embeds on Farcaster and media on Twitter (ts) - #675

Merged
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts
Jul 24, 2025
Merged

feat:post embeds on Farcaster and media on Twitter (ts)#675
CarsonRoscoe merged 2 commits into
coinbase:mainfrom
phdargen:socials-ts

Conversation

@phdargen

@phdargenphdargen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

Description

Added media upload support for Twitter and embeds support for Farcaster

  • FarcasterActionProvider: post_cast actions takes new optional embeds URL as input
  • TwitterActionProvider:
    • new action to upload upload_media returns media_id
    • post_tweet/post_tweet_reply take new optional media_ids as input

Tests

Chatbot: typescript/examples/langchain-cdp-chatbot/chatbot.ts
Network: Base Sepolia
Prompt: farcaster post with text "Testing in prod" and embeds: "https://true-cast.vercel.app", "https://true-cast.vercel.app/trueCast.png"
-------------------
Successfully posted cast to Farcaster:
{"success":true,"cast":{"hash":"0x4f24e69ed1f51aaeb65e79b9968bd72742bd4899","author":{"object":"user","fid":1046472,"username":"truecastagent","display_name":"TrueCast","pfp_url":"https://imagedelivery.net/BXluQx4ige9GuW0Ia56BHw/bd831a9d-dc68-4de3-a4d8-5337e2e43100/rectcrop3","custody_address":"0x1819005a8e32b2ef3d0fec2f8e0d08517b401d29","profile":{"bio":{"text":""}},"follower_count":16,"following_count":8,"verifications":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"verified_addresses":{"eth_addresses":["0x8e59886e4bd8b733df54c035d8fb33a982fb07dd"],"sol_addresses":["7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"],"primary":{"eth_address":"0x8e59886e4bd8b733df54c035d8fb33a982fb07dd","sol_address":"7FwxmJWVQvCTB1hdr4bTXrvMpdLu8Z58xmRybJkCwsJj"}},"verified_accounts":[{"platform":"x","username":"truecastagent"}],"power_badge":false,"experimental":{"neynar_user_score":0.58,"deprecation_notice":"The `neynar_user_score` field under `experimental` will be deprecated after June 1, 2025, as it will be formally promoted to a stable field named `score` within the user object."},"score":0.58},"text":"Testing in prod"}}
-------------------
The cast "Testing in prod" has been successfully posted to Farcaster with the specified embeds. If you need anything else, feel free to ask!

Cast: https://farcaster.xyz/truecastagent/0x4f24e69e

Prompt: upload file base.png to twitter
-------------------
Successfully uploaded media to Twitter: 1948465451035422720
-------------------
The media has been successfully uploaded to Twitter with the media ID: `1948465451035422720`. Would you like to post a tweet with this media? If so, please provide the text for the tweet.
-------------------
Prompt: Post text "Testing in prod" with this media ID
-------------------
Successfully posted to Twitter:
{"data":{"edit_history_tweet_ids":["1948465523076821024"],"text":"Testing in prod https://t.co/AAYAcCW3gj","id":"1948465523076821024"}}
-------------------
The tweet "Testing in prod" has been successfully posted to Twitter! You can view it [here](https://twitter.com/i/web/status/1948465523076821024). If you need anything else, feel free to ask!
-------------------
Prompt: post again and use this media id twice -------------------
Successfully posted to Twitter:
{"data":{"text":"Testing in prod again https://t.co/ue1UiF2dlg","edit_history_tweet_ids":["1948465987025600547"],"id":"1948465987025600547"}}
-------------------
The tweet "Testing in prod again" has been successfully posted to Twitter using the media twice! You can view it [here](https://twitter.com/i/web/status/1948465987025600547). Let me know if you need anything else!

Posts:

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 Apr 15, 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 action provider New action provider typescript labels Apr 15, 2025
async postTweet(args: z.infer<typeof TwitterPostTweetSchema>): Promise<string> {
try {
const response = await this.client.v2.tweet(args.tweet);
let mediaOptions = {};

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 suggest updating the action's descriptions to mention the newly added mediaIds and how the agent should use them

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.

Good catch, done!

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

Hey @phdargen, this PR is looking good and I'm happy to get this in :)

Can you rebase against main first and address my one comment?
Then I'll do some testing and aim to get this in for this weeks release

@phdargen
phdargenforce-pushed the socials-ts branch 2 times, most recently from 9023d28 to 770df82CompareApril 30, 2025 14:45
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

@phdargen

Copy link
Copy Markdown
ContributorAuthor

Rebased and tested again, see recent posts above. Should be good to go @CarsonRoscoe

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@CarsonRoscoe Rebased again bc of some changes to the twitter provider yesterday.

After rebasing I cant run the chatbots examples anymore. pnpm i && pnpm build and pnpm test work fine but getting the error below for the chatbot. I get the same error for a clean master checkout, so I don't think this is related to my PR. I suspect this might come from #678 that seems to do some hacks for "jose" in framework-extensions (eg https://github.com/coinbase/agentkit/blob/bc4e7be8a3ab0cc0c576b642b000bf71df0c06dd/typescript/framework-extensions/langchain/setup-jest.js), but not in chatbot.

langchain-cdp-chatbot % pnpm run start
@coinbase/cdp-langchain-chatbot-example@1.0.0 start /cdp-agentkit/typescript/examples/langchain-cdp-chatbot
NODE_OPTIONS='--no-warnings' ts-node ./chatbot.ts
/cdp-agentkit/typescript/node_modules/.pnpm/ts-node@10.9.2_@types+node@22.13.14_typescript@5.8.2/node_modules/ts-node/dist/index.js:851
return old(m, filename);
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /cdp-agentkit/typescript/node_modules/.pnpm/jose@6.0.10/node_modules/jose/dist/webapi/index.js from /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js not supported.
Instead change the require of index.js in /cdp-agentkit/typescript/node_modules/.pnpm/@coinbase+cdp-sdk@1.3.0_bufferutil@4.0.9_typescript@5.8.2_utf-8-validate@5.0.10_zod@3.24.2/node_modules/@coinbase/cdp-sdk/_cjs/auth/utils/jwt.js to a dynamic import() which is available in all CommonJS modules.

BTW, this error occurs when running with node v20. I think all the CDP v2 stuff requires v22, while all the READMEs still have node v18 as prerequisite

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

LGTM! Thank you for the contribution

@CarsonRoscoe
CarsonRoscoe merged commit ff02c51 into coinbase:mainJul 24, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerdocumentationImprovements or additions to documentationtypescript

Development

Successfully merging this pull request may close these issues.

3 participants

@phdargen@cb-heimdall@CarsonRoscoe