Build Your Own AI Personal Assistant in TypeScript
Course description
Large language models (LLM) are incredibly powerful, especially for tasks that are difficult to formalize: analyzing disparate information, task prioritization, meeting preparation, finding lost context in correspondence, and automating routine tasks. However, universal chatbots do not fully unlock this potential: they do not use your data, do not remember your preferences, do not adapt to your workflows, and remain a "black box."
In this course, you will learn how to create your own personal AI assistant in TypeScript—a fully managed system that works with your data, remembers context, utilizes tools through API, and always stays under your control. You will understand why the key value lies not in the model itself, but in the system architecture: data retrieval, memory, context management, agent scripts, validation, and security.
Read more about the course
In 5 days of intensive practice, you will implement from scratch:
- an intelligent search on your own data (BM25, semantic search, RRF, query rewriting);
- an advanced memory system (semantic and episodic memory);
- quality and reliability assessment of responses through automatic eval mechanisms;
- safe interaction with tools and API with human-in-the-loop confirmations.
As a result, you will have a ready-to-use, expandable personal AI assistant that:
- works with large volumes of data;
- learns from your preferences;
- can perform actions safely;
- is not tied to a specific model.
Apart from the ready assistant, you will gain fundamental skills in modern AI engineering, which can be applied to create any custom LLM systems—for work, business, and personal projects.
Watch Online
All Course Lessons (113)
| # | Lesson Title | Duration | Access |
|---|---|---|---|
| 1 | 001 Course Overview Demo | 02:08 | |
| 2 | 002 Skill Building Vs. Project | 00:47 | |
| 3 | 003 How to Do Skill Building Exercises | 02:42 | |
| 4 | 004 Project Repo Intro | 03:56 | |
| 5 | 005 How to Do The Project Exercises | 04:43 | |
| 6 | 006 Getting Model Keys | 01:32 | |
| 7 | 007 Introduction to Discord | 01:47 | |
| 8 | 008 What to Do Now | 01:10 | |
| 9 | 009 Retrieval Introduction | 03:01 | |
| 10 | 010 Overview of the BM25 Algorithm | 03:48 | |
| 11 | 011 Retrieval with BM25 | 01:20 | |
| 12 | 012 Retrieval with BM25 solution | 01:53 | |
| 13 | 013 Replacing BM25 with Embeddings | 04:13 | |
| 14 | 014 Replacing BM25 with Embeddings solution | 01:32 | |
| 15 | 015 Rank Fusion | 03:06 | |
| 16 | 016 Query Rewriting | 01:45 | |
| 17 | 017 Query Rewriting solution | 01:48 | |
| 18 | 018 Building Your Own Dataset | 01:42 | |
| 19 | 019 Intro to Building a Search Algorithm | 00:53 | |
| 20 | 020 Adding BM25 Search | 01:52 | |
| 21 | 021 Caching Embeddings | 02:23 | |
| 22 | 022 Searching with Embeddings | 01:08 | |
| 23 | 023 Combining Results with Reciprocal Rank Fusion | 01:29 | |
| 24 | 024 Intro to Adding Search Tool to Agent | 00:21 | |
| 25 | 025 Search Tool | 02:23 | |
| 26 | 026 Context Engineering Search Tool | 01:14 | |
| 27 | 027 Chunking Intro | 01:33 | |
| 28 | 028 Fixed Size Chunks | 02:53 | |
| 29 | 029 Structural Chunking | 02:06 | |
| 30 | 030 Structural Chunking Solution | 02:37 | |
| 31 | 031 Retrieval with Chunks | 01:43 | |
| 32 | 032 Reranking | 02:14 | |
| 33 | 033 Reranking Solution | 02:17 | |
| 34 | 034 Chunking Emails Playground Intro | 00:22 | |
| 35 | 035 Abstracted Embeddings Cache | 01:30 | |
| 36 | 036 Adding the Text Splitter | 01:21 | |
| 37 | 037 Applying Chunking to Search Algorithms | 02:09 | |
| 38 | 038 Reranking and Chunking in Search Tool Intro | 00:25 | |
| 39 | 039 Adding the Reranker | 01:44 | |
| 40 | 040 Giving the Reranker More Context | 02:21 | |
| 41 | 041 Viewing Tool Calls in the Frontend | 02:22 | |
| 42 | 042 Custom Filter Tools Intro | 00:45 | |
| 43 | 043 Added Filter Emails Tool | 03:29 | |
| 44 | 044 Displayed Filter Tools in Frontend | 00:41 | |
| 45 | 045 Metadata First Retrieval Pattern Intro | 00:48 | |
| 46 | 046 Make Search Only Provide Metadata | 04:13 | |
| 47 | 047 Including Whole Threads | 02:29 | |
| 48 | 048 Basic Memory Setup | 02:51 | |
| 49 | 049 Basic Memory Setup Solution | 02:10 | |
| 50 | 050 Updating Previous Memories | 01:52 | |
| 51 | 051 Updating Previous Memories Solution | 02:49 | |
| 52 | 052 Memory as Tool Call | 01:34 | |
| 53 | 053 Memory as Tool Call Solution | 03:05 | |
| 54 | 054 Semantic Recall on Memories | 02:26 | |
| 55 | 055 Intro to Semantic Recall on Memories | 00:42 | |
| 56 | 056 Made Embedding Functions Generic | 01:48 | |
| 57 | 057 Added Memory Search Function | 02:50 | |
| 58 | 058 Added Memories to the Agent | 01:25 | |
| 59 | 059 Added Memory Extraction | 02:05 | |
| 60 | 060 Fixed System Prompt | 01:29 | |
| 61 | 061 Intro to Working Memory via Message Embeddings | 01:01 | |
| 62 | 062 Make Chat API Receive One Message | 02:03 | |
| 63 | 063 Added Search Messages Function | 01:01 | |
| 64 | 064 Implemented Working Memory | 01:54 | |
| 65 | 065 Intro to Episodic Memory from Conversations | 01:11 | |
| 66 | 066 Storing Chat Summaries | 01:21 | |
| 67 | 067 Added the reflectOnThat Function | 01:58 | |
| 68 | 068 Searching for Related Chats | 00:49 | |
| 69 | 069 Working Episodic Memory Setup | 02:47 | |
| 70 | 070 Evaluating Tool Call Agents | 02:33 | |
| 71 | 071 Evaluating Tool Call Agents Solution | 01:37 | |
| 72 | 072 Implementing a Deterministic Tool Call Scorer | 01:31 | |
| 73 | 073 Implementing a Deterministic Tool Call Scorer Solution | 01:05 | |
| 74 | 074 Using Evalite Each for A_B Testing | 01:07 | |
| 75 | 075 Using Evalite Each for A_B Testing Solution | 01:52 | |
| 76 | 076 Adversarial Inputs | 01:09 | |
| 77 | 077 Adversarial Inputs Solution | 01:48 | |
| 78 | 078 Creating a Clarifying Questions Tool | 01:36 | |
| 79 | 079 Creating a Clarifying Questions Tool Solution | 01:45 | |
| 80 | 080 Intro to Evaluating Memory Extraction | 00:24 | |
| 81 | 081 Make extractMemories Testable | 01:02 | |
| 82 | 082 Added createUIMessageFixture | 01:24 | |
| 83 | 083 Scaffold Eval | 02:13 | |
| 84 | 084 Added Dataset | 01:59 | |
| 85 | 085 Added answerCorrectness Scorer | 04:20 | |
| 86 | 086 Moved to answerSimilarity | 01:56 | |
| 87 | 087 Intro to Evaluating End to End Agent | 01:04 | |
| 88 | 088 Moved Agent Into Its Own File | 01:33 | |
| 89 | 089 Scaffolding the Eval | 02:08 | |
| 90 | 090 Customized Evalite's UI | 01:13 | |
| 91 | 091 Added Answer Correctness Scorer | 01:43 | |
| 92 | 092 Adding Multi-Hop and Filtering Queries | 02:34 | |
| 93 | 093 Human in the Loop Intro | 01:11 | |
| 94 | 094 Initiating Human in the Loop Requests | 02:12 | |
| 95 | 095 Initiating Human in the Loop Requests Solution | 00:51 | |
| 96 | 096 Approving Human in the Loop Requests | 03:33 | |
| 97 | 097 Converting Custom Data Parts For The LLM | 01:27 | |
| 98 | 098 Converting Custom Data Parts For The LLM Solution | 01:01 | |
| 99 | 099 Processing Human in the Loop Requests | 02:53 | |
| 100 | 100 Processing Human in the Loop Requests Solution | 01:29 | |
| 101 | 101 Executing the Human in the Loop Requests | 01:57 | |
| 102 | 102 Executing the Human in the Loop Requests Solution | 02:28 | |
| 103 | 103 Intro to Building the Destructive Tools | 01:45 | |
| 104 | 104 Hooked Up Zapier MCP | 02:21 | |
| 105 | 105 Removed Unwanted Tools | 02:04 | |
| 106 | 106 Added Local Definitions | 02:16 | |
| 107 | 107 Intro to Build the Human in the Loop Harness | 00:15 | |
| 108 | 108 HITL on the Backend | 04:21 | |
| 109 | 109 HITL on the Frontend | 02:53 | |
| 110 | 110 Intro to Filtering Tool Groups on the Frontend | 02:15 | |
| 111 | 111 Added Types and Helper Functions | 02:19 | |
| 112 | 112 Implemented App Tagging on Frontend | 01:52 | |
| 113 | 113 Implemented App Tagging on Backend | 02:00 |
Unlock unlimited learning
Get instant access to all 112 lessons in this course, plus thousands of other premium courses. One subscription, unlimited knowledge.
Learn more about subscription
Want to join the conversation?
Sign in to comment