Transcription: OpenAgents Episode 017 - Connecting the UI
June 9, 2026 ยท View on GitHub
Source: https://twitter.com/OpenAgentsInc/status/1725197866409267544 Wiki source: https://raw.githubusercontent.com/wiki/OpenAgentsInc/openagents/Video-Series.md Media title: OpenAgents - Episode 017: Connecting the UI We clean up our code and connect our u... Upload date: 20231116 Transcription model: mlx-whisper/mlx-community/whisper-tiny Generated at: 2026-06-01T20:48:21Z
Machine-generated transcript. Review speaker labels and wording before using this as quote-grade source material.
[00:00] Christopher David: Our goal for today is to replace
[00:05] Christopher David: Victoria with our own version of
[00:10] Christopher David: Chattover Docs that we built in the last couple of videos
[00:13] Christopher David: and get the full flow working.
[00:15] Christopher David: So right now, the live version we're skipping over the
[00:19] Christopher David: Doc uploading piece because we were limited on the number of
[00:23] Christopher David: different kind of knowledge bases that we could have
[00:26] Christopher David: and we built our own version.
[00:29] Christopher David: So we now want this kind of thing to be done entirely via
[00:33] Christopher David: our local implementation of this.
[00:37] Christopher David: So we'll probably do that over a few videos today.
[00:43] Christopher David: And I don't have any real strategy for this.
[00:46] Christopher David: I was playing around yesterday with trying to do a
[00:48] Christopher David: test via, I was like struggling to mock up
[00:54] Christopher David: and uploading a PDF.
[00:57] Christopher David: And we're actually not going to go that route.
[01:00] Christopher David: I will commit my horrible code.
[01:12] Christopher David: Okay, let's run our test suite.
[01:14] Christopher David: I commented on that one.
[01:16] Christopher David: And then we're just going to kind of go at it.
[01:22] Christopher David: Sometimes it's nice to kind of plan your way forward.
[01:26] Christopher David: Sometimes it's nice to just throw yourself at the goal.
[01:30] Christopher David: So we're going to do that.
[01:35] Christopher David: Most test are passing.
[01:37] Christopher David: I think sometimes we get a hang up on the embedding attempt.
[01:44] Christopher David: We need to implement retry logic on the embeddings.
[01:50] Christopher David: We diagnosed kind of what was going wrong in the past
[01:55] Christopher David: videos.
[01:56] Christopher David: Oops, and we need to remove the DDA there.
[01:59] Christopher David: But look at that beautiful embedding.
[02:02] Christopher David: See it worked once and didn't work it out.
[02:05] Christopher David: All right, let's go remove our data up there.
[02:13] Christopher David: Yeah, can ingest PDF to database as chunked embeddings.
[02:17] Christopher David: This is basically the test that we're going to be connecting the UI
[02:22] Christopher David: for.
[02:23] Christopher David: Let's review it.
[02:25] Christopher David: So given a PDF at this point, we're assuming that it's already been uploaded.
[02:32] Christopher David: We clean it up.
[02:33] Christopher David: Split it up into pages.
[02:37] Christopher David: It's got this slash F character to denote new page.
[02:44] Christopher David: We're removing our replacing all of the new line characters with space.
[02:48] Christopher David: Because it comes a web with a bunch of backslash ends, backslash Fs.
[02:52] Christopher David: And trimming leading and trailing white, white space.
[02:55] Christopher David: Can we rate that into an array?
[02:57] Christopher David: We're passing that to our queen bee, which is our worker or our job
[03:02] Christopher David: orchestrator that's our opening eye compatible endpoint.
[03:08] Christopher David: Creating an embedding, passing that array of PDF chunks.
[03:12] Christopher David: We're getting back the embeddings for each.
[03:20] Christopher David: And then we are creating, I said,
[03:23] Christopher David: don't know what this query thing is.
[03:26] Christopher David: We're storing those in the database with the text next to the embedding.
[03:33] Christopher David: So we can do look up Slater and note the text is.
[03:36] Christopher David: And expecting us to have a number of the embeddings in our database to match the number of chunks.
[03:43] Christopher David: And that's all working.
[03:50] Christopher David: So let's pick up where we left off on the local application.
[03:57] Christopher David: Okay, we do have file upload working, I think.
[04:03] Christopher David: Actually, let's see what happens when we upload a file here.
[04:12] Christopher David: Demo PDF softbox.
[04:25] Christopher David: Let's actually step through exactly what happens.
[04:33] Christopher David: So we have the upload doc form.
[04:40] Christopher David: That's how we just make a list so we can remind ourselves.
[04:48] Christopher David: Let's start.
[04:51] Christopher David: Page renders and upload doc form.
[05:02] Christopher David: That posts a file.
[05:08] Christopher David: And that posts an inputted.
[05:11] Christopher David: That takes an inputted PDF.
[05:15] Christopher David: And posts to API files.
[05:19] Christopher David: And then you can see the file.
[05:24] Christopher David: And then you can see the file.
[05:27] Christopher David: And then you can see the file.
[05:30] Christopher David: And then you can see the file.
[05:33] Christopher David: And then you can see the file.
[05:36] Christopher David: And then you can see the file.
[05:39] Christopher David: And then you can see the file.
[05:42] Christopher David: And then you can see the file.
[05:44] Christopher David: And then you can see the file.
[05:48] Christopher David: Validate it.
[05:50] Christopher David: Grab the file store the file.
[05:53] Christopher David: Now here we go.
[05:54] Christopher David: Creative.
[05:55] Christopher David: Creative.
[06:02] Christopher David: Okay, we started commenting this stuff.
[06:04] Christopher David: That's where we left off.
[06:06] Christopher David: Remove the vector code.
[06:08] Christopher David: Sorry, Victor.
[06:09] Christopher David: I think you for helping us test.
[06:18] Christopher David: Ordinarily I would drive this out with TDD, but I was having some struggling.
[06:21] Christopher David: Struggling yesterday to kind of mock the full flow because ordinarily with TDD,
[06:26] Christopher David: you would create like a mock PDF to test that your file.
[06:29] Christopher David: A load and points work and we have test to do that in our upload file test.
[06:34] Christopher David: But to test the full flow, we can't just create a mock PDF because we actually have to chunk it up.
[06:42] Christopher David: So it has to have actual text content.
[06:45] Christopher David: And so let's like if you ever get to a point where just thinking about how to test something like start to making you crazy.
[06:50] Christopher David: Like like that's a good sign to kind of skip it or revisit it later.
[06:57] Christopher David: So let's just kind of think about this.
[07:02] Christopher David: What do we need this to do?
[07:06] Christopher David: About any as a PDF or mark down or text plain.
[07:20] Christopher David: I think for now I just want to force that to be a PDF.
[07:34] Christopher David: We're thinking only in terms of PDF.
[07:36] Christopher David: So let's do that.
[08:03] Christopher David: Now I don't know if I want to redefine file here.
[08:16] Christopher David: After we store the file, what should we do?
[08:19] Christopher David: Well, we should do this.
[08:32] Christopher David: Actually, the parsing we should not do synchronously.
[08:38] Christopher David: We should do that in a background job.
[08:49] Christopher David: And that would be something we get tested.
[08:57] Christopher David: So if we were to just copy paste this logic there, then it would wait for all of that to complete before sending back to response.
[09:08] Christopher David: We don't want that.
[09:10] Christopher David: We want a quick like response like.
[09:18] Christopher David: We're probably going to want it to be a job, but maybe we should just do the simplest thing first.
[09:21] Christopher David: Maybe we should do some copy pasta.
[09:26] Christopher David: But I also don't really want all of that stuff.
[09:29] Christopher David: I kind of want this to be.
[09:31] Christopher David: It's behind a class.
[09:57] Christopher David: So right now, this is returning back to the same page.
[09:59] Christopher David: Let's just keep following the logic through.
[10:04] Christopher David: We'll do a tax for what hasn't been built yet.
[10:06] Christopher David: That takes an input at PDF and post API files for all control of store.
[10:12] Christopher David: Store method.
[10:15] Christopher David: File controller store method validates.
[10:20] Christopher David: It's a PDF stores it in Lair of L storage.
[10:27] Christopher David: Then what needs to do is parse the PDF into embeddings.
[10:34] Christopher David: So it can be search over.
[10:39] Christopher David: And like, you know, associated with the user.
[10:44] Christopher David: Save the end being.
[10:47] Christopher David: Redirect back start page with.
[10:54] Christopher David: With.
[11:03] Christopher David: Message file uploaded.
[11:06] Christopher David: Found name.
[11:09] Christopher David: Yeah, the file.
[11:18] Christopher David: So.
[11:27] Christopher David: So.
[11:37] Christopher David: So.
[11:45] Christopher David: So.
[11:55] Christopher David: So.
[12:00] Christopher David: So.
[12:05] Christopher David: So.
[12:15] Christopher David: Okay, let's do this.
[12:32] Christopher David: I want to move all this logic out of this test.
[12:38] Christopher David: Into a parse.
[12:41] Christopher David: Method.
[12:42] Christopher David: So.
[12:46] Christopher David: So.
[12:52] Christopher David: So.
[12:55] Christopher David: So.
[13:00] Christopher David: So.
[13:05] Christopher David: So.
[13:11] Christopher David: So.
[13:15] Christopher David: So.
[13:20] Christopher David: So.
[13:25] Christopher David: So.
[13:30] Christopher David: So.
[13:33] Christopher David: So.
[13:37] Christopher David: So.
[13:42] Christopher David: So.
[13:47] Christopher David: So.
[13:51] Christopher David: So.
[13:55] Christopher David: So.
[14:00] Christopher David: So.
[14:04] Christopher David: So.
[14:14] Christopher David: So.
[14:19] Christopher David: So.
[14:24] Christopher David: So.
[14:29] Christopher David: So.
[14:33] Christopher David: So.
[14:38] Christopher David: So.
[14:43] Christopher David: So.
[14:48] Christopher David: So.
[14:53] Christopher David: So.
[14:56] Christopher David: So.
[15:01] Christopher David: So.
[15:11] Christopher David: So.
[15:13] Christopher David: So.
[15:14] Christopher David: So.
[15:14] Christopher David: So.
[15:14] Christopher David: So.
[15:15] Christopher David: So.
[15:16] Christopher David: So.
[15:18] Christopher David: So.
[15:19] Christopher David: So.
[15:20] Christopher David: So.
[15:22] Christopher David: So.
[15:24] Christopher David: So.
[15:24] Christopher David: So.
[15:26] Christopher David: So.
[15:26] Christopher David: So.
[15:29] Christopher David: So.
[15:33] Christopher David: So.
[15:38] Christopher David: So.
[15:40] Christopher David: So.
[15:42] Christopher David: So.
[15:43] Christopher David: So.
[15:45] Christopher David: So.
[15:47] Christopher David: So.
[15:49] Christopher David: So.
[15:51] Christopher David: So.
[15:54] Christopher David: So.
[15:55] Christopher David: So.
[16:05] Christopher David: So.
[16:10] Christopher David: So.
[16:15] Christopher David: So.
[16:20] Christopher David: So.
[16:21] Christopher David: So.
[16:23] Christopher David: So it's expecting this tax to be a thing now.
[16:27] Christopher David: I don't know what this thing is.
[16:30] Christopher David: So.
[16:36] Christopher David: So.
[16:37] Christopher David: So.
[16:38] Christopher David: So.
[16:41] Christopher David: So.
[16:42] Christopher David: So.
[16:44] Christopher David: So.
[16:46] Christopher David: So.
[16:49] Christopher David: So.
[16:50] Christopher David: So.
[16:51] Christopher David: So.
[16:52] Christopher David: So.
[16:55] Christopher David: So.
[16:57] Christopher David: So.
[16:58] Christopher David: So.
[17:00] Christopher David: So.
[17:02] Christopher David: So.
[17:03] Christopher David: So.
[17:05] Christopher David: So.
[17:06] Christopher David: So.
[17:07] Christopher David: So.
[17:08] Christopher David: So.
[17:09] Christopher David: So.
[17:10] Christopher David: So.
[17:11] Christopher David: So.
[17:12] Christopher David: So.
[17:13] Christopher David: So.
[17:14] Christopher David: So.
[17:15] Christopher David: So.
[17:16] Christopher David: So.
[17:17] Christopher David: So.
[17:18] Christopher David: So.
[17:19] Christopher David: So.
[17:20] Christopher David: So.
[17:21] Christopher David: So.
[17:24] Christopher David: So.
[17:25] Christopher David: So.
[17:27] Christopher David: So.
[17:28] Christopher David: So.
[17:30] Christopher David: So.
[17:31] Christopher David: So.
[17:32] Christopher David: So.
[17:33] Christopher David: So.
[17:34] Christopher David: So.
[17:36] Christopher David: So.
[17:37] Christopher David: So.
[17:38] Christopher David: So.
[17:39] Christopher David: So.
[17:40] Christopher David: So.
[17:41] Christopher David: So.
[17:42] Christopher David: So.
[17:44] Christopher David: So.
[17:45] Christopher David: So.
[17:46] Christopher David: So.
[17:47] Christopher David: So.
[17:48] Christopher David: So.
[17:49] Christopher David: So.
[17:50] Christopher David: So.
[17:54] Christopher David: So.
[17:55] Christopher David: So.
[17:57] Christopher David: So.
[17:58] Christopher David: So.
[18:00] Christopher David: So.
[18:01] Christopher David: So.
[18:02] Christopher David: So.
[18:03] Christopher David: So.
[18:04] Christopher David: So.
[18:05] Christopher David: So.
[18:06] Christopher David: So.
[18:07] Christopher David: So.
[18:08] Christopher David: So.
[18:09] Christopher David: So.
[18:10] Christopher David: So.
[18:11] Christopher David: So.
[18:12] Christopher David: So.
[18:13] Christopher David: So.
[18:14] Christopher David: So.
[18:15] Christopher David: So.
[18:16] Christopher David: So.
[18:17] Christopher David: So.
[18:18] Christopher David: So.
[18:20] Christopher David: So.
[18:22] Christopher David: So.
[18:23] Christopher David: So.
[18:24] Christopher David: So.
[18:25] Christopher David: So.
[18:26] Christopher David: So.
[18:27] Christopher David: So.
[18:28] Christopher David: So.
[18:29] Christopher David: So.
[18:30] Christopher David: So.
[18:31] Christopher David: So.
[18:32] Christopher David: So.
[18:33] Christopher David: So.
[18:34] Christopher David: So.
[18:35] Christopher David: So.
[18:36] Christopher David: So.
[18:37] Christopher David: So.
[18:38] Christopher David: So.
[18:39] Christopher David: So.
[18:40] Christopher David: So.
[18:41] Christopher David: So.
[18:42] Christopher David: So.
[18:43] Christopher David: So.
[18:44] Christopher David: So.
[18:45] Christopher David: So.
[18:46] Christopher David: So.
[18:47] Christopher David: So.
[18:49] Christopher David: So.
[18:50] Christopher David: So.
[18:51] Christopher David: So.
[18:52] Christopher David: So.
[18:53] Christopher David: So.
[18:54] Christopher David: So.
[18:55] Christopher David: So.
[18:56] Christopher David: So.
[18:57] Christopher David: So.
[18:58] Christopher David: So.
[18:59] Christopher David: So.
[19:00] Christopher David: So.
[19:01] Christopher David: So.
[19:02] Christopher David: So.
[19:03] Christopher David: So.
[19:04] Christopher David: So.
[19:05] Christopher David: So.
[19:06] Christopher David: So.
[19:07] Christopher David: So.
[19:08] Christopher David: So.
[19:09] Christopher David: So.
[19:10] Christopher David: So.
[19:11] Christopher David: So.
[19:12] Christopher David: So.
[19:13] Christopher David: So.
[19:15] Christopher David: So.
[19:16] Christopher David: So.
[19:17] Christopher David: So.
[19:18] Christopher David: So.
[19:19] Christopher David: So.
[19:20] Christopher David: So.
[19:21] Christopher David: So.
[19:22] Christopher David: So.
[19:23] Christopher David: So.
[19:24] Christopher David: So.
[19:25] Christopher David: So.
[19:26] Christopher David: So.
[19:27] Christopher David: So.
[19:28] Christopher David: So.
[19:29] Christopher David: So.
[19:30] Christopher David: So.
[19:31] Christopher David: So.
[19:32] Christopher David: So.
[19:33] Christopher David: So.
[19:34] Christopher David: So.
[19:35] Christopher David: So.
[19:36] Christopher David: So.
[19:37] Christopher David: So.
[19:38] Christopher David: So.
[19:39] Christopher David: So.
[19:40] Christopher David: So.
[19:41] Christopher David: So.
[19:42] Christopher David: So.
[19:43] Christopher David: So.
[19:44] Christopher David: So.
[19:45] Christopher David: So.
[19:46] Christopher David: So.
[19:48] Christopher David: So.
[19:49] Christopher David: So.
[19:50] Christopher David: So.
[19:51] Christopher David: So.
[19:52] Christopher David: So.
[19:53] Christopher David: So.
[19:55] Christopher David: So.
[19:56] Christopher David: So.
[19:57] Christopher David: So.
[19:58] Christopher David: So.
[19:59] Christopher David: So.
[20:00] Christopher David: So.
[20:01] Christopher David: So.
[20:02] Christopher David: So.
[20:03] Christopher David: So.
[20:04] Christopher David: So.
[20:05] Christopher David: So.
[20:06] Christopher David: So.
[20:07] Christopher David: So.
[20:08] Christopher David: So.
[20:09] Christopher David: So.
[20:10] Christopher David: So.
[20:11] Christopher David: So.
[20:12] Christopher David: So.
[20:13] Christopher David: So.
[20:14] Christopher David: So.
[19:59] Christopher David: I don't know what chunks are.
[20:13] Christopher David: So I need to return here the chunks in the embeddings.
[20:29] Christopher David: The count of...
[20:37] Christopher David: Parson chunks.
[21:00] Christopher David: Buya test pass.
[21:03] Christopher David: Alright, let's clean this up.
[21:12] Christopher David: So we will call that...
[21:21] Christopher David: Move parts logic out from ingest test to parser.
[21:32] Christopher David: Now we just need this path to be passed a parse PDF in our file controller.
[21:43] Christopher David: I think this is what we want here.
[21:51] Christopher David: So we're going to try here is...
[21:57] Christopher David: Use app services parser.
[22:04] Christopher David: This is a parse parser.
[22:12] Christopher David: Pass.
[22:27] Christopher David: Yeah, that might be it.
[22:41] Christopher David: Clean this up a bit.
[23:11] Christopher David: And we break any of our other tests.
[23:18] Christopher David: Specifically the upload tests.
[23:29] Christopher David: Yes, alright now.
[23:34] Christopher David: Do the gateway of create embeddings.
[23:44] Christopher David: If this times out, it hangs.
[23:51] Christopher David: Oops.
[23:57] Christopher David: I'm going to find a Rake E1.
[24:16] Christopher David: Yeah, it works sometimes.
[24:22] Christopher David: I wonder if there's a way to automatically do some retry logic.
[24:28] Christopher David: Let's try to do that real quick before we test the client side.
[24:35] Christopher David: Let's go ask our good friend, chatty, GPT.
[24:45] Christopher David: For quests, some of my requests here to that embeddings endpoint time out.
[24:59] Christopher David: And it takes 30 seconds to know.
[25:04] Christopher David: I want to do faster retries.
[25:11] Christopher David: Wait, three seconds.
[25:16] Christopher David: And if it has not responded, retry again up to a maximum of 10 tries.
[25:22] Christopher David: Please re-factor the code accordingly.
[25:34] Christopher David: I'm going to do a quick retry.
[25:48] Christopher David: Obviously hard coding token is a note up.
[25:51] Christopher David: And we're just going to clarify demo mode.
[25:54] Christopher David: But swap that out with an environment very well soon.
[26:04] Christopher David: Hopefully I can just copy past of this.
[26:30] Christopher David: Let's see if it works.
[26:45] Christopher David: It's slow.
[26:47] Christopher David: And it works.
[26:50] Christopher David: It's fast if it works right away.
[26:53] Christopher David: I'm okay with it taking a little bit longer.
[27:00] Christopher David: And until we debug it on the cleanb side.
[27:08] Christopher David: Awesome.
[27:13] Christopher David: We're still doing this asynchronously.
[27:20] Christopher David: So in our file controller, we're not returning a response until this process is done.
[27:28] Christopher David: We're just going to want this to be an asynchronous process.
[27:33] Christopher David: Like done via a layer of help job.
[27:37] Christopher David: So we can not block.
[27:40] Christopher David: But this is fine for now.
[27:45] Christopher David: And you know it might even work.
[27:59] Christopher David: Let's see.
[28:12] Christopher David: You can see the progress bar at the top.
[28:20] Christopher David: We're going to make a nicer progress bar.
[28:28] Christopher David: It's doing something.
[28:34] Christopher David: We're going to delete everything in our storage.
[28:46] Christopher David: Except for OSY.
[28:51] Christopher David: We'll keep that one.
[29:01] Christopher David: We'll see it there.
[29:11] Christopher David: We'll also go to our local database.
[29:15] Christopher David: Let's do PHP artisan.
[29:20] Christopher David: PHP artisan.
[29:27] Christopher David: So we now have a fresh empty database.
[29:34] Christopher David: And I'm now going to here.
[29:37] Christopher David: And I'm going to upload our soft bots PDF.
[29:47] Christopher David: We're loading.
[29:58] Christopher David: There it is.
[30:10] Christopher David: And we check our embeddings and oh yes.
[30:20] Christopher David: Now we have six embeddings.
[30:27] Christopher David: Oh, this is only a six page paper.
[30:32] Christopher David: So we have embeddings for our PDF.
[30:35] Christopher David: That is really cool.
[30:37] Christopher David: Done by our queen B.
[30:39] Christopher David: Our queen B worker B.
[30:41] Christopher David: Okay.
[30:44] Christopher David: I want to push this up, but we have not installed PG vector on our remote database.
[30:54] Christopher David: We got to see.
[31:13] Christopher David: I still call more things.
[31:15] Christopher David: One thing I want to do, I'm going to redo all this.
[31:17] Christopher David: PHP artisans serve.
[31:20] Christopher David: People are in dev.
[31:23] Christopher David: In Russia has like a nicer progress bar.
[31:30] Christopher David: And actually, I think I had this in the previous code base.
[31:41] Christopher David: I don't want the progress bar to be gray.
[31:54] Christopher David: Let's do this.
[31:59] Christopher David: And see if there's anything else we need to do for that.
[32:06] Christopher David: And then there's progress indicators.
[32:11] Christopher David: Since the network was maybe XHR, there would typically not be a browser loading indicator when navigating from one page to another.
[32:16] Christopher David: To solve this, and there's just a progress indicator at the top of the page whenever you make an inertia visit.
[32:21] Christopher David: Of course, if you prefer, you can disable it blah, blah, blah, blah, blah, blah.
[32:26] Christopher David: In progress, library.
[32:31] Christopher David: You can customize it blah, blah, blah.
[32:35] Christopher David: Okay, let's see if that worked.
[32:44] Christopher David: Oh yeah.
[32:46] Christopher David: Oh, that's so nice.
[32:47] Christopher David: Look at that.
[32:48] Christopher David: Top right, spinny spinning on brand color.
[33:05] Christopher David: So what I might do on here is if we're uploading.
[33:36] Christopher David: Let's do a new use date for constant uploading set uploading.
[33:54] Christopher David: Here we're going to do set uploading true.
[34:00] Christopher David: Here we're going to do set uploading false.
[34:13] Christopher David: Oh, props dot progress.
[34:21] Christopher David: Let's do this.
[34:22] Christopher David: Let's upload a new set uploading.
[34:34] Christopher David: Progress.
[34:35] Christopher David: Progress.
[34:38] Christopher David: That did not show up.
[34:49] Christopher David: I'm guessing because that's only for the actual upload of the file to the server and not the processing.
[34:57] Christopher David: And when I'm doing it on the local host, there's no time to upload.
[35:05] Christopher David: I actually don't know quite about that.
[35:13] Christopher David: But what part do I want to replace if it is?
[35:27] Christopher David: Yeah.
[35:28] Christopher David: So if we do, if we're not uploading, then show all this stuff.
[35:40] Christopher David: We are uploading.
[35:47] Christopher David: Show.
[35:56] Christopher David: Wow.
[36:04] Christopher David: Don't tell me that worked.
[36:10] Christopher David: Let's wipe the database one more time.
[36:15] Christopher David: PHP, Artisan, Migrate, Fresh.
[36:42] Christopher David: Wow.
[37:06] Christopher David: Fresh.
[37:18] Christopher David: Let's make that look prettier.
[37:24] Christopher David: Let's make what's.
[37:43] Christopher David: Very low spinners.
[38:13] Christopher David: Where is.
[38:29] Christopher David: Let's do this.
[38:39] Christopher David: Maybe.
[39:01] Christopher David: There we go.
[39:05] Christopher David: That's a good idea.
[39:50] Christopher David: You upload a PDF.
[39:59] Christopher David: for the embeddings, save the embeddings to the database.
[40:03] Christopher David: Now we are ready to ask questions about the document.
[40:06] Christopher David: So in the next video we will implement the querying
[40:11] Christopher David: and you know today we will have chat
[40:14] Christopher David: over the doc working on our live website using
[40:18] Christopher David: only local and GPUtopious warm to power the embeddings
[40:22] Christopher David: with no third party services.
[40:24] Christopher David: Practical, Jason.