Trending

#strandsagents

Latest posts tagged with #strandsagents on Bluesky

Latest Top
Trending

Posts tagged #strandsagents

Preview
Anarchy, Assembly Lines, and Corporate Hierarchy: Benchmarking Multi-Agent Architectures for Medical Device Data My AI judge gave the anarchists a perfect score. I disagree. I built three multi-agent systems to...

✍️ New blog post by Martin Nanchev

Anarchy, Assembly Lines, and Corporate Hierarchy: Benchmarking Multi-Agent Architectures for Medical Device Data

#awscommunitybuilders #aws #strandsagents #ai

1 0 0 0
Preview
Stop AI Agent Hallucinations: 4 Essential Techniques 4 techniques to stop AI agent hallucinations: Graph-RAG for precise data retrieval, semantic tool...

🚀📝 Stop AI Agent Hallucinations: 4 Essential Techniques

#GraphRAG #SemanticToolSelection #NeurosymbolicGuardrails #MultiAgentValidation #StrandsAgents

0 0 0 0
Preview
TIL: Strands Agents Has Built-In Session Persistence The Strands Agents SDK has a built-in persistence layer for conversation history - just pass a SessionManager to the Agent constructor.

🚀📝 TIL: Strands Agents Has Built-In Session Persistence

#StrandsAgents #SessionPersistence #ConversationHistory #AIbackends #PythonSDK

0 0 0 0
Preview
Strands Multi-Agent Systems: Graph In my last post I covered the Swarm pattern and how multiple specialized agents can collaborate...

🚀📝 Strands Multi-Agent Systems: Graph

#multiagent #graph #strandsagents #ai #collaboration

1 0 0 0
Post image

Next week - Wed 8 Oct London.
🎙️ @danilop.bsky.social - From Prototype to Production with #StrandsAgents & #AmazonBedrock #AgentCore.
🎙️Diana Ionita - My #AI Coding Partner: Building the London Improv Calendar on #AWS
www.meetup.com/awsuguk-ai-i...
#AWSCommunity #Serverless #DynamoDB #APIGateway

3 4 0 0
Preview
StrandsAgents+AgentCore Memory で私好みのエージェントを実現する - Taste of Tech Topics こんにちは、YAMALEXの駿です。 昨今、対話型AIの活用が進む中で、ユーザーごとにパーソナライズされた体験を提供することが、より重要になっています。 単なる一問一答ではなく、「ユーザーが誰で、どんな関心や目的を持っているか」を理解したうえで応答できるエージェントが求められています。 本記事では、Strands AgentsとBedrock AgentCoreを組み合わせて、ユーザーとの対話履歴...

📝ブログ更新
「StrandsAgents+AgentCore Memory で私好みのエージェントを実現する」

ユーザーの嗜好を記憶して応答できるエージェントを実装&検証しました。
パーソナライズの鍵は「Memory」にあり!

詳細はこちら👇
acro-engineer.hatenablog.com/entry/2025/0...
#AI #Agent #Bedrock #StrandsAgents #パーソナライズ

0 0 0 0
Preview
AWS Weekly Roundup: Strands Agents 1M+ downloads, Cloud Club Captain, AI Agent Hackathon, and more (September 15, 2025) | Amazon Web Services Last week, Strands Agents, AWS open source for agentic AI SDK just hit 1 million downloads and earned 3,000+ GitHub Stars less than 4 months since launching as a preview in May 2025. With Strands Agents,...

📰🚨 AWS Weekly Roundup: Strands Agents 1M+ downloads, Cloud Club Captain, AI Agent Hackathon, and more (September 15, 2025)

#StrandsAgents #AgenticAI #AWSOpenSource #TechInnovation #AICommunity

0 0 0 0
Preview
Building Production-Ready AI Agents with Strands Agents and Amazon Bedrock AgentCore In this first deep dive of our multi-framework series, I'll show you how to build a production-ready...

🚀📝 Building Production-Ready AI Agents with Strands Agents and Amazon Bedrock AgentCore

#AI #MachineLearning #AmazonBedrock #StrandsAgents #AgentCore

2 0 0 0
Post image

8 Oct, London - #AWS AI In Practice: From prototype → production with AI agents. Danilo Poccia on #StrandsAgents + #AmazonBedrock #AgentCore: secure sessions, memory, identity, observability. www.meetup.com/awsuguk-ai-i...
#AWSCloud #AWSCommunity

2 2 0 0
Preview
StrandsAgents + Claude インターリーブ思考でDeepResearchを実現する - Taste of Tech Topics こんにちは、YAMALEXの駿です。 最近はStrandsAgentsとStrandsAgents Toolsを組み合わせていろいろなエージェントを作るのにはまっています。 今回は StrandsAgents と Claude 4 のインターリーブ思考 を組み合わせ、マルチエージェントなし で Deep Research 相当の調査レポートを生成する手法を紹介します。 1. はじめに 1.1. D...

