Transcription: OpenAgents Episode 068 - URL Extractor Plugin

June 9, 2026 ยท View on GitHub

Source: https://twitter.com/OpenAgentsInc/status/1753092771206885743 Wiki source: https://raw.githubusercontent.com/wiki/OpenAgentsInc/openagents/Video-Series.md Media title: OpenAgents - Episode 068: URL Extractor Plugin We write our first real WASM plugin... Upload date: 20240201 Transcription model: mlx-whisper/mlx-community/whisper-tiny Generated at: 2026-06-01T19:09:12Z

Machine-generated transcript. Review speaker labels and wording before using this as quote-grade source material.

[00:00] Christopher David: Let's create our first plugin. This is going to be a very simple plugin that's going to take a string text input and

[00:09] Christopher David: Return a list and array of all of the URLs in that text input. Very simple

[00:17] Christopher David: String manipulation and

[00:19] Christopher David: This video we're going to follow the

[00:23] Christopher David: Extism quick start

[00:25] Christopher David: I'm going to build my plugin in rust

[00:28] Christopher David: So this video can also serve as sort of the intro for anyone who's new and wants to learn how to create a plugin

[00:34] Christopher David: You can watch me do this process. They've got you know JavaScript go. You can pick the language at your most familiar with

[00:42] Christopher David: I'm picking rest which I'm not adds familiar as JavaScript, but it'll be

[00:50] Christopher David: fun to

[00:52] Christopher David: Go through this

[00:55] Christopher David: So I've got a basic rust installed

[00:57] Christopher David: By the way, you can see the dot files for my current setup of

[01:03] Christopher David: Neil Vam and Kitty and stuff

[01:07] Christopher David: At the February one

[01:10] Christopher David: Come out of my dot files on my personal repo there if you want to get my same setup

[01:16] Christopher David: Okay

[01:17] Christopher David: Let's get started

[01:19] Christopher David: So on the extism.org website under quick start right up plugin. I'm selecting rust and we're going to step through this together

[01:26] Christopher David: So

[01:30] Christopher David: Let's do cargo new

[01:33] Christopher David: Dash gosh lib

[01:38] Christopher David: And I think I want to call this like plugin

[01:43] Christopher David: URL extractor

[01:49] Christopher David: I'm going to commit every step of this

[01:59] Christopher David: I'm going to put this in the open agent repo

[02:03] Christopher David: But I would invite you to

[02:07] Christopher David: I'm going to put this in the open agent repo

[02:11] Christopher David: But I would invite you to

[02:14] Christopher David: If you're building your own plugin put it in your own personal repo

[02:20] Christopher David: Let's see

[02:23] Christopher David: Let's make a new repo in here

[02:32] Christopher David: Public

[02:37] Christopher David: I'll figure out the appropriate license for this later something that's maximally permissive

[02:42] Christopher David: Plug in your own extractor

[03:12] Christopher David: I'll just paste in what I actually did there

[03:18] Christopher David: Oops

[03:36] Christopher David: All right, we're off to the races

[03:38] Christopher David: All right, we generated a new lib project with cargo

[03:44] Christopher David: Let's add the library from crates.io

[03:48] Christopher David: Paste

[03:52] Christopher David: Commit

[03:55] Christopher David: No

[03:58] Christopher David: Still learning my

[04:02] Christopher David: I've got the mode active on the terminal

[04:08] Christopher David: I'm going to add the code

[04:12] Christopher David: Cargo add x isn't be decay. Yes

[04:15] Christopher David: All right

[04:17] Christopher David: Change your cargo.com to set the crate type to see

[04:21] Christopher David: This instructs the compiler to produce a dynamic library which for our target will be a wasm binary

[04:27] Christopher David: All right, let's open up the whole thing

[04:31] Christopher David: In Vim, can I do a fuzzy find here?

[04:34] Christopher David: Okay, I broke something

[04:43] Christopher David: Making sure that it caps off on

[04:47] Christopher David: What I do

[04:49] Christopher David: Cargo to the top

[04:51] Christopher David: Okay, so let's grab this

[04:55] Christopher David: This

[05:03] Christopher David: So that's

[05:06] Christopher David: Great type

[05:09] Christopher David: See, dial in and I'm being a little more anal than I need to be on the commits in parts so we can have future rust plugins just fork this repo that would be nice

