---
title: "Reconstructed Slides: Agents vs Workflows: Why Not Both? — Sam Bhagwat, Mastra.ai"
category: "slides"
video_id: "8SUJEqQNClw"
sourceLabels: ["Cropped public YouTube video frames", "Local OpenCV slide-region detection", "Local RapidOCR"]
---

# Reconstructed Slides: Agents vs Workflows: Why Not Both? — Sam Bhagwat, Mastra.ai

## Source Video
[Agents vs Workflows: Why Not Both? — Sam Bhagwat, Mastra.ai](https://www.youtube.com/watch?v=8SUJEqQNClw)

## Method
This deck is reconstructed from the existing video frame captures by detecting likely slide regions with OpenCV, cropping/upscaling those regions, deduplicating similar crops, and OCRing the cropped slide images locally. It is a cleaner companion to the full-stage frame deck.

## Reconstructed Slides
![[assets/reconstructed-slides/8SUJEqQNClw/slide-003.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-003.html)
- AI slide classifier: `content_slide` confidence `0.97`
- Text source: agent_vision.

Slide text:

> In December Anthropic wrote a great blog post that canonically defined agents and workflows

![[assets/reconstructed-slides/8SUJEqQNClw/slide-004.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-004.html)
- AI slide classifier: `content_slide` confidence `0.96`
- Text source: agent_vision.

Slide text:

> In April OpenAI released a paper on the topic

![[assets/reconstructed-slides/8SUJEqQNClw/slide-005.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-005.html)
- AI slide classifier: `content_slide` confidence `0.96`
- Text source: agent_vision.

Slide text:

> Hot Take #1: Don't be That Guy

![[assets/reconstructed-slides/8SUJEqQNClw/slide-006.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-006.html)
- AI slide classifier: `content_slide` confidence `0.96`
- Text source: agent_vision.

Slide text:

> Sometimes That Guy works for a FAANG type company in a public facing role Then the rest of us are really in for it

![[assets/reconstructed-slides/8SUJEqQNClw/slide-007.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-007.html)
- AI slide classifier: `content_slide` confidence `0.95`
- Text source: agent_vision.

Slide text:

> "Use the platform" was a codeword for why React was wrong and anti-web

![[assets/reconstructed-slides/8SUJEqQNClw/slide-008.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-008.html)
- AI slide classifier: `content_slide` confidence `0.95`
- Text source: agent_vision.

Slide text:

> Some of our users *loved* this. But many folks didn't.

![[assets/reconstructed-slides/8SUJEqQNClw/slide-009.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-009.html)
- AI slide classifier: `content_slide` confidence `0.99`
- Text source: advanced OCR `rapidocr-live/bright-screen/opencv-adaptive` reconciled by agent.
- OCR decision: ready — Dense code snippet and small footer text make OCR more efficient than manual transcription.

Slide text:

> So when I see APIs
> like this, it gives me
> (bad) flashbacks
> 
> // Langgraph.js
> const graph = new MessageGraph()
> // nodes
> .addNode("nodeA", funcA)
> .addNode("nodeB", funcB)
> // edges
> .addEdge(START, "nodeA")
> .addEdge("nodeA", "nodeB")
> .addEdge("nodeB", END)
> 
> github.com/mastra-ai/mastra

![[assets/reconstructed-slides/8SUJEqQNClw/slide-010.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-010.html)
- AI slide classifier: `content_slide` confidence `0.99`
- Text source: advanced OCR `rapidocr-live/border-trim/opencv-adaptive` reconciled by agent.
- OCR decision: ready — Dense code snippet and small text are better handled by OCR, while the title is short enough to read directly.

Slide text:

> AIE
> Or like this:
> 
> // Ingest
> const [notifyTeam, assignPlan] = await Promise.all([
>   step.run("notify_team", async () => {
>     return { notified: true };
>   }),
>   step.run("assign_default_plan", async () => {
>     return { planId: "starter" };
>   }),
> ]);
> 
> github.com/mastra-ai/mastra

![[assets/reconstructed-slides/8SUJEqQNClw/slide-011.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-011.html)
- AI slide classifier: `content_slide` confidence `0.98`
- Text source: advanced OCR `rapidocr-live/full` reconciled by agent.
- OCR decision: ready — Dense code snippet and small text are better handled by OCR, while the title is short enough to read directly.

Slide text:

> Or like this:
> 
> // Ingest
> const [notifyTeam, assignPlan] = await Promise.all([
>   step.run("notify_team", async () => {
>     return { notified: true };
>   }),
>   step.run("assign_default_plan", async () => {
>     return { planId: "starter" };
>   }),
> ]);
> 
> github.com/mastra-ai/mastra

![[assets/reconstructed-slides/8SUJEqQNClw/slide-012.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-012.html)
- AI slide classifier: `content_slide` confidence `0.97`
- Text source: advanced OCR `rapidocr-live/full` reconciled by agent.
- OCR decision: ready — Book-cover text and small thumbnail labels are OCR-suitable.

Slide text:

> A Pattern Language
> Towns·Buildings·Construction
> Christopher Alexander
> Sara Ishikawa·Murray Silverstein
> with
> Max Jacobson·Ingrid Fiksdahl-King
> Shlomo Angel

![[assets/reconstructed-slides/8SUJEqQNClw/slide-013.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-013.html)
- AI slide classifier: `content_slide` confidence `0.98`
- Text source: advanced OCR `rapidocr-live/bright-screen/contrast` reconciled by agent.
- OCR decision: ready — Multiple text boxes and bullet lists make OCR the better triage path.

Slide text:

> How the WorkOS folks put it in their
> Mastra workshop yesterday:
> 
> Agents are stateful AI entities that:
> • Maintain conversation memory
> • Execute workflows autonomously
> • Make decisions based on context
> • Use tools to complete tasks
> 
> Think of them as AI assistants with both
> memory and capabilities.
> 
> Workflows are composable pipelines that:
> • Chain multiple steps together
> • Pass data between steps
> • Validate inputs/outputs with Zod
> • Handle errors gracefully
> 
> Think of them as typed, observable
> functions that can do complex multi-step
> operations.
> 
> github.com/mastra-ai/mastra

![[assets/reconstructed-slides/8SUJEqQNClw/slide-014.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-014.html)
- AI slide classifier: `content_slide` confidence `0.99`
- Text source: agent_vision.

Slide text:

> Here's another way to put it:
> (1) Agents are a turn based game.
> (2) Workflows are a rules engine for your tech tree

![[assets/reconstructed-slides/8SUJEqQNClw/slide-015.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-015.html)
- AI slide classifier: `content_slide` confidence `0.99`
- Text source: agent_vision.

Slide text:

> Here’s another way to put it:
> (1) Agents store threads of messages and continuously interact with users
> (2) Workflows can have branching, parallelism, conditions, loops, can suspend/resume, etc

![[assets/reconstructed-slides/8SUJEqQNClw/slide-016.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-016.html)
- AI slide classifier: `content_slide` confidence `0.98`
- Text source: agent_vision.

Slide text:

> At the end of the day it's all just a tradeoff

![[assets/reconstructed-slides/8SUJEqQNClw/slide-017.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-017.html)
- AI slide classifier: `content_slide` confidence `0.99`
- Text source: agent_vision.

Slide text:

> Rules of agents + workflow composition
> (1) Agents have tools
> (2) Workflows have steps
> (3) An agent can be a step
> (4) A workflow can be a tool
> (5) An agent can be a tool
> (6) A workflow can be a step

![[assets/reconstructed-slides/8SUJEqQNClw/slide-018.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-018.html)
- AI slide classifier: `content_slide` confidence `0.97`
- Text source: advanced OCR `rapidocr-live/border-trim/contrast` reconciled by agent.
- OCR decision: ready — Code-heavy slide is better handled by OCR; only the title is captured here.

Slide text:

> Agent supervisor
> Supervisor
> 
> const researchAgent = new Agent({
>   name: 'research-agent',
>   instructions: 'You are a research agent that analyzes',
>   model: openai('gpt-4'),
> });
> 
> const summaryAgent = new Agent({
>   name: 'summary-agent',
>   instructions: 'You are a summary agent.',
>   model: openai('gpt-4'),
> });
> 
> const researchTool = createTool({
>   id: 'research',
>   execute: async ({ inputData }) => {
>     const result = await researchAgent.generate(inputData.query);
>     return { text: result.text };
>   },
> });
> 
> const summaryTool = createTool({
>   id: 'summarize',
>   execute: async ({ inputData }) => {
>     const result = await summaryAgent.generate(inputData.text);
>     return { text: result.text };
>   },
> });
> 
> export const supervisorAgent = new Agent({
>   name: 'supervisor-agent',
>   instructions: 'You are a supervisor agent that coordinates research and summarization tasks.',
>   model: openai('gpt-4'),
>   tools: [researchTool, summaryTool],
> });
> 
> aws
> World's Fair

![[assets/reconstructed-slides/8SUJEqQNClw/slide-019.jpg]]

- Recreated text/layout view: [open HTML recreation](/assets/slide-recreations/reconstructed/8SUJEqQNClw/slide-019.html)
- AI slide classifier: `content_slide` confidence `0.97`
- Text source: advanced OCR `rapidocr-live/bright-screen/contrast` reconciled by agent.
- OCR decision: ready — Code-heavy slide is better handled by OCR; only the title is captured here.

Slide text:

> Workflow as tool
> 
> export const agent = new Agent({
>   name: 'Agent',
>   instructions: `Ask the user for their location, check weather, and plan a trip`,
>   model: openai('gpt-4o-mini'),
>   workflows: {
>     checkWeather,
>     planTrip
>   },
>   memory,
> });


### Hidden Non-Slide Evidence
- [`slide-001.jpg`](/assets/reconstructed-slides/8SUJEqQNClw/slide-001.jpg) — `sponsor_logo` confidence `0.99`; sponsor/logo wall only
- [`slide-002.jpg`](/assets/reconstructed-slides/8SUJEqQNClw/slide-002.jpg) — `title_card` confidence `0.98`; speaker intro card
- [`slide-020.jpg`](/assets/reconstructed-slides/8SUJEqQNClw/slide-020.jpg) — `speaker_stage` confidence `0.99`; speaker on stage, not a presentation slide
- [`slide-021.jpg`](/assets/reconstructed-slides/8SUJEqQNClw/slide-021.jpg) — `speaker_stage` confidence `0.99`; Speaker on stage at podium; no readable presentation slide content.

Classification audit: `raw/sources/slide-ai-classification/reconstructed/8SUJEqQNClw/audit.json`