🔥 AIエージェント技術の革新!

StrandsAgents + Claude インターリーブ思考で、複雑なマルチエージェント構成なしにDeepResearch相当を実現

✅ たった70行のコード
✅ 情報欠落・ハルシネーション大幅削減
✅ 実用レベルの品質確認済み

従来の複雑な実装が不要になる画期的なアプローチを詳しく解説しました👇
acro-engineer.hatenablog.com/entry/2025/0...

#AI #エージェント #DeepResearch #Claude #StrandsAgents

2 0 0 0
Preview
2025 AI Conference Hack Day in San Francisco · Luma Join us for The AI Conference 2025 Hack Day. Join other builders in the industry to hack on the hottest tech to bring AI into production. Here's what you can…

AI Conference Hack Day in San Francisco :)
#weaviate #StrandsAgents and #Neo4j bringing AI into production - join!

September 16 from 10 to 7pm!


https://lu.ma/ai-conference-hack-day-2025

0 0 0 0
Preview
Building Strands Agents with a few lines of code: Observability and with Langfuse 🇻🇪🇨🇱 Dev.to Linkedin GitHub Twitter Instagram Youtube Linktr ...

🚀📝 Building Strands Agents with a few lines of code: Observability and with Langfuse

#Observability #AIagents #LangFuse #AWS #StrandsAgents

0 0 0 0
Preview
Construyendo Strands Agents con Pocas Líneas de Código: Tools Personalizadas e Integración MCP 🔗 Repositorio en GitHub Descubre cómo crear agentes que pueden interactuar con tu entorno de...

📢🚨Nuevo blog #AWSEspanol en #devto: Construyendo Strands Agents con Pocas Líneas de Código: Tools Personalizadas e Integración MCP

#StrandsAgents #AIDevelopment #OpenSource #MachineLearning #MCPProtocol

2 1 0 0
Preview
Building Strands Agents with a few lines of code: Custom Tools and MCP Integration 🇻🇪🇨🇱 Dev.to Linkedin GitHub Twitter Instagram Youtube Linktr ...

🚀📝 Building Strands Agents with a few lines of code: Custom Tools and MCP Integration

#StrandsAgents #AWSDeveloper #MachineLearning #DevCommunity #MCP

1 0 0 0
Preview
Procesamiento de Contenido Multimodal con Strands Agent y solo unas pocas líneas de código 🇻🇪🇨🇱 Dev.to Linkedin GitHub Twitter Instagram Youtube Linktr ...

📢🚨Nuevo blog #AWSEspanol en #devto: Procesamiento de Contenido Multimodal con Strands Agent y solo unas pocas líneas de código

#strandsagents #multimodalAI #AWS #deeplearning #AItools

1 0 0 0
Preview
Multi-Modal Content Processing with Strands Agent and just a few lines of code 🇻🇪🇨🇱 Dev.to Linkedin GitHub Twitter Instagram Youtube Linktr ...

🚀📝 Multi-Modal Content Processing with Strands Agent and just a few lines of code

#StrandsAgents #MultiModalAI #AWSDeveloper #TechInnovation #AICommunity

0 0 0 0
Preview
Using Strands Agents with Anthropic 🧬 It's been a few weeks since I talked about using Strands Agents for the first time and I wanted to...

🚀📝 Using Strands Agents with Anthropic 🧬

#StrandsAgents #Anthropic #AWS #AIExperimentation #TechnologyTrends

1 0 0 0
Preview
Agent-to-Agent AI Integration: AWS Security Analysis with AI21 Maestro & Strands Agents Introduction The future of enterprise AI isn't just about more powerful models—it's about...

✍️ New blog post by Vivek V.

Agent-to-Agent AI Integration: AWS Security Analysis with AI21 Maestro & Strands Agents

#ai21labs #ai #amazonnova #strandsagents

0 0 0 0
Preview
I built a city explorer using the Strands Agents SDK Recently, AWS announced the release of Strands Agents, an open source SDK that takes a model-driven...

🚀📝 I built a city explorer using the Strands Agents SDK

#StrandsAgents #OpenSourceAI #AWS #AIdevelopment #CityExplorer

1 0 0 0
Preview
First Impressions with Strands Agents SDK 🧬 It's been exactly 3 months since I last wrote about agents and the industry has certainly made leaps...

🚀📝 First Impressions with Strands Agents SDK 🧬

#StrandsAgents #AI #OpenSource #CloudComputing #PythonDevelopment

4 0 1 0

Can it be run efficiently with multi-task agents?
What is the minimum TOPS - Quant int8 that it can run on?
Can it be made to, in under 6TOPS?
#ASYNC #Agentic #AIAgentic #MCP #n8n #Dart #innovation

#StrandsAgents

0 0 1 1