[05:20] Christopher David: Okay, create an export

[05:24] Christopher David: The primary means of interacting with this plugin is an export function that can be called by the outside world

[05:29] Christopher David: Let's create a simple greeting plugin

[05:32] Christopher David: The plugin Fn macro wires this function to ex-tism and exports it using the name greet

[05:40] Christopher David: Okay

[05:42] Christopher David: Let's put that in source

[05:44] Christopher David: I'm guessing we should maybe delete all of the rest of this

[05:51] Christopher David: Okay, we can compile to the wasm32 unknown unknowns since we don't need to make any sys calls

[06:13] Christopher David: If this fails make sure you've added this target to rust

[06:24] Christopher David: Alright, let's give it a try

[06:27] Christopher David: Let's pop over to a new console thing there, paste that in

[06:33] Christopher David: See what happens

[06:36] Christopher David: Can't find in this scoop

[06:43] Christopher David: Alright, a computer maybe any of that

[06:59] Christopher David: Okay, did that make any

[07:05] Christopher David: Changes, let's just commit the lib change

[07:09] Christopher David: We'll call that

[07:13] Christopher David: Demo export greet

[07:21] Christopher David: Make sure that looks nice right there

[07:28] Christopher David: Okay, this will put your compiled wasm in target wasm32 unknown slash debug

[07:34] Christopher David: We can now test it using the ex-tism CLI's run command

[07:38] Christopher David: I do not yet have this installed I don't think

[07:42] Christopher David: But let's just confirm

[07:47] Christopher David: Oops, not my wasm plugin

[07:51] Christopher David: Maybe I haven't done

[07:54] Christopher David: Plug in your extractor maybe

[07:57] Christopher David: Or is it called some emails?

[08:08] Christopher David: Plug in, okay, underscore

[08:11] Christopher David: Okay, let's just go to the list

[08:16] Christopher David: Okay, let's just go to the list

[08:21] Christopher David: Okay, let's just go to the list

[08:25] Christopher David: Okay, let's just go to the list

[08:29] Christopher David: Okay, let's just go to the list

[08:33] Christopher David: Okay, let's just go to the list

[08:37] Christopher David: Okay, let's just go to the list

[08:39] Christopher David: Okay, let's just go to the list

[08:42] Christopher David: Okay, let's just go to the list

[08:46] Christopher David: Okay, let's just go to the list

[08:49] Christopher David: Okay, let's just go to the list

[08:52] Christopher David: Okay, let's just go to the list

[08:55] Christopher David: Okay, let's just go to the list

[08:58] Christopher David: Okay, let's just go to the list

[09:01] Christopher David: Okay, let's just go to the list

[09:05] Christopher David: Okay, let's just go to the list

[09:09] Christopher David: Okay, let's just go to the list

[09:12] Christopher David: Okay, let's just go to the list

[09:16] Christopher David: Okay, let's just go to the list

[09:19] Christopher David: Okay, let's just go to the list

[09:22] Christopher David: Okay, let's just go to the list

[09:25] Christopher David: Okay, let's just go to the list

[09:28] Christopher David: Okay, let's just go to the list

[09:32] Christopher David: Okay, let's just go to the list

[09:35] Christopher David: Okay, let's just go to the list

[09:37] Christopher David: Okay, let's just go to the list

[09:40] Christopher David: Okay, let's just go to the list

[09:42] Christopher David: Okay, let's just go to the list

[09:46] Christopher David: Okay, let's just go to the list

[09:49] Christopher David: Okay, let's just go to the list

[09:52] Christopher David: Okay, let's just go to the list

[09:55] Christopher David: Okay, let's just go to the list

[09:58] Christopher David: Okay, let's just go to the list

[10:01] Christopher David: Okay, let's just go to the list

[10:04] Christopher David: Okay, let's just go to the list

[10:07] Christopher David: Okay, let's just go to the list

[10:10] Christopher David: Okay, let's just go to the list

[10:12] Christopher David: Okay, let's just go to the list

[10:15] Christopher David: Okay, let's just go to the list

[10:18] Christopher David: Okay, let's just go to the list

[10:21] Christopher David: Okay, let's just go to the list

[10:24] Christopher David: Okay, let's just go to the list

[10:27] Christopher David: Okay, let's just go to the list

