Videos C_GG5g38vLU
Harnesses in AI: A Deep Dive — Tejas Kumar, IBM
Scene timeline
79 shot(s).
keyframes kept every frame deduplicated
What was stored
- cues
- 410
- whisperx 410
- chunks
- 37
- from 410 cues
- keyframes
- 43
- kept of 79 captured
- frames with text
- 43
- 1,258 lines read
- chapters
- 13
- from the source metadata
- keyframe bytes
- 8.8 MB
- word timings on 410 cues
Provenance
| stage | state | model | started | took |
|---|---|---|---|---|
fetch |
done | — | 2026-08-10 00:42 | 1m 50s |
stt |
done | — | 2026-08-10 00:44 | 24s |
chunk |
done | — | 2026-08-10 00:44 | 0s |
text_embed |
done | — | 2026-08-10 19:44 | 1s |
keyframe |
done | — | 2026-08-10 00:44 | 1m 57s |
ocr |
done | — | 2026-08-10 00:46 | 27s |
frame_embed |
done | — | 2026-08-10 19:44 | 7s |
Frames, and what the machine read
-
- AlEngineer0.98
- EUROPE1.00
-
- PRESENTINGSPONSOR1.00
- Google DeepMind1.00
-
- PLATINUM SPONSORS0.98
- # Braintrust0.96
- WorkOS OpenAI0.95
-
- X @tejaskun0.93
- Spotity0.95
- Teja0.99
- Like “conta0.98
- AlEngineer0.99
- EUROPE1.00
-
- X @tejaskumar_0.98
- AIE1.00
- AI Harnesses0.96
- ★1.00
- ★1.00
- From first principles1.00
- AlEngineer1.00
- Engineering the future of Al1.00
- 20260.91
-
- X @tejaskumar_0.96
- AIE1.00
- AI Harnesses1.00
- ★1.00
- ★1.00
- ★1.00
- From first principles0.98
- AlEngineer0.97
- AlEngineer0.96
- 20260.88
- EUROPE1.00
-
- X @tejaskumar_0.98
- AIE1.00
- Why Harness?1.00
- ★1.00
- ★1.00
- AlEngineer1.00
- AlEngineer0.97
- 20260.90
- EUROPE1.00
-
- ***0.52
- AIE1.00
- Engineering the future of Al1.00
- AlEngineer0.99
- 20260.88
-
- AlEngineer0.98
- EUROPE1.00
-
- X @tejaskumar_0.98
- AIE1.00
- ★1.00
- What Harness?1.00
- ★1.00
- ★1.00
- Eval Harness (ML Engineering)1.00
- Agent Harness (AI Engineering)1.00
- What1.00
- Eval Harness (ML Engineer0.99
- Agent Harness (AI Enginee1.00
- AlEngineer0.98
- AlEngineer0.97
- 20260.95
- EUROPE1.00
-
- X @tejaskumar_0.98
- Agent Harness1.00
- AIE1.00
- • Tool Registry0.96
- ★1.00
- ★1.00
- Ager1.00
- • Tool Re0.90
- AlEngineer0.96
- Engineering the future of Al1.00
- 20260.92
-
- X @tejaskumar_0.97
- Agent Harness1.00
- *★★0.67
- AIE1.00
- Tool Registry0.98
- ★1.00
- ★1.00
- Model1.00
- Context Management1.00
- Guardrails1.00
- Agent Loop1.00
- Ager1.00
- • Tool Re0.93
- Model1.00
- Context Management1.00
- Guardrails1.00
- Agent Loop1.00
- AlEngineer0.97
- Engineering the future of Al1.00
- 20260.85
-
- Agent Harness1.00
- Tool Registry1.00
- Model1.00
- Context Management1.00
- Guardrails1.00
- Agent Loop1.00
- lerify0.90
- AlEngineer0.98
- EUROPE1.00
-
- dem1.00
- AlEngineer0.99
- EUROPE1.00
-
- Keynote1.00
- File0.99
- Edit0.99
- Insert1.00
- Slide1.00
- Format1.00
- Arrange1.00
- Piay0.90
- Window1.00
- Help1.00
- Thu Apr 9 14 35 480.97
- aie-europe0.99
- 00.65
- 63 %0.77
- Add Slide0.94
- 用0.51
- 80.90
- ①0.67
- Format0.98
- Slide1.00
- Blank1.00
- Appearance1.00
- Title0.93
- X etejaskumar0.83
- Slide Number0.96
- Body1.00
- Background1.00
- Standard1.00
- Dynamic0.97
- ★1.00
- ★1.00
- ★0.89
- AIE1.00
- ★1.00
- ★1.00
- ★1.00
- ★1.00
- ★1.00
- demo1.00
- Preview Motion0.99
- Colors0.96
- Speed1.00
- 4,480.97
- Height0.96
- Peaks1.00
- 0.10.94
- Slack1.00
- $I0.67
- 米0.99
- A0.99
- Edt Slide Layouf0.97
- AlEngineer0.97
- AlEngineer0.96
- 0260.86
- EUROPE1.00
-
- Run1.00
- Window Help0.98
- harness0.96
- 7-index.ts ×0.96
- 日0.50
- agent ) Ts 7-Index.ts .0.84
- import { createTools ) from "./1-tools.js";0.97
- import { createContext } from "./3-context.js";0.98
- import { runLoop } from "./5-loop.js";0.97
- import { BrowserSession ) from "./browser.js";0.96
- // try a shitty model1.00
- const MODEL = "openai/gpt-3.5-turbo-0613*;0.97
- 81.00
- const TASK =0.99
- 101.00
- Upvote a story on Hacker News.1.00
- ★1.00
- 111.00
- AIE1.00
- ★1.00
- 121.00
- 131.00
- Go to https://news.ycombinator.com.0.99
- Call browser_get_stories to see ranked stories with their IDs and voted status.0.99
- ★1.00
- 151.00
- 141.00
- Find the highest-ranked story where alreadyVoted is false.1.00
- Click its upvote arrow using the exact selector: a[id="up_STORYID"] (replace STORYID with the actual id).0.99
- ★1.00
- ★1.00
- ★1.00
- 161.00
- .trim();0.99
- 171.00
- 181.00
- console.log( Model: $(MODEL)');0.95
- 191.00
- console.log('Task: upvote on Hacker News\n');0.99
- 20 210.85
- const session = new BrowserSession();0.98
- 221.00
- 231.00
- try0.95
- 241.00
- await session.open();0.97
- 251.00
- 261.00
- const tools = createTools(session);1.00
- 271.00
- const messages = createContext(TASK);1.00
- 281.00
- const result = await runLoop(MODEL, messages, tools);0.99
- 291.00
- 301.00
- console.log('\nAnswer: $(result.answer)');0.96
- 311.00
- console.log('Stopped by: $(result.stoppedBy));0.99
- 321.00
- console.log('Iterations: $(result.iterations)');0.97
- 331.00
- finally{0.93
- 341.00
- await session.close();0.99
- 0 harmess 1 0 Live Share0.86
- Engineering the future of Al0.99
- AlEngineer1.00
- 20260.98
-
- Edit1.00
- Selection1.00
- GQ0.83
- Thu Apr 9 14:36:060.97
- □←0.89
- harness0.99
- Agents Window+0.99
- Ts 7-index.ts ×0.96
- Select Color Theme (detect system color mode disabled)0.99
- ①0.85
- agent > TS 7-index.ts > ...0.93
- Cursor Light1.00
- light themes0.96
- 21.00
- 11.00
- import { createT0.99
- import { createC1.00
- Light Modern Default Light Modern0.98
- Light+ Default Light+1.00
- Light (Visual Studio) Visual Studio Light0.99
- 31.00
- import { runLoop0.98
- Quiet Light1.00
- 41.00
- import { Browser0.96
- Solarized Light1.00
- 51.00
- Abyss1.00
- dark themes1.00
- 61.00
- // try a shitty0.97
- Cursor Dark0.96
- ★1.00
- 71.00
- const MODEL = "o0.99
- Cursor Dark Midnight1.00
- AIE1.00
- ★0.87
- 81.00
- Dark (Visual Studio) Visual Studio Dark1.00
- ★1.00
- 91.00
- const TASK =0.97
- Dark Modern Default Dark Modern1.00
- ★1.00
- ★1.00
- ★1.00
- 100.83
- Upvote a story on Hacker News.1.00
- 110.97
- 121.00
- Go to https://news.ycombinator.com.1.00
- 131.00
- Call browser_get_stories to see ranked stories with their IDs and voted status.0.99
- 141.00
- Find the highest-ranked story where alreadyVoted is false.1.00
- 151.00
- Click its upvote arrow using the exact selector: a[id="up_STORYID"] (replace STORYID with the actual id).0.99
- 161.00
- .trim();0.99
- 171.00
- 181.00
- console.log(Model: ${MODEL}');0.97
- 191.00
- console.log('Task: upvote on Hacker News\n`);0.98
- 201.00
- 211.00
- const session = new BrowserSession();1.00
- 221.00
- ↓90 harness0.91
- 10Live Share1.00
- Cursor Tab -- Tejas Kumar (1 week ago)0.97
- Ln 25, Col 10.98
- Spaces: 2 UTF-8 LF () TypeScript Prettier0.95
- Engineering the future of Al0.98
- AlEngineer1.00
- 20260.99
-
- Edit1.00
- Selection1.00
- Thu Apr 9 14:36:350.98
- □←0.98
- harness1.00
- Agents Window +0.96
- Ts 7-index.ts ×0.96
- agent > TS 7-index.ts > [0] TASK0.95
- 81.00
- 91.00
- const TASK =1.00
- 101.00
- Upvote a story on Hacker News.0.99
- 111.00
- 121.00
- Go to https://news.ycombinator.com.0.99
- 131.00
- Call browser_get_stories to see ranked stories with their IDs and voted status.1.00
- ★1.00
- 141.00
- Find the highest-ranked story where alreadyVoted is false.1.00
- AIE1.00
- ★1.00
- 151.00
- Click its upvote arrow using the exact selector: a[id="up_STORYID"] (replace STORYID with the actual id).0.98
- ★1.00
- 161.00
- .trim();0.98
- ★1.00
- ★1.00
- ★1.00
- 171.00
- 181.00
- console.log(Model: ${MODEL}');0.97
- 191.00
- console.log('Task: upvote on Hacker News\n');0.97
- 201.00
- 211.00
- const session = new BrowserSession();1.00
- 221.00
- 231.00
- try {0.94
- 241.00
- await session.open();1.00
- 251.00
- 261.00
- const tools = createTools(session);0.99
- 271.00
- const messages = createContext(TASK);0.99
- 281.00
- const result = await runLoop(MODEL, messages, tools);0.99
- 290.89
- 300.96
- conenle loa('lnAnewer: $/reeult anewerl.).0.75
- 90 harness 1 0 Live Share0.89
- Cursor Tab1.00
- -- Tejas Kumar (1 week ago)0.96
- Ln 15, Col 40.97
- Spaces: 2 UTF-8 LF () TypeScript Prettier0.97
- Engineering the future of Al0.98
- AlEngineer1.00
- 20260.98
-
- Edit0.86
- Selection View Go Run Terminal Window Help0.98
- Thu Apr 9 14 37 000.98
- □←0.68
- harness1.00
- Agents Window +0.96
- Ts 7-index.ts0.93
- Ts browser.ts ×0.95
- agent Ts browser.ts BrowserSession >getText0.93
- 41.00
- export class BrowserSession {1.00
- 231.00
- async getText(): Promise<string> {1.00
- LT0.61
- 251.00
- return text.slice(0, 4000);0.98
- 261.00
- 271.00
- ★1.00
- 281.00
- async fill(selector: string, value: string): Promise<string> {0.99
- AIE1.00
- ★0.99
- 291.00
- await this.page!.fill(selector, value);1.00
- ★1.00
- ★1.00
- ★1.00
- ★1.00
- 301.00
- 311.00
- 321.00
- }0.80
- return `Filled "$(selector}";0.96
- 331.00
- async click(selector: string): Promise<string> {0.99
- 341.00
- // Capture the id of the element before clicking (navigation may change the page)0.99
- 351.00
- const elementId = await this.page!.locator(selector).first().getAttribute("id");0.99
- 361.00
- 371.00
- await this.page!.click(selector, { timeout: 10000 });1.00
- 381.00
- await this.page!.waitForLoadState("domcontentloaded", { timeout: 10000 });0.99
- 391.00
- 401.00
- const clicked = elementId ? `element id="${elementId}"' : '"${selector}"`;0.95
- 411.00
- return Clicked ${clicked} - now at ${this.page!.url()}`;0.98
- 421.00
- }0.86
- 431.00
- 441.00
- // Returns a structured list of HN front-page stories so the agent can0.99
- 90④0.77
- harness 1 0 Live Share0.95
- Cursor Tab -o- Tejas Kumar (1 week ago)0.97
- Q0.83
- Ln 25, Col 21 (5 selected)1.00
- Spaces: 2 UTF-8 LF (} TypeScript Prettier0.94
- Google DeepMind1.00
- AlEngineer1.00
- 20260.98
-
- Edit1.00
- Selection View Go Run Terminal Window Help0.99
- Thu Apr 9 14 37 340.97
- □←0.96
- harness1.00
- Agents Window +0.97
- Ts 7-index.ts0.92
- Ts 1-tools.ts ×0.96
- agent > Ts 1-tools.ts > createTools > [] tools execute0.92
- 191.00
- export function createTools(session: BrowserSession, hooks?: ToolHooks): ToolRegistry {0.99
- 201.00
- const tools: Tool[] =[0.97
- 411.00
- definition: {1.00
- 431.00
- function: {0.97
- 700.59
- WUL LC UnL UI LIC CUTLL NayC. VOU LITO LU UOLOVL0.57
- pa0.99
- 461.00
- parameters: { type: "object", properties: {}, required: [] },0.98
- 471.00
- 3.0.56
- ★1.00
- AIE1.00
- ★1.00
- 481.00
- }.0.57
- ★1.00
- 491.00
- 501.00
- }.0.70
- execute: async () => session.getUrl(),0.99
- ★1.00
- ★1.00
- ★1.00
- 511.00
- 521.00
- 531.00
- definition: {0.99
- 541.00
- type: "function",0.99
- 551.00
- function: {0.97
- 561.00
- name: "browser_get_text",0.99
- 571.00
- description: "Get the visible text content of the current page.",1.00
- 581.00
- parameters: { type: "object", properties: {}, required: [] },0.98
- 591.00
- },0.87
- 601.00
- }.0.57
- 611.00
- execute: async () => session.getText(),0.99
- 621.00
- },0.67
- 631.00
- 90④0.78
- harness1.00
- ②10Live Share0.93
- Cursor Tab1.00
- -o- Tejas Kumar (1 week ago)0.98
- Ln 37, Col 22 (1 selected)1.00
- Spaces: 20.99
- UTF-81.00
- LF1.00
- () TypeScript Prettier0.95
- AlEngineer0.98
- Braintrust1.00
- WorkOS OpenAI0.98
- 20260.96
Transcript
410 cues· 3,978 words· 20,664 chars
- 0:15 Everybody's head turned up.
- 0:17 Hello, hi.
- 0:19 How was lunch?
- 0:19 Was it good?
- 0:21 You didn't like it, huh?
- 0:23 It's like British food.
- 0:25 Anyway, hi, I'm Tejas.
- 0:27 I'll be your first speaker this afternoon.
- 0:28 Tejas, that's pronounced like contagious.
- 0:31 Don't worry, I'm not.
- 0:32 Hopefully, my joy in AI is.
- 0:34 And I've had the privilege of working at a number of different places over my career in one form or the other.
- 0:38 It's just been an absolute joy to learn from the best.
- 0:41 Today, I'm an AI developer advocate at IBM, where we do
- 0:46 things with AI, believe it or not.
- 0:47 We train frontier models, we build harnesses.
- 0:50 It's a fun lab to work in.
- 0:52 But that's not what I'm here to talk to you about today.
- 0:54 Today I'm here to talk to you about AI harnesses.
- 0:57 AI harnesses.
- 0:58 Before I move forward, I would love to just have a show of hands.
- 1:02 How many of you are confident in your understanding of AI harnesses?
- 1:05 You're like, I could present this on stage today.
- 1:08 Look around.
- 1:09 Look around.
- 1:09 No, seriously, look around.
- 1:10 That's why we're doing this talk.
- 1:12 This is my hope.
- 1:14 If I ask you this at the end of the talk, I want you to be like, oh, I get it now.
- 1:17 That's the whole point.
- 1:18 I have literally nothing to gain from this other than I shared knowledge.
- 1:23 Because also, this term is kind of everywhere.
- 1:25 You may have heard it used like 52,000 times today.
- 1:28 And it means different things to different people.
- 1:31 Because in the machine learning world, it means like a glorified test suite for machine learning models.
- 1:35 But in the AI world, it means something different.
- 1:37 And so today, we're going to understand this in detail.
- 1:40 It's a deep dive, but it's 18 minutes long.
- 1:42 So let's move forward.
- 1:44 I want to start by talking about why harness?
- 1:46 Why do we use harnesses?
- 1:47 And the reason for this is because we pay rent
- 1:50 to companies that give us compute, give us inference, give us tokens in return.
- 1:56 Some of you maybe work for companies that have frontier models like Anthropic or Google or whatever, and you maybe, what was the term?
- 2:02 Token billionaires, yeah?
- 2:05 I'm not that.
- 2:06 I am maybe with Watson models, but the vast majority of us aren't token billionaires.
- 2:11 We pay rent, we literally, $20 a month for Cloud Pro, and then you get a context window that's limited and you don't get the full hog, so to speak.
- 2:20 And the model you rent is a black box.
- 2:23 They could at any time, I'm not saying they do, but they could, if Opus is somehow not available, they could serve you Sonnet even though it says Opus.
loading
Chapters
- 0:00 Introduction to Tejas Kumar and AI Harnesses
- 1:45 Why we use harnesses: Reliability and control
- 3:00 Defining an agent harness from first principles
- 4:32 Key components of an agent harness (Tooling, Context, Guardrails)
- 5:59 Starting the demo: Building a browser agent
- 7:00 Inspecting the initial agent loop
- 8:12 The problem: Agent failure and hallucination
- 10:20 Adding guardrails and context management
- 11:54 Refactoring into a formal harness
- 13:02 Implementing a verify step to catch lies
- 15:36 Implementing a login handler for programmatic access
- 17:42 Final demonstration: Successful autonomous upvoting
- 18:34 Summary and the future of dynamic harnesses