A (mostly) fun and frantic day. But the opposite is no good, so I’ll take it.
[blog] Agentic Engine Optimization (AEO). The guide you didn’t know you needed. Addy provides a checklist and more for helping you structure your content in a way that agents can benefit from.
[blog] Productive procrastination. Our brains like novelty and try to protect us from negative emotions. How do we recognize this truth, while still doing the work we need to do? Solid advice here.
I got to build a bit this weekend. First, I added an ADK agent to a web solution that I like to demonstrate to customers. This gave me a chance to once again deploy to our Agent Engine. Then I built up a solution with Pub/Sub and blogged about it today.
[blog] Go for AI agents: a field report. Useful to read, although the writer misses out on a handful of mature ecosystem projects for Go devs building AI apps and agents. Don’t miss Genkit and ADK!
Throughout my tech career, I’ve been taught to be cautious about where I stash business logic. I now reflexively think about putting important rules and considerations into central services. Could you bury it in stored procedures or database triggers? Be careful, say Internet people. Same goes for frontend components. Middleware? It’s easy to stash sneaky-important rules in all sorts of interesting platform extensions. Google Cloud just made it very simple to invoke an LLM from a Pub/Sub topic or subscription. When might I do that? And what does it look like? I’ll show you.
In my classic ESB days, meaningful logic could show up in data processing pipelines, message transformations, long-running orchestrations, and even code callouts. You couldn’t avoid it. Cloud messaging services like Pub/Sub also have plenty of spots where you can add some decision logic. Where should I route this message? Based on what criteria? How long should I retain messages after delivered? What cause a retry? And now we have Single Message Transforms (SMTs) where I can do simple manipulation of the data stream. This is handy if you want to hand the downstream consumer a sanitized message with sensitive data removed, clean up data formatting, or even enrich the message with new data points.
A brand new SMT is the AI Inference SMT. Using this, I can call Google, partner, or custom models. What’s also cool is that I can apply this at the Topic level—this means every subscription gets the altered message—or apply it for specific Subscriptions. Let’s set one up.
What’s the scenario? In my former days as a solutions architect, I worked with a massive ERP implementation where key events were sent out and consumed downstream. One of those was “employee” events for hiring new staff. What if we had a Pub/Sub topic that took in a “new employee” event, and one of the many downstream subscribers sends welcome emails? I could call the LLM in that subscription to hand a pre-built welcome note to the destination system. Of course, you might also craft that AI-assisted welcome note in the subscriber’s own service. Might depend on how capable that downstream system is.
Once you’ve got a Google Cloud account and have the right permissions set up, we can get to work. This is all doable in our gcloud CLI, but I’ll use the web console to demonstrate everything here. I start by going to the Google Cloud Console and Pub/Sub section to create a new Topic.
You’ll see there’s a Transforms section, but I don’t want to apply a transform to every message. So I’ll create this topic without one.
Next, I create a subscription. Pub/Sub is one of the most unique cloud messaging services because it supports push, pull, and even message replay. This sub is a simple pull-based subscription.
Further down this page, I see the option again to add Transforms. The AI SMT expects content in a specific structure, but I don’t want to assume the upstream system is going to send messages in that format. So I can daisy-chain SMT where I first re-format the message in a JavaScript User-Defined Function, and then run the AI SMT.
I click the Add Transform button and choose Javascript UDF. I set the function name as transform and populate the JavaScript code that sticks the original employee event into the prompt that the AI SMT expects.
Here’s the code.
function transform(message, metadata) {
var incomingData = JSON.parse(message.data);
var promptText = "Generate a personalized welcome email factoring in the person's name, location, and role. " + JSON.stringify(incomingData);
// No wrapper object here
var aiInferenceObject = {
model: "google/gemini-2.5-flash",
messages: [
{ role: "user", content: promptText }
]
};
return {
data: JSON.stringify(aiInferenceObject),
attributes: message.attributes || {}
};
}
I like that I can test this inline. The Test Transforms button takes me to an interface where I can see if my UDF does its job. After plugging in an example message, I click the Test button and see the transformation result.
Now I add the AI SMT to the sequence of transforms. I chose AI Inference and then picked the managed Gemini model from Vertex AI. I could have also chosen any number of managed models from DeepSeek, Mistral, or Anthropic. Or even chosen my own model endpoint. I also picked a service account that had access to Vertex AI models. And I set a couple of parameters for max token count and temperature.
Now when I choose the Test Transforms button again, I see both SMTs. After popping the same value into the transform SMT, I click Test. It’s pretty great than when I click the second SMT (AI Inference), the results from the first pre-populates the box!
The transformed message includes the desired “welcome” note. In real life, I’d have crafted a better prompt to ensure exactly what I wanted, but this shows what’s possible.
Once I save this subscription, it works like any other. Now I’ve got an LLM-enhanced Google Cloud Pub/Sub!
I like seeing these sorts of capabilities baked into Cloud services. Integrating LLMs into your architecture doesn’t need to be difficult. But make good choices, and figure out when your business logic needs to be explicitly called out, versus buried inside service configurations!
Happy Friday. I do hope you had a productive week, and get the chance to enjoy yourself over the weekend.
[article] AI Adoption by the Numbers. That “95% of AI pilots fail” stat from last year? Feels suspect. This gang looked at data that shows that AI startups are finding real success in the enterprise.
I spent the latter half of today trying to help Future Richard who somehow has a meeting-filled “no meeting Friday” tomorrow. Better to tackle tasks I usually leave for Friday today, and not stress it later.
[blog] The 49MB Web Page. How did we get here? Trackers, bloat, auto-play videos, and more ambush us on seemingly every website.
[blog] Your parallel Agent limit. Managers, read this. And AI fanatics, dig in. Adding agents doesn’t scale developers linearly. There’s a ceiling for what we can handle.
[article] Developer ramp-up time continues to accelerate with AI. Wow, developers are getting significantly more productive, faster, in new jobs. Will we reach a plateau where there’s nothing left to speed up with AI?
[article] Unstructured data is piling up as AI risks rise. Hmmm, I wonder why AI pilots have a middling chance of success? Maybe because most data estates aren’t remotely set up to work with AI scenarios?
Want to get this update sent to you every day? Subscribe to my RSS feed or subscribe via email below:
Today was a day I was happy to have access to experts and decision-makers. Instead of playing telephone through intermediaries, I still like going right to the source. Risky at times, but usually pays off!
[blog] The 2nd Phase of Agentic Development. Instead of cloning things, we can now reimagine software based on the jobs-to-be-done. Coding agents make reimagining practical.
[blog] How I Use AI Before the First Line of Code. Don’t just AI for implementation work. It’s a good exploration tool, reviewer of requirements, and architectural sparring partner.
[blog] Portability is the new productivity. Do you need to rebuild software for every type of client? The gaming industry solved this, and app devs have Flutter for this too.
[blog] Ultimate prompting guide for Lyria 3 models. I like the detailed instructions here that explain the best way to get music, lyrics, and vocals from this set of Google models.
It feels later in the week than Tuesday. But Google Cloud Next is officially sold out, and much of our team is working towards delivering the best tech event possible for you all. And I had a few minutes to code up an agent today, so no complaints.
[article] Components of A Coding Agent. Fantastic. We suddenly start throwing terms like “harness” around and assume we’re all talking about the same thing. Sebastian offers up a terrific definition and deep dive into coding harnesses.
[article] Nobody Is Coming to Save Your Career. No one ever was. If you have a strong manager and a supportive org, fantastic. But you still own your career plan.
[blog] I Still Prefer MCP Over Skills. These points resonate with me. I don’t personally want to write giant skill files that I have to store, share, and maintain. MCP does a lot of good things for me.
Lots of “hard truth” in today’s reading list. A lot of people came out hot from the Easter weekend. Dig in.
[blog] “Good Taste” Is Just Experience. You’re not born with it. You put in the work to get experience to help you apply good judgement to a situation.
[blog] How Claude Code Builds a System Prompt. Nice analysis of the leaked Claude Code system prompt. It might change how you approach your own agent instructions.
[article] No Offense. Are you unoffendable? If so, kudos. Going into situations with that stance (versus the more visible opposite) leads to much higher quality interactions.
[article] Multi-agent AI is the new microservices. Matt brings the heat with this one. Like previous trends, we’re probably over-engineering AI agents already.
I’m ready for the weekend and looking forward to downtime. Maybe some tech experiments, but mainly investing my time in a great Easter with the family.
[article] Directing a Swarm of Agents for Fun and Profit. I like this collection of observations from Adrian. Those of us who have been in tech for a while can appreciate how he’s looking at the AI world.
[article] Backstage is dead. Do we need different things from an Internal Developer Platform that what Backstage offered? Yes. It’s a piece, but a platform matters.
[blog] developer relations after the cheat code machine. I like this. Does instruction (and DevRel) move away from “hello world” and “how to use the thing” towards more apprenticeship-style guidance of how to use the AI tools well? Seems like it.
[article] Axios hack exposes AI-coding’s dependency problem. AI-generated code uses a lot of open source references. Are they up to date? Exposing vulnerabilities? Without the right checks in place, you face real risks.
We shipped a cool open model today, and I enjoyed a few meeting-free moments to work on some docs and research. It looks like many folks are already starting an extended weekend, but I’ll see you here tomorrow.
[article] When Executive Presence Backfires. You don’t want to hear generic feedback that you need more “executive presence” or give that feedback. Both are unsatisfying. But how can efforts to build these behaviors actually cause you problems?
[article] How Amex deploys AI tools. Looks like some widespread use cases, and a “redesign” of how they operate.