[10:30] Christopher David: Okay, let's just go to the list

[10:33] Christopher David: Okay, let's just go to the list

[10:35] Christopher David: Okay, let's just go to the list

[10:37] Christopher David: Okay, let's just go to the list

[10:40] Christopher David: Okay, let's just go to the list

[10:42] Christopher David: Okay, let's just go to the list

[10:46] Christopher David: Okay, let's just go to the list

[10:49] Christopher David: Okay, let's just go to the list

[10:52] Christopher David: Okay, let's just go to the list

[10:55] Christopher David: Okay, let's just go to the list

[10:58] Christopher David: Okay, let's just go to the list

[11:01] Christopher David: Okay, let's just go to the list

[11:04] Christopher David: Okay, let's just go to the list

[11:07] Christopher David: Okay, let's just go to the list

[11:11] Christopher David: Okay, let's just go to the list

[11:14] Christopher David: Okay, let's just go to the list

[11:17] Christopher David: Okay, let's just go to the list

[11:20] Christopher David: Okay, let's just go to the list

[11:23] Christopher David: Okay, let's just go to the list

[11:26] Christopher David: Okay, let's just go to the list

[11:29] Christopher David: Okay, let's just go to the list

[11:33] Christopher David: Okay, let's just go to the list

[11:34] Christopher David: Okay, let's just go to the list

[11:38] Christopher David: Okay, let's just go to the list

[11:41] Christopher David: Okay, let's just go to the list

[11:44] Christopher David: Okay, let's just go to the list

[11:47] Christopher David: Okay, let's just go to the list

[11:50] Christopher David: Okay, let's just go to the list

[11:53] Christopher David: Okay, let's just go to the list

[11:56] Christopher David: Okay, let's just go to the list

[11:59] Christopher David: Okay, let's just go to the list

[12:01] Christopher David: Okay, let's just go to the list

[12:05] Christopher David: Okay, let's just go to the list

[12:08] Christopher David: Okay, let's just go to the list

[12:11] Christopher David: Okay, let's just go to the list

[12:14] Christopher David: Okay, let's just go to the list

[12:17] Christopher David: Okay, let's just go to the list

[12:20] Christopher David: Okay, let's just go to the list

[12:23] Christopher David: Okay, let's just go to the list

[12:26] Christopher David: Okay, let's just go to the list

[12:28] Christopher David: Okay, let's just go to the list

[12:32] Christopher David: Okay, let's just go to the list

[12:35] Christopher David: Okay, let's just go to the list

[12:38] Christopher David: Okay, let's just go to the list

[12:41] Christopher David: Okay, let's just go to the list

[12:44] Christopher David: Okay, let's just go to the list

[12:47] Christopher David: Okay, let's just go to the list

[12:50] Christopher David: Okay, let's just go to the list

[12:53] Christopher David: Okay, let's just go to the list

[12:55] Christopher David: Okay, let's just go to the list

[12:59] Christopher David: Okay, let's just go to the list

[13:02] Christopher David: Okay, let's just go to the list

[13:05] Christopher David: Okay, let's just go to the list

[13:08] Christopher David: Okay, let's just go to the list

[13:11] Christopher David: Okay, let's just go to the list

[13:14] Christopher David: Okay, let's just go to the list

[13:17] Christopher David: Okay, let's just go to the list

[13:20] Christopher David: Okay, let's just go to the list

[13:22] Christopher David: Okay, let's just go to the list

[13:25] Christopher David: Okay, let's just go to the list

[13:27] Christopher David: Okay, let's just go to the list

[13:31] Christopher David: Okay, let's just go to the list

[13:34] Christopher David: Okay, let's just go to the list

[13:37] Christopher David: Okay, let's just go to the list

[13:40] Christopher David: Okay, let's just go to the list

[13:43] Christopher David: Okay, let's just go to the list

[13:46] Christopher David: Okay, let's just go to the list

[13:49] Christopher David: Okay, let's just go to the list

[13:52] Christopher David: Okay, let's just go to the list

[13:55] Christopher David: Okay, let's just go to the list

[13:57] Christopher David: Okay, let's just go to the list

[14:00] Christopher David: Okay, let's just go to the list

[14:03] Christopher David: Okay, let's just go to the list

[14:05] Christopher David: Okay, let's just go to the list