Relation to:
#AgenticAI #AI #AGI #Superintelligence #SGI #Frameworks #RoleAI #MCP #MCPServer #server #AI #AIAgents #Agentic #Google #MultiAgentic #Agentic #Topologies #Framework #AWS #StrandsAgents #OpenSource #Dev #SDK #N8N #Dart #Python #github #git #Antrhopics #OpenAI

3 1 1 0
Preview
Introducing Strands Agents, an Open Source AI Agents SDK | Amazon Web Services Today I am happy to announce we are releasing Strands Agents. Strands Agents is an open source SDK that takes a model-driven approach to building and running AI agents in just a few lines of code. Str...

Amazon's #AWS #AgenticAI offering is #StrandsAgents #OpenSource #SDK

aws.amazon.com/blogs/openso...

2 0 0 0
Preview
Auto-Generating Clips for Social Media from Live Streams with the Strands Agents SDK Generative AI is excellent at analyzing large amounts of data and identifying and summarizing a...

🚀📝 Auto-Generating Clips for Social Media from Live Streams with the Strands Agents SDK

#GenerativeAI #VideoAnalysis #ClipCreation #ContentAutomation #StrandsAgents

0 0 0 0
Preview
Auto-Generating Clips for Social Media from Live Streams with the Strands Agents SDK Generative AI is excellent at analyzing large amounts of data and identifying and summarizing a meaningful subset of the data based on a guided set of instructions. The source of the data could be anything - your email inbox, a large text file on your machine or a webpage on the internet. It's not perfect, but it can give you a head start on large tasks that involve a lot of data. One of the things I get asked about a lot by developers is how they can use AI to analyze video content. Multimodal LLMs have come a long way, but they're not quite at the point where they could ingest an hour's worth of video from a live stream and provide a summary or identify potential clips for sharing on social media. But there's another approach that we can take to solve this problem. ## Solution Overview In order to create a tool to analyze a video-on-demand (VOD) from a live stream, I settled on the following approach. 1. Download/convert the HLS media to a local MP4 2. Transcribe the MP4 3. Ask an AI agent to identify start/end timestamps for potential clips based on the transcript 4. Create MP4 'clips' based on the identified timestamps 5. Summarize the work ## Solution Architecture To accomplish this task, I decided to try out the new Strands Agents SDK. It's a fairly new framework for building agents that has a simple way to define tools that the agent can use to assist in responding to prompts. For this solution, we'll need FFMPEG and Whisper installed on the machine where the agent runs. I'll be working locally, but this could easily be converted to a server-based solution using FastAPI or another web framework and deployed to the cloud in a Docker/Podman container. ## Defining Tools I won't cover how to get started with Strands Agents since the docs do a great job of that. Instead, we'll walk through this demo and see how it works. Of course we start with a fresh virtual environment. python -m venv .venv source .venv/bin/activate Next we'll need to install our dependencies. Place the following in `requirements.txt`: ffmpeg-python git+https://github.com/openai/whisper.git strands-agents strands-agents-tools click And install the dependencies with: pip install -r requirements.txt Next, in `agent.py`, we'll define our imports. import os import ffmpeg import tempfile import uuid import shutil import whisper import click from whisper.utils import get_writer from strands import Agent, tool from strands_tools import ( file_read, file_write, use_aws, ) Create a temp working directory and some variables for our temp files. temp_dir = tempfile.mkdtemp() mp4_file = f"{uuid.uuid4()}.mp4" mp4_path = os.path.join(temp_dir, mp4_file) transcript_file = f"{uuid.uuid4()}.vtt" transcript_path = os.path.join(temp_dir, transcript_file) Now we can start defining the tools that our agent will need to complete the task. For this we use the `@tool` decorator. The first tool will take the `m3u8` URL for the HLS playlist and download it as an `mp4` with FFMPEG. @tool def convert_m3u8_to_mp4(path_to_m3u8: str): stream = ffmpeg.input(path_to_m3u8) stream = ffmpeg.output( stream, mp4_path, acodec="copy", vcodec="copy", crf=50, **{"bsf:a": "aac_adtstoasc"}, loglevel=("verbose" if verbose else "quiet"), ) ffmpeg.run(stream, overwrite_output=True) print(f"Saved stream to {mp4_path}") The next tool will transcribe the MP4 with Whisper. @tool def transcribe_mp4(): print(f"Transcribing {mp4_path} to {transcript_file}") model = whisper.load_model("base") result = model.transcribe(mp4_path, verbose=verbose) vtt_writer = get_writer("vtt", temp_dir) vtt_writer(result, transcript_file) print(f"Transcribe complete") And finally, a tool that will take the start/end timestamps that the agent identifies and generate a new clip from the original `mp4` at the given start/end time. @tool def create_mp4_clip( input_file: str, start_time: str, end_time: str, output_file: str, ): """clip an mp4 using ffmpeg""" stream = ffmpeg.input(input_file, ss=start_time, to=end_time) stream = ffmpeg.output( stream, output_file, c="copy", loglevel=("verbose" if verbose else "quiet"), ) ffmpeg.run(stream, overwrite_output=True) ## Prompting the Agent Now that our tools are defined, we can create an instance of the agent. Here we are passing our custom tools, as well as some built-in tools like `file_read`, `file_write` and `use_aws` that the agent can use as necessary. agent = Agent( tools=[ create_mp4_clip, convert_m3u8_to_mp4, transcribe_mp4, file_read, file_write, use_aws, ], ) We'll prompt the user to ask if they'd like to run in `verbose` mode (which will provide STDIO output from FFMPEG and Whisper) and ask them to provide the `m3u8` (HLS playlist) URL. verbose = click.confirm("Enable verbose output?", default=False) m3u8_url = click.prompt("Enter M3U8 URL", type=str) And now we can pass a prompt to the agent. agent( f""" your purpose is to generate small clips from a larger live stream so that they can be shared on social media. your task involves the following steps: 1. download the HLS segments and convert them to an MP4 file 2. transcribe the downloaded MP4 using whisper 3. analyze the transcript to identify potential clips 4. create the clips 5. provide a summary of your work here are some details: Step 1: using the tool `convert_m3u8_to_mp4`: given the HLS manifest file located at {m3u8_url}, convert the live stream to an MP4 and save it to {mp4_path}. Step 2: using the tool `transcribe_mp4`: transcribe the MP4 and save the transcript to {transcript_path}. this will produce a timestamped transcript from the live stream. Step 3: take a look at the transcript and identify a list of suggested timestamps (start and end) for clips that might be good to share on social media. provide a suggested title, the start and end timestamp, the transcript in that section, a summary/description and several tags. Step 4: using the tool `create_mp4_clip`: after you have identified them, create an mp4 for each based on the timestamp identified. use the original mp4 that was created in the first step that is located at {mp4_path}. each output file should use a kebab case mp4 filename generated from your suggested title. save the new clips in {temp_dir}. do not cleanup the temp directory at this time, even though you have a tool that can perform this step. Step 5: provide a summary of your work, in the summary, output the following information for each clip: - Title - Start Time - End Time - Transcript - Summary - Tags - File Location of Clip """ ) ## Running the Application When we run the application using `python agent.py` we'll be prompted to toggle verbose mode and provide the URL. Enable verbose output? [y/N]: Enter M3U8 URL: I decided to test the agent out with a recent live stream from my friend Darko Mesaroš. I'll help you generate small clips from the larger live stream following the steps you've outlined. Let's begin: ## Step 1: Download the HLS segments and convert them to an MP4 file First, I'll convert the HLS manifest file to an MP4. Tool #1: convert_m3u8_to_mp4 Saved stream to /[redacted]/0a464c96-e071-4300-83d7-a74eeee82e28.mp4 Looks good - the MP4 file was generated as expected based on our prompt. ## Step 2: Transcribe the MP4 file Now, I'll transcribe the downloaded MP4 file: Tool #3: transcribe_mp4 Transcribing /[redacted]/0a464c96-e071-4300-83d7-a74eeee82e28.mp4 to 55c5f5f6-85ed-46d4-80f9-d455f6c51fcb.vtt /[redacted]/transcribe.py:132: UserWarning: FP16 is not supported on CPU; using FP32 instead warnings.warn("FP16 is not supported on CPU; using FP32 instead") Detected language: English Transcribe complete And the transcript was generated! Now it should analyze the transcript to identify some clips. ## Step 3: Analyze the transcript to identify potential clips Based on the transcript, I'll identify several potential clips that could be good to share on social media. These will be moments that are engaging, informative, or entertaining. ### Clip 1: Stream Introduction and Technical Difficulties **Title:** "Starting a Creative Coding Stream with Rust" **Start Time:** 01:26.580 **End Time:** 02:12.220 **Transcript:** "NOW! We're live. Yes. Okay. Now there's audio. There's audio. Okay. I was like, ah, um, so last moment I had to cut off my, um, what is it called? My, uh, my audio. Not only my whole Thunderbolt docked here because it just froze. So lost all my audio and everything else as I went along. So how do you, how do we, Jay? How are you doing my friend? It has been way too long. So I hope you're doing good. Um, welcome to the show. Welcome. Welcome. It has been actually, um, actually even a good old while for myself in the terms of live streaming. I think I have a stream for like 20 days. So incredibly happy to be back. So yeah, let's do some live streaming." **Summary:** The streamer begins their first live stream in 20 days, explaining how they had technical difficulties with their audio setup when trying to start the stream. Despite the challenges, they're enthusiastic about being back and connecting with viewers. **Tags:** #RustDevelopment #LiveCoding #StreamingTech #CreativeCoding #TechnicalDifficulties ### Clip 2: Introducing GGEZ - A Rust Game Engine **Title:** "What is GGEZ? A Rust Game Engine for Creative Coding" **Start Time:** 02:30.860 **End Time:** 03:29.820 **Transcript:** "Um, okay. So the plan for today, my friends, is to do some stuff with, well, as always, Rust. So I'm going to do some creative coding today. Something with, um, um, Rust and a, and a framework I was using over the last few days called, GGE. It is a, I think they call themselves like a rust game engine thing. Like not terribly serious. It's not a full blown game engine. Um, it's a, it's a thing and it kind of does graphics. It is very similar to like P5JS, which is a very much, uh, an artistic type of coding framework, which I used in the past stream a long time ago. And, and of course, P5JS comes from processing. If anybody knows what processing is, um, so processing is an old framework. I think it uses its own bespoke language to do like graphics and like stuff. So, um, that's the whole plan today to do a little bit of that. Um, and have some fun." **Summary:** The streamer introduces GGEZ, a Rust game engine framework they'll be using for creative coding. They explain how it's similar to P5JS and Processing, highlighting that it's not a full game engine but a tool for making graphics and creative coding projects. **Tags:** #RustProgramming #GGEZ #GameDevelopment #CreativeCoding #GraphicsProgramming ### Clip 3: Drawing Fire - Creative Coding Goal **Title:** "Let's Draw Fire with Rust: My Creative Coding Challenge" **Start Time:** 06:03.980 **End Time:** 07:09.740 **Transcript:** "So what, why would I like to do is I would love to do some creative coding, but in Rust. So, so that's the plan for today. Do a little bit of that. Um, there's no certain point to today. Like, in a sense, like we're not building up to, we're going to share. We're going to try to draw some pixels on the screen. We're not going to go too crazy and be like S.D.L type of approach. And I'm like, just super complicated. We're going to just do, um, squares and circles and whatnot. So, um, I want to try to draw flames. This is one of my, one of my tests when I draw this, these kinds of, when I work with these, a kind of artistic tools is like, can I draw fire, right? A C doughnut. Is, is a C doughnut, so. I know a C, oh, oh, wow. This would be a, I mean, probably at one point, I'm not as good as, as being able to do something like this. I know this whole thing code that actually is shaped like doughnut and it's just math. I'm not as good as math in this, but, um, yeah, yeah, yeah. We're going to try to draw some flames just simple as that. And I've done that in the past in Lua, but I want to try to do a Darwin rust. And I want to use this GGZ to set it up." **Summary:** The streamer explains their goal for the creative coding session: to draw flames using Rust and GGEZ. They mention this as their go-to test when trying out new creative coding frameworks, comparing it to the famous "donut" code visualization but clarifying they'll stick to something simpler that they've previously implemented in Lua. **Tags:** #RustCreativeCoding #DigitalArt #FlameSimulation #CreativeTech #VisualProgramming ### Clip 4: Setting Up GGEZ Fundamentals **Title:** "How GGEZ Works: The Core Architecture of a Rust Game Engine" **Start Time:** 12:46.140 **End Time:** 13:21.340 **Transcript:** "So the way this works is that, um, your application has, um, basically a state, a main state where it kind of keeps stuff between frames. And, um, it has specific events on that state. That means as your application runs, there is a draw event, and there's an update event. And within those two events, you can do certain things. Now, of course, in the draw event, you draw on the screen, and the update event, you update whatever you're doing. And those are the two, two main important things we're going to be creating. And GGZ requires you to do it in a specific way." **Summary:** The streamer explains the fundamental architecture of GGEZ, detailing how the game loop works with a main state that maintains data between frames, and the two key events - draw and update - that form the backbone of any GGEZ application. **Tags:** #GameDevelopment #RustProgramming #GameLoop #GGEZ #GraphicsProgramming That's a lot of output, but it's done exactly what we wanted. It analyzed the 20 minute stream that I provided and identified 4 clips that would be "engaging, informative, or entertaining". Based on the summary, I think it does a really good job at finding small clips of the larger stream that would be good for sharing on social media. The next step is to generate the `mp4` files. Now I'll create MP4 clips for each of the identified segments: Tool #6: create_mp4_clip Tool #7: create_mp4_clip Tool #8: create_mp4_clip Tool #9: create_mp4_clip Finally, the agent summarizes all of the work ## Step 5: Summary of Work ### Clip 1: Starting a Creative Coding Stream with Rust - **Title:** Starting a Creative Coding Stream with Rust - **Start Time:** 00:01:26.580 - **End Time:** 00:02:12.220 - **Transcript:** "NOW! We're live. Yes. Okay. Now there's audio. There's audio. Okay. I was like, ah, um, so last moment I had to cut off my, um, what is it called? My, uh, my audio. Not only my whole Thunderbolt docked here because it just froze. So lost all my audio and everything else as I went along. So how do you, how do we, Jay? How are you doing my friend? It has been way too long. So I hope you're doing good. Um, welcome to the show. Welcome. Welcome. It has been actually, um, actually even a good old while for myself in the terms of live streaming. I think I have a stream for like 20 days. So incredibly happy to be back. So yeah, let's do some live streaming." - **Summary:** The streamer begins their first live stream in 20 days, explaining how they had technical difficulties with their audio setup when trying to start the stream. Despite the challenges, they're enthusiastic about being back and connecting with viewers. - **Tags:** #RustDevelopment #LiveCoding #StreamingTech #CreativeCoding #TechnicalDifficulties - **File Location:** /[redacted]/starting-a-creative-coding-stream-with-rust.mp4 [trimmed for brevity] Here's an example of one of the clips that our agent generated for us from the longer live stream. ## Enhancing the Agent If we wanted to, we could prompt the agent to upload the resulting `mp4` files to an S3 bucket. If we did that, we might want to also create a tool that cleans up the temp files that were generated during the process. There's no limit to the amount of tools we can create to enhance the agent. What kind of enhancements would you want to see with this social clip generating agent? How are you using the Strands Agents framework? Let me know in the comments. Photo by Sangharsh Lohakare on Unsplash
0 0 0 0
Preview
How I Built a Serverless Agentic AI Meme Generator for WhatsApp ## Background So there I was, half awake at 6 AM, when my phone buzzed for the third time. Another "Good Morning" meme on the family WhatsApp group. You know the ones - sunrises, flowers, and inspirational quotes that somehow always manage to use Comic Sans. After the initial grumbling (and coffee), I got curious. How exactly does Aunt Linda find a new "Rise and Shine" image _every single day_? Is there some secret repository of morning memes I don't know about? Or does she wake up at 6 AM just to forward these good morning memes or send those Happy Birthday or Anniversary messages? That's when it hit me - what if I could build an AI that automatically generates and sends these memes? Not only would it be a fun project, but I could also secretly become the most consistent "good morning" or "Happy Birthday" messenger in the family group chat without actually waking up early. Win-win! ## The Birth of the Agentic Meme Generator I decided to leverage Amazon Bedrock's AI capabilities and the Strands Agents SDK to create a fully autonomous meme generation system. The goal was simple: Build something that could 1. Come up with creative meme ideas 2. Generate custom images 3. Add text overlays 4. Send them automatically via WhatsApp But I wanted to go beyond just a simple script. I wanted to create an _agentic_ system - one that could make creative decisions on its own and adapt to different themes and requirements. ## What Makes It "Agentic"? Traditional automation follows rigid, predefined steps. An agentic system, on the other hand, uses AI to make decisions and adapt its approach based on the task at hand. Using the Strands Agents framework, I defined a set of "tools" that the AI agent could use: agent = Agent( model=bedrock_model, tools=[ generate_meme_content, generate_image_prompt, generate_image_with_nova, add_text_to_image, upload_to_s3, send_whatsapp_message ], system_prompt="""You are a creative assistant specialized in generating and sending good morning memes...""" ) Instead of hardcoding the exact steps, I let the agent decide how to combine these tools to achieve the goal. This gives it the flexibility to handle different themes (like standard funny memes or religious inspirational ones) and adapt to any errors or unexpected situations. ## Dynamic Content Generation The most challenging part was ensuring the memes were actually funny and varied. Nobody wants to see the same "Monday coffee" joke every week. I solved this by prompting the Amazon Nova model to combine multiple random elements for unique compositions: @tool def generate_meme_content(theme: str = "standard") -> str: # Create prompt based on theme if theme == "religious": prompt = """Generate content for a religious good morning meme...""" else: prompt = """Generate content for a funny good morning meme that COMBINES MULTIPLE ELEMENTS like: - sloth wearing a business suit late for work - llama as a yoga instructor - T-Rex trying to make a bed with tiny arms - robot attempting to understand the concept of sleep - raccoon organizing a breakfast buffet ... """ This approach produces delightfully absurd combinations like "a dragon trying to blow out birthday candles while a raccoon organizes a breakfast buffet in the background" - much more interesting than the standard "need coffee" memes! ## Deploying the schedule-based Serverless Strands Agent on AWS Lambda with CDK, EventBridge and Docker To make this system truly automated, I deployed it as a serverless application using AWS Lambda and the AWS CDK. This way, it can run on a schedule or be triggered via an AWS CLI command (sample provided below). I initially used a simple Lambda deployment, but recently upgraded to a container-based approach for better dependency management and consistency. The CDK made this deployment super easy: export class AgenticMemeGeneratorStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Create S3 bucket for storing generated memes const memeBucket = new s3.Bucket(this, 'MemeBucket', { removalPolicy: cdk.RemovalPolicy.DESTROY, autoDeleteObjects: true, publicReadAccess: false, blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL, }); // Create ECR repository const memeRepository = new ecr.Repository(this, 'MemeGeneratorRepo', { repositoryName: 'agentic-meme-generator', removalPolicy: cdk.RemovalPolicy.DESTROY, emptyOnDelete: true }); // Build Docker image from local assets const dockerImageAsset = new ecr_assets.DockerImageAsset(this, 'MemeGeneratorImage', { directory: path.join(__dirname, '..'), platform: ecr_assets.Platform.LINUX_AMD64, buildArgs: { TWILIO_ACCOUNT_SID: process.env.TWILIO_ACCOUNT_SID || '', TWILIO_AUTH_TOKEN: process.env.TWILIO_AUTH_TOKEN || '', BEDROCK_WHATSAPP_TO: process.env.BEDROCK_WHATSAPP_TO || '', } }); // Deploy the Docker image to ECR const deploy = new ecr_deployment.ECRDeployment(this, 'DeployDockerImage', { src: new ecr_deployment.DockerImageName(dockerImageAsset.imageUri), dest: new ecr_deployment.DockerImageName(memeRepository.repositoryUri + ':latest'), }); // Create Lambda function using the ECR image with a fixed name const memeGeneratorLambda = new lambda.DockerImageFunction(this, 'MemeGenerator', { functionName: 'AgenticMemeGenerator', code: lambda.DockerImageCode.fromEcr(memeRepository, { tagOrDigest: 'latest', }), timeout: cdk.Duration.seconds(300), // 5 minutes memorySize: 1024, environment: { S3_BUCKET_NAME: memeBucket.bucketName, TWILIO_ACCOUNT_SID: process.env.TWILIO_ACCOUNT_SID || '', TWILIO_AUTH_TOKEN: process.env.TWILIO_AUTH_TOKEN || '', BEDROCK_WHATSAPP_TO: process.env.BEDROCK_WHATSAPP_TO || '', }, }); memeGeneratorLambda.node.addDependency(deploy) // Grant Lambda permissions to use Bedrock memeGeneratorLambda.addToRolePolicy( new iam.PolicyStatement({ actions: [ 'bedrock:InvokeModel', 'bedrock:InvokeModelWithResponseStream' ], resources: ['*'], }) ); // Grant Lambda permissions to write to S3 bucket memeBucket.grantReadWrite(memeGeneratorLambda); // No API Gateway - using EventBridge scheduled events only // Create daily scheduled event (8:00 AM EST/EDT) const dailySchedule = new events.Rule(this, 'DailyMemeSchedule', { schedule: events.Schedule.cron({ minute: '0', hour: '13', // 8:00 AM EST is 13:00 UTC (accounting for standard time) month: '*', weekDay: '*', year: '*', }), }); // Add Lambda as target for the scheduled event dailySchedule.addTarget( new targets.LambdaFunction(memeGeneratorLambda, { event: events.RuleTargetInput.fromObject({ body: JSON.stringify({ theme: 'standard' }), }), }) ); } } For running the Lambda, I use container-based automated deployment using the `cdk-ecr-deployment` package. This approach offers several advantages: 1. **Consistent environments** : The Docker container ensures the same environment in development and production 2. **Simplified dependency management** : All dependencies are packaged in the container image 3. **Better isolation** : Container-based functions have more predictable behavior 4. **Easier updates** : I can update the container image without redeploying the entire stack 5. **Long-running processes** : Container-based Lambda functions can handle the processing time needed for AI image generation (90+ seconds) The Dockerfile below is very straightforward and the image is built during the cdk deployment process and pushed to ECR repository and used by the Lambda Function code. FROM public.ecr.aws/lambda/python:3.10 # Define build arguments for environment variables ARG TWILIO_ACCOUNT_SID ARG TWILIO_AUTH_TOKEN ARG BEDROCK_WHATSAPP_TO # Set environment variables from build args ENV TWILIO_ACCOUNT_SID=${TWILIO_ACCOUNT_SID} ENV TWILIO_AUTH_TOKEN=${TWILIO_AUTH_TOKEN} ENV BEDROCK_WHATSAPP_TO=${BEDROCK_WHATSAPP_TO} # Copy requirements file COPY lambda/requirements.txt ${LAMBDA_TASK_ROOT} # Install dependencies RUN pip install --upgrade pip && \ pip install -r ${LAMBDA_TASK_ROOT}/requirements.txt # Copy function code COPY lambda/lambda_function.py ${LAMBDA_TASK_ROOT} # Set the CMD to your handler CMD [ "lambda_function.lambda_handler" ] I also use EventBridge for scheduled triggers and avoid API Gateway in my solution, due to the 29-second timeout limit with API Gateway (although it can be increased now), and given that my meme generation process takes about ~90 seconds to complete. ## The Results After deploying the system, I started receiving some truly unique good morning memes. Some of my favorites include: * A sloth wearing a business suit riding a roomba while holding a coffee mug that says "I literally can't even" * A confused alien reading a human sleep manual with alarm clocks flying everywhere in the background * A T-Rex trying to make a bed with its tiny arms while a calendar that's somehow on fire burns in the background The religious-themed memes are equally impressive, with beautiful scenes like: * A shepherd tending sheep on a hillside while angels appear in the clouds above * A dove carrying an olive branch flying over Noah's Ark with a rainbow forming in the background * A wooden manger under the Star of Bethlehem with rays of divine light shining down ## Lessons Learned Building this project taught me several valuable lessons: 1. **Agentic AI is powerful** : By giving the AI agent a set of tools and letting it decide how to use them, I created a system that's more flexible and creative than a traditional script with absolutely no hardcoding or steps added. Just let the Agent do the handling of the flow of data between the tools or steps. 2. **Randomness is key for creativity** : Adding random elements and variations to the prompts ensures the memes stay fresh and interesting. 3. **Amazon Bedrock makes AI accessible** : The combination of Amazon Nova Premier for text generation and Amazon Nova Canvas for image creation made it easy to build a complete AI solution without managing complex ML infrastructure. 4. **Serverless is perfect for this use case** : Since meme generation only happens once a day, Lambda is ideal - I only pay for the few seconds of compute time I actually use (negligible for Lambda) and for the Bedrock Models usage (PS: I have active AWS credits from various AWS programs, so it doesnt charge me to use Amazon Nova Models. Check the Amazon Nova Pricing if trying this on your own AWS account, and make sure in the Bedrock console to enable the model access to Amazon Nova models in your account). ## Try It Yourself Want to build your own agentic meme generator? Here's how to get started: 1) Clone the repository: git clone https://github.com/awsdataarchitect/agentic-meme-generator cd agentic-meme-generator 2) Install dependencies: pip install -r requirements.txt 3) Set up Twilio for WhatsApp messaging: * Sign up for a free Twilio account at https://www.twilio.com/try-twilio * Navigate to the Twilio Console and note down your Account SID and Auth Token * Enable the WhatsApp Sandbox in the Messaging section * Follow the instructions to connect your WhatsApp number to the sandbox by sending the provided code * Note: The sandbox allows you to send 9 free messages every 24 hours for testing 4) Configure your environment variables: export TWILIO_ACCOUNT_SID=your_account_sid export TWILIO_AUTH_TOKEN=your_auth_token export BEDROCK_WHATSAPP_TO=your_whatsapp_number # Format: whatsapp:+1234567890 You can test your Twilio setup with this simple Python script: from twilio.rest import Client client = Client("your_account_sid", "your_auth_token") message = client.messages.create( body="Test message from Twilio", from_="whatsapp:+14155238886", # Twilio's sandbox number to="whatsapp:+1234567890" # Your WhatsApp number ) print(f"Message sent with SID: {message.sid}") 5) Deploy with CDK: cd agentic-meme-generator npm install npm run build cdk deploy 6) Trigger a meme generation manually on ad-hoc basis using AWS CLI command (e.g. for ad-hoc testing): aws lambda invoke \ --region us-east-1 \ --function-name AgenticMemeGenerator \ --payload '{"body": "{\"theme\": \"standard\"}"}' \ --cli-binary-format raw-in-base64-out \ /tmp/lambda-output.json ## What's Next? I'm planning to expand the system with more features: * Additional themes beyond standard and religious * Personalized memes based on recipient preferences * Integration with other messaging platforms * A web interface for customizing meme generation parameters * Birthday and other reminders generation ## Conclusion What started as a silly response to family WhatsApp messages turned into a fascinating exploration of agentic AI and serverless architecture. The project demonstrates how Amazon Bedrock and the Strands Agents SDK framework can be combined to create intelligent, creative applications that make decisions on their own. And the best part? Thanks to Amazon Nova and Strands Agents SDK, I'm now the undisputed king of good morning messages in the family WhatsApp group chat - all while sleeping in until a reasonable hour. Sorry, Aunt Linda, but AI has beat you up at your own morning meme game! If you're interested in exploring the code further or have ideas for improvements, check out the GitHub repository or drop me a message. I'd love to see what creative memes your own agent comes up with!
0 0 0 0
Preview
How I Built a Serverless Agentic AI Meme Generator for WhatsApp Background So there I was, half awake at 6 AM, when my phone buzzed for the third time....

✍️ New blog post by Vivek V.

How I Built a Serverless Agentic AI Meme Generator for WhatsApp

#ai #serverless #cdk #strandsagents

0 0 0 0
Preview
AWS Weekly Roundup: Strands Agents, AWS Transform, Amazon Bedrock Guardrails, AWS CodeBuild, and more (May 19, 2025) | Amazon Web Services Many events are taking place in this period! Last week I was at the AI Week in Italy. This week I’ll be in Zurich for the AWS Community Day – Switzerland. On May 22, you can join us remotely for AWS...

📰🚨AWS Weekly Roundup: Strands Agents, AWS Transform, Amazon Bedrock Guardrails, AWS CodeBuild, and more (May 19, 2025) by Danilo Poccia

#AIWeek #AWSCommunityDay #CloudInfrastructureDay #StrandsAgents #AWSInnovations

0 0 0 0