[14:08] Christopher David: Okay, let's just go to the list

[14:11] Christopher David: Okay, let's just go to the list

[14:14] Christopher David: Okay, let's just go to the list

[14:17] Christopher David: Okay, let's just go to the list

[14:20] Christopher David: So this is returning a vector of strings

[14:23] Christopher David: And I just don't know if I don't work

[14:26] Christopher David: But it's I guess worth a try

[14:28] Christopher David: Please know that you need to add the reggae's

[14:30] Christopher David: Create to your cargo to accommodate the dependencies to use the reggae's type

[14:38] Christopher David: And then so at first

[14:41] Christopher David: Point of curiosity is

[14:49] Christopher David: Okay, let's just go to the list

[14:53] Christopher David: Okay, let's just go to the list

[14:56] Christopher David: Okay, let's just go to the list

[14:59] Christopher David: Okay, let's just go to the list

[15:02] Christopher David: Okay, let's just go to the list

[15:05] Christopher David: Okay, let's just go to the list

[15:08] Christopher David: Okay, let's just go to the list

[15:11] Christopher David: Okay, let's just go to the list

[15:14] Christopher David: Okay, let's just go to the list

[15:17] Christopher David: And then let's say I didn't pay that any of you

[15:25] Christopher David: So let's try what if I do this this oops?

[15:38] Christopher David: No

[15:46] Christopher David: Okay, now I got some squirrely brace squirrely errors here

[15:59] Christopher David: What's going on there?

[16:05] Christopher David: Oh, maybe Rustan Lyser just doesn't accept the macro

[16:10] Christopher David: This is like a barely configured Neo of him for Rust

[16:13] Christopher David: So I'm sure there's something

[16:18] Christopher David: Okay, I guess let's try this

[16:28] Christopher David: Let's try it

[16:30] Christopher David: So let's just go back to the command line

[16:34] Christopher David: And see if this compiles will run the same command we did previously

[16:43] Christopher David: Okay, let's just go back to the command line

[16:48] Christopher David: Cargo build target wasm 32, no, no, no

[16:52] Christopher David: So question one is does it build and it does not build

[16:58] Christopher David: The trade to bikes is not implemented for a veck string of strength

[17:03] Christopher David: So we probably need this to be an actual string

[17:06] Christopher David: And what I'm going to do here is see if I may want to copy this

[17:14] Christopher David: I'd like to ask it questions about the

[17:25] Christopher David: Function that it wrote hopefully gives me the same thing

[17:30] Christopher David: Okay, so I'm going to stop it before it terminates raffle

[17:36] Christopher David: I got this error

[17:39] Christopher David: I think we may be need to convert the URLs

[17:45] Christopher David: I don't have to a string that we parse on the other side

[17:56] Christopher David: The area you encountered is due to the fact that the x is a framework

[18:00] Christopher David: Expects the output of a plug-in function to be a type that implements the two bytes

[18:03] Christopher David: Trate and veck string does not directly implement the string

[18:07] Christopher David: To resolve this you can serialize the veck string containing the URLs and was trained format

[18:11] Christopher David: Yeah, this requires you to necessarily serialization library like a surrogate on

[18:16] Christopher David: Additionally, the error related to fn error indicates that this type is not available

[18:21] Christopher David: You should use error from the x isn't pbk instead

[18:24] Christopher David: Here's a revised code

[18:28] Christopher David: Okay, let's give it a try

[18:33] Christopher David: I think I have

[18:38] Christopher David: Do I need to cargo add surrogate on?

[18:43] Christopher David: And then I think I have

[18:53] Christopher David: Do I need to cargo add surrogate on?

[19:03] Christopher David: Okay, so cargo add surrogate cargo add surrogate on?

[19:13] Christopher David: Okay, let's try building this

[19:17] Christopher David: Okay, let's try building this

[19:24] Christopher David: Cuz imagine we panicked

[19:32] Christopher David: So one thing that I found is that

[19:40] Christopher David: Okay, let's try building this

[19:45] Christopher David: Cuz imagine we panicked

[19:49] Christopher David: So one thing that I found is that

[19:57] Christopher David: ChatectmTens to

[19:59] Christopher David: after making a bunch of these errors.

[20:02] Christopher David: Like I have to copy paste continuously,

[20:04] Christopher David: eventually it'll maybe convert into the right thing.

[20:09] Christopher David: The air message indicates that plugin FN attributes

[20:11] Christopher David: expects a function that returns X is a BDK FN result,

[20:15] Christopher David: but the modified extractor, yeah, why did do that?

[20:24] Christopher David: FN result, VEC of U8.

[20:25] Christopher David: I don't know that I wanted to return bytes.

[20:30] Christopher David: Can you just return a string?

[20:33] Christopher David: Didn't we have it returning a string before?

[20:45] Christopher David: Yeah, you are complicating it with the into bytes.

[20:51] Christopher David: Just return a string.

[20:55] Christopher David: You're right.

[21:00] Christopher David: What? I know more than you.

[21:03] Christopher David: About Russ, I'm just a new.

[21:05] Christopher David: To simplify the implementation, we can return a JSON string directly

[21:10] Christopher David: instead of converting into bytes.

[21:12] Christopher David: Well, thanks.

[21:14] Christopher David: I'll get out as well.

[21:25] Christopher David: I don't like these squigglies.

[21:37] Christopher David: Why do I have these squigglies?

[21:43] Christopher David: Bro.

[21:55] Christopher David: I don't think I can return them.

[22:00] Christopher David: I don't think I can return them.

[22:05] Christopher David: I don't think I can return them.

[22:08] Christopher David: I don't think I can return them.

[22:11] Christopher David: I don't think I can return them.

[22:13] Christopher David: I don't think I can return them.

[22:16] Christopher David: I don't think I can return them.

[22:18] Christopher David: I don't think I can return them.

[22:20] Christopher David: I don't think I can return them.

[22:22] Christopher David: I don't think I can return them.

[22:24] Christopher David: You got the errors below.

[22:29] Christopher David: Just give me the most basic possible function.

[22:38] Christopher David: Taking a string and returning a string of the serialized array of URLs.

[22:53] Christopher David: I don't think I can return them.

[22:58] Christopher David: I don't think I can return them.

[23:03] Christopher David: I don't think I can return them.

[23:08] Christopher David: I don't think I can return them.

[23:13] Christopher David: I don't think I can return them.

[23:17] Christopher David: I don't think I can return them.

[23:21] Christopher David: Copy-based powers.

[23:25] Christopher David: Let's try it one more time.

[23:30] Christopher David: Finished.

[23:32] Christopher David: All right.

[23:37] Christopher David: Okay. Let's test it out.

[23:50] Christopher David: I'm going to modify this command to call our new thing.

[23:57] Christopher David: It's called plugin URL extractor.

[24:05] Christopher David: And pass in some Lorum,

[24:07] Christopher David: Ipsum text that contains two URLs.

[24:13] Christopher David: Oops.

[24:20] Christopher David: Yes, yes, yes.

[24:30] Christopher David: Just giving.

[24:45] Christopher David: Copy-paste.

[24:49] Christopher David: Okay.

[24:57] Christopher David: Our function works.

[25:02] Christopher David: Our function works.

[25:04] Christopher David: Now there's probably some edge cases that it messes up on.

[25:07] Christopher David: I don't know.

[25:09] Christopher David: The reggae's might not be perfect.

[25:12] Christopher David: I don't know exactly.

[25:14] Christopher David: We'll probably need to do some JSON parsing thing.

[25:17] Christopher David: But look, if you've got a batch of wasm that you can drop into any application

[25:25] Christopher David: and know that if you pass it a thing, you get back this.

[25:29] Christopher David: Nice like a nice thing.

[25:31] Christopher David: That's one less thing that you need to write.

[25:34] Christopher David: Okay.

[25:36] Christopher David: Let's commit this.

[25:48] Christopher David: Initial extraction works.

[25:57] Christopher David: So next I want to upload this.

[26:02] Christopher David: I guess to our interface.

[26:05] Christopher David: Okay.

[26:12] Christopher David: I don't know if I can use the debug wasm or should we bundle it for release.

[26:25] Christopher David: Thanks.

[26:30] Christopher David: I did this tutorial.

[26:37] Christopher David: Should I bundle it for release or can I use the debug wasm file?

[26:44] Christopher David: I already made.

[26:54] Christopher David: Okay.

[26:55] Christopher David: Cargo build release target.

[27:05] Christopher David: Let's see what that does.

[27:12] Christopher David: What happened?

[27:15] Christopher David: Copy.

[27:19] Christopher David: Paste.

[27:23] Christopher David: Test that version of it.

[27:27] Christopher David: Yeah, that also worked.

[27:29] Christopher David: Okay.

[27:30] Christopher David: And then out of curiosity, let's go into our target.

[27:45] Christopher David: I was wondering if there's like a size difference between the two.

[27:49] Christopher David: So that the debug version is 24 megabytes.

[27:59] Christopher David: That's huge.

[28:02] Christopher David: And then the release version is three megabytes, which is still huge relative to the function that we're passing in.

[28:09] Christopher David: Binari size may be something we need to wrestle with at some point.

[28:12] Christopher David: I know you can get smaller binaries if you use some like lighter frame.

[28:16] Christopher David: If you use a frame works from go or whatever.

[28:19] Christopher David: Fortunately, it shouldn't matter too much because these are going to be loaded by agents.

[28:26] Christopher David: Server side.

[28:27] Christopher David: I don't know.

[28:28] Christopher David: We'll experiment with that later.

[28:30] Christopher David: Okay.

[28:31] Christopher David: Let's take our new binari and upload it.

[28:37] Christopher David: I did the same thing I did with that kind of demo wasm video.

[28:41] Christopher David: We did a number of episodes again.

[28:44] Christopher David: Let's see here plug in URL extractor.

[28:48] Christopher David: And I'm going to make a release for it.

[28:53] Christopher David: Just so I get a persistent URL.

[28:55] Christopher David: And I'm going to call this be oh.

[28:59] Christopher David: First of all, let's make sure that we have all of that pushed up.

[29:12] Christopher David: Hello.

[29:15] Christopher David: Everything up to date.

[29:21] Christopher David: All right, call this be oh.

[29:22] Christopher David: One.

[29:30] Christopher David: Give it a string.

[29:37] Christopher David: Return is string.

[29:40] Christopher David: How do I even describe it?

[29:43] Christopher David: It's like a.

[29:51] Christopher David: Array string of URLs.

[30:01] Christopher David: How would you describe its current functionality for release notes?

[30:09] Christopher David: Is this accurate?

[30:26] Christopher David: Okay, Chad, GPD.

[30:28] Christopher David: We're going to try.

[30:33] Christopher David: Publish.

[30:35] Christopher David: Oh no.

[30:38] Christopher David: Okay, there's something I have to do here.

[30:42] Christopher David: Oh, maybe I should actually drop the money I released in there.

[30:48] Christopher David: All right, so documents.

[30:53] Christopher David: I need a shortcut for code.

[30:57] Christopher David: So you got plug in URL extractor.

[30:59] Christopher David: Target.

[31:01] Christopher David: Waw isn't there doing a release.

[31:07] Christopher David: Plug in URL extractor.

[31:11] Christopher David: Oh, I see.

[31:25] Christopher David: That's right.

[31:26] Christopher David: Okay, VO1.

[31:30] Christopher David: Generate release notes.

[31:33] Christopher David: Full change log.

[31:36] Christopher David: Okay.

[31:43] Christopher David: Oh yeah.

[31:46] Christopher David: We've released a plug in everybody.

[31:48] Christopher David: This, this, this might actually freaking work.

[31:50] Christopher David: Now let's go test it.

[31:53] Christopher David: I think.

[31:58] Christopher David: I think.

[32:01] Christopher David: I'll copy a link to this.

[32:08] Christopher David: And if our code from previous videos is working,

[32:14] Christopher David: I should be able to create a plug in.

[32:18] Christopher David: Drop in the plugin URL.

[32:22] Christopher David: Type URL extractor.

[32:28] Christopher David: Let's use that same description.

[32:33] Christopher David: No fee.

[32:34] Christopher David: Oh, I'll charge you guys for this one.

[32:36] Christopher David: Create.

[32:37] Christopher David: Please work.

[32:38] Christopher David: Please work.

[32:43] Christopher David: Look at this, everybody.

[32:44] Christopher David: Just, just look at it.

[32:46] Christopher David: Just look at it.

[32:47] Christopher David: Ooh.

[32:48] Christopher David: Okay.

[32:50] Christopher David: Let's inspect just so you can monitor free and causal bullshit.

[32:53] Christopher David: Okay, let's try dropping in the same thing we did over here.

[32:58] Christopher David: Laura, maybe some, oh no.

[33:02] Christopher David: Oh no.

[33:05] Christopher David: Vim mode.

[33:08] Christopher David: Vim mode.

[33:09] Christopher David: I'm just, maybe a new, sorry.

[33:12] Christopher David: Try try.

[33:13] Christopher David: Okay, ready?

[33:14] Christopher David: Yank to be under the line.

[33:20] Christopher David: Hell yeah.

[33:21] Christopher David: Okay, let's remove the strings.

[33:28] Christopher David: The moment of truth.

[33:31] Christopher David: Ah.

[33:32] Christopher David: Okay.

[33:34] Christopher David: I error 500.

[33:35] Christopher David: Let's see what happened.

[33:48] Christopher David: Server error.

[33:50] Christopher David: Give me one second.

[33:58] Christopher David: Oh, I know it's wrong.

[34:01] Christopher David: We are, our open agents.

[34:07] Christopher David: Current implementation is only calling the count underscore vowels.

[34:15] Christopher David: Um,

[34:17] Christopher David: function.

[34:20] Christopher David: Let's quickly solve this as quickly as we can.

[34:25] Christopher David: Watch this.

[34:26] Christopher David: See the open agents.

[34:28] Christopher David: Boom.

[34:29] Christopher David: Um.

[34:31] Christopher David: In plugin.

[34:39] Christopher David: I'll give you a little tour of this.

[34:42] Christopher David: So right now, a little shortcut that we took.

[34:46] Christopher David: Why does it do that?

[34:55] Christopher David: I'm not sure if we can do that.

[35:05] Christopher David: Right now when we're calling it.

[35:09] Christopher David: Somewhere we're hard coding count vowels.

[35:23] Christopher David: I'm guessing in the.

[35:26] Christopher David: Yeah, we need to change this.

[35:30] Christopher David: I mean, we need to get it from the input.

[35:32] Christopher David: I'm not going to change all that right now.

[35:33] Christopher David: For now, I'm just going to change this to.

[35:38] Christopher David: Make sure you get it right extract underscore URLs.

[35:52] Christopher David: Okay.

[35:57] Christopher David: Plug in extract URLs, not count vowels.

[36:01] Christopher David: Okay.

[36:06] Christopher David: Not quite ready to allow a full arbitrary.

[36:11] Christopher David: Walson code execution server side, not quite ready for that.

[36:15] Christopher David: Okay, so the reason this failed is my hard coded count vowels as the name of the function.

[36:20] Christopher David: We do have the ability in that parse function to to.

[36:28] Christopher David: See if I can search for that.

[36:33] Christopher David: Yeah, my.

[36:35] Christopher David: Vim config must be.

[36:38] Christopher David: Broken because it crashes when I do a fuzzy fine.

[36:43] Christopher David: But in our plugin model.

[36:48] Christopher David: You can get the names of the functions from the parse.

[36:51] Christopher David: So we got to just kind of connect that instead of hard coding.

[36:56] Christopher David: But that should be almost done deploying.

[36:59] Christopher David: Let's check out.

[37:01] Christopher David: Open agents.

[37:11] Christopher David: Let's really enjoy our we should be checking.

[37:15] Christopher David: Okay, well, let's try it again.

[37:18] Christopher David: I'm going to refresh the page.

[37:27] Christopher David: All right, the moment of truth.

[37:30] Christopher David: Boom.

[37:31] Christopher David: We did it.

[37:34] Christopher David: Okay, given a string input this plugin scans for and extract all URLs present in the text.

[37:41] Christopher David: It then returns a JSON encoded string representing and array of the extracted URLs.

[37:55] Christopher David: It works.

[37:56] Christopher David: Okay, and so what I'll do is I'll say I'll go over back to our issue.

[38:03] Christopher David: Oops for this.

[38:07] Christopher David: Plug in number one completed.

[38:14] Christopher David: Plug in number one completed here.

[38:35] Christopher David: And testable here.

[38:39] Christopher David: This URL works.

[38:41] Christopher David: It works until we hard code change the hard code thing.

[38:47] Christopher David: All right, we will build plugin number two in the next video.

[38:50] Christopher David: See you soon.