<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Rami's Data Newsletter]]></title><description><![CDATA[A weekly curated update on data science and engineering topics and resources]]></description><link>https://ramikrispin.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!M-EE!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99852d65-3983-4d8e-b04f-2e6d902beab9_1280x1280.png</url><title>Rami&apos;s Data Newsletter</title><link>https://ramikrispin.substack.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 04 Nov 2026 19:13:03 GMT</lastBuildDate><atom:link href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Ffeed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Rami Krispin]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[ramikrispin@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[ramikrispin@substack.com]]></itunes:email><itunes:name><![CDATA[Rami Krispin]]></itunes:name></itunes:owner><itunes:author><![CDATA[Rami Krispin]]></itunes:author><googleplay:owner><![CDATA[ramikrispin@substack.com]]></googleplay:owner><googleplay:email><![CDATA[ramikrispin@substack.com]]></googleplay:email><googleplay:author><![CDATA[Rami Krispin]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Introduction to Machine Learning from Scratch]]></title><description><![CDATA[Understand the series approach, choose NumPy, MLX, or base R, and follow the path from numerical foundations to machine learning models]]></description><link>https://ramikrispin.substack.com/p/introduction-to-machine-learning</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/introduction-to-machine-learning</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Wed, 04 Nov 2026 04:23:15 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21B2QB%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fc6449a45-9753-4e0e-8468-2c5dd1c44661_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Machine learning continues to solve everyday problems, from forecasting demand to detecting spam and predicting prices. AI tools make it easier to write the code and fit a model, but getting useful results still requires knowing what to ask, what to evaluate, and what to change when performance falls short. In this series, we will explore the functionality and properties of core machine learning algorithms and learn how they work by building them from scratch. By connecting the mathematics to the code, we will build the understanding needed to choose suitable models, diagnose problems, and use machine learning libraries and AI tools more effectively.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><p>We will develop each concept step by step, connecting the underlying mathematics to an implementation we can inspect and experiment with. We will demonstrate the algorithms in both Python, using MLX and NumPy, and R, using base R. We will share the concepts and examples across all three implementations, so you can follow the approach that fits your background or compare implementations across tools. Along the way, we will write the calculations that train each model and produce predictions, using numerical building blocks instead of ready-made model-fitting functions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21B2QB%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fc6449a45-9753-4e0e-8468-2c5dd1c44661_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!B2QB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6449a45-9753-4e0e-8468-2c5dd1c44661_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!B2QB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6449a45-9753-4e0e-8468-2c5dd1c44661_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!B2QB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6449a45-9753-4e0e-8468-2c5dd1c44661_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!B2QB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6449a45-9753-4e0e-8468-2c5dd1c44661_1672x941.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21B2QB%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fc6449a45-9753-4e0e-8468-2c5dd1c44661_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6449a45-9753-4e0e-8468-2c5dd1c44661_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1616735,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/223424152?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6449a45-9753-4e0e-8468-2c5dd1c44661_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!B2QB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6449a45-9753-4e0e-8468-2c5dd1c44661_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!B2QB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6449a45-9753-4e0e-8468-2c5dd1c44661_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!B2QB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6449a45-9753-4e0e-8468-2c5dd1c44661_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!B2QB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6449a45-9753-4e0e-8468-2c5dd1c44661_1672x941.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Why build from scratch?</strong></h2><p>Machine learning libraries can hide much of what happens between providing data and receiving a prediction. By building an algorithm from scratch, we can inspect its core components: how it represents data, measures error, learns its parameters, and produces predictions. This gives us a clearer view of how the mathematics translates into the algorithm&#8217;s behavior.</p><p>That visibility helps us understand what affects the algorithm&#8217;s performance and which changes may improve its results. We can also examine its assumptions, identify the types of problems it handles effectively, and recognize the conditions in which it may perform poorly or fail.</p><p>Building from scratch does not mean recreating every numerical operation. We will use building blocks such as arrays, matrix multiplication, and equation solvers. However, we will implement the logic that trains each model and produces its predictions instead of delegating those steps to ready-made model-fitting functions.</p><h2><strong>From data to a prediction</strong></h2><p>Consider a dataset of apartments. Each apartment is an <strong>observation</strong>. Its floor area is an input <strong>feature</strong>, and its monthly rent is the <strong>target</strong> we want to predict. A <strong>model</strong> describes a relationship between the input and the prediction.</p><p>A simple model predicts rent by multiplying area by a slope and adding an intercept. The slope and intercept are its <strong>parameters</strong>. With an illustrative slope of 20 and intercept of 500, an area of 50 square meters gives a predicted monthly rent of 1,500 currency units: 20 &#215; 50 + 500. This calculation applies chosen parameters; it does not tell us how to choose them.</p><p><strong>Training</strong>, or fitting, uses data to determine parameters. A <strong>loss function</strong> quantifies prediction errors and gives us an objective for fitting. <strong>Prediction</strong> applies the fitted model to inputs. <strong>Evaluation</strong> checks how useful its results are, including on observations held out from fitting. Small training errors alone do not establish that it will predict new rents well.</p><p>Learning from inputs paired with targets is <strong>supervised learning</strong>. Predicting a numerical value is regression; predicting a category, such as whether an email is spam, is classification. <strong>Unsupervised learning</strong> looks for structure without supplied target labels. Clustering apartments by their features is one example. These distinctions are covered in <a href="iframe.php?url=https%3A%2F%2Fdevelopers.google.com%2Fmachine-learning%2Fintro-to-ml%2Fwhat-is-ml">Google&#8217;s introduction to machine learning</a>.</p><h2><strong>One article, three implementation tracks</strong></h2><p>Each coding tutorial will pair one shared article with three implementations, so we can follow one track without learning three tools at once.</p><ul><li><p><strong>Python with <a href="iframe.php?url=https%3A%2F%2Fnumpy.org%2Fdoc%2Fstable%2Fuser%2Fwhatisnumpy.html">NumPy</a>:</strong> NumPy provides arrays and numerical operations, making this a natural starting point for readers familiar with Python.</p></li><li><p><strong>Python with <a href="iframe.php?url=https%3A%2F%2Fml-explore.github.io%2Fmlx%2Fbuild%2Fhtml%2Findex.html">MLX</a>:</strong> MLX is Apple ML Research&#8217;s array framework and provides another Python path for exploring the same algorithms.</p></li><li><p><strong><a href="iframe.php?url=https%3A%2F%2Fwww.r-project.org%2Fabout.html">Base R</a>:</strong> Base R provides built-in vectors, matrices, and functions for readers familiar with R.</p></li></ul><p>For setup, start with the <a href="iframe.php?url=https%3A%2F%2Fnumpy.org%2Finstall%2F">NumPy installation guide</a>, <a href="iframe.php?url=https%3A%2F%2Fml-explore.github.io%2Fmlx%2Fbuild%2Fhtml%2Finstall.html">MLX installation requirements</a>, and <a href="iframe.php?url=https%3A%2F%2Fcran.r-project.org%2F">R downloads</a>. The next tutorial, <strong>Vectors, Matrices, and Linear Algebra</strong>, will provide the chosen track&#8217;s setup and execution steps. Installing the other tracks is unnecessary.</p><p>The <a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FRamiKrispin%2Fml-from-scratch">companion repository</a> will hold the supporting code. A notebook combines explanations, executable code cells, and outputs; an annotated script presents code with explanatory comments. We will read the article, then run the chosen implementation from the beginning. Tracks will use shared <strong>fixtures</strong>, stored inputs for reproducible checks, and compare results within documented numerical tolerances.</p><h2><strong>The learning path</strong></h2><p>We will begin with the foundations: vectors, matrices, loss functions, gradients, and data preparation. With those pieces in place, we will build regression models and see how methods such as gradient descent learn their parameters. We will then move into classification before exploring trees, ensembles, and a margin-based classifier. Clustering and dimensionality reduction will introduce unsupervised learning. Finally, we will bring these ideas together in a small neural network and compare representative models on suitable tasks.</p><p>Along the way, we will introduce the mathematics when it becomes useful and focus on one model or problem at a time. A separate, future <em>Statistics with Tensors</em> series will cover large-scale batched statistics.</p><h2><strong>Summary</strong></h2><p>We now have a reading guide: one shared explanation, a chosen implementation track, and explicit fitting and prediction logic built from numerical primitives. Training, prediction, and evaluation will give us a common way to examine each model.</p><p>In the next tutorial, <strong>Vectors, Matrices, and Linear Algebra</strong>, we will set up one track and use small arrays and matrices to express the numerical operations needed by later models.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[AI-Assisted Python, DuckPad | Issue 112]]></title><description><![CDATA[Explore Reuven M. Lerner's AI-Assisted Python for Nonprogrammers, DuckPad's visual SQL pipelines and data lineage, agent harnesses, local AI agents on Ubuntu, and prefill-only decision models.]]></description><link>https://ramikrispin.substack.com/p/ai-assisted-python-duckpad-issue</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/ai-assisted-python-duckpad-issue</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sat, 31 Oct 2026 12:31:29 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21Twb4%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Faf749379-a445-4827-ad5c-0d39f7c141fa_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - DuckPad</p></li><li><p>New learning resources - Kimi K3.1 Pro, agent harnesses, OpenCode 2.0, local AI agents on Ubuntu, and prefill-only decision models</p></li><li><p>Book of the week - AI-Assisted Python for Nonprogrammers by Reuven M. Lerner</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-agents-with-large-language-models" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NdDe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6f0e6f-6e4a-4a3e-96ee-ac4aad8a7484_2172x330.gif 424w, https://substackcdn.com/image/fetch/$s_!NdDe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6f0e6f-6e4a-4a3e-96ee-ac4aad8a7484_2172x330.gif 848w, https://substackcdn.com/image/fetch/$s_!NdDe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6f0e6f-6e4a-4a3e-96ee-ac4aad8a7484_2172x330.gif 1272w, https://substackcdn.com/image/fetch/$s_!NdDe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6f0e6f-6e4a-4a3e-96ee-ac4aad8a7484_2172x330.gif 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21NdDe%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F3b6f0e6f-6e4a-4a3e-96ee-ac4aad8a7484_2172x330.gif" width="1456" height="221" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b6f0e6f-6e4a-4a3e-96ee-ac4aad8a7484_2172x330.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:221,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:427162,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:&quot;https://www.linkedin.com/learning/build-with-ai-sql-agents-with-large-language-models&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/222870260?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6f0e6f-6e4a-4a3e-96ee-ac4aad8a7484_2172x330.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NdDe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6f0e6f-6e4a-4a3e-96ee-ac4aad8a7484_2172x330.gif 424w, https://substackcdn.com/image/fetch/$s_!NdDe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6f0e6f-6e4a-4a3e-96ee-ac4aad8a7484_2172x330.gif 848w, https://substackcdn.com/image/fetch/$s_!NdDe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6f0e6f-6e4a-4a3e-96ee-ac4aad8a7484_2172x330.gif 1272w, https://substackcdn.com/image/fetch/$s_!NdDe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6f0e6f-6e4a-4a3e-96ee-ac4aad8a7484_2172x330.gif 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>The newsletter is available on <strong><a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a></strong> and <strong><a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a></strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21Twb4%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Faf749379-a445-4827-ad5c-0d39f7c141fa_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Twb4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf749379-a445-4827-ad5c-0d39f7c141fa_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!Twb4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf749379-a445-4827-ad5c-0d39f7c141fa_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!Twb4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf749379-a445-4827-ad5c-0d39f7c141fa_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!Twb4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf749379-a445-4827-ad5c-0d39f7c141fa_1672x941.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21Twb4%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Faf749379-a445-4827-ad5c-0d39f7c141fa_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af749379-a445-4827-ad5c-0d39f7c141fa_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2558430,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/222870260?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf749379-a445-4827-ad5c-0d39f7c141fa_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Twb4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf749379-a445-4827-ad5c-0d39f7c141fa_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!Twb4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf749379-a445-4827-ad5c-0d39f7c141fa_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!Twb4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf749379-a445-4827-ad5c-0d39f7c141fa_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!Twb4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf749379-a445-4827-ad5c-0d39f7c141fa_1672x941.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Open Source of the Week</strong></h2><p>This week&#8217;s focus is on the <strong>DuckPad</strong> project.</p><p><strong>DuckPad</strong> is an open-source SQL workspace powered by <strong>DuckDB 2.0</strong>. It turns data sources, joins, reusable components, and SQL transformations into visual pipelines you can explore and version. Rather than treating a result as the end of the workflow, DuckPad lets users select a cell and trace the source values that contributed to it. You can store projects in Git, develop on independent branches, compare them visually, and review changes before merging. The project runs on your own infrastructure and supports environment-specific connections and team access controls.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Fhugues31%2Fduckpad">https://github.com/hugues31/duckpad</a></strong></p><h3><strong>Key Features</strong></h3><ul><li><p><strong>Visual pipelines</strong> &#8212; connect data sources, joins, and reusable components in a graphical workspace.</p></li><li><p><strong>Integrated SQL editor</strong> &#8212; use guided forms or write SQL directly when defining transformations.</p></li><li><p><strong>Cell-level lineage</strong> &#8212; trace a result cell back to the source values that contributed to it.</p></li><li><p><strong>Git versioning</strong> &#8212; save projects, work on separate branches, and compare pipeline changes visually.</p></li><li><p><strong>Merge review</strong> &#8212; inspect proposed changes before applying them to a project.</p></li><li><p><strong>Self-hosted operation</strong> &#8212; run DuckPad on your own infrastructure and configure connections by environment.</p></li><li><p><strong>Project access</strong> &#8212; manage access for teams working in the same DuckPad deployment.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21NBlX%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fad280f17-b8cf-4a5f-96b4-ff82eec00b06_1440x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NBlX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad280f17-b8cf-4a5f-96b4-ff82eec00b06_1440x1000.png 424w, https://substackcdn.com/image/fetch/$s_!NBlX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad280f17-b8cf-4a5f-96b4-ff82eec00b06_1440x1000.png 848w, https://substackcdn.com/image/fetch/$s_!NBlX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad280f17-b8cf-4a5f-96b4-ff82eec00b06_1440x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!NBlX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad280f17-b8cf-4a5f-96b4-ff82eec00b06_1440x1000.png 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21NBlX%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fad280f17-b8cf-4a5f-96b4-ff82eec00b06_1440x1000.png" width="1440" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad280f17-b8cf-4a5f-96b4-ff82eec00b06_1440x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:194855,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/222870260?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad280f17-b8cf-4a5f-96b4-ff82eec00b06_1440x1000.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NBlX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad280f17-b8cf-4a5f-96b4-ff82eec00b06_1440x1000.png 424w, https://substackcdn.com/image/fetch/$s_!NBlX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad280f17-b8cf-4a5f-96b4-ff82eec00b06_1440x1000.png 848w, https://substackcdn.com/image/fetch/$s_!NBlX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad280f17-b8cf-4a5f-96b4-ff82eec00b06_1440x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!NBlX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad280f17-b8cf-4a5f-96b4-ff82eec00b06_1440x1000.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>More details are available in the project <a href="iframe.php?url=https%3A%2F%2Fhugues31.github.io%2Fduckpad%2F">documentation</a>.</p><p>License: MIT</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><div><hr></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>The Best Open Model Right Now? (Kimi K3.1 Pro)</strong></h3><p>This video from NeuralNine examines Kimi K3.1 Pro through published benchmarks and three coding tasks: a CNN training visualizer, thumbnail asset generation, and a MOBA game prototype.</p><div id="youtube2-ZDu5abJXGTU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;ZDu5abJXGTU&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FZDu5abJXGTU%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>What Is an Agent Harness? How AI Coding Agents Work</strong></h3><p>The following visual explainer from AI Systems with Andy breaks an agent harness into its loop, tools, context, memory, and controls. It also covers the execution cycle, context management, permissions, agents versus workflows, and a minimal Python implementation.</p><div id="youtube2-XJuLcDxtTz0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;XJuLcDxtTz0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FXJuLcDxtTz0%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Harness&#178; Explained: Self-Improving Agents Without Training</strong></h3><p>This video from Prompt Engineering examines Harness&#178;, a research framework that enables an agent to modify its prompts, skills, scripts, subagents, and control-loop hooks for each task without retraining the model. It explains the Propose, Probe, and Compose process, its experience library, comparisons with coding agents, and the approach&#8217;s limitations.</p><div id="youtube2-pW2ktrJlsyE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;pW2ktrJlsyE&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FpW2ktrJlsyE%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>OpenCode 2.0: Biggest Update Ever (Free + Local Models)</strong></h3><p>This video from Leon van Zyl tests OpenCode 2.0 by building a bill splitter application. It covers free models, sessions shared across the terminal and desktop app, background agents, MCP code mode, Git worktrees, custom plugins, and running local models with Ollama.</p><div id="youtube2-OyuId4YQiIs" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;OyuId4YQiIs&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FOyuId4YQiIs%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Jev Course &#8211; Prefill-Only Inference &amp; Decision Models from Scratch</strong></h3><p>This course from freeCodeCamp builds Jev-style decision models with PyTorch and Hugging Face. It covers encoder- and decoder-based architectures, custom causal attention masks, KV-cache reuse, teacher-student distillation, and reinforcement learning for structured choices, scores, and Boolean outputs.</p><div id="youtube2-aZglGvBPQGs" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;aZglGvBPQGs&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FaZglGvBPQGs%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Building a Local AI Agent in Workshop on Ubuntu</strong></h3><p>The following tutorial from Canonical Ubuntu builds a local coding agent with Canonical Workshop and the Qwen3-Coder inference snap. It demonstrates an isolated development environment, a tunnel to the locally hosted model, and coding tasks that run without an internet connection.</p><div id="youtube2-u5Q149jlMQ8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;u5Q149jlMQ8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2Fu5Q149jlMQ8%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Agent Harness for Learning Things</strong></h3><p>This video by Eero Alvar presents LearnHarness, an agent-based system for personalized learning. It demonstrates how the system probes existing knowledge, plans a dependency path, teaches and practices in small steps, and stores propositions and reasoning chains in a persistent knowledge graph.</p><div id="youtube2-nfTDljFG2g0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;nfTDljFG2g0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FnfTDljFG2g0%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is on a new book &#8212; <em>AI-Assisted Python for Nonprogrammers</em> by <strong>Reuven M. Lerner</strong>. The book introduces Python to readers without previous programming experience while using AI chatbots as learning partners. It builds from the concepts behind computers and programming through core Python syntax, data structures, functions, modules, and packages. Focused exercises use approaches such as strategy sessions, debugging prompts, interviews, and reverse Socratic questioning to reinforce the material. The final chapters connect these foundations to AI-assisted and agentic coding tools while emphasizing the programming knowledge needed to evaluate and maintain generated code.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>Python foundations</strong> &#8212; programming concepts, installation, IDEs, and JupyterLite.</p></li><li><p><strong>Values and variables</strong> &#8212; data types, assignment, input, and formatted strings.</p></li><li><p><strong>Control flow</strong> &#8212; conditions, comparisons, Boolean logic, and loops.</p></li><li><p><strong>Core data structures</strong> &#8212; strings, lists, tuples, and dictionaries.</p></li><li><p><strong>Files</strong> &#8212; reading, writing, parsing, and converting text into data.</p></li><li><p><strong>Functions</strong> &#8212; parameters, return values, documentation, scope, and arguments.</p></li><li><p><strong>Modules and namespaces</strong> &#8212; imports, aliases, and Python&#8217;s standard library.</p></li><li><p><strong>Package management</strong> &#8212; evaluating PyPI packages and managing projects with uv.</p></li><li><p><strong>AI-assisted coding</strong> &#8212; pair programming with chatbots and GitHub Copilot.</p></li><li><p><strong>Agentic coding</strong> &#8212; working with Claude Code and OpenCode while considering code quality and maintenance.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%215GEW%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F7e1c7be8-ca0c-44b5-9673-68683aa7cc0f_1143x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5GEW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e1c7be8-ca0c-44b5-9673-68683aa7cc0f_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5GEW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e1c7be8-ca0c-44b5-9673-68683aa7cc0f_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5GEW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e1c7be8-ca0c-44b5-9673-68683aa7cc0f_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5GEW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e1c7be8-ca0c-44b5-9673-68683aa7cc0f_1143x1500.jpeg 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%215GEW%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F7e1c7be8-ca0c-44b5-9673-68683aa7cc0f_1143x1500.jpeg" width="1143" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e1c7be8-ca0c-44b5-9673-68683aa7cc0f_1143x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1143,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:169095,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/222870260?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e1c7be8-ca0c-44b5-9673-68683aa7cc0f_1143x1500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5GEW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e1c7be8-ca0c-44b5-9673-68683aa7cc0f_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5GEW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e1c7be8-ca0c-44b5-9673-68683aa7cc0f_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5GEW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e1c7be8-ca0c-44b5-9673-68683aa7cc0f_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5GEW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e1c7be8-ca0c-44b5-9673-68683aa7cc0f_1143x1500.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is ideal for <strong>beginners and nonprogrammers</strong> who want to learn Python fundamentals while developing practical habits for working with AI coding tools.</p><p>The book is available on <strong><a href="iframe.php?url=https%3A%2F%2Fwww.oreilly.com%2Flibrary%2Fview%2Fai-assisted-python-for%2F9798341661622%2F">O&#8217;Reilly</a></strong> and <strong><a href="iframe.php?url=https%3A%2F%2Fwww.amazon.com%2FAI-Assisted-Python-Nonprogrammers-Programming-Ground%2Fdp%2FB0GTYL2JQT%2F">Amazon</a></strong>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p>]]></content:encoded></item><item><title><![CDATA[Data Engineering for Multimodal AI, Pixeltable | Issue 111]]></title><description><![CDATA[A weekly curated update on data science and engineering topics and resources.]]></description><link>https://ramikrispin.substack.com/p/data-engineering-for-multimodal-ai</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/data-engineering-for-multimodal-ai</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sat, 24 Oct 2026 13:54:31 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21wTcv%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F12511ec3-b284-4dea-9438-8325a7d24f5d_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - Pixeltable</p></li><li><p>New learning resources - Qwen RL experiments, DeepSeek V4.1 Flash 1017, terminal development setup</p></li><li><p>Book of the week - Data Engineering for Multimodal AI by Vasundra Srinivasan</p></li></ul><p>The newsletter is available on <strong><a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a></strong> and <strong><a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a></strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21wTcv%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F12511ec3-b284-4dea-9438-8325a7d24f5d_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wTcv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12511ec3-b284-4dea-9438-8325a7d24f5d_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!wTcv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12511ec3-b284-4dea-9438-8325a7d24f5d_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!wTcv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12511ec3-b284-4dea-9438-8325a7d24f5d_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!wTcv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12511ec3-b284-4dea-9438-8325a7d24f5d_1920x1080.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21wTcv%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F12511ec3-b284-4dea-9438-8325a7d24f5d_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/12511ec3-b284-4dea-9438-8325a7d24f5d_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5071610,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/221915655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12511ec3-b284-4dea-9438-8325a7d24f5d_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wTcv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12511ec3-b284-4dea-9438-8325a7d24f5d_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!wTcv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12511ec3-b284-4dea-9438-8325a7d24f5d_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!wTcv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12511ec3-b284-4dea-9438-8325a7d24f5d_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!wTcv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12511ec3-b284-4dea-9438-8325a7d24f5d_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><h2><strong>Open Source of the Week</strong></h2><p><strong>Pixeltable</strong> is an open-source Python project for building AI applications with <strong>images, video, audio, documents, and structured data</strong>. It combines a multimodal database, data processing, vector search, and API serving. Transformations and model calls are defined as <strong>computed columns</strong>, with their results stored alongside the source data. Pixeltable tracks column dependencies and processes new rows as they arrive. The goal is to reduce the code needed to keep media, metadata, model outputs, and search indexes in sync.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Fpixeltable%2Fpixeltable">https://github.com/pixeltable/pixeltable</a></strong></p><h3><strong>Key Features</strong></h3><ul><li><p><strong>Multimodal tables</strong> &#8212; work with images, video, audio, and documents alongside ordinary columns.</p></li><li><p><strong>Computed columns</strong> &#8212; define transformations and model calls as part of a table.</p></li><li><p><strong>Incremental processing</strong> &#8212; process new data and recompute affected results without repeating unrelated work.</p></li><li><p><strong>Vector search</strong> &#8212; declare embedding indexes that the table maintains as data changes.</p></li><li><p><strong>Media processing</strong> &#8212; build workflows for document chunks, video frames, and audio transcripts.</p></li><li><p><strong>Versioning</strong> &#8212; inspect table history and revert changes.</p></li><li><p><strong>API serving</strong> &#8212; declare HTTP routes alongside tables using FastAPI integration.</p></li></ul><p>Here is an example by <strong><a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fin%2FACoAAAZMzKUBhXGzZps5nVJG2hlEWEK9U5CuwCU">Alison Presmanes Hill, PhD</a></strong> builds a photo search application with Pixeltable using six retrieval approaches. It starts with <strong>keyword search</strong>, then adds LLM query rewriting, hybrid search with <strong>BLIP captions and CLIP embeddings</strong>, automatic captioning and indexing of new images, metadata filtering, and comparison of two embedding models. The walkthrough also covers query decomposition and serving the application over HTTP. It demonstrates how the retrieval strategy can evolve while Pixeltable manages the underlying data and indexes.</p><div id="youtube2-92lsL395T6s" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;92lsL395T6s&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F92lsL395T6s%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>More details are available in the project <a href="iframe.php?url=https%3A%2F%2Fdocs.pixeltable.com%2F">documentation</a>.</p><p>License: Apache-2.0</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-agents-with-large-language-models" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BS_0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c93eea5-a9d0-4e72-8c3f-bf856704315a_2172x330.gif 424w, https://substackcdn.com/image/fetch/$s_!BS_0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c93eea5-a9d0-4e72-8c3f-bf856704315a_2172x330.gif 848w, https://substackcdn.com/image/fetch/$s_!BS_0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c93eea5-a9d0-4e72-8c3f-bf856704315a_2172x330.gif 1272w, https://substackcdn.com/image/fetch/$s_!BS_0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c93eea5-a9d0-4e72-8c3f-bf856704315a_2172x330.gif 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21BS_0%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F4c93eea5-a9d0-4e72-8c3f-bf856704315a_2172x330.gif" width="1456" height="221" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4c93eea5-a9d0-4e72-8c3f-bf856704315a_2172x330.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:221,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:427162,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:&quot;https://www.linkedin.com/learning/build-with-ai-sql-agents-with-large-language-models&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/221915655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c93eea5-a9d0-4e72-8c3f-bf856704315a_2172x330.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BS_0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c93eea5-a9d0-4e72-8c3f-bf856704315a_2172x330.gif 424w, https://substackcdn.com/image/fetch/$s_!BS_0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c93eea5-a9d0-4e72-8c3f-bf856704315a_2172x330.gif 848w, https://substackcdn.com/image/fetch/$s_!BS_0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c93eea5-a9d0-4e72-8c3f-bf856704315a_2172x330.gif 1272w, https://substackcdn.com/image/fetch/$s_!BS_0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c93eea5-a9d0-4e72-8c3f-bf856704315a_2172x330.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>Tuning LLM with RL</strong></h3><p>This video from Prompt Engineering tests whether reinforcement learning can move Qwen3.5-4B closer to Qwen3.5-27B on held-out tasks. It covers LoRA training, GRPO, strict checkers for reward hacking, task selection, and combining model distillation with reinforcement learning.</p><div id="youtube2-Pl_2TelxjdY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Pl_2TelxjdY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FPl_2TelxjdY%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>DeepSeek V4.1 Flash 1017 Explained in 15 Minutes</strong></h3><p>The following video by Bruno Vega examines DeepSeek V4.1 Flash 1017, including its effort-conditioned output-length penalty, benchmark caveats, token costs, and local inference implications. It also discusses DeepSeek Harness and the Search &amp; Fetch API.</p><div id="youtube2-0kDXKTYKBEM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;0kDXKTYKBEM&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F0kDXKTYKBEM%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Great Terminal Setup</strong></h3><p>This walkthrough from DevOps Toolbox presents the free and open-source tools that make up the creator&#8217;s terminal workflow. It covers the terminal and multiplexer, Workmux, shell configuration, coding agents, navigation, command history, prompts, the IDE, file exploration, and development environment setup.</p><div id="youtube2-QpiZOKul1U8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;QpiZOKul1U8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FQpiZOKul1U8%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is on a new book &#8212; <em>Data Engineering for Multimodal AI</em> by <strong>Vasundra Srinivasan</strong>. The book explores the infrastructure behind multimodal AI, from data architecture and ingestion to retrieval and production operations. It treats assembling useful context from different data types as a data engineering problem. Each chapter includes a practical playbook that readers can extend, connecting the concepts to an implementation. The focus is on building and operating the pipelines that supply multimodal models with reliable data, with examples spanning cloud-native and on-premises environments.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>Data architecture</strong> &#8212; semantic layers, data contracts, and multimodal storage patterns.</p></li><li><p><strong>Ingestion and transformation</strong> &#8212; validation and processing across data modalities.</p></li><li><p><strong>Feature engineering</strong> &#8212; feature extraction, fusion, and multimodal feature stores.</p></li><li><p><strong>Storage and retrieval</strong> &#8212; vector search, knowledge graphs, and hybrid retrieval.</p></li><li><p><strong>Streaming pipelines</strong> &#8212; event alignment, adaptive processing, and edge computing.</p></li><li><p><strong>MLOps</strong> &#8212; versioning, testing, monitoring, and automated retraining.</p></li><li><p><strong>Scaling and serving</strong> &#8212; distributed processing, inference deployment, and cost management.</p></li><li><p><strong>Governance and security</strong> &#8212; lineage, privacy, and responsible AI practices.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%216K2x%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fc0b9dba0-7609-4dff-8356-73eba6333fd3_1143x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6K2x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b9dba0-7609-4dff-8356-73eba6333fd3_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6K2x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b9dba0-7609-4dff-8356-73eba6333fd3_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6K2x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b9dba0-7609-4dff-8356-73eba6333fd3_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6K2x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b9dba0-7609-4dff-8356-73eba6333fd3_1143x1500.jpeg 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%216K2x%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fc0b9dba0-7609-4dff-8356-73eba6333fd3_1143x1500.jpeg" width="1143" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0b9dba0-7609-4dff-8356-73eba6333fd3_1143x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1143,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:199171,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/221915655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b9dba0-7609-4dff-8356-73eba6333fd3_1143x1500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6K2x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b9dba0-7609-4dff-8356-73eba6333fd3_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6K2x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b9dba0-7609-4dff-8356-73eba6333fd3_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6K2x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b9dba0-7609-4dff-8356-73eba6333fd3_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6K2x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b9dba0-7609-4dff-8356-73eba6333fd3_1143x1500.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is ideal for <strong>data engineers, ML engineers, and MLOps practitioners</strong> who want to build and maintain data infrastructure for multimodal AI applications.</p><p>The book is available on <strong><a href="iframe.php?url=https%3A%2F%2Flearning.oreilly.com%2Flibrary%2Fview%2Fdata-engineering-for%2F9781098190774%2F">O&#8217;Reilly</a></strong> and <strong><a href="iframe.php?url=https%3A%2F%2Fwww.amazon.com%2Fdp%2F1098190785">Amazon</a></strong>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><div><hr></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Build a SQL AI Agent from Scratch]]></title><description><![CDATA[Build your first SQL AI agent with a few simple Python functions]]></description><link>https://ramikrispin.substack.com/p/build-a-sql-ai-agent-from-scratch</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/build-a-sql-ai-agent-from-scratch</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Tue, 20 Oct 2026 12:45:35 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%212fsf%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F178f5d78-a855-40c2-ae9a-20f1009b3a3f_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>So far in this series, we have focused on the theory behind SQL AI agents and prepared the prerequisites: a <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fset-up-a-python-environment-for-sql">Python environment</a> and a <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fprepare-data-for-a-sql-ai-agent-with">DuckDB database</a>. In this tutorial, we will use a few lines of Python code to build our first SQL AI agent from scratch. It will receive a question in natural language, give the question and table schema to a model, extract the SQL returned by the model, execute the query in DuckDB, and return the result to Python:</p><p><code>question &#8594; prompt &#8594; model-generated SQL &#8594; DuckDB &#8594; result</code></p><p>The complete workflow has several setup steps, but the agent at its center is only a few lines of Python. Keeping this first implementation small will help us see exactly what each component contributes before we add more context, safety controls, and reliability mechanisms later in the series.</p><p>This tutorial series is based on my LinkedIn Learning course, <em><a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-agents-with-large-language-models">Build with AI: SQL Agents with Large Language Models</a></em>. If you prefer video-based learning, please check out the course on LinkedIn Learning.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-agents-with-large-language-models" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d4_X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aea9110-0b19-44b2-a8f1-46b0ef81e99b_2172x330.gif 424w, https://substackcdn.com/image/fetch/$s_!d4_X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aea9110-0b19-44b2-a8f1-46b0ef81e99b_2172x330.gif 848w, https://substackcdn.com/image/fetch/$s_!d4_X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aea9110-0b19-44b2-a8f1-46b0ef81e99b_2172x330.gif 1272w, https://substackcdn.com/image/fetch/$s_!d4_X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aea9110-0b19-44b2-a8f1-46b0ef81e99b_2172x330.gif 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21d4_X%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F5aea9110-0b19-44b2-a8f1-46b0ef81e99b_2172x330.gif" width="1456" height="221" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5aea9110-0b19-44b2-a8f1-46b0ef81e99b_2172x330.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:221,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:427162,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:&quot;https://www.linkedin.com/learning/build-with-ai-sql-agents-with-large-language-models&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/221251004?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aea9110-0b19-44b2-a8f1-46b0ef81e99b_2172x330.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!d4_X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aea9110-0b19-44b2-a8f1-46b0ef81e99b_2172x330.gif 424w, https://substackcdn.com/image/fetch/$s_!d4_X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aea9110-0b19-44b2-a8f1-46b0ef81e99b_2172x330.gif 848w, https://substackcdn.com/image/fetch/$s_!d4_X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aea9110-0b19-44b2-a8f1-46b0ef81e99b_2172x330.gif 1272w, https://substackcdn.com/image/fetch/$s_!d4_X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aea9110-0b19-44b2-a8f1-46b0ef81e99b_2172x330.gif 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>By the end of this tutorial, we will know how to:</p><ul><li><p>Connect to an existing DuckDB database through Ibis.</p></li><li><p>Extract table and column information for model context.</p></li><li><p>Send system instructions and a user question through the OpenAI Responses API.</p></li><li><p>Extract SQL from the model response.</p></li><li><p>Execute the generated SQL against DuckDB.</p></li><li><p>Combine these steps into a small reusable SQL AI agent.</p></li></ul><p>A reproducible example of the code in this tutorial is available in the <a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FRamiKrispin%2Fsql-ai-agent%2Fblob%2Fmain%2Ftutorials%2F04_simple_sql_ai_agent.ipynb">supporting Jupyter notebook</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%212fsf%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F178f5d78-a855-40c2-ae9a-20f1009b3a3f_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2fsf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F178f5d78-a855-40c2-ae9a-20f1009b3a3f_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!2fsf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F178f5d78-a855-40c2-ae9a-20f1009b3a3f_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!2fsf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F178f5d78-a855-40c2-ae9a-20f1009b3a3f_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!2fsf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F178f5d78-a855-40c2-ae9a-20f1009b3a3f_1672x941.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%212fsf%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F178f5d78-a855-40c2-ae9a-20f1009b3a3f_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/178f5d78-a855-40c2-ae9a-20f1009b3a3f_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1461288,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/221251004?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F178f5d78-a855-40c2-ae9a-20f1009b3a3f_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2fsf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F178f5d78-a855-40c2-ae9a-20f1009b3a3f_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!2fsf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F178f5d78-a855-40c2-ae9a-20f1009b3a3f_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!2fsf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F178f5d78-a855-40c2-ae9a-20f1009b3a3f_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!2fsf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F178f5d78-a855-40c2-ae9a-20f1009b3a3f_1672x941.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><h2><strong>Prerequisites</strong></h2><p>To run the code in this tutorial, we will need a configured Python environment and a DuckDB database. The following tutorials cover these prerequisites:</p><ul><li><p><strong>Python environment:</strong> Follow <em><a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fset-up-a-python-environment-for-sql">Set up a Python environment for SQL AI agents</a></em> to create the environment and install the dependencies declared in <code>docker/requirements.txt</code>.</p></li><li><p><strong>DuckDB settings:</strong> Follow <em><a href="iframe.php?url=https%3A%2F%2Ffile%2B.vscode-resource.vscode-cdn.net%2FUsers%2Framikrispin%2FProjects%2Ftutorials%2Fsql-ai-agent-tutorials%2Ftutorials%2Ft03b-prepare-data-for-sql-ai-agent%2FREADME.md">Prepare data for a SQL AI agent with DuckDB and Ibis</a></em> to create the <code>sql-ai-agent.duckdb</code> database and its <code>air_traffic</code> table.</p></li></ul><p>The tutorial also requires two environment variables. <code>DUCKDB_DATABASES_PATH</code> points to the directory containing the database file, and <code>OPENAI_API_KEY</code> contains an OpenAI API key:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;fdc3da3a-b4ab-4006-81ee-ea5b88142299&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">export DUCKDB_DATABASES_PATH="$HOME/databases/duckdb"
export OPENAI_API_KEY="your_api_key_here"</code></pre></div><blockquote><p><strong>Note:</strong> This tutorial uses the OpenAI API for the model request, but the overall workflow is not tied to one provider. We can adapt it to Google Gemini, Anthropic, or another provider by replacing the provider-specific client, credentials, and request and response handling. The surrounding steps&#8212;assembling context, executing the generated SQL in DuckDB, and returning the result&#8212;remain the same.</p></blockquote><p>Keep the API key in the environment rather than writing it directly in the notebook. With the environment variables set and the database ready, we can assemble the first end-to-end agent.</p><h2><strong>Understand the minimal SQL AI agent workflow</strong></h2><p>At a high level, the workflow begins with a user question. Before sending it to the large language model (LLM), we combine the question with useful context that can help the model generate the correct SQL query. As we discussed in <em><a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fcontext-in-sql-ai-agents-the-three">Context in SQL AI Agents: The Three Layers Behind Reliable Answers</a></em>, clearer and more complete context reduces ambiguity and gives the model fewer details to guess, making its response more predictable.</p><p>First, the model needs the table schema. The schema contains the available column names and their data types, such as integer, text, Boolean, or date. This information helps the model refer to the correct columns and use them according to their types. We will also tell the model that the database uses DuckDB and instruct it to return only the SQL query.</p><p>These are simple ways to derive context from our database. In later tutorials, we will explore more advanced methods for generating and enriching that context.</p><p>Once the prompt is ready, we send it to the LLM. The model returns a SQL query, which our Python code extracts and sends to DuckDB. DuckDB executes the query and returns the resulting table to Python, where we can present it to the user. Figure 1 illustrates this workflow, including how the table schema and user question enter separate prompts before the model request.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21DpN4%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F47bf09d8-ab9c-4bd6-b729-00ca747c7920_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DpN4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47bf09d8-ab9c-4bd6-b729-00ca747c7920_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!DpN4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47bf09d8-ab9c-4bd6-b729-00ca747c7920_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!DpN4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47bf09d8-ab9c-4bd6-b729-00ca747c7920_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!DpN4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47bf09d8-ab9c-4bd6-b729-00ca747c7920_1672x941.png 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21DpN4%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F47bf09d8-ab9c-4bd6-b729-00ca747c7920_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/47bf09d8-ab9c-4bd6-b729-00ca747c7920_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1217063,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/221251004?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47bf09d8-ab9c-4bd6-b729-00ca747c7920_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DpN4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47bf09d8-ab9c-4bd6-b729-00ca747c7920_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!DpN4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47bf09d8-ab9c-4bd6-b729-00ca747c7920_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!DpN4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47bf09d8-ab9c-4bd6-b729-00ca747c7920_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!DpN4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47bf09d8-ab9c-4bd6-b729-00ca747c7920_1672x941.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Figure 1. The minimal SQL AI agent builds separate system and user prompts, uses the LLM response to extract a SQL query, and returns the database result.</figcaption></figure></div><p>We begin by importing the modules used throughout the notebook:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;ae52288e-bd91-4568-9687-85adbf31d3ca&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">import os
import re

from pathlib import Path

import ibis
from openai import OpenAI</code></pre></div><p>We use <code>os</code> to read environment variables, <code>Path</code> to construct the database path, <code>re</code> for a small response-parsing helper, Ibis to connect to DuckDB, and the OpenAI Python SDK to send the model request.</p><h2><strong>Connect to DuckDB and extract the schema</strong></h2><p>The previous tutorial created a persistent <code>sql-ai-agent.duckdb</code> file. Rather than loading and preparing the source CSV again, we reconnect to that database and reuse its <code>air_traffic</code> table.</p><p>The following code reads <code>DUCKDB_DATABASES_PATH</code>, constructs the database file path, and raises a clear error if the directory variable or file is missing:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;c7fd859a-5665-4147-8290-fba5f15b3427&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">database_directory = os.environ.get("DUCKDB_DATABASES_PATH")
if not database_directory:
    raise EnvironmentError(
        "Set DUCKDB_DATABASES_PATH to the directory used in the previous tutorial."
    )

database_path = Path(database_directory).expanduser() / "sql-ai-agent.duckdb"
if not database_path.is_file():
    raise FileNotFoundError(
        f"Could not find {database_path}. Run 03a_duckdb_settings.ipynb first."
    )</code></pre></div><p>Next, we connect Ibis to the DuckDB file and confirm that the expected table is available:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;a671b090-1a57-4d5f-92b2-36b47b967281&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">connection = ibis.duckdb.connect(database_path)
table_name = "air_traffic"

if table_name not in connection.list_tables():
    raise RuntimeError(
        f"Could not find the {table_name!r} table. Run the previous tutorial first."
    )

print(f"Connected to {database_path.name}")
print(f"Available table: {table_name}")</code></pre></div><p>The verified notebook returns:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;52811814-6767-4251-85fc-126b89f49d93&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">Connected to sql-ai-agent.duckdb
Available table: air_traffic</code></pre></div><p>The model cannot inspect this connection directly, so the table name alone is not enough. It also needs the available column names and their data types. We can retrieve those details from DuckDB&#8217;s <code>information_schema.columns</code> view.</p><p>The query selects the column name and DuckDB data type for <code>air_traffic</code>. The <code>ordinal_position</code> ordering preserves the table&#8217;s column order:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;d9ea091d-ba47-4013-8576-6faaecb23fba&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">schema_sql = f"""
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = '{table_name}'
ORDER BY ordinal_position
"""

schema_details = connection.sql(schema_sql).execute()
schema_context = ",\n".join(
    f'    "{row.column_name}" {row.data_type}'
    for row in schema_details.itertuples(index=False)
)

print(schema_context)</code></pre></div><p>This produces a compact schema description that we can insert into the model instructions:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;66338115-dbd6-4172-9891-d80e64eef8b3&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">    "Year" BIGINT,
    "Date" TIMESTAMP,
    "Operating Airline" VARCHAR,
    "Operating Airline IATA Code" VARCHAR,
    "Published Airline" VARCHAR,
    "Published Airline IATA Code" VARCHAR,
    "GEO Summary" VARCHAR,
    "GEO Region" VARCHAR,
    "Activity Type Code" VARCHAR,
    "Price Category Code" VARCHAR,
    "Terminal" VARCHAR,
    "Boarding Area" VARCHAR,
    "Passenger Count" BIGINT</code></pre></div><p>At this point, our Python process knows where to execute a query, and we have a text representation of the schema for the model. The schema identifies the available fields and their types, but it does not describe distinct values, business definitions, or relationships with other tables. Those are separate context problems that we will address later in the series.</p><h2><strong>Set up OpenAI and build the prompts</strong></h2><p>The OpenAI client needs an API key before it can send a request. We use <code>os.getenv()</code> to load <code>OPENAI_API_KEY</code>, check that it is available, and pass it to <code>OpenAI()</code>:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;2aa68e10-46b7-4fe7-baf7-25de4f568993&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">openai_api_key = os.getenv("OPENAI_API_KEY")
if not openai_api_key:
    raise EnvironmentError("Set OPENAI_API_KEY before running the notebook.")

client = OpenAI(api_key=openai_api_key)
model = "gpt-5.4-mini"</code></pre></div><p>Loading the key from the environment keeps the credential out of the notebook source and its saved outputs. We store the selected model name separately so it is easy to identify or change without editing the request code.</p><p>Before building the prompts, it helps to separate their roles. The system prompt contains the reusable instructions and context that define the model&#8217;s task: generate DuckDB SQL, use the supplied schema, and follow the required output format. The user prompt contains the specific natural-language question we want to translate into SQL. Keeping them separate lets us reuse the same instructions and schema context with different questions.</p><p>With the Responses API, we pass the system-level guidance through <code>instructions</code> and the user prompt through <code>input</code>. The instructions take priority over the input, so they establish the rules the model should apply to the question. The <a href="iframe.php?url=https%3A%2F%2Fdevelopers.openai.com%2Fapi%2Fdocs%2Fguides%2Fprompt-engineering%23message-roles-and-instruction-following">OpenAI prompt-engineering guide</a> describes these roles in more detail.</p><p>Next, we define the instructions that describe the model&#8217;s task:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;5a33f706-95cb-4fd0-934e-39aacd51641c&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">system_prompt = f"""
Translate the user's question into one DuckDB SQL query.
Return only the SQL query as plain text, without Markdown or an explanation.
Use only the table and columns shown below.
Enclose table and column names in double quotes.
Write a SELECT query that reads data; do not modify the database.

CREATE TABLE "{table_name}" (
{schema_context}
);
""".strip()</code></pre></div><p>The prompt supplies five pieces of context:</p><ul><li><p>The task is to translate a question into SQL.</p></li><li><p>The target dialect is DuckDB SQL.</p></li><li><p>The output should contain only one plain-text query.</p></li><li><p>The query should read rather than modify data.</p></li><li><p>The model may use only the supplied table and columns.</p></li></ul><p>We represent the schema with a familiar <code>CREATE TABLE</code> shape because it keeps the table name, field names, and data types together. This string is context for generation; it does not create or change the real table.</p><p>For the first question, we ask for one straightforward aggregation:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;ee2adb37-8c83-4b25-a8bf-ccf67c090877&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">question = "What was the total passenger count in 2024?"
user_prompt = f"Write a SQL query that answers: {question}"</code></pre></div><p>The instruction to write a <code>SELECT</code> query guides the model, but it is not an enforced database rule. We will return to that limitation after the query runs.</p><h2><strong>Generate, extract, and execute the SQL</strong></h2><p>We now have the client, model name, system instructions, and user question. The next call sends them to the Responses API:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;6ceb0574-764e-4d60-ac15-d6d2f8ceb3bc&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">response = client.responses.create(
    model=model,
    instructions=system_prompt,
    input=user_prompt,
)

model_output = response.output_text
print(model_output)</code></pre></div><p>The SDK&#8217;s <code>output_text</code> helper collects the text output into one string. In the verified run, the model returned:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;sql&quot;,&quot;nodeId&quot;:&quot;cc567a4b-bd8c-475a-bf91-eda034687b18&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-sql">SELECT SUM("Passenger Count") AS "total passenger count"
FROM "air_traffic"
WHERE "Year" = 2024;</code></pre></div><p>The query uses the schema context correctly: it selects <code>Passenger Count</code> from <code>air_traffic</code>, filters <code>Year</code> to 2024, and uses <code>SUM</code> to calculate the total.</p><p>Model output is nondeterministic, so another successful run may use different spacing or a different alias while expressing the same query. The system instructions ask for plain SQL, but a model may still wrap the query in a Markdown fence. We add a small helper to handle that presentation difference:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;36d36312-94d0-4330-89ed-16cdcea7e99a&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">def extract_sql(text):
    fenced_sql = re.search(
        r"```(?:sql)?\s*(.*?)```",
        text,
        flags=re.IGNORECASE | re.DOTALL,
    )
    sql = fenced_sql.group(1) if fenced_sql else text
    sql = sql.strip()

    if not sql:
        raise ValueError("The model did not return a SQL query.")

    return sql


generated_sql = extract_sql(model_output)
print(generated_sql)</code></pre></div><p><code>extract_sql()</code> looks for an optional fence beginning with either three backticks or three backticks followed by <code>sql</code>. When a fence exists, the regular expression returns its contents. Otherwise, the helper uses the model text as-is. It then removes surrounding whitespace and rejects an empty response.</p><p>This helper is a parser, not a SQL validator. It does not check whether the text contains one statement, whether that statement is read-only, which tables it references, or how much work the query could perform.</p><p>With the text extracted, we pass the query to the same Ibis connection and ask DuckDB to execute it:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;938d5c12-43de-4015-b6cf-7038f904d402&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">result = connection.sql(generated_sql).execute()
result</code></pre></div><p>The verified data snapshot returns:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;9015122e-3414-48bf-9e48-88cc1f12f263&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">  total passenger count
0              52210939</code></pre></div><p>The total passenger count recorded for 2024 is <strong>52,210,939</strong>. At this point, the complete path works: the question reached the model, the model returned SQL, and DuckDB returned a result.</p><h2><strong>Combine the steps into a reusable SQL AI agent</strong></h2><p>The previous sections separated each operation so we could inspect it. We can now wrap the model request, SQL extraction, and database execution in one function:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;10a95133-2ab8-435e-b039-3a396a5dcbf0&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">def sql_ai_agent(question):
    response = client.responses.create(
        model=model,
        instructions=system_prompt,
        input=f"Write a SQL query that answers: {question}",
    )
    sql = extract_sql(response.output_text)
    result = connection.sql(sql).execute()

    separator = "-" * 72
    print(f"Question:\n{question}\n")
    print(f"Generated SQL:\n{separator}\n{sql}\n{separator}")
    print("\nResult:")
    print(result.to_string(index=False))

    return sql, result</code></pre></div><p>The printing makes the notebook output easy to inspect, while the returned <code>(sql, result)</code> tuple remains available for later code. The three lines at the center of the function are the minimal agent loop:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;311892a4-d99b-4c3d-9c2c-847d154d25b9&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">response = client.responses.create(...)
sql = extract_sql(response.output_text)
result = connection.sql(sql).execute()</code></pre></div><p>The connection, schema, system instructions, and client are prepared once. For each question, the function then asks the model for SQL, prepares the text, and sends the query to DuckDB.</p><p>We run the complete workflow with the same question:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;02740191-8b1d-4c97-a8f7-f52402cfc34d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">output = sql_ai_agent(question=question)</code></pre></div><p>The verified notebook prints:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;45ed6493-9513-4f07-bfec-0e9502df8616&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">Question:
What was the total passenger count in 2024?

Generated SQL:
------------------------------------------------------------------------
SELECT SUM("Passenger Count") AS "total_passenger_count"
FROM "air_traffic"
WHERE "Year" = 2024;
------------------------------------------------------------------------

Result:
total_passenger_count
             52210939</code></pre></div><p>That&#8217;s it. We have built a working SQL AI agent from scratch with a small Python function.</p><p>The implementation is intentionally minimal. The prompt includes only basic schema context, and <code>extract_sql()</code> handles formatting without validating the query. Most importantly, the function sends model-generated SQL directly to the database. Asking the model to return a <code>SELECT</code> statement does not prevent it from returning something else, and the current connection does not provide an independently enforced read-only boundary.</p><p>That makes this implementation useful for understanding the complete workflow, but not suitable as a production safety pattern. Later tutorials will add richer context, a stronger output contract, SQL validation, bounded repair, read-only permissions, and evaluation.</p><h2><strong>Summary</strong></h2><p>In this tutorial, we built the first complete SQL AI agent in the series. We reconnected to the persistent DuckDB database created in the prerequisite, confirmed that <code>air_traffic</code> was available, and extracted its ordered column names and data types from <code>information_schema.columns</code>.</p><p>We then initialized the OpenAI client with an API key loaded from the environment. We created system instructions containing the DuckDB task and table schema, paired them with a natural-language question, and sent both through the Responses API. The model returned a SQL aggregation, which we extracted and executed through Ibis. DuckDB returned a total passenger count of 52,210,939 for 2024.</p><p>Finally, we combined the model request, response parsing, and SQL execution in <code>sql_ai_agent()</code>. The result is deliberately small: a question goes in, SQL is generated, DuckDB executes it, and a result comes back.</p><p>This first version uses the minimum schema information required for the example. In the next tutorial, <strong>Add Schema and SQL Dialect Context</strong>, we will turn that inline description into a more deliberate and reusable context layer. That improvement will help the model understand the database more reliably as our questions and schemas become more complex.</p><h2><strong>References</strong></h2><ul><li><p><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FRamiKrispin%2Fsql-ai-agent%2Fblob%2Fmain%2Ftutorials%2F04_simple_sql_ai_agent.ipynb">Supporting notebook: </a><code>04_simple_sql_ai_agent.ipynb</code></p></li><li><p><a href="iframe.php?url=https%3A%2F%2Fdevelopers.openai.com%2Fapi%2Fdocs%2Fguides%2Ftext">OpenAI text generation and Responses API guide</a></p></li><li><p><a href="iframe.php?url=https%3A%2F%2Fduckdb.org%2Fdocs%2Fcurrent%2Fsql%2Fmeta%2Finformation_schema">DuckDB information schema documentation</a></p></li><li><p><a href="iframe.php?url=https%3A%2F%2Fibis-project.org%2Fbackends%2Fduckdb">Ibis DuckDB backend documentation</a></p></li></ul><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Glyf, Applied AI Tutorials, Financial AI in Practice | Issue 110]]></title><description><![CDATA[Explore Glyf for dbt visualization pipelines, applied AI and system design tutorials, and Taehun Kim's Financial AI in Practice for credit, fraud, and investment systems.]]></description><link>https://ramikrispin.substack.com/p/glyf-applied-ai-tutorials-financial</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/glyf-applied-ai-tutorials-financial</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sat, 17 Oct 2026 14:23:51 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21C0Uy%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F68356515-733e-4d58-9700-3a3c7e4c3236_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - Glyf</p></li><li><p>New learning resources - system design, local inference, TabFM, decision models, n8n automation</p></li><li><p>Book of the week - Financial AI in Practice: A playbook for credit, fraud, and investment systems by Taehun Kim</p></li></ul><p>The newsletter is also available on <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a> and <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21C0Uy%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F68356515-733e-4d58-9700-3a3c7e4c3236_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C0Uy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68356515-733e-4d58-9700-3a3c7e4c3236_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!C0Uy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68356515-733e-4d58-9700-3a3c7e4c3236_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!C0Uy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68356515-733e-4d58-9700-3a3c7e4c3236_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!C0Uy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68356515-733e-4d58-9700-3a3c7e4c3236_1920x1080.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21C0Uy%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F68356515-733e-4d58-9700-3a3c7e4c3236_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/68356515-733e-4d58-9700-3a3c7e4c3236_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4373945,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/220853529?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68356515-733e-4d58-9700-3a3c7e4c3236_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!C0Uy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68356515-733e-4d58-9700-3a3c7e4c3236_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!C0Uy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68356515-733e-4d58-9700-3a3c7e4c3236_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!C0Uy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68356515-733e-4d58-9700-3a3c7e4c3236_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!C0Uy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68356515-733e-4d58-9700-3a3c7e4c3236_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><h2><strong>Open Source of the Week</strong></h2><p>This week&#8217;s focus is on the <strong>Glyf</strong> project.</p><p><strong>Glyf</strong> is a new open source project from <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Kannan Kalidasan&quot;,&quot;id&quot;:3128655,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9bb09dda-fe5e-4370-a5f1-0120f78b4eaf_333x333.png&quot;,&quot;uuid&quot;:&quot;2a42c0f3-0214-4821-82b1-71db724d92bf&quot;}" data-component-name="MentionToDOM"></span> that adds a code-first visualization build step to a dbt project. Rather than defining charts in a browser-based BI interface, Glyf keeps chart definitions in SQL and dashboards in YAML alongside the data models that power them. It reads dbt artifacts, resolves model references, validates chart SQL, executes it against the warehouse, and renders charts with Altair. The build produces a static site and chart artifacts that can be reviewed, versioned, and published through an existing delivery workflow. The goal is to make visualizations a declared part of the data pipeline rather than a separate downstream asset.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Fglyf-data%2Fglyf">https://github.com/glyf-data/glyf</a></strong></p><h3><strong>Key Features</strong></h3><ul><li><p><strong>dbt-aware chart definitions</strong> &#8212; resolves <code>ref()</code> and <code>source()</code> references from the dbt manifest before rendering.</p></li><li><p><strong>GGSQL visualizations</strong> &#8212; combines SQL queries with chart instructions to define visualizations in source files.</p></li><li><p><strong>YAML dashboards and Python macros</strong> &#8212; composes charts, layout, labels, thresholds, and reusable components as reviewable project files.</p></li><li><p><strong>Build-time validation</strong> &#8212; checks dbt artifacts, chart files, and SQL execution before a complete build.</p></li><li><p><strong>Static publishing artifacts</strong> &#8212; produces rendered PNG and SVG charts plus a self-contained static site for deployment.</p></li><li><p><strong>Warehouse support</strong> &#8212; runs through the dbt profile with DuckDB, Trino, Snowflake, and BigQuery listed as supported adapters.</p></li><li><p><strong>Data-exposure controls</strong> &#8212; includes row-data modes, PII deny or redact rules, value scanning, per-audience builds, and build provenance.</p></li></ul><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;eb4cc6ae-7a4f-4944-93a7-9d6ad5172766&quot;,&quot;duration&quot;:null}"></div><p>More details are available in the project <a href="iframe.php?url=https%3A%2F%2Fglyfdata.com%2F">documentation</a>.</p><p>License: Apache 2.0</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-agents-with-large-language-models" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n_Yj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F443f8716-29ed-42f5-a755-ecc63791d275_2172x330.png 424w, https://substackcdn.com/image/fetch/$s_!n_Yj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F443f8716-29ed-42f5-a755-ecc63791d275_2172x330.png 848w, https://substackcdn.com/image/fetch/$s_!n_Yj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F443f8716-29ed-42f5-a755-ecc63791d275_2172x330.png 1272w, https://substackcdn.com/image/fetch/$s_!n_Yj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F443f8716-29ed-42f5-a755-ecc63791d275_2172x330.png 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21n_Yj%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F443f8716-29ed-42f5-a755-ecc63791d275_2172x330.png" width="1456" height="221" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/443f8716-29ed-42f5-a755-ecc63791d275_2172x330.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:221,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:836483,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://www.linkedin.com/learning/build-with-ai-sql-agents-with-large-language-models&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/220853529?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F443f8716-29ed-42f5-a755-ecc63791d275_2172x330.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!n_Yj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F443f8716-29ed-42f5-a755-ecc63791d275_2172x330.png 424w, https://substackcdn.com/image/fetch/$s_!n_Yj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F443f8716-29ed-42f5-a755-ecc63791d275_2172x330.png 848w, https://substackcdn.com/image/fetch/$s_!n_Yj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F443f8716-29ed-42f5-a755-ecc63791d275_2172x330.png 1272w, https://substackcdn.com/image/fetch/$s_!n_Yj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F443f8716-29ed-42f5-a755-ecc63791d275_2172x330.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>Design Software Systems Like a Senior Engineer &#8211; Complete Course</strong></h3><p>This complete course from freeCodeCamp.org focuses on designing software systems from a senior engineer&#8217;s perspective.</p><div id="youtube2-soTfFFIQQ8U" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;soTfFFIQQ8U&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FsoTfFFIQQ8U%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Qwen 3.8 27B Just Hit 200 Tokens/s on Mac M5</strong></h3><p>This video from Cloud Codes examines Lithos AI&#8217;s <code>lithos-metal</code> inference engine and its Qwen 3.8-27B benchmark on an M5 Max Mac. It contrasts Metal megakernels and speculative decoding with standard decoding, and distinguishes measured from projected token-per-second results.</p><div id="youtube2-KKKAkhphTSg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;KKKAkhphTSg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FKKKAkhphTSg%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Google&#8217;s GPT-3 Moment for Databases &amp; Spreadsheets (TabFM)</strong></h3><p>The following video from Prompt Engineering introduces Google&#8217;s TabFM, a zero-shot foundation model for tabular classification and regression. It covers TabFM-Auto, a customer-churn workflow, and how data leakage can produce misleading predictions.</p><div id="youtube2-5YJGDElbCDY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;5YJGDElbCDY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F5YJGDElbCDY%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Ollama Decision Models: The End of Jev?!</strong></h3><p>This video by NeuralNine looks at using Ollama to run local decision models that return structured classifications, selections, or scores. It compares that approach with the hosted Jev product and considers tradeoffs around routing tasks, cost, privacy, and access to inference.</p><div id="youtube2-1odB_JnMQP8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;1odB_JnMQP8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F1odB_JnMQP8%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>n8n Full Course &#8211; Architect Scalable AI Automations from Scratch</strong></h3><p>This full course from freeCodeCamp.org, taught by Rahul Joshi, builds n8n automation workflows ranging from personalized emails and CRM chatbots to document extraction and lead qualification. It covers AI agents, persistent memory, human approval, error handling, and operations monitoring.</p><div id="youtube2-YY-egxTQirA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;YY-egxTQirA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FYY-egxTQirA%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="iframe.php?url=https%3A%2F%2Ftheaiops.substack.com%2F" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qJMh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c2bb7-fd53-40bd-b32d-56b6a621dd34_2172x420.gif 424w, https://substackcdn.com/image/fetch/$s_!qJMh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c2bb7-fd53-40bd-b32d-56b6a621dd34_2172x420.gif 848w, https://substackcdn.com/image/fetch/$s_!qJMh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c2bb7-fd53-40bd-b32d-56b6a621dd34_2172x420.gif 1272w, https://substackcdn.com/image/fetch/$s_!qJMh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c2bb7-fd53-40bd-b32d-56b6a621dd34_2172x420.gif 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21qJMh%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F945c2bb7-fd53-40bd-b32d-56b6a621dd34_2172x420.gif" width="1456" height="282" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/945c2bb7-fd53-40bd-b32d-56b6a621dd34_2172x420.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:282,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1251693,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:&quot;https://theaiops.substack.com/&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/220853529?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c2bb7-fd53-40bd-b32d-56b6a621dd34_2172x420.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qJMh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c2bb7-fd53-40bd-b32d-56b6a621dd34_2172x420.gif 424w, https://substackcdn.com/image/fetch/$s_!qJMh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c2bb7-fd53-40bd-b32d-56b6a621dd34_2172x420.gif 848w, https://substackcdn.com/image/fetch/$s_!qJMh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c2bb7-fd53-40bd-b32d-56b6a621dd34_2172x420.gif 1272w, https://substackcdn.com/image/fetch/$s_!qJMh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c2bb7-fd53-40bd-b32d-56b6a621dd34_2172x420.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is on a new book &#8212; <em>Financial AI in Practice: A playbook for credit, fraud, and investment systems</em> by Taehun Kim. The book follows financial AI projects from data preparation and modeling through deployment, monitoring, and business decisions. Its four-layer framework connects data assets, modeling, strategy and monitoring, and application delivery. The examples span credit scoring, fraud detection, investment analysis, and customer personalization, with explainability and regulatory constraints considered throughout. The goal is to help readers understand how models fit into the wider systems that use their predictions.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>Financial AI architecture</strong> &#8212; connecting data, models, decision rules, and application workflows</p></li><li><p><strong>Credit scoring</strong> &#8212; preparing data, engineering features, and deploying an XGBoost pipeline</p></li><li><p><strong>Model monitoring and explainability</strong> &#8212; tracking changes in data and explaining credit decisions</p></li><li><p><strong>Fraud detection</strong> &#8212; combining supervised classifiers with autoencoders for anomaly detection</p></li><li><p><strong>Graph analytics</strong> &#8212; using graph neural networks to identify patterns in transaction networks</p></li><li><p><strong>Investment analysis</strong> &#8212; pairing quantitative models with LLM-based news analysis</p></li><li><p><strong>Retrieval-augmented generation</strong> &#8212; grounding portfolio analysis in selected sources and recording decisions</p></li><li><p><strong>Personalization and agents</strong> &#8212; building customer segments and retention workflows with human approval</p></li><li><p><strong>Business strategy and governance</strong> &#8212; evaluating ROI, model risk, and operational tradeoffs</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%214CsJ%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F3e49bb95-51e7-4bb0-a7c7-721aeaba6d91_1197x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4CsJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e49bb95-51e7-4bb0-a7c7-721aeaba6d91_1197x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4CsJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e49bb95-51e7-4bb0-a7c7-721aeaba6d91_1197x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4CsJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e49bb95-51e7-4bb0-a7c7-721aeaba6d91_1197x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4CsJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e49bb95-51e7-4bb0-a7c7-721aeaba6d91_1197x1500.jpeg 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%214CsJ%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F3e49bb95-51e7-4bb0-a7c7-721aeaba6d91_1197x1500.jpeg" width="1197" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e49bb95-51e7-4bb0-a7c7-721aeaba6d91_1197x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1197,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:90541,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/220853529?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e49bb95-51e7-4bb0-a7c7-721aeaba6d91_1197x1500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4CsJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e49bb95-51e7-4bb0-a7c7-721aeaba6d91_1197x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4CsJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e49bb95-51e7-4bb0-a7c7-721aeaba6d91_1197x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4CsJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e49bb95-51e7-4bb0-a7c7-721aeaba6d91_1197x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4CsJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e49bb95-51e7-4bb0-a7c7-721aeaba6d91_1197x1500.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is ideal for data scientists, ML engineers, financial analysts, and technical leaders who want to build financial AI applications and understand the operational decisions surrounding them.</p><p>The book is available on the <strong><a href="iframe.php?url=https%3A%2F%2Fwww.manning.com%2Fbooks%2Ffinancial-ai-in-practice">publisher's website</a></strong> and <strong><a href="iframe.php?url=https%3A%2F%2Fwww.amazon.com%2FFinancial-AI-Practice-playbook-investment%2Fdp%2F1633435393">Amazon</a></strong>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p>]]></content:encoded></item><item><title><![CDATA[Self-Improving Agent Harnesses, AI Agents with MCP | Issue 109]]></title><description><![CDATA[Explore RRSI for improving agent harnesses, new resources on attention, decision models, and API design, and AI Agents with MCP by Kyle Stratis.]]></description><link>https://ramikrispin.substack.com/p/self-improving-agent-harnesses-ai</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/self-improving-agent-harnesses-ai</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sat, 10 Oct 2026 12:31:03 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21AEGp%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fe3eafdbc-bbc1-4737-a155-b61f3c27cf1f_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - Regularized Recursive Self-Improvement</p></li><li><p>New learning resources - MLA, Fledge Alpha, Jev decision models, and REST API design</p></li><li><p>Book of the week - AI Agents with MCP by Kyle Stratis</p></li></ul><p>The newsletter is also available on <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a> and <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21AEGp%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fe3eafdbc-bbc1-4737-a155-b61f3c27cf1f_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AEGp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3eafdbc-bbc1-4737-a155-b61f3c27cf1f_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!AEGp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3eafdbc-bbc1-4737-a155-b61f3c27cf1f_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!AEGp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3eafdbc-bbc1-4737-a155-b61f3c27cf1f_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!AEGp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3eafdbc-bbc1-4737-a155-b61f3c27cf1f_1920x1080.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21AEGp%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fe3eafdbc-bbc1-4737-a155-b61f3c27cf1f_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e3eafdbc-bbc1-4737-a155-b61f3c27cf1f_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5859077,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/219682575?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3eafdbc-bbc1-4737-a155-b61f3c27cf1f_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AEGp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3eafdbc-bbc1-4737-a155-b61f3c27cf1f_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!AEGp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3eafdbc-bbc1-4737-a155-b61f3c27cf1f_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!AEGp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3eafdbc-bbc1-4737-a155-b61f3c27cf1f_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!AEGp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3eafdbc-bbc1-4737-a155-b61f3c27cf1f_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2><strong>Open Source of the Week</strong></h2><p>This week&#8217;s focus is on the <strong>RRSI</strong> project. <strong>RRSI</strong>, or Regularized Recursive Self-Improvement, is an open-source project from <strong>Google Research</strong> for evolving the harness around a frozen LLM agent. The harness includes the prompts, control flow, configuration, context management, tools, skills, memory, and subagents that shape how the model operates.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%2196tE%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fdc88b08e-06fc-499d-8b2c-a434a7950182_2400x1256.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!96tE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc88b08e-06fc-499d-8b2c-a434a7950182_2400x1256.png 424w, https://substackcdn.com/image/fetch/$s_!96tE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc88b08e-06fc-499d-8b2c-a434a7950182_2400x1256.png 848w, https://substackcdn.com/image/fetch/$s_!96tE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc88b08e-06fc-499d-8b2c-a434a7950182_2400x1256.png 1272w, https://substackcdn.com/image/fetch/$s_!96tE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc88b08e-06fc-499d-8b2c-a434a7950182_2400x1256.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%2196tE%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fdc88b08e-06fc-499d-8b2c-a434a7950182_2400x1256.png" width="1456" height="762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc88b08e-06fc-499d-8b2c-a434a7950182_2400x1256.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:762,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:454670,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/219682575?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc88b08e-06fc-499d-8b2c-a434a7950182_2400x1256.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!96tE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc88b08e-06fc-499d-8b2c-a434a7950182_2400x1256.png 424w, https://substackcdn.com/image/fetch/$s_!96tE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc88b08e-06fc-499d-8b2c-a434a7950182_2400x1256.png 848w, https://substackcdn.com/image/fetch/$s_!96tE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc88b08e-06fc-499d-8b2c-a434a7950182_2400x1256.png 1272w, https://substackcdn.com/image/fetch/$s_!96tE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc88b08e-06fc-499d-8b2c-a434a7950182_2400x1256.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Rather than optimizing the harness against a fixed task set without constraints, RRSI regularizes the search process to reduce overfitting. It limits how many independent edits a candidate can bundle, uses the full edit history to avoid repeating failed hypotheses, and redirects stalled searches toward components that have not been explored. A critic screens candidates for task-specific logic before evaluation, while noise- and cost-aware selection rules reject gains that are too small or too expensive.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Fgoogle-research%2Frrsi">https://github.com/google-research/rrsi</a></strong></p><h3><strong>Key Features</strong></h3><ul><li><p><strong>Open harness editing</strong> &#8212; modify prompts, control flow, tools, skills, memory, subagents, and context management</p></li><li><p><strong>Regularized proposals</strong> &#8212; control the number of bundled edits and use prior edit history to guide new candidates</p></li><li><p><strong>Leakage screening</strong> &#8212; review candidates for benchmark-specific logic before running evaluations</p></li><li><p><strong>Noise-aware selection</strong> &#8212; require improvements to exceed the measured evaluation variance</p></li><li><p><strong>Cost-aware decisions</strong> &#8212; accept additional inference tokens only when they produce a measured gain</p></li><li><p><strong>Three domain adapters</strong> &#8212; apply the same loop to terminal tasks, document work, and engineering design</p></li><li><p><strong>Auditable experiments</strong> &#8212; isolate candidates in Git worktrees and record hypotheses, score changes, costs, and verdicts</p></li></ul><p>More details are available on the project <a href="iframe.php?url=https%3A%2F%2Fregularized-rsi.com%2F">website</a>.</p><p>License: Apache 2.0</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="iframe.php?url=https%3A%2F%2Ftheaiops.substack.com%2F" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d6jE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20fce94c-eddf-4a33-b2de-463af519309b_2172x420.gif 424w, https://substackcdn.com/image/fetch/$s_!d6jE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20fce94c-eddf-4a33-b2de-463af519309b_2172x420.gif 848w, https://substackcdn.com/image/fetch/$s_!d6jE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20fce94c-eddf-4a33-b2de-463af519309b_2172x420.gif 1272w, https://substackcdn.com/image/fetch/$s_!d6jE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20fce94c-eddf-4a33-b2de-463af519309b_2172x420.gif 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21d6jE%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F20fce94c-eddf-4a33-b2de-463af519309b_2172x420.gif" width="1456" height="282" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20fce94c-eddf-4a33-b2de-463af519309b_2172x420.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:282,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1251693,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:&quot;https://theaiops.substack.com/&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/219682575?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20fce94c-eddf-4a33-b2de-463af519309b_2172x420.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!d6jE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20fce94c-eddf-4a33-b2de-463af519309b_2172x420.gif 424w, https://substackcdn.com/image/fetch/$s_!d6jE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20fce94c-eddf-4a33-b2de-463af519309b_2172x420.gif 848w, https://substackcdn.com/image/fetch/$s_!d6jE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20fce94c-eddf-4a33-b2de-463af519309b_2172x420.gif 1272w, https://substackcdn.com/image/fetch/$s_!d6jE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20fce94c-eddf-4a33-b2de-463af519309b_2172x420.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>Multi-Head Latent Attention Explained Visually: DeepSeek&#8217;s Secret to 93% Less GPU Memory</strong></h3><p>This visual explainer from <strong>Visual AI</strong> covers attention during prefill and decoding, the KV-cache memory bottleneck, and the progression from multi-head attention to MQA, GQA, and DeepSeek&#8217;s multi-head latent attention. It also explains low-rank latent compression and decoupled RoPE.</p><div id="youtube2-DBdeFbNrIZI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;DBdeFbNrIZI&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FDBdeFbNrIZI%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Fledge Alpha Is Here &#8211; And It&#8217;s Fast</strong></h3><p>This investigation by <strong>Bruno Vega and Kai</strong> examines the anonymously released <strong>Fledge Alpha</strong> model in OpenCode Zen. It reviews the model&#8217;s published specifications, the models.dev pull-request history, evidence that may connect it to Thinking Machines&#8217; Inkling family, early coding tests, and the privacy tradeoff of using the free preview.</p><div id="youtube2-4Zb9my4MI3U" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;4Zb9my4MI3U&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F4Zb9my4MI3U%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>What Is Jev and How to Use It with an LLM? (Free Lab)</strong></h3><p>The following video from <strong>KodeKloud</strong> introduces <strong>Jev</strong> as a non-generative decision model that complements LLMs. It covers the state-and-questions API, binary, choice, and score outputs, and applications such as model routing, human-review thresholds, safety checks, and policy compliance, with a free hands-on lab.</p><div id="youtube2-0VKS8VS_M2s" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;0VKS8VS_M2s&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F0VKS8VS_M2s%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Open-Source Jev Now Runs Locally</strong></h3><p>This walkthrough by <strong>Samuel Gregory</strong> explores running Jev-style decision models locally. It explains decision models, compares local options including <strong>Nimble</strong> and <strong>Tev1</strong> with cloud-hosted Jev and Claude, and closes with a real-world example and benchmark comparison.</p><div id="youtube2-2d8p0INizGc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;2d8p0INizGc&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F2d8p0INizGc%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>8 Must-Know REST API Design Principles for Developers</strong></h3><p>This video from <strong>Visualcoders</strong> presents eight patterns for APIs that need to support changing clients and larger workloads. It covers resource-oriented design, pagination, filtering and field selection, idempotency, backend-for-frontend, API gateways, asynchronous APIs, and versioning.</p><div id="youtube2-jCs7ld1ROcw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;jCs7ld1ROcw&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FjCs7ld1ROcw%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>This is how to train Decision Language Models (like JEV) from scratch on custom tasks!</strong></h3><p>This long-form tutorial from <strong>Neural Breakdown with AVB</strong> builds a System One decision model inspired by Jev. It covers choice, score, and noul question types, bi-encoder versus joint-encoder design, a Qwen-based network and decision head, choice-order invariance, a live PyTorch implementation, dataset construction, training, and results.</p><div id="youtube2-sF3CNPbWA8o" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;sF3CNPbWA8o&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FsF3CNPbWA8o%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is on a new book &#8212; <em>AI Agents with MCP</em> by Kyle Stratis. The book explains how the Model Context Protocol connects AI applications with tools, data, prompts, and external services through a standardized interface. It moves from MCP&#8217;s architecture and connection lifecycle to hands-on client and server development with the Python SDK, then covers the operational concerns involved in using MCP beyond a local prototype.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>Agentic AI and MCP</strong> &#8212; understanding agents, common use cases, and MCP&#8217;s role in agentic systems</p></li><li><p><strong>Protocol architecture</strong> &#8212; working with hosts, clients, servers, transports, and the connection lifecycle</p></li><li><p><strong>MCP clients</strong> &#8212; connecting over stdio and Streamable HTTP and consuming tools, resources, and prompts</p></li><li><p><strong>Advanced client capabilities</strong> &#8212; supporting sampling, roots, elicitations, OAuth, registries, and multiple servers</p></li><li><p><strong>MCP servers</strong> &#8212; building servers with the Python SDK and exposing tools, prompts, and resources</p></li><li><p><strong>Server utilities</strong> &#8212; adding logging, progress notifications, pagination, cancellation, and client-provided capabilities</p></li><li><p><strong>Testing and evaluation</strong> &#8212; debugging with MCP Inspector, automating tests, and evaluating server behavior</p></li><li><p><strong>Security</strong> &#8212; identifying MCP vulnerabilities and applying architectural and framework-level safeguards</p></li><li><p><strong>Transports and messaging</strong> &#8212; using JSON-RPC, session objects, stdio, Streamable HTTP, and custom transports</p></li><li><p><strong>Ecosystem and extensions</strong> &#8212; exploring the MCP Registry, MCP Apps, authentication extensions, MCP Tasks, and alternative frameworks</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21fT_L%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F408544ad-061f-4325-b94c-e05c56df7082_1143x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fT_L!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408544ad-061f-4325-b94c-e05c56df7082_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fT_L!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408544ad-061f-4325-b94c-e05c56df7082_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fT_L!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408544ad-061f-4325-b94c-e05c56df7082_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fT_L!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408544ad-061f-4325-b94c-e05c56df7082_1143x1500.jpeg 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21fT_L%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F408544ad-061f-4325-b94c-e05c56df7082_1143x1500.jpeg" width="1143" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/408544ad-061f-4325-b94c-e05c56df7082_1143x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1143,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:153564,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/219682575?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408544ad-061f-4325-b94c-e05c56df7082_1143x1500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fT_L!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408544ad-061f-4325-b94c-e05c56df7082_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fT_L!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408544ad-061f-4325-b94c-e05c56df7082_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fT_L!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408544ad-061f-4325-b94c-e05c56df7082_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fT_L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408544ad-061f-4325-b94c-e05c56df7082_1143x1500.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is ideal for intermediate to advanced Python developers, AI engineers, and software architects who want to build and operate MCP clients, servers, and agent workflows with a systems-level understanding of the protocol.</p><p>The book is available on the <strong><a href="iframe.php?url=https%3A%2F%2Flearning.oreilly.com%2Flibrary%2Fview%2Fai-agents-with%2F9798341639546%2F">publisher&#8217;s website</a></strong> and on <strong><a href="iframe.php?url=https%3A%2F%2Fwww.amazon.com%2FAI-Agents-MCP-End-End%2Fdp%2FB0FYCBVGX7%2F">Amazon</a></strong>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><div><hr></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[React Interfaces for Shiny, Practical RAG Systems in Python | Issue 108]]></title><description><![CDATA[Explore ShinyReact for React-based Shiny interfaces, resources on production agents and software factories, and RAG with Python Cookbook by Dominik Polzer.]]></description><link>https://ramikrispin.substack.com/p/react-interfaces-for-shiny-practical</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/react-interfaces-for-shiny-practical</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sat, 03 Oct 2026 15:17:18 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21x3pN%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fedd80ce8-34ec-423f-8183-2bea07c2a370_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - ShinyReact</p></li><li><p>New learning resources - LangSmith, specialist agents, software factories, and building agents in Python</p></li><li><p>Book of the week - RAG with Python Cookbook by Dominik Polzer</p></li></ul><p>The newsletter is also available on <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a> and <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21x3pN%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fedd80ce8-34ec-423f-8183-2bea07c2a370_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x3pN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedd80ce8-34ec-423f-8183-2bea07c2a370_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!x3pN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedd80ce8-34ec-423f-8183-2bea07c2a370_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!x3pN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedd80ce8-34ec-423f-8183-2bea07c2a370_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!x3pN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedd80ce8-34ec-423f-8183-2bea07c2a370_1920x1080.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21x3pN%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fedd80ce8-34ec-423f-8183-2bea07c2a370_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/edd80ce8-34ec-423f-8183-2bea07c2a370_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2852798,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/218656072?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedd80ce8-34ec-423f-8183-2bea07c2a370_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!x3pN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedd80ce8-34ec-423f-8183-2bea07c2a370_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!x3pN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedd80ce8-34ec-423f-8183-2bea07c2a370_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!x3pN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedd80ce8-34ec-423f-8183-2bea07c2a370_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!x3pN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedd80ce8-34ec-423f-8183-2bea07c2a370_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2><strong>Open Source of the Week</strong></h2><p>This week&#8217;s focus is on the <strong>ShinyReact</strong> project. <strong>ShinyReact</strong> is an open-source project from <strong>Posit</strong> that connects a React frontend to a Shiny server written in Python or R. It provides the communication layer but no UI components, leaving the application interface under the developer&#8217;s control.</p><p>Rather than defining the interface on the server or wrapping individual React widgets as Shiny components, ShinyReact keeps reactive computation on the server and presentation in a React client. The server publishes JSON values with <code>reactive_output</code>, while React hooks send inputs, consume outputs, monitor output state, and receive custom messages. One JavaScript bundle supports both Python and R servers, so the same client can work with either backend.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Fposit-dev%2Fshinyreact">https://github.com/posit-dev/shinyreact</a></strong></p><h3><strong>Key Features</strong></h3><ul><li><p><strong>Python and R support</strong> &#8212; connect the same React client to a Shiny server implemented in either language</p></li><li><p><strong>React-owned interface</strong> &#8212; build the complete UI in <code>ui.tsx</code>, JSX, or JavaScript instead of generating markup on the server</p></li><li><p><strong>Data-oriented outputs</strong> &#8212; send raw JSON values with <code>reactive_output</code> and render them in one or more React components</p></li><li><p><strong>Bidirectional hooks</strong> &#8212; exchange inputs, outputs, and custom messages between the React client and Shiny server</p></li><li><p><strong>Client-side presentation</strong> &#8212; handle formatting, sorting, hover state, and view changes without a server round trip</p></li><li><p><strong>Output lifecycle state</strong> &#8212; distinguish pending, ready, recalculating, and error states in the interface</p></li><li><p><strong>Flexible builds</strong> &#8212; use a no-build JavaScript file or a TypeScript workflow with Vite and hot-module replacement</p></li><li><p><strong>Agent skills</strong> &#8212; scaffold a new ShinyReact application or convert an existing Shiny app with packaged coding-agent guidance</p></li></ul><p>The project is currently pre-release. More details and examples are available in the project <a href="iframe.php?url=https%3A%2F%2Fposit-dev.github.io%2Fshinyreact%2F">documentation</a>.</p><p>License: MIT</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><div><hr></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>LangSmith Crash Course: Running Agents in Production</strong></h3><p>This crash course from <strong>NeuralNine</strong> introduces <strong>LangSmith</strong> for operating LLM applications in Python. It covers setup, tracing, datasets and experiments, evaluators, prompt management, annotation queues, monitoring, dashboards, and a document-extraction workflow.</p><div id="youtube2-P3kmo04DiEw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;P3kmo04DiEw&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FP3kmo04DiEw%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Agent Wikis Beginner&#8217;s Guide: Building Specialist Agents</strong></h3><p>The following video from <strong>Tonbi&#8217;s AI Garage</strong> explains how to turn a general-purpose agent into a specialist using an <strong>Agent Wikis</strong> profile. It walks through the profile&#8217;s skills, knowledge, tools, guardrails, and routines, then configures the <code>local-llm-tinkerer</code> and uses it to prepare a sandbox and run a local benchmark campaign.</p><div id="youtube2-O15SMfGR0lE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;O15SMfGR0lE&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FO15SMfGR0lE%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>What It Actually Takes to Build a Software Factory</strong></h3><p>In this talk from <strong>AI Engineer</strong>, <strong>Tereza T&#237;&#382;kov&#225; from Factory</strong> describes a software factory that spans prioritization, implementation, validation, production testing, and feedback. She discusses model routing, verifiable completion criteria, separate workers and validators, selective context loading, codebase preparation, and the role of human judgment.</p><div id="youtube2-vGCJ7diEtrw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;vGCJ7diEtrw&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FvGCJ7diEtrw%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Build Your First AI Agent in Python</strong></h3><p>This beginner tutorial from <strong>Kevin Stratvert</strong> builds a Python agent with <strong>Agentspan</strong> using a tool, an agent, and a runner. It also demonstrates the execution dashboard, a test-writing agent, persisted state, recovery after a forced crash, and idempotent reruns.</p><div id="youtube2-YKPO2S6j7MM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;YKPO2S6j7MM&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FYKPO2S6j7MM%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-agents-with-large-language-models" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KQjU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff69b3b3e-3088-4fcc-ac4a-cbf4d2f15601_2172x330.png 424w, https://substackcdn.com/image/fetch/$s_!KQjU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff69b3b3e-3088-4fcc-ac4a-cbf4d2f15601_2172x330.png 848w, https://substackcdn.com/image/fetch/$s_!KQjU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff69b3b3e-3088-4fcc-ac4a-cbf4d2f15601_2172x330.png 1272w, https://substackcdn.com/image/fetch/$s_!KQjU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff69b3b3e-3088-4fcc-ac4a-cbf4d2f15601_2172x330.png 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21KQjU%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Ff69b3b3e-3088-4fcc-ac4a-cbf4d2f15601_2172x330.png" width="1456" height="221" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f69b3b3e-3088-4fcc-ac4a-cbf4d2f15601_2172x330.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:221,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:836483,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://www.linkedin.com/learning/build-with-ai-sql-agents-with-large-language-models&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/218656072?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff69b3b3e-3088-4fcc-ac4a-cbf4d2f15601_2172x330.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KQjU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff69b3b3e-3088-4fcc-ac4a-cbf4d2f15601_2172x330.png 424w, https://substackcdn.com/image/fetch/$s_!KQjU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff69b3b3e-3088-4fcc-ac4a-cbf4d2f15601_2172x330.png 848w, https://substackcdn.com/image/fetch/$s_!KQjU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff69b3b3e-3088-4fcc-ac4a-cbf4d2f15601_2172x330.png 1272w, https://substackcdn.com/image/fetch/$s_!KQjU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff69b3b3e-3088-4fcc-ac4a-cbf4d2f15601_2172x330.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is a new book - <em>RAG with Python Cookbook</em> by Dominik Polzer. The book takes a recipe-based approach to building retrieval-augmented generation systems in Python, from preparing different data formats and choosing embeddings to improving retrieval and evaluating results. Rather than focusing only on a basic vector-search pipeline, it also covers agentic RAG, knowledge graphs, multimodal inputs, and deploying RAG applications. The examples are aimed at intermediate to advanced readers who want to understand the individual components and their trade-offs.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>RAG foundations</strong> &#8212; identifying suitable use cases and building a first application</p></li><li><p><strong>Data loading</strong> &#8212; processing documents, tables, databases, audio, images, and video</p></li><li><p><strong>Data preparation</strong> &#8212; adding metadata and comparing document, semantic, and agentic chunking methods</p></li><li><p><strong>Embeddings and search</strong> &#8212; selecting embedding models and combining semantic and keyword retrieval</p></li><li><p><strong>Vector storage</strong> &#8212; working with FAISS, Chroma, PostgreSQL, and pgvector</p></li><li><p><strong>Retrieval strategies</strong> &#8212; applying metadata filters, HyDE, multiquery retrieval, routing, and reranking</p></li><li><p><strong>Agentic and graph RAG</strong> &#8212; building tool-using workflows and knowledge-graph retrieval with Neo4j</p></li><li><p><strong>Evaluation</strong> &#8212; testing retrieval precision, faithfulness, and response relevance</p></li><li><p><strong>Application delivery</strong> &#8212; building Streamlit interfaces and deploying with Docker and AWS</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21cyeO%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fbe3e6a12-8377-405f-8710-382d4e8f0f41_1143x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cyeO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3e6a12-8377-405f-8710-382d4e8f0f41_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cyeO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3e6a12-8377-405f-8710-382d4e8f0f41_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cyeO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3e6a12-8377-405f-8710-382d4e8f0f41_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cyeO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3e6a12-8377-405f-8710-382d4e8f0f41_1143x1500.jpeg 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21cyeO%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fbe3e6a12-8377-405f-8710-382d4e8f0f41_1143x1500.jpeg" width="1143" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be3e6a12-8377-405f-8710-382d4e8f0f41_1143x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1143,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:161244,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/218656072?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3e6a12-8377-405f-8710-382d4e8f0f41_1143x1500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cyeO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3e6a12-8377-405f-8710-382d4e8f0f41_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cyeO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3e6a12-8377-405f-8710-382d4e8f0f41_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cyeO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3e6a12-8377-405f-8710-382d4e8f0f41_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cyeO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3e6a12-8377-405f-8710-382d4e8f0f41_1143x1500.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is ideal for Python developers, machine learning engineers, and AI practitioners who want a practical reference for designing, testing, and deploying RAG systems beyond a basic prototype.</p><p>The book is available on the <strong><a href="iframe.php?url=https%3A%2F%2Flearning.oreilly.com%2Flibrary%2Fview%2Frag-with-python%2F9798341600553%2F">publisher&#8217;s website</a></strong> and on <strong><a href="iframe.php?url=https%3A%2F%2Fwww.amazon.com%2FRAG-Python-Cookbook-Practical-Preprocessing%2Fdp%2FB0FTTFFNVF%2F">Amazon</a></strong>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><div><hr></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Prepare data for a SQL AI agent with DuckDB and Ibis]]></title><description><![CDATA[Prepare SFO passenger data for a SQL AI agent, create a persistent DuckDB table through Ibis, and validate it with native SQL.]]></description><link>https://ramikrispin.substack.com/p/prepare-data-for-a-sql-ai-agent-with</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/prepare-data-for-a-sql-ai-agent-with</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sun, 27 Sep 2026 17:27:08 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21Y8Ht%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fc9377ae1-8c19-4c57-9bd1-8c194b3f52d2_1672x940.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Before we build our first SQL AI agent, we need a reproducible Python environment and a database the agent can query. In <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fset-up-a-python-environment-for-sql">Part 1, </a><em><a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fset-up-a-python-environment-for-sql">Set up a Python environment for SQL AI agents</a></em>, we reviewed how to set up the Python environment for this tutorial series. In this tutorial, we will focus on setting up the database the agent will query. We will introduce and prepare the San Francisco International Airport (SFO) passenger traffic dataset, create a persistent DuckDB database through Ibis, and verify the table with native SQL. Completing both parts gives us the shared foundation we need before we introduce a model and build the agent workflow.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21Y8Ht%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fc9377ae1-8c19-4c57-9bd1-8c194b3f52d2_1672x940.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y8Ht!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9377ae1-8c19-4c57-9bd1-8c194b3f52d2_1672x940.png 424w, https://substackcdn.com/image/fetch/$s_!Y8Ht!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9377ae1-8c19-4c57-9bd1-8c194b3f52d2_1672x940.png 848w, https://substackcdn.com/image/fetch/$s_!Y8Ht!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9377ae1-8c19-4c57-9bd1-8c194b3f52d2_1672x940.png 1272w, https://substackcdn.com/image/fetch/$s_!Y8Ht!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9377ae1-8c19-4c57-9bd1-8c194b3f52d2_1672x940.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21Y8Ht%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fc9377ae1-8c19-4c57-9bd1-8c194b3f52d2_1672x940.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9377ae1-8c19-4c57-9bd1-8c194b3f52d2_1672x940.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1230545,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/217697844?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9377ae1-8c19-4c57-9bd1-8c194b3f52d2_1672x940.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Y8Ht!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9377ae1-8c19-4c57-9bd1-8c194b3f52d2_1672x940.png 424w, https://substackcdn.com/image/fetch/$s_!Y8Ht!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9377ae1-8c19-4c57-9bd1-8c194b3f52d2_1672x940.png 848w, https://substackcdn.com/image/fetch/$s_!Y8Ht!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9377ae1-8c19-4c57-9bd1-8c194b3f52d2_1672x940.png 1272w, https://substackcdn.com/image/fetch/$s_!Y8Ht!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9377ae1-8c19-4c57-9bd1-8c194b3f52d2_1672x940.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This tutorial series is based on my LinkedIn Learning course, <em><a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-agents-with-large-language-models">Build with AI: SQL Agents with Large Language Models</a></em>. If you prefer video-based learning, please check out the course on LinkedIn Learning:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-agents-with-large-language-models" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iUEF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae75fd0b-8c1f-452a-92ca-75d5c6571715_2172x330.png 424w, https://substackcdn.com/image/fetch/$s_!iUEF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae75fd0b-8c1f-452a-92ca-75d5c6571715_2172x330.png 848w, https://substackcdn.com/image/fetch/$s_!iUEF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae75fd0b-8c1f-452a-92ca-75d5c6571715_2172x330.png 1272w, https://substackcdn.com/image/fetch/$s_!iUEF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae75fd0b-8c1f-452a-92ca-75d5c6571715_2172x330.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21iUEF%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fae75fd0b-8c1f-452a-92ca-75d5c6571715_2172x330.png" width="1456" height="221" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae75fd0b-8c1f-452a-92ca-75d5c6571715_2172x330.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:221,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:836483,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://www.linkedin.com/learning/build-with-ai-sql-agents-with-large-language-models&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/217697844?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae75fd0b-8c1f-452a-92ca-75d5c6571715_2172x330.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!iUEF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae75fd0b-8c1f-452a-92ca-75d5c6571715_2172x330.png 424w, https://substackcdn.com/image/fetch/$s_!iUEF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae75fd0b-8c1f-452a-92ca-75d5c6571715_2172x330.png 848w, https://substackcdn.com/image/fetch/$s_!iUEF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae75fd0b-8c1f-452a-92ca-75d5c6571715_2172x330.png 1272w, https://substackcdn.com/image/fetch/$s_!iUEF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae75fd0b-8c1f-452a-92ca-75d5c6571715_2172x330.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>By the end of this tutorial, we will know how to:</p><ul><li><p>Load and validate the SFO passenger traffic snapshot with pandas.</p></li><li><p>Prepare the fields the SQL AI agent will use as context.</p></li><li><p>Create a persistent DuckDB database and <code>air_traffic</code> table through Ibis.</p></li><li><p>Inspect the table schema and verify its row count.</p></li><li><p>Query the table with native SQL from Python.</p></li></ul><p>A reproducible example of the code in this tutorial is available in the following <a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FRamiKrispin%2Fsql-ai-agent%2Fblob%2Fmain%2Ftutorials%2F03a_duckdb_settings.ipynb">notebook</a>. Before continuing, please make sure the Python environment is configured as described in <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fset-up-a-python-environment-for-sql">Part 1, </a><em><a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fset-up-a-python-environment-for-sql">Set up a Python environment for SQL AI agents</a></em>, including the repository dependencies and <code>DUCKDB_DATABASES_PATH</code>.</p><p>The tutorial series uses DuckDB. The optional <a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FRamiKrispin%2Fsql-ai-agent%2Fblob%2Fmain%2Ftutorials%2F03a_postgresql_settings.ipynb">tutorials/03a_postgresql_settings.ipynb</a> notebook is available for readers who use the Docker setup described in Part 1, but it is not required here or in later tutorials.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><h2><strong>Why DuckDB and Ibis?</strong></h2><p>Before we load the data, let&#8217;s look at why I selected DuckDB as the database backend and Ibis as the Python query interface for this tutorial. The main reason is ease of use: together, they keep the workflow lightweight and within Python. DuckDB runs inside the Python process without requiring a separate database server, and it can store the database in a local file so we can reuse the table in later sessions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21MWUg%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Faefb2b3b-d4df-451a-8b97-cc49b47e661e_1692x930.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MWUg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faefb2b3b-d4df-451a-8b97-cc49b47e661e_1692x930.png 424w, https://substackcdn.com/image/fetch/$s_!MWUg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faefb2b3b-d4df-451a-8b97-cc49b47e661e_1692x930.png 848w, https://substackcdn.com/image/fetch/$s_!MWUg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faefb2b3b-d4df-451a-8b97-cc49b47e661e_1692x930.png 1272w, https://substackcdn.com/image/fetch/$s_!MWUg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faefb2b3b-d4df-451a-8b97-cc49b47e661e_1692x930.png 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21MWUg%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Faefb2b3b-d4df-451a-8b97-cc49b47e661e_1692x930.png" width="1456" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aefb2b3b-d4df-451a-8b97-cc49b47e661e_1692x930.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1458963,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/217697844?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faefb2b3b-d4df-451a-8b97-cc49b47e661e_1692x930.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MWUg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faefb2b3b-d4df-451a-8b97-cc49b47e661e_1692x930.png 424w, https://substackcdn.com/image/fetch/$s_!MWUg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faefb2b3b-d4df-451a-8b97-cc49b47e661e_1692x930.png 848w, https://substackcdn.com/image/fetch/$s_!MWUg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faefb2b3b-d4df-451a-8b97-cc49b47e661e_1692x930.png 1272w, https://substackcdn.com/image/fetch/$s_!MWUg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faefb2b3b-d4df-451a-8b97-cc49b47e661e_1692x930.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Figure 1. The data preparation pipeline outlines the workflow we will use in this tutorial to support later SQL AI agent interactions.</em></figcaption></figure></div><p>Ibis gives us one Python interface for connecting to DuckDB and other supported backends, including PostgreSQL and Snowflake. This makes it easier to reuse the surrounding Python workflow if the database changes. Because this tutorial uses native SQL, moving to another backend may still require changes to the connection configuration, authentication, data types, or SQL dialect. Even so, the core workflow&#8212;connect to the database, create a table, submit a query, and return data to Python&#8212;remains the same.</p><blockquote><p><strong>Note:</strong> DuckDB is the database used throughout this tutorial series. The tutorial supporting repository also provides an optional PostgreSQL notebook for readers who prefer PostgreSQL and are comfortable using the Docker environment. This optional path is not a prerequisite for later tutorials.</p></blockquote><p>With the environment from Part 1 ready and the database approach established, we can load the dataset that will support the rest of the series.</p><h2><strong>Load the SFO passenger traffic dataset</strong></h2><p>Throughout this tutorial series, we will use the San Francisco International Airport (SFO) <a href="iframe.php?url=https%3A%2F%2Fdata.sfgov.org%2FTransportation%2FAir-Traffic-Passenger-Statistics%2Frkru-6vcg%2Fabout_data">Air Traffic Passenger Statistics dataset</a>. As its name suggests, the dataset provides monthly passenger traffic statistics for airlines operating at SFO and is published through the <a href="iframe.php?url=https%3A%2F%2Fdata.sfgov.org%2F">San Francisco Data Portal</a>. It gives us an approachable, real-world dataset for building and testing a SQL AI agent.</p><p>In this section, we will load a snapshot of the dataset from a CSV file, explore its structure and data types, and run a few quality-assurance checks before preparing it for the agent.</p><p>We begin by importing <code>os</code> to read the database-path environment variable, <code>Path</code> to work with file paths, pandas to load and prepare the comma-separated values (CSV) file, and Ibis to create and query the DuckDB table:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;7348e8f1-a215-41fe-8476-7faf557388da&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">import os

from pathlib import Path

import ibis
import pandas as pd</code></pre></div><p>The tutorial supporting repository contains a local snapshot of the dataset at <a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FRamiKrispin%2Fsql-ai-agent%2Fblob%2Fmain%2Fdata%2FAir_Traffic_Passenger_Statistics_20260905.csv">data/Air_Traffic_Passenger_Statistics_20260905.csv</a>.</p><p>Using a repository snapshot gives the tutorial series a stable starting point. The source dataset can receive new records, but everyone who checks out this version of the project works from the same input. That consistency will matter when we compare queries and agent behavior in later tutorials.</p><p>The notebook supports two common launch locations: the repository root and the <code>tutorials</code> directory. The next cell checks both relative paths and raises a clear error if it cannot find the CSV:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;36ef36a5-12ec-4cba-9afa-8f86ae36d99c&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">filename = "Air_Traffic_Passenger_Statistics_20260905.csv"
candidates = [Path("data") / filename, Path("../data") / filename]
dataset_path = next((path.resolve() for path in candidates if path.is_file()), None)

if dataset_path is None:
    raise FileNotFoundError(
        f"Could not find {filename}. Start Jupyter from the sql-ai-agent "
        "repository root or its tutorials directory."
    )

raw = pd.read_csv(
    dataset_path,
    keep_default_na=False,
    na_values=[""],
)
print(f"Loaded {raw.shape[0]:,} rows and {raw.shape[1]} columns")</code></pre></div><p>The snapshot contains 40,450 rows and 15 source columns:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;cc83bf75-9d8a-48e7-a4c3-5b02c9e653ce&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">Loaded 40,450 rows and 15 columns</code></pre></div><p>The two <code>read_csv()</code> arguments protect an important source value. pandas normally recognizes <code>NA</code> as a missing-value marker. In this dataset, <code>NA</code> is also a valid airline code. <code>keep_default_na=False</code> prevents pandas from silently replacing that code, while <code>na_values=[""]</code> continues to treat empty fields as missing.</p><p>This is a small but important example of preparation before agent development. If a valid code is changed during ingestion, a later SQL query cannot recover the original meaning.</p><p>Next, we define the expected dimensions for the source data and the prepared table. Keeping these values in one place makes the validation checks easier to read:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;e431eee8-3c3a-4ee3-ae83-fdc447c45737&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">rows_number = 40450
cols_number = 15
cols_reformat_number = 13</code></pre></div><p>We inspect a few records and their data types:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;bf87add1-8225-4907-9d1d-cf9a8030bd79&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">raw.head()</code></pre></div><p>We should expect the following output:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;cd8fe357-774a-4c6c-83a1-17eafd8ad150&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">   Activity Period Activity Period Start Date  \
0           199907                 1999/07/01   
1           199907                 1999/07/01   
2           199907                 1999/07/01   
3           199907                 1999/07/01   
4           199907                 1999/07/01   

                         Operating Airline Operating Airline IATA Code  \
0                             ATA Airlines                          TZ   
1                             ATA Airlines                          TZ   
2                             ATA Airlines                          TZ   
3  Aeroflot Russian International Airlines                         NaN   
4  Aeroflot Russian International Airlines                         NaN   

                         Published Airline Published Airline IATA Code  \
0                             ATA Airlines                          TZ   
1                             ATA Airlines                          TZ   
2                             ATA Airlines                          TZ   
3  Aeroflot Russian International Airlines                         NaN   
4  Aeroflot Russian International Airlines                         NaN   

     GEO Summary GEO Region Activity Type Code Price Category Code  \
0       Domestic         US           Deplaned            Low Fare   
1       Domestic         US           Enplaned            Low Fare   
2       Domestic         US     Thru / Transit            Low Fare   
3  International     Europe           Deplaned               Other   
4  International     Europe           Enplaned               Other   

     Terminal Boarding Area Passenger Count              data_as_of  \
0  Terminal 1             B          31,432  2026/08/20 01:00:20 PM   
1  Terminal 1             B          31,353  2026/08/20 01:00:20 PM   
2  Terminal 1             B           2,518  2026/08/20 01:00:20 PM   
3  Terminal 2             D           1,324  2026/08/20 01:00:20 PM   
4  Terminal 2             D           1,198  2026/08/20 01:00:20 PM   

           data_loaded_at  
0  2026/08/22 03:04:26 PM  
1  2026/08/22 03:04:26 PM  
2  2026/08/22 03:04:26 PM  
3  2026/08/22 03:04:26 PM  
4  2026/08/22 03:04:26 PM  
</code></pre></div><p>As we can see, each row describes a segment of passenger traffic at SFO, organized by details such as the airline, terminal, geographic region, activity type, and reporting period.</p><p>Now let&#8217;s validate the snapshot dimensions and confirm that the literal <code>NA</code> airline code was preserved during ingestion:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;cac1cb16-4f8d-4ae8-9c8f-2496e16060a5&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">assert raw.shape == (rows_number, cols_number)
assert raw["Operating Airline IATA Code"].eq("NA").any()
print("Source snapshot validated")</code></pre></div><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;1e50808b-22c4-46b0-aca7-509cc3741a87&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">Source snapshot validated</code></pre></div><p>These checks establish the starting contract: 40,450 rows, 15 source columns, and at least one literal <code>NA</code> operating-airline code. They are focused checks for this tutorial, not a complete data-quality pipeline.</p><p>Before moving on, let&#8217;s inspect the data type assigned to each column with the <code>dtypes</code> attribute:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;fccb16dd-adf9-4677-9719-9fe71d750811&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">raw.dtypes</code></pre></div><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;88f59eb2-2f03-4187-b404-533083eef042&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">Activity Period                 int64
Activity Period Start Date     object
Operating Airline              object
Operating Airline IATA Code    object
Published Airline              object
Published Airline IATA Code    object
GEO Summary                    object
GEO Region                     object
Activity Type Code             object
Price Category Code            object
Terminal                       object
Boarding Area                  object
Passenger Count                object
data_as_of                     object
data_loaded_at                 object
dtype: object</code></pre></div><p>As we can see, most columns use the <code>object</code> data type. Although this is appropriate for the descriptive text fields, some columns require more useful types. For example, <code>Passenger Count</code> should be an integer, and <code>Activity Period Start Date</code> should be a date. In the next section, we will reformat these fields and prepare the table for the SQL AI agent.</p><h2><strong>Prepare the table for agent context</strong></h2><p>In the previous tutorial, <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fcontext-in-sql-ai-agents-the-three">Context in SQL AI Agents: The Three Layers of Context</a>, we reviewed the role of context in helping a SQL AI agent generate accurate output. One of those context inputs is the table&#8217;s field names. In this section, we prepare the table so its fields provide the agent with focused and meaningful context.</p><p>This preparation goes beyond correcting data types. It can include removing columns that the agent does not need, enriching the data with derived fields or calculations, and reformatting values so they are ready for analysis.</p><p>We should also review the column names and rename them when their meaning is unclear. Column names are an important part of the schema context supplied to a later model, so descriptive names make each field&#8217;s role explicit and reduce ambiguity during candidate SQL generation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21nGdn%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F1773a9a0-dd6e-4c13-ab12-355b5d87b465_1717x916.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nGdn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1773a9a0-dd6e-4c13-ab12-355b5d87b465_1717x916.png 424w, https://substackcdn.com/image/fetch/$s_!nGdn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1773a9a0-dd6e-4c13-ab12-355b5d87b465_1717x916.png 848w, https://substackcdn.com/image/fetch/$s_!nGdn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1773a9a0-dd6e-4c13-ab12-355b5d87b465_1717x916.png 1272w, https://substackcdn.com/image/fetch/$s_!nGdn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1773a9a0-dd6e-4c13-ab12-355b5d87b465_1717x916.png 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21nGdn%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F1773a9a0-dd6e-4c13-ab12-355b5d87b465_1717x916.png" width="1456" height="777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1773a9a0-dd6e-4c13-ab12-355b5d87b465_1717x916.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:777,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1495472,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/217697844?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1773a9a0-dd6e-4c13-ab12-355b5d87b465_1717x916.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nGdn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1773a9a0-dd6e-4c13-ab12-355b5d87b465_1717x916.png 424w, https://substackcdn.com/image/fetch/$s_!nGdn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1773a9a0-dd6e-4c13-ab12-355b5d87b465_1717x916.png 848w, https://substackcdn.com/image/fetch/$s_!nGdn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1773a9a0-dd6e-4c13-ab12-355b5d87b465_1717x916.png 1272w, https://substackcdn.com/image/fetch/$s_!nGdn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1773a9a0-dd6e-4c13-ab12-355b5d87b465_1717x916.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Figure 2. Preparing the raw SFO data creates a focused schema with clearer field semantics and less ambiguity for later candidate SQL generation.</em></figcaption></figure></div><p>For the SFO dataset, the raw fields are useful for data delivery, but they are not all equally useful to the analytical questions in this series. The source contains the compact <code>Activity Period</code>, a text-formatted <code>Activity Period Start Date</code>, an as-of timestamp describing data freshness, and a timestamp recording when the data was loaded.</p><p>Our future agent will need a concise schema that supports questions about passengers, airlines, geography, terminals, and time. We therefore make four deliberate changes:</p><ul><li><p>Convert <code>Passenger Count</code> from comma-formatted text to an integer.</p></li><li><p>Parse <code>Activity Period Start Date</code> into the typed <code>Date</code> field.</p></li><li><p>Derive a separate integer <code>Year</code> field for clear annual questions.</p></li><li><p>Keep 11 descriptive business fields while omitting the raw activity-period representation and the dataset as-of and load timestamps.</p></li></ul><p>The existing business names remain readable, so we preserve them. Names such as <code>Operating Airline</code>, <code>GEO Region</code>, and <code>Passenger Count</code> carry more context than shortened labels would. Because some names contain spaces, we will quote them where SQL requires it.</p><p>Let&#8217;s begin with <code>Passenger Count</code>. As its name implies, this field represents the number of passengers for a given record. The values currently contain commas and are stored as text:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;20f95344-f7b0-4146-979d-768178cd1db6&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">raw["Passenger Count"].head()
</code></pre></div><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;0414db53-5c63-4a10-be8c-a90bf1f8ab7f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">0    31,432
1    31,353
2     2,518
3     1,324
4     1,198
Name: Passenger Count, dtype: object</code></pre></div><p>We remove the commas and convert the field to an integer:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;87c1ad0f-8ff9-4c7e-9d27-b988bf1bc49a&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">raw["Passenger Count"] = (
    raw["Passenger Count"].str.replace(",", "").astype(int)
)</code></pre></div><p>Next, we parse <code>Activity Period Start Date</code> as a date and derive <code>Year</code> from the compact <code>Activity Period</code> field:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;e7e1ea38-9d73-4ffb-9751-acc82ff33654&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">raw["Date"] = pd.to_datetime(
    raw["Activity Period Start Date"],
    format="%Y/%m/%d",
)
raw["Year"] = raw["Activity Period"].astype(str).str[:4].astype(int)</code></pre></div><p>Passing <code>format="%Y/%m/%d"</code> makes the expected source format explicit. An unexpected date fails at this boundary instead of being interpreted under a different convention.</p><p>Finally, we select the 13 columns that will form the <code>air_traffic</code> table. This removes the source fields that we replaced or do not need for the analytical questions in this series:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;88a1c625-7148-4d76-97e3-cd43ca8d9754&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">table_columns = [
    "Year",
    "Date",
    "Operating Airline",
    "Operating Airline IATA Code",
    "Published Airline",
    "Published Airline IATA Code",
    "GEO Summary",
    "GEO Region",
    "Activity Type Code",
    "Price Category Code",
    "Terminal",
    "Boarding Area",
    "Passenger Count",
]

air_traffic = raw.loc[:, table_columns].copy()
air_traffic.head()
</code></pre></div><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;8d374d97-08b9-4e4b-8b67-6f9b206c308f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">   Year       Date                        Operating Airline  \
0  1999 1999-07-01                             ATA Airlines   
1  1999 1999-07-01                             ATA Airlines   
2  1999 1999-07-01                             ATA Airlines   
3  1999 1999-07-01  Aeroflot Russian International Airlines   
4  1999 1999-07-01  Aeroflot Russian International Airlines   

  Operating Airline IATA Code                        Published Airline  \
0                          TZ                             ATA Airlines   
1                          TZ                             ATA Airlines   
2                          TZ                             ATA Airlines   
3                         NaN  Aeroflot Russian International Airlines   
4                         NaN  Aeroflot Russian International Airlines   

  Published Airline IATA Code    GEO Summary GEO Region Activity Type Code  \
0                          TZ       Domestic         US           Deplaned   
1                          TZ       Domestic         US           Enplaned   
2                          TZ       Domestic         US     Thru / Transit   
3                         NaN  International     Europe           Deplaned   
4                         NaN  International     Europe           Enplaned   

  Price Category Code    Terminal Boarding Area  Passenger Count  
0            Low Fare  Terminal 1             B            31432  
1            Low Fare  Terminal 1             B            31353  
2            Low Fare  Terminal 1             B             2518  
3               Other  Terminal 2             D             1324  
4               Other  Terminal 2             D             1198 </code></pre></div><p>The ordered <code>table_columns</code> list makes the table contract visible in code rather than relying on whatever column order happened to arrive in the CSV.</p><p>Next, we confirm the prepared shape, ordered columns, and relationship between the derived year and parsed date:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;5da264c2-fc59-4eb7-b53a-95de7098fbb6&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">assert air_traffic.shape == (rows_number, cols_reformat_number)
assert air_traffic.columns.tolist() == table_columns
assert air_traffic["Year"].eq(air_traffic["Date"].dt.year).all()
print(f"Prepared table: {air_traffic.shape[0]:,} rows &#215; {air_traffic.shape[1]} columns")</code></pre></div><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;99697873-bf8e-4966-b32b-41cda1c2b5e8&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">Prepared table: 40,450 rows &#215; 13 columns</code></pre></div><p>At this point, <code>air_traffic</code> is a pandas DataFrame with the 13 fields the next tutorials will use. We have shaped the data contract, but we do not yet have a database table that can receive SQL. In the next section, we will use Ibis to create a persistent DuckDB database and load the prepared DataFrame into an <code>air_traffic</code> table.</p><h2><strong>Create a persistent DuckDB database with Ibis</strong></h2><p><a href="iframe.php?url=https%3A%2F%2Fduckdb.org%2Fdocs%2Fcurrent%2Fclients%2Fpython%2Foverview">DuckDB</a> is an analytical database that runs directly inside the Python process. This gives us a full SQL execution engine while keeping the setup local and lightweight.</p><p>In <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fset-up-a-python-environment-for-sql">Part 1, </a><em><a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fset-up-a-python-environment-for-sql">Set up a Python environment for SQL AI agents</a></em>, we configured the persistent storage location before starting the notebook. We set <code>DUCKDB_DATABASES_PATH</code> to <code>$HOME/databases/duckdb</code>, reloaded the zsh environment, and created the directory:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;f8276d1c-343a-4e1b-b376-f26326117c5f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">export DUCKDB_DATABASES_PATH="$HOME/databases/duckdb"
source ~/.zshenv
mkdir -p "$DUCKDB_DATABASES_PATH"</code></pre></div><p>Using an environment variable lets the notebook locate the database directory without hard-coding a machine-specific path. The local and Dev Container workflows can therefore use the same Python code even though the path exposed inside the container is different.</p><p><a href="iframe.php?url=https%3A%2F%2Fibis-project.org%2Fbackends%2Fduckdb">Ibis</a> provides the Python interface we will use to connect to DuckDB and execute queries. The following code reads the existing <code>DUCKDB_DATABASES_PATH</code> setting and builds the path to the <code>sql-ai-agent.duckdb</code> file. The <code>mkdir()</code> call ensures that the configured directory exists, and <code>ibis.duckdb.connect()</code> opens a file-backed database so our data persists across notebook sessions. We then create the <code>air_traffic</code> table from the prepared DataFrame:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;e6d8c8c3-075c-4252-bdf2-f79cff22aaf4&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">duckdb_databases_path = Path(os.environ["DUCKDB_DATABASES_PATH"]).expanduser()
duckdb_databases_path.mkdir(parents=True, exist_ok=True)
database_path = duckdb_databases_path / "sql-ai-agent.duckdb"

connection = ibis.duckdb.connect(database_path)
connection.create_table("air_traffic", air_traffic, overwrite=True)</code></pre></div><p>The final expression returns an Ibis representation of the persistent table and its schema:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;3ed89226-86e6-4d34-b81c-e5861a0e5794&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">DatabaseTable: sql-ai-agent.main.air_traffic
  Year                        int64
  Date                        timestamp(6)
  Operating Airline           string
  Operating Airline IATA Code string
  Published Airline           string
  Published Airline IATA Code string
  GEO Summary                 string
  GEO Region                  string
  Activity Type Code          string
  Price Category Code         string
  Terminal                    string
  Boarding Area               string
  Passenger Count             int64</code></pre></div><p>The name <code>air_traffic</code> becomes the table identifier used in our SQL queries, while <code>overwrite=True</code> allows the cell to replace the table when we rerun it. DuckDB stores the database in <code>sql-ai-agent.duckdb</code> under the configured directory. When we stop the notebook kernel, the connection closes, but the database file and table remain available for the next session.</p><p>In this tutorial, we use Ibis to manage the DuckDB connection and execute SQL. We will not use its native query-expression interface.</p><h2><strong>Inspect the DuckDB table with SQL</strong></h2><p>Before asking an analytical question, we confirm that DuckDB exposes the expected table and schema. <code>list_tables()</code> checks the connection, while the <code>information_schema.columns</code> query returns the created column names and data types in their defined order:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;14503fbe-58c5-441a-b9ff-dec33792be1f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">user_tables = [
    name
    for name in connection.list_tables()
    if not name.startswith("ibis_pandas_memtable_")
]
assert "air_traffic" in user_tables
print(user_tables)
schema_sql = """
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'air_traffic'
ORDER BY ordinal_position
"""
connection.sql(schema_sql).execute()</code></pre></div><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;eead8da9-e4fe-49fc-a4b3-c31e9df70f29&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">['air_traffic']

                    column_name  data_type
0                          Year     BIGINT
1                          Date  TIMESTAMP
2             Operating Airline    VARCHAR
3   Operating Airline IATA Code    VARCHAR
4             Published Airline    VARCHAR
5   Published Airline IATA Code    VARCHAR
6                   GEO Summary    VARCHAR
7                    GEO Region    VARCHAR
8            Activity Type Code    VARCHAR
9           Price Category Code    VARCHAR
10                     Terminal    VARCHAR
11                Boarding Area    VARCHAR
12              Passenger Count     BIGINT
</code></pre></div><p>Ibis may create temporary registered views while transferring a pandas DataFrame to DuckDB. Their generated names differ between sessions, so the <code>user_tables</code> list filters them out and keeps this validation output stable.</p><p>As we will see in the next tutorial, the table schema plays a critical role in the context supplied to the AI agent. Accurate column names and data types give the later model explicit information about the table&#8217;s structure when it generates candidate SQL. Here, <code>connection.sql()</code> sends native SQL through Ibis, and <code>execute()</code> asks DuckDB to run it and return the data to Python.</p><p>We can apply the same pattern to a familiar sample query:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;eebb50d2-4379-4a35-83ac-05b87b8d2948&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">connection.sql("SELECT * FROM air_traffic LIMIT 10").execute()</code></pre></div><p>As expected, this returns 10 rows from the dataset:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;6ae5b5ac-03ea-4ac4-b8ce-f1519f00961c&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">   Year       Date                        Operating Airline  \
0  1999 1999-07-01                             ATA Airlines   
1  1999 1999-07-01                             ATA Airlines   
2  1999 1999-07-01                             ATA Airlines   
3  1999 1999-07-01  Aeroflot Russian International Airlines   
4  1999 1999-07-01  Aeroflot Russian International Airlines   
5  1999 1999-07-01                               Air Canada   
6  1999 1999-07-01                               Air Canada   
7  1999 1999-07-01                                Air China   
8  1999 1999-07-01                                Air China   
9  1999 1999-07-01                               Air Europe   

  Operating Airline IATA Code                        Published Airline  \
0                          TZ                             ATA Airlines   
1                          TZ                             ATA Airlines   
2                          TZ                             ATA Airlines   
3                        None  Aeroflot Russian International Airlines   
4                        None  Aeroflot Russian International Airlines   
5                          AC                               Air Canada   
6                          AC                               Air Canada   
7                          CA                                Air China   
8                          CA                                Air China   
9                          PE                               Air Europe   

  Published Airline IATA Code    GEO Summary GEO Region Activity Type Code  \
0                          TZ       Domestic         US           Deplaned   
1                          TZ       Domestic         US           Enplaned   
2                          TZ       Domestic         US     Thru / Transit   
3                        None  International     Europe           Deplaned   
4                        None  International     Europe           Enplaned   
5                          AC  International     Canada           Deplaned   
6                          AC  International     Canada           Enplaned   
7                          CA  International       Asia           Deplaned   
8                          CA  International       Asia           Enplaned   
9                          PE  International     Europe           Deplaned   

  Price Category Code    Terminal Boarding Area  Passenger Count  
0            Low Fare  Terminal 1             B            31432  
1            Low Fare  Terminal 1             B            31353  
2            Low Fare  Terminal 1             B             2518  
3               Other  Terminal 2             D             1324  
4               Other  Terminal 2             D             1198  
5               Other  Terminal 1             B            24124  
6               Other  Terminal 1             B            23613  
7               Other  Terminal 2             D             4983  
8               Other  Terminal 2             D             4604  
9               Other  Terminal 2             D              205  </code></pre></div><p><code>LIMIT 10</code> keeps the returned sample small while confirming that the table is queryable. We should also verify that table creation did not change the number of rows. The following query compares DuckDB&#8217;s count with the length of the prepared DataFrame:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;d34cf1a4-173c-4918-bfb2-40cc98bd2258&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">row_count_result = connection.sql(
    "SELECT COUNT(*) AS row_count FROM air_traffic"
).execute()
duckdb_row_count = int(row_count_result.loc[0, "row_count"])
assert duckdb_row_count == len(air_traffic)
print(f"DuckDB row count: {duckdb_row_count:,}")</code></pre></div><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;bc3059d1-7f5a-42f5-8bed-3742c92ba4f0&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">DuckDB row count: 40,450</code></pre></div><p>The verified snapshot contains the same 40,450 rows on both sides of that comparison. The assertion establishes continuity from CSV load to DataFrame to database table.</p><h2><strong>Query DuckDB with native SQL</strong></h2><p>Now that the table and row count are in place, we can run an analytical query. The next statement groups passenger traffic by year and geographic summary, calculates the total passenger count, sorts the totals in descending order, and returns ten rows:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;eb3d123b-ab6f-4464-b647-e7f6866f8860&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">passengers_by_year_sql = """
SELECT
    Year,
    "GEO Summary",
    SUM("Passenger Count") AS passenger_count
FROM air_traffic
GROUP BY Year, "GEO Summary"
ORDER BY passenger_count DESC
LIMIT 10
"""

result = connection.sql(passengers_by_year_sql).execute()
assert not result.empty
result
</code></pre></div><p>The query returns the ten largest annual passenger totals by geographic summary:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;69226b25-e015-48a3-b00f-1a030b6e48cc&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">   Year GEO Summary passenger_count
0  2018    Domestic        43489998
1  2017    Domestic        42397717
2  2019    Domestic        42116019
3  2016    Domestic        40736875
4  2015    Domestic        38814323
5  2025    Domestic        38457662
6  2014    Domestic        36844841
7  2024    Domestic        36387149
8  2023    Domestic        36009025
9  2013    Domestic        35201472</code></pre></div><p>The double quotes around <code>GEO Summary</code> and <code>Passenger Count</code> identify column names that contain spaces. DuckDB performs the grouping, aggregation, sorting, and limiting. Python holds the connection and receives the result through Ibis.</p><p>The nonempty-result assertion is deliberately modest. It confirms that the prepared dimensions and passenger measure work in a real SQL query. It does not prove that every executable query answers a user&#8217;s question correctly. Later tutorials will distinguish execution success from semantic correctness and add controls for model-generated SQL.</p><p>That&#8217;s it. With both prerequisite tutorials complete, we are now ready to build our first SQL AI agent!</p><h2><strong>Summary</strong></h2><p>In this second prerequisite, we loaded a local snapshot of the SFO Air Traffic Passenger Statistics dataset and preserved <code>NA</code> as a valid airline code rather than allowing pandas to interpret it as missing data.</p><p>We then transformed the source into a focused 13-column contract. We created a typed <code>Date</code>, converted <code>Passenger Count</code> to an integer, derived an integer <code>Year</code>, retained meaningful business-facing column names, and omitted the raw activity-period field and the dataset freshness and load timestamps. These choices provide future schema context with fewer, more useful column names and types.</p><p>Finally, we created a persistent DuckDB database through Ibis, created the <code>air_traffic</code> table from the DataFrame, inspected its schema, compared row counts, and ran an aggregation using native SQL. The database is stored in <code>sql-ai-agent.duckdb</code> under <code>DUCKDB_DATABASES_PATH</code>, so the table remains available after the notebook session ends.</p><p>The two-part prerequisite is now complete. In <strong>Build a SQL AI Agent from Scratch</strong>, we will use this table to build the smallest complete SQL AI agent pipeline. Query validation, read-only database access, and other production controls remain outside this data-preparation checkpoint and will be added when the running example creates the need for them.</p><h2><strong>References</strong></h2><ul><li><p><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FRamiKrispin%2Fsql-ai-agent">Tutorial supporting repository</a>, including Jupyter <a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FRamiKrispin%2Fsql-ai-agent%2Ftree%2Fmain%2Ftutorials">notebook</a></p></li><li><p><a href="iframe.php?url=https%3A%2F%2Ffile%2B.vscode-resource.vscode-cdn.net%2FUsers%2Framikrispin%2FProjects%2Ftutorials%2Fsql-ai-agent-tutorials%2Ftutorials%2Ft03a-set-up-python-environment%2FREADME.md">Part 1: Set up a Python environment for SQL AI agents</a></p></li><li><p><a href="iframe.php?url=https%3A%2F%2Fdata.sfgov.org%2FTransportation%2FAir-Traffic-Passenger-Statistics%2Frkru-6vcg%2Fabout_data">Air Traffic Passenger Statistics dataset from DataSF</a></p></li><li><p><a href="iframe.php?url=https%3A%2F%2Fduckdb.org%2Fdocs%2Fcurrent%2Fclients%2Fpython%2Foverview">DuckDB Python client overview</a></p></li><li><p><a href="iframe.php?url=https%3A%2F%2Fibis-project.org%2Fbackends%2Fduckdb">Ibis DuckDB backend documentation</a></p></li></ul><div><hr></div><p>To follow the rest of the SQL AI agent series, <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">subscribe to the newsletter</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Paperclip Agent Orchestration, Work Automation with R | Issue 107]]></title><description><![CDATA[A weekly curated update on data science and engineering topics and resources.]]></description><link>https://ramikrispin.substack.com/p/paperclip-agent-orchestration-work</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/paperclip-agent-orchestration-work</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sat, 26 Sep 2026 15:04:29 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21Vdw2%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F23871df7-3f8c-4678-9d32-552f8a66487e_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - Paperclip</p></li><li><p>New learning resources - Agent sandboxing and memory, Claude prompting, Jev tutorials and model routing, LLM inference, and tabular prediction</p></li><li><p>Book of the week - Work Automation with R by Tiger Tang</p></li></ul><p>The newsletter is also available on <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a> and <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21Vdw2%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F23871df7-3f8c-4678-9d32-552f8a66487e_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vdw2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23871df7-3f8c-4678-9d32-552f8a66487e_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!Vdw2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23871df7-3f8c-4678-9d32-552f8a66487e_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!Vdw2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23871df7-3f8c-4678-9d32-552f8a66487e_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!Vdw2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23871df7-3f8c-4678-9d32-552f8a66487e_1920x1080.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21Vdw2%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F23871df7-3f8c-4678-9d32-552f8a66487e_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23871df7-3f8c-4678-9d32-552f8a66487e_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2115929,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/217542434?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23871df7-3f8c-4678-9d32-552f8a66487e_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Vdw2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23871df7-3f8c-4678-9d32-552f8a66487e_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!Vdw2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23871df7-3f8c-4678-9d32-552f8a66487e_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!Vdw2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23871df7-3f8c-4678-9d32-552f8a66487e_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!Vdw2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23871df7-3f8c-4678-9d32-552f8a66487e_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2><strong>Open Source of the Week</strong></h2><p>This week&#8217;s focus is on the <strong>Paperclip</strong> project. <strong>Paperclip</strong> is an open-source, self-hosted application from Paperclip Labs for coordinating teams of AI agents. It combines a Node.js server with a React interface and works with agents such as Codex, Claude Code, OpenClaw, Cursor, Bash, and HTTP-based bots.</p><p>Rather than managing agents across separate terminal sessions and scripts, Paperclip organizes their work around company goals, projects, tasks, roles, reporting lines, and budgets. Scheduled heartbeats wake agents to check for work, while persistent sessions help them resume their context across runs. Human operators can review plans, approve actions, monitor costs, pause agents, and inspect the activity log from one dashboard.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Fpaperclipai%2Fpaperclip">https://github.com/paperclipai/paperclip</a></strong></p><h3><strong>Key Features</strong></h3><ul><li><p><strong>Bring your own agent</strong> &#8212; connect different agent runtimes through built-in adapters, CLI tools, or HTTP services</p></li><li><p><strong>Goal-aware tasks</strong> &#8212; link issues to projects and company goals so agents receive the surrounding context</p></li><li><p><strong>Coordinated execution</strong> &#8212; use atomic task checkout and blocker dependencies to reduce duplicate work</p></li><li><p><strong>Scheduled heartbeats</strong> &#8212; run recurring work and wake agents through schedules, events, webhooks, or APIs</p></li><li><p><strong>Budgets and cost tracking</strong> &#8212; monitor usage by agent, project, provider, and model, with warnings and hard stops</p></li><li><p><strong>Governance controls</strong> &#8212; add approval stages, review decisions, and pause or terminate agents when needed</p></li><li><p><strong>Persistent records</strong> &#8212; retain session state, structured logs, work products, cost events, and audit trails</p></li><li><p><strong>Multiple organizations</strong> &#8212; manage separate companies from one deployment while keeping their data isolated</p></li></ul><p>More details are available in the project <a href="iframe.php?url=https%3A%2F%2Fdocs.paperclip.ing%2F">documentation</a>.</p><p>License: MIT</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><div><hr></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>Sandboxing a Coding Agent</strong></h3><p>This tutorial by <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Paul Iusztin&quot;,&quot;id&quot;:110559689,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0714d360-396c-4b41-a676-1b58dc1dc5f3_1470x1470.jpeg&quot;,&quot;uuid&quot;:&quot;680a41d2-48aa-4d94-bab9-433e90445c13&quot;}" data-component-name="MentionToDOM"></span> from <strong>Decoding AI</strong> builds the sandbox layer of a coding agent harness, using <strong>Docker</strong> locally and <strong>Modal</strong> for remote execution. It covers sandbox design, routing file and shell tools through a shared executor, container lifecycle management, and choosing between local and remote backends.</p><div id="youtube2-7CHMb8jWs6A" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;7CHMb8jWs6A&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F7CHMb8jWs6A%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Agent Memory and Harness Engineering</strong></h3><p>In this workshop, <strong>AI Engineer</strong> <strong>Ignacio Martinez from Oracle</strong> explores agent memory and harness engineering. It covers harness architecture, files versus databases, context engineering, tool selection, and turning successful workflows into reusable skills.</p><div id="youtube2-xs-ob87TTzg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;xs-ob87TTzg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2Fxs-ob87TTzg%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Prompting Claude Opus 5.5</strong></h3><p>The following video by <strong>Jay E from RoboNuggets</strong> presents twelve tips for working with <strong>Claude Opus 5.5</strong>. Topics include testing reasoning-effort settings, maintaining task checklists, setting time budgets, giving explicit design direction, and using image-cropping tools for detailed visual tasks.</p><div id="youtube2-vsGwx28z4jk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;vsGwx28z4jk&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FvsGwx28z4jk%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Using Jev with Python</strong></h3><p>This hands-on tutorial from <strong>NeuralNine</strong> introduces <strong>Jev</strong> through the TypeSafe playground and Python API. It demonstrates classification and scoring, then applies them to model routing, detecting potentially unsafe requests, sentiment analysis, and a Connect Four game.</p><div id="youtube2-z1lkS-A2fYQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;z1lkS-A2fYQ&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2Fz1lkS-A2fYQ%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Causal Encoder-Decoder Architectures for LLM Inference</strong></h3><p>This technical walkthrough from <strong>Neural Breakdown with AVB</strong> explores <strong>causal encoder-decoder (CED)</strong> architectures and the distinction between prefill and decoding in LLM inference. It explains the architecture and includes a live <strong>PyTorch</strong> implementation of GPT and CED models.</p><div id="youtube2-4xAU2bHazUs" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;4xAU2bHazUs&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F4xAU2bHazUs%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Mitra-v2 for Tabular Prediction</strong></h3><p>This tutorial from <strong>AI with Surya</strong> demonstrates tabular prediction with <strong>Mitra-v2</strong>, including house price regression and machine failure classification. It walks through fine-tuning, ensemble predictions, and comparing results with a traditional machine learning baseline.</p><div id="youtube2-l6os-gJHWeU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;l6os-gJHWeU&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2Fl6os-gJHWeU%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Open Jev-Style Models</strong></h3><p>The following video by <strong>Sam Witteveen</strong> compares seven open Jev-style models using benchmarks and demonstrations. It introduces JevBench and explores SemIf, Nimble, Decider, Alex Wortega&#8217;s OpenJev, DiffusionGemma, NanoJev, and Laya.</p><div id="youtube2-53wDOI_7x8I" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;53wDOI_7x8I&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F53wDOI_7x8I%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Model Routing with Jev and herdr</strong></h3><p>This walkthrough by <strong>Nidhi Singh</strong> combines <strong>Jev</strong>, <strong>herdr</strong>, and a model-router CLI to select an agent, model, and reasoning effort for a task. The demonstrations include routing planning and implementation to different models, previewing routing decisions with dry runs, and storing API keys in Keychain.</p><div id="youtube2-7w8eRWnUUA8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;7w8eRWnUUA8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F7w8eRWnUUA8%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is on a new book &#8212; <em>Work Automation with R</em> by Tiger Tang. The book explores how to use R to automate recurring tasks such as updating dashboards, generating reports, processing data, and sending notifications. It connects these activities into workflows that reduce manual effort and make routine data work reproducible. The scope extends from individual tasks to complete automation systems, including internal tools built with Shiny and scheduled jobs with monitoring. It is written for practitioners who want to apply R to everyday work across analysis, reporting, and communication.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>Project planning</strong> &#8212; identifying automation opportunities, gathering requirements, and defining success metrics</p></li><li><p><strong>Data workflows</strong> &#8212; importing structured and unstructured data, handling large files, and querying databases</p></li><li><p><strong>Visualizations</strong> &#8212; creating plots, maps, and interactive tables for recurring reports</p></li><li><p><strong>Report generation</strong> &#8212; producing HTML dashboards, Excel workbooks, Word documents, PDFs, and presentations</p></li><li><p><strong>Email automation</strong> &#8212; sending formatted reports and processing messages with R</p></li><li><p><strong>Messaging integrations</strong> &#8212; delivering updates and notifications through Slack and Teams</p></li><li><p><strong>Shiny applications</strong> &#8212; connecting data, visualizations, and reporting through interactive interfaces</p></li><li><p><strong>Scheduling and monitoring</strong> &#8212; testing workflows, scheduling jobs, and tracking logs and notifications</p></li><li><p><strong>Maintenance</strong> &#8212; documenting processes, training users, and measuring usage and time saved</p></li><li><p><strong>Performance and reliability</strong> &#8212; using parallel processing, supporting concurrent users, and handling errors</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%210JAe%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fd766b900-6159-48ab-8d95-7ba5046809db_350x500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0JAe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd766b900-6159-48ab-8d95-7ba5046809db_350x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0JAe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd766b900-6159-48ab-8d95-7ba5046809db_350x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0JAe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd766b900-6159-48ab-8d95-7ba5046809db_350x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0JAe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd766b900-6159-48ab-8d95-7ba5046809db_350x500.jpeg 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%210JAe%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fd766b900-6159-48ab-8d95-7ba5046809db_350x500.jpeg" width="350" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d766b900-6159-48ab-8d95-7ba5046809db_350x500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:350,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:31457,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/217542434?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd766b900-6159-48ab-8d95-7ba5046809db_350x500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0JAe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd766b900-6159-48ab-8d95-7ba5046809db_350x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0JAe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd766b900-6159-48ab-8d95-7ba5046809db_350x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0JAe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd766b900-6159-48ab-8d95-7ba5046809db_350x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0JAe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd766b900-6159-48ab-8d95-7ba5046809db_350x500.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is ideal for data scientists, analysts, BI developers, and other R users who want to automate repetitive work and connect their existing data tasks into maintainable workflows. Basic familiarity with R is helpful; advanced programming experience is not required.</p><p>The book is available on the <strong><a href="iframe.php?url=https%3A%2F%2Fwww.routledge.com%2FWork-Automation-with-R%2FTang%2Fp%2Fbook%2F9781032440163">publisher&#8217;s website</a></strong>. Read more on the <strong><a href="iframe.php?url=https%3A%2F%2Ftigertang.org%2Fbook%2F">author&#8217;s website</a></strong>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><div><hr></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Free Access: SQL AI Agents in Production]]></title><description><![CDATA[My LinkedIn Learning course is open for a limited time]]></description><link>https://ramikrispin.substack.com/p/free-access-sql-ai-agents-in-production</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/free-access-sql-ai-agents-in-production</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Fri, 25 Sep 2026 13:46:15 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21TMSa%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fee07b90f-3cdd-42f4-b67a-ef49e8fbdfb4_3602x2034.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Happy Friday! </p><p>My <strong>LinkedIn Learning course &#8212; &#8220;SQL AI Agents in Production&#8221;</strong> &#8212; is now <strong>open for a limited time</strong> to non-subscribers. You can access it via the following <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Ffeed%2Fupdate%2Furn%3Ali%3Aactivity%3A7508886895397961729%2F">LinkedIn post</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21TMSa%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fee07b90f-3cdd-42f4-b67a-ef49e8fbdfb4_3602x2034.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TMSa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee07b90f-3cdd-42f4-b67a-ef49e8fbdfb4_3602x2034.png 424w, https://substackcdn.com/image/fetch/$s_!TMSa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee07b90f-3cdd-42f4-b67a-ef49e8fbdfb4_3602x2034.png 848w, https://substackcdn.com/image/fetch/$s_!TMSa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee07b90f-3cdd-42f4-b67a-ef49e8fbdfb4_3602x2034.png 1272w, https://substackcdn.com/image/fetch/$s_!TMSa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee07b90f-3cdd-42f4-b67a-ef49e8fbdfb4_3602x2034.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21TMSa%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fee07b90f-3cdd-42f4-b67a-ef49e8fbdfb4_3602x2034.png" width="1456" height="822" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee07b90f-3cdd-42f4-b67a-ef49e8fbdfb4_3602x2034.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:822,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TMSa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee07b90f-3cdd-42f4-b67a-ef49e8fbdfb4_3602x2034.png 424w, https://substackcdn.com/image/fetch/$s_!TMSa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee07b90f-3cdd-42f4-b67a-ef49e8fbdfb4_3602x2034.png 848w, https://substackcdn.com/image/fetch/$s_!TMSa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee07b90f-3cdd-42f4-b67a-ef49e8fbdfb4_3602x2034.png 1272w, https://substackcdn.com/image/fetch/$s_!TMSa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee07b90f-3cdd-42f4-b67a-ef49e8fbdfb4_3602x2034.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>What does the course cover?</h2><p>The course focuses on the following topics:<br><strong>Chapter 1:</strong> Review SQL AI agent architecture.<br><strong>Chapter 2:</strong> Automate context generation, add conversational memory, and inject business skills.<br><strong>Chapter 3:</strong> Implement SQL query constraints and safety validation.<br><strong>Chapter 4:</strong> Build error handling, fallback strategies, and a SQL debugger agent.<br><strong>Chapter 5:</strong> Implement logging and observability for production monitoring.</p><p>This course requires a basic understanding of agentic workflow and Python. </p><h2>Getting Started with SQL AI Agents</h2><p>If you are new to AI agents and want to get started, I recently started a new <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Ft%2Fsql-ai-agents">series of tutorials focusing on SQL AI agents</a> in my newsletter. This sequence is beginner-friendly and based on my <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-agents-with-large-language-models">introductory course on LinkedIn Learning</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21vHIk%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F2b5b99a7-bf9f-4da5-ada3-6c777d7f6723_1692x930.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vHIk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5b99a7-bf9f-4da5-ada3-6c777d7f6723_1692x930.png 424w, https://substackcdn.com/image/fetch/$s_!vHIk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5b99a7-bf9f-4da5-ada3-6c777d7f6723_1692x930.png 848w, https://substackcdn.com/image/fetch/$s_!vHIk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5b99a7-bf9f-4da5-ada3-6c777d7f6723_1692x930.png 1272w, https://substackcdn.com/image/fetch/$s_!vHIk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5b99a7-bf9f-4da5-ada3-6c777d7f6723_1692x930.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21vHIk%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F2b5b99a7-bf9f-4da5-ada3-6c777d7f6723_1692x930.png" width="1456" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b5b99a7-bf9f-4da5-ada3-6c777d7f6723_1692x930.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1978312,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/217389578?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5b99a7-bf9f-4da5-ada3-6c777d7f6723_1692x930.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vHIk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5b99a7-bf9f-4da5-ada3-6c777d7f6723_1692x930.png 424w, https://substackcdn.com/image/fetch/$s_!vHIk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5b99a7-bf9f-4da5-ada3-6c777d7f6723_1692x930.png 848w, https://substackcdn.com/image/fetch/$s_!vHIk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5b99a7-bf9f-4da5-ada3-6c777d7f6723_1692x930.png 1272w, https://substackcdn.com/image/fetch/$s_!vHIk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5b99a7-bf9f-4da5-ada3-6c777d7f6723_1692x930.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Please subscribe to receive updates &#128071;&#127996;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><p>Enjoy the weekend!</p><p>Rami</p>]]></content:encoded></item><item><title><![CDATA[Posit Commons Data Agents, Generative AI Tools for Excel | Issue 106]]></title><description><![CDATA[Explore Posit Commons, videos on Jev, Bonsai 2, coding agent harnesses, and weather forecasting, plus a book on generative AI tools for Excel.]]></description><link>https://ramikrispin.substack.com/p/posit-commons-data-agents-generative</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/posit-commons-data-agents-generative</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sun, 20 Sep 2026 12:30:34 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21QiWb%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fc8d42866-dd91-4a28-8cb7-d5b78ad4985c_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - Posit Commons</p></li><li><p>New learning resources - Jev explained, Bonsai 2 for local coding, building a coding agent harness, and weather forecasting with Hugging Face</p></li><li><p>Book of the week - Learning Generative AI Tools for Excel by Angelica Lo Duca</p></li></ul><p>The newsletter is also available on <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a> and <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21QiWb%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fc8d42866-dd91-4a28-8cb7-d5b78ad4985c_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QiWb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8d42866-dd91-4a28-8cb7-d5b78ad4985c_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!QiWb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8d42866-dd91-4a28-8cb7-d5b78ad4985c_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!QiWb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8d42866-dd91-4a28-8cb7-d5b78ad4985c_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!QiWb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8d42866-dd91-4a28-8cb7-d5b78ad4985c_1920x1080.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21QiWb%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fc8d42866-dd91-4a28-8cb7-d5b78ad4985c_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8d42866-dd91-4a28-8cb7-d5b78ad4985c_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3438672,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/216534554?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8d42866-dd91-4a28-8cb7-d5b78ad4985c_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QiWb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8d42866-dd91-4a28-8cb7-d5b78ad4985c_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!QiWb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8d42866-dd91-4a28-8cb7-d5b78ad4985c_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!QiWb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8d42866-dd91-4a28-8cb7-d5b78ad4985c_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!QiWb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8d42866-dd91-4a28-8cb7-d5b78ad4985c_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2><strong>Open Source of the Week</strong></h2><p>This week&#8217;s open-source project is <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Fposit-dev%2Fcommons">commons</a></strong>. This open-source project from <strong>Posit</strong> helps developers build trustworthy data analysis agents in R and Python. It gives agents access to existing trusted code and labels answers according to how they were produced.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Fposit-dev%2Fcommons">https://github.com/posit-dev/commons</a></strong></p><p>The R library is authored by <strong>Simon Couch</strong> and <strong>Sara Altman</strong>, and the Python library by <strong>Josh Taillon</strong>. The package is built on <a href="iframe.php?url=https%3A%2F%2Fellmer.tidyverse.org%2F">ellmer</a>, <a href="iframe.php?url=https%3A%2F%2Fposit-dev.github.io%2Fchatlas%2F">chatlas</a>, and <a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Fposit-dev%2Fshinychat%2F">shinychat</a>, Posit&#8217;s open-source LLM stack.</p><p>The workflow starts with a search for a trusted calculation that can answer the user&#8217;s question. If a match is found, the agent runs it, and the response displays a <strong>green shield</strong>. Otherwise, the agent searches relevant context before generating SQL, R, or Python code. If its answer includes a supporting quotation that commons verifies against a trusted source, the response displays a <strong>blue citation marker</strong>. If no citation verifies, it displays a <strong>yellow warning marker</strong>. Commons assigns these labels based on the agent&#8217;s actions.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;a69355f0-0799-4977-bf72-f31333abbfc0&quot;,&quot;duration&quot;:null}"></div><h3><strong>Key Features</strong></h3><ul><li><p><strong>Reusable calculations</strong> &#8212; exposes existing R and Python code as measures that the agent can find and execute.</p></li><li><p><strong>Semantic definitions</strong> &#8212; supports trusted calculations from data dictionaries, Snowflake semantic views, and Databricks metric views.</p></li><li><p><strong>Domain context</strong> &#8212; uses Markdown documents and data dictionaries to explain tables, columns, relationships, and how to interpret results.</p></li><li><p><strong>Answer provenance</strong> &#8212; assigns Verified, Cited, or Untrusted outcomes based on the analysis path, with supporting quotations checked against their sources.</p></li><li><p><strong>Model choice</strong> &#8212; connects to LLM providers through <strong>ellmer</strong> in R and <strong>chatlas</strong> in Python.</p></li><li><p><strong>Agent development skill</strong> &#8212; includes guidance for coding agents to help build, evaluate, and improve Commons agents.</p></li></ul><p>The project is <strong>highly experimental</strong>, and the Python package is currently in beta. More details and setup examples are available in the project <a href="iframe.php?url=https%3A%2F%2Fposit-dev.github.io%2Fcommons%2F">documentation</a> and the <a href="iframe.php?url=https%3A%2F%2Fposit-dev.github.io%2Fcommons%2Fr%2Farticles%2Fcommons.html">introduction to Commons</a>.</p><p>License: MIT</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><div><hr></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>Jev Explained</strong></h3><p>The following video from <strong>Caleb Writes Code</strong> introduces <strong>Jev</strong>, a model from TypeSafe AI, and discusses its approach to reinforcement learning and probability-based outputs. It covers the model&#8217;s background, speed, and how its approach differs from conventional LLMs.</p><div id="youtube2-vj7hysh0mOI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;vj7hysh0mOI&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2Fvj7hysh0mOI%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Bonsai 2 for Local Coding</strong></h3><p>This overview from <strong>Cloud Codes</strong> examines <strong>Bonsai 2</strong> and the tradeoffs of running a compressed coding model locally. It covers ternary quantization, coding and tool-calling benchmarks, memory requirements, and performance on consumer hardware and in the browser.</p><div id="youtube2-M6nv640H1Xo" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;M6nv640H1Xo&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FM6nv640H1Xo%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Build a Coding Agent Harness from Scratch</strong></h3><p>This step-by-step tutorial from <strong>Neural Breakdown with AVB</strong> builds a coding agent harness without frameworks. It progresses from basic chat, Bash tools, browser access, and file reading to agent loops, skills, planning, sandbox permissions, context compaction, and subagents.</p><div id="youtube2-Lu1UWqVTbQg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Lu1UWqVTbQg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FLu1UWqVTbQg%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Weather Forecasting with Hugging Face</strong></h3><p>In this video from <strong>Hugging Face</strong>, <strong>Emma and Aritra</strong> explain neural network approaches to weather forecasting and walk through running an open-source forecasting model. The discussion covers physics-based models, a code walkthrough, hardware considerations, evaluation, and Hugging Face&#8217;s research tooling.</p><div id="youtube2-1jq7sC6IjMk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;1jq7sC6IjMk&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F1jq7sC6IjMk%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is on a new book &#8212; <em>Learning Generative AI Tools for Excel: Speed Up Your Everyday Tasks with Microsoft Excel, Copilot, ChatGPT, and Beyond</em> by Angelica Lo Duca. The book provides a beginner-focused guide to using ChatGPT, Copilot, Excel AI add-ins, and Python for spreadsheet workflows. It progresses from prompting and formulas to data preparation, statistical analysis, visualization, reporting, macros, and code-assisted automation.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>AI for Excel</strong> &#8212; where generative AI supports data management, analysis, and visualization, and where it does not help</p></li><li><p><strong>ChatGPT prompting</strong> &#8212; setting context, defining tasks, and generating formulas for calculations, logic, text, dates, and lookups</p></li><li><p><strong>Everyday automation</strong> &#8212; creating templates, filling data, and enriching spreadsheet records</p></li><li><p><strong>Advanced Excel operations</strong> &#8212; analyzing datasets, building PivotTables, and generating macros and VBA</p></li><li><p><strong>Copilot fundamentals</strong> &#8212; creating, editing, and understanding spreadsheet data through natural-language instructions</p></li><li><p><strong>Data preparation</strong> &#8212; removing duplicates, handling missing values, and correcting formatting problems</p></li><li><p><strong>Statistics and analysis</strong> &#8212; calculating descriptive statistics, interpreting distributions, and running what-if analyses</p></li><li><p><strong>Visualization and reporting</strong> &#8212; selecting charts, reducing visual clutter, and assembling summary dashboards</p></li><li><p><strong>Excel AI add-ins</strong> &#8212; comparing tools such as Numerous.ai, GPT for Work, Power GPT, and Sally Suite</p></li><li><p><strong>Python and AI</strong> &#8212; using embedded Python, xlwings, and the OpenAI API for sentiment analysis, classification, and troubleshooting</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21nQ3A%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F0dd4e9b7-daf8-47ad-8d45-d5c098df4385_1143x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nQ3A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd4e9b7-daf8-47ad-8d45-d5c098df4385_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nQ3A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd4e9b7-daf8-47ad-8d45-d5c098df4385_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nQ3A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd4e9b7-daf8-47ad-8d45-d5c098df4385_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nQ3A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd4e9b7-daf8-47ad-8d45-d5c098df4385_1143x1500.jpeg 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21nQ3A%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F0dd4e9b7-daf8-47ad-8d45-d5c098df4385_1143x1500.jpeg" width="1143" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0dd4e9b7-daf8-47ad-8d45-d5c098df4385_1143x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1143,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:148594,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/216534554?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd4e9b7-daf8-47ad-8d45-d5c098df4385_1143x1500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nQ3A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd4e9b7-daf8-47ad-8d45-d5c098df4385_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nQ3A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd4e9b7-daf8-47ad-8d45-d5c098df4385_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nQ3A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd4e9b7-daf8-47ad-8d45-d5c098df4385_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nQ3A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd4e9b7-daf8-47ad-8d45-d5c098df4385_1143x1500.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is ideal for Excel users, data analysts, financial professionals, project managers, and spreadsheet practitioners who want to apply generative AI without requiring prior AI experience.</p><p>The book is available on the <strong><a href="iframe.php?url=https%3A%2F%2Flearning.oreilly.com%2Flibrary%2Fview%2Flearning-generative-ai%2F9781098190163%2F">publisher&#8217;s website</a></strong> and on <strong><a href="iframe.php?url=https%3A%2F%2Fwww.amazon.com%2FLearning-Generative-Tools-Excel-Microsoft%2Fdp%2F1098190173%2F">Amazon</a></strong>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><div><hr></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[TimesFM, Generative AI on Microsoft Azure | Issue 105]]></title><description><![CDATA[Explore TimesFM for zero-shot forecasting, six videos on Python, voice dictation, Git, MCP, AI coding workflows, and looped transformers, plus a guide to generative AI on Azure.]]></description><link>https://ramikrispin.substack.com/p/timesfm-generative-ai-on-microsoft</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/timesfm-generative-ai-on-microsoft</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sat, 12 Sep 2026 12:31:01 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21obca%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F3ee2174f-34c8-4bb0-be08-bf5bd05f45dc_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - TimesFM</p></li><li><p>New learning resources - Python, OpenWhispr, Git internals, MCP, AI coding workflows, and looped transformers</p></li><li><p>Book of the week - Generative AI on Microsoft Azure by Adri&#225;n Gonz&#225;lez S&#225;nchez, Jaime De Mora, and Jorge Garc&#237;a Xim&#233;nez</p></li></ul><p>The newsletter is also available on <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a> and <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21obca%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F3ee2174f-34c8-4bb0-be08-bf5bd05f45dc_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!obca!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee2174f-34c8-4bb0-be08-bf5bd05f45dc_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!obca!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee2174f-34c8-4bb0-be08-bf5bd05f45dc_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!obca!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee2174f-34c8-4bb0-be08-bf5bd05f45dc_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!obca!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee2174f-34c8-4bb0-be08-bf5bd05f45dc_1920x1080.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21obca%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F3ee2174f-34c8-4bb0-be08-bf5bd05f45dc_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ee2174f-34c8-4bb0-be08-bf5bd05f45dc_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4447172,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/215314609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee2174f-34c8-4bb0-be08-bf5bd05f45dc_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!obca!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee2174f-34c8-4bb0-be08-bf5bd05f45dc_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!obca!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee2174f-34c8-4bb0-be08-bf5bd05f45dc_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!obca!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee2174f-34c8-4bb0-be08-bf5bd05f45dc_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!obca!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee2174f-34c8-4bb0-be08-bf5bd05f45dc_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>Are you interested in learning about SQL AI agents in production? If so, please check out my LinkedIn Learning course: </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.linkedin.com/learning/build-with-ai-sql-ai-agents-in-production&quot;,&quot;text&quot;:&quot;SQL AI Agents in Production&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-ai-agents-in-production"><span>SQL AI Agents in Production</span></a></p><div><hr></div><h2><strong>Open Source of the Week</strong></h2><p>This week&#8217;s focus is on <strong>TimesFM</strong>, a pretrained time-series foundation model from Google Research. It produces zero-shot forecasts for new time series without requiring a task-specific training cycle. The latest model supports univariate and native multivariate forecasting, along with past-only and past-and-future dynamic covariates. Its Python interface accepts variable-length NumPy inputs and returns point forecasts with optional quantile estimates.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Fgoogle-research%2Ftimesfm">https://github.com/google-research/timesfm</a></strong></p><h3><strong>Key Features</strong></h3><ul><li><p><strong>Zero-shot forecasting</strong> &#8212; applies a pretrained model to unseen time series without additional training</p></li><li><p><strong>Univariate and multivariate inputs</strong> &#8212; forecasts individual series or multiple related variables jointly</p></li><li><p><strong>Dynamic covariates</strong> &#8212; incorporate past-only signals and covariates that extend into the forecast horizon</p></li><li><p><strong>Probabilistic forecasts</strong> &#8212; return point predictions and quantile estimates from 0.1 through 0.9</p></li><li><p><strong>Variable context lengths</strong> &#8212; processes batches containing time series with different history lengths</p></li><li><p><strong>PyTorch support</strong> &#8212; provides a Python package and pretrained checkpoints for local inference</p></li><li><p><strong>Fine-tuning examples</strong> &#8212; include workflows using Hugging Face Transformers and PEFT with LoRA</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21G1eg%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F9b24e7a9-aaec-423d-81c9-3e8a15258716_1946x1158.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G1eg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b24e7a9-aaec-423d-81c9-3e8a15258716_1946x1158.png 424w, https://substackcdn.com/image/fetch/$s_!G1eg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b24e7a9-aaec-423d-81c9-3e8a15258716_1946x1158.png 848w, https://substackcdn.com/image/fetch/$s_!G1eg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b24e7a9-aaec-423d-81c9-3e8a15258716_1946x1158.png 1272w, https://substackcdn.com/image/fetch/$s_!G1eg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b24e7a9-aaec-423d-81c9-3e8a15258716_1946x1158.png 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21G1eg%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F9b24e7a9-aaec-423d-81c9-3e8a15258716_1946x1158.png" width="1456" height="866" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b24e7a9-aaec-423d-81c9-3e8a15258716_1946x1158.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:866,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2438014,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/215314609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b24e7a9-aaec-423d-81c9-3e8a15258716_1946x1158.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!G1eg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b24e7a9-aaec-423d-81c9-3e8a15258716_1946x1158.png 424w, https://substackcdn.com/image/fetch/$s_!G1eg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b24e7a9-aaec-423d-81c9-3e8a15258716_1946x1158.png 848w, https://substackcdn.com/image/fetch/$s_!G1eg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b24e7a9-aaec-423d-81c9-3e8a15258716_1946x1158.png 1272w, https://substackcdn.com/image/fetch/$s_!G1eg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b24e7a9-aaec-423d-81c9-3e8a15258716_1946x1158.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>More details are available in the <a href="iframe.php?url=https%3A%2F%2Fresearch.google%2Fblog%2Fa-decoder-only-foundation-model-for-time-series-forecasting%2F">Google Research overview</a>.</p><p>License: Apache-2.0 for the source code and model weights through TimesFM 2.5. TimesFM 3.0 weights use a separate non-commercial license and are not permitted for commercial or production use.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fdocker-for-local-ai-app-development-build-lightweight-containerized-ai-applications%2F" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4Dky!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97480308-47fc-4c23-8796-78f97e00e5d8_2172x420.png 424w, https://substackcdn.com/image/fetch/$s_!4Dky!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97480308-47fc-4c23-8796-78f97e00e5d8_2172x420.png 848w, https://substackcdn.com/image/fetch/$s_!4Dky!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97480308-47fc-4c23-8796-78f97e00e5d8_2172x420.png 1272w, https://substackcdn.com/image/fetch/$s_!4Dky!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97480308-47fc-4c23-8796-78f97e00e5d8_2172x420.png 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%214Dky%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F97480308-47fc-4c23-8796-78f97e00e5d8_2172x420.png" width="1456" height="282" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97480308-47fc-4c23-8796-78f97e00e5d8_2172x420.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:282,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:979264,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://www.linkedin.com/learning/docker-for-local-ai-app-development-build-lightweight-containerized-ai-applications/&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/215314609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97480308-47fc-4c23-8796-78f97e00e5d8_2172x420.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4Dky!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97480308-47fc-4c23-8796-78f97e00e5d8_2172x420.png 424w, https://substackcdn.com/image/fetch/$s_!4Dky!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97480308-47fc-4c23-8796-78f97e00e5d8_2172x420.png 848w, https://substackcdn.com/image/fetch/$s_!4Dky!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97480308-47fc-4c23-8796-78f97e00e5d8_2172x420.png 1272w, https://substackcdn.com/image/fetch/$s_!4Dky!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97480308-47fc-4c23-8796-78f97e00e5d8_2172x420.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>OpenWhispr: Use Your Voice For Everything</strong></h3><p>This video from NeuralNine introduces OpenWhispr, a cross-platform voice-to-text app that supports private local transcription with Whisper or NVIDIA Parakeet, along with cloud and bring-your-own-key options.</p><div id="youtube2-PKzCW5OpMVM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;PKzCW5OpMVM&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FPKzCW5OpMVM%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>How Git ACTUALLY works</strong></h3><p>This video from Coder Coder explains Git internals by following the workflow through blobs, trees, commits, the staging area, branches, detached HEAD, merges, rebases, remote-tracking branches, pulls, and tags.</p><div id="youtube2-cLBvn81naWY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;cLBvn81naWY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FcLBvn81naWY%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>MCP Explained Simply &#8212; What It Is and Why It Exists</strong></h3><p>This video by TechWorld with Nana explains MCP through a customer-support chatbot, comparing MCP with direct API integrations and tracing dynamic tool discovery, stateful sessions, access control, host-client-server architecture, and the request flow.</p><div id="youtube2-oblaHqULUHk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;oblaHqULUHk&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FoblaHqULUHk%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>mattpocock/skills: A Complete AI Coding Workflow, End-to-End</strong></h3><p>This tutorial from Matt Pocock walks through installing and configuring his skills repository, then using its AI coding workflow for interviews, specs, tickets, implementation, and code review.</p><div id="youtube2-M6mYodf0dJM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;M6mYodf0dJM&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FM6mYodf0dJM%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Learn Python &#8212; Interactive Course</strong></h3><p>This four-hour course from freeCodeCamp and Scrimba teaches Python from the ground up through three projects. It covers variables, strings, user input, arithmetic, lists, conditionals, loops, functions, and error handling.</p><div id="youtube2-kLZgQWjnUz0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;kLZgQWjnUz0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FkLZgQWjnUz0%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Let me explain Looped Transformers to you</strong></h3><p>This visual tutorial from Neural Breakdown with AVB explains how looped transformers reuse internal model layers to simulate iterative reasoning. The 22-minute video introduces the architecture and then covers how looped transformer models are trained.</p><div id="youtube2-z0Y8-IUwBKE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;z0Y8-IUwBKE&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2Fz0Y8-IUwBKE%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><div><hr></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is on a new book &#8212; <em>Generative AI on Microsoft Azure</em> by Adri&#225;n Gonz&#225;lez S&#225;nchez, Jaime De Mora, and Jorge Garc&#237;a Xim&#233;nez. The book moves from generative AI foundations and model selection into production patterns on Azure. It compares prompt engineering, retrieval-augmented generation, and fine-tuning, then covers agentic systems, GenAIOps, evaluation, monitoring, security, and governance using Microsoft Foundry and related Azure services.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>Generative AI foundations</strong> &#8212; model types, pretraining, post-training, inference, and Azure adoption patterns</p></li><li><p><strong>From prototype to production</strong> &#8212; Microsoft Foundry, model catalogs, deployment patterns, Copilot Studio, and supporting data platforms</p></li><li><p><strong>Model selection and prompting</strong> &#8212; choosing providers and deployment types, then applying prompt-engineering techniques</p></li><li><p><strong>Retrieval-augmented generation</strong> &#8212; Azure AI Search, Cosmos DB, multimodal RAG, GraphRAG, NL2SQL, agentic RAG, and RAFT</p></li><li><p><strong>Model fine-tuning</strong> &#8212; deciding when to fine-tune and implementing SFT and PEFT workflows in Azure</p></li><li><p><strong>Agentic systems</strong> &#8212; MCP, sequential and concurrent workflows, handoffs, reflection, supervisors, and multiagent orchestration</p></li><li><p><strong>GenAIOps and LLMOps</strong> &#8212; evaluation, CI/CD, production monitoring, lifecycle automation, versioning, and reproducibility</p></li><li><p><strong>Security and governance</strong> &#8212; guardrails, access control, Microsoft Purview, Defender, Entra, Content Safety, and PyRIT</p></li><li><p><strong>Production perspectives</strong> &#8212; interviews on Azure innovation, AI architecture, platform design, and frontier AI</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%215VZe%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F391fdc70-0a9d-4eb8-b0ae-8f6852a03e34_1143x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5VZe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F391fdc70-0a9d-4eb8-b0ae-8f6852a03e34_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5VZe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F391fdc70-0a9d-4eb8-b0ae-8f6852a03e34_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5VZe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F391fdc70-0a9d-4eb8-b0ae-8f6852a03e34_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5VZe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F391fdc70-0a9d-4eb8-b0ae-8f6852a03e34_1143x1500.jpeg 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%215VZe%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F391fdc70-0a9d-4eb8-b0ae-8f6852a03e34_1143x1500.jpeg" width="1143" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/391fdc70-0a9d-4eb8-b0ae-8f6852a03e34_1143x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1143,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:139190,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/215314609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F391fdc70-0a9d-4eb8-b0ae-8f6852a03e34_1143x1500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5VZe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F391fdc70-0a9d-4eb8-b0ae-8f6852a03e34_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5VZe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F391fdc70-0a9d-4eb8-b0ae-8f6852a03e34_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5VZe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F391fdc70-0a9d-4eb8-b0ae-8f6852a03e34_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5VZe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F391fdc70-0a9d-4eb8-b0ae-8f6852a03e34_1143x1500.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is ideal for AI engineers, cloud architects, technical leaders, and practitioners who want to design, deploy, monitor, and govern production generative AI systems on Microsoft Azure.</p><p>The book is available on the <strong><a href="iframe.php?url=https%3A%2F%2Flearning.oreilly.com%2Flibrary%2Fview%2Fgenerative-ai-on%2F9798341623279%2F">publisher&#8217;s website</a></strong> and on <strong><a href="iframe.php?url=https%3A%2F%2Fwww.amazon.com%2FGenerative-AI-Microsoft-Azure-Multi-Agent%2Fdp%2FB0FYCQ6WFX%2F">Amazon</a></strong>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><div><hr></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p>]]></content:encoded></item><item><title><![CDATA[Set up a Python environment for SQL AI agents]]></title><description><![CDATA[Set up Python for SQL AI agent tutorials with uv, venv and pip, or a Docker-based VS Code Dev Container.]]></description><link>https://ramikrispin.substack.com/p/set-up-a-python-environment-for-sql</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/set-up-a-python-environment-for-sql</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Tue, 08 Sep 2026 12:30:50 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21bJyh%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F8beba7ad-befa-43e5-907d-2539e70bb761_1692x930.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the previous tutorials, we laid the foundation for <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fintroduction-to-sql-ai-agents-the">what a Structured Query Language (SQL) artificial intelligence (AI) agent is</a> and <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fcontext-in-sql-ai-agents-the-three">how context shapes its behavior</a>. Before we build our first SQL AI agent, we need a reproducible environment and a database the agent can query. We will establish those prerequisites in two parts. In this tutorial, we will focus on preparing the Python environment and show two approaches: setting up a local virtual environment and using a Docker container with the Visual Studio Code (VS Code) Dev Containers extension. </p><p>In Part 2, <em>Prepare data for a SQL AI agent with DuckDB and Ibis</em>, we will introduce the San Francisco International Airport (SFO) passenger traffic dataset, prepare it for agent context, and create the persistent DuckDB table used throughout the series. Together, these two prerequisites give us a tested foundation before we introduce a model or build the agent workflow.</p><p>By the end of these two prerequisite tutorials, we will have established the foundation required to start developing our SQL AI agents. In the infographic below, this foundation is represented by the green data preparation pipeline.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21bJyh%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F8beba7ad-befa-43e5-907d-2539e70bb761_1692x930.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bJyh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8beba7ad-befa-43e5-907d-2539e70bb761_1692x930.png 424w, https://substackcdn.com/image/fetch/$s_!bJyh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8beba7ad-befa-43e5-907d-2539e70bb761_1692x930.png 848w, https://substackcdn.com/image/fetch/$s_!bJyh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8beba7ad-befa-43e5-907d-2539e70bb761_1692x930.png 1272w, https://substackcdn.com/image/fetch/$s_!bJyh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8beba7ad-befa-43e5-907d-2539e70bb761_1692x930.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21bJyh%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F8beba7ad-befa-43e5-907d-2539e70bb761_1692x930.png" width="1456" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8beba7ad-befa-43e5-907d-2539e70bb761_1692x930.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1405972,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/214681877?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8beba7ad-befa-43e5-907d-2539e70bb761_1692x930.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bJyh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8beba7ad-befa-43e5-907d-2539e70bb761_1692x930.png 424w, https://substackcdn.com/image/fetch/$s_!bJyh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8beba7ad-befa-43e5-907d-2539e70bb761_1692x930.png 848w, https://substackcdn.com/image/fetch/$s_!bJyh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8beba7ad-befa-43e5-907d-2539e70bb761_1692x930.png 1272w, https://substackcdn.com/image/fetch/$s_!bJyh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8beba7ad-befa-43e5-907d-2539e70bb761_1692x930.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Figure 1. The green data preparation pipeline represents the foundation we will establish across the two prerequisite tutorials.</em></figcaption></figure></div><p>This tutorial is part of the SQL AI Agent series for AI developers:</p><ul><li><p><a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fintroduction-to-sql-ai-agents-the">Introduction to SQL AI Agents: The Four Components Behind Natural Language SQL</a></p></li><li><p><a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fcontext-in-sql-ai-agents-the-three">Context in SQL AI Agents: The Three Layers Behind Reliable Answers</a></p></li><li><p>&#128204; Part I: Set up a Python environment for SQL AI agents</p></li><li><p>&#9197;&#65039; Part II: Prepare data for a SQL AI agent with DuckDB and Ibis</p></li></ul><p>This series expands on my LinkedIn Learning course, <em><a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-agents-with-large-language-models">Build with AI: SQL Agents with Large Language Models</a></em>, with hands-on examples and supporting code.</p><p>By the end, we will know how to:</p><ul><li><p>Configure persistent DuckDB storage.</p></li><li><p>Set up Python 3.12 with uv or <code>venv</code> and pip.</p></li><li><p>Run the supporting notebook with Jupyter or VS Code.</p></li><li><p>Use the Docker Dev Container and its optional PostgreSQL setup.</p></li></ul><p>All code used across these two prerequisite tutorials is available in the <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FRamiKrispin%2Fsql-ai-agent">tutorial supporting repository</a></strong>:</p><ul><li><p><strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FRamiKrispin%2Fsql-ai-agent%2Fblob%2Fmain%2Ftutorials%2F03a_duckdb_settings.ipynb">DuckDB settings</a></strong></p></li><li><p>Optional <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FRamiKrispin%2Fsql-ai-agent%2Fblob%2Fmain%2Ftutorials%2F03a_postgresql_settings.ipynb">PostgreSQL settings</a></strong></p></li></ul><p>The tutorial series will use DuckDB. I am including the PostgreSQL settings as an optional example for readers who prefer PostgreSQL and are comfortable using Docker. PostgreSQL is not required for this tutorial or any later tutorial in the series.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2><strong>Choose a Python environment</strong></h2><p>We will cover two ways to set up the required Python environment: a local virtual environment or a containerized environment using Docker and the VS Code Dev Containers extension. Both options support the DuckDB notebook used by this tutorial series.</p><p>For the local setup, I recommend using uv to create the Python virtual environment because it provides a convenient environment-management workflow and installs Python packages very quickly. Alternatively, if we prefer not to use uv, we can create the virtual environment with Python&#8217;s built-in <code>venv</code> module and install the dependencies with pip. Both local methods use the same dependencies provided by the tutorial supporting repository.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21Ljir%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F2ccbbdae-994b-4d30-9d75-c2a9c0da1ed7_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ljir!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ccbbdae-994b-4d30-9d75-c2a9c0da1ed7_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Ljir!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ccbbdae-994b-4d30-9d75-c2a9c0da1ed7_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Ljir!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ccbbdae-994b-4d30-9d75-c2a9c0da1ed7_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Ljir!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ccbbdae-994b-4d30-9d75-c2a9c0da1ed7_1536x1024.png 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21Ljir%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F2ccbbdae-994b-4d30-9d75-c2a9c0da1ed7_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ccbbdae-994b-4d30-9d75-c2a9c0da1ed7_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1650513,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/214681877?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ccbbdae-994b-4d30-9d75-c2a9c0da1ed7_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ljir!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ccbbdae-994b-4d30-9d75-c2a9c0da1ed7_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Ljir!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ccbbdae-994b-4d30-9d75-c2a9c0da1ed7_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Ljir!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ccbbdae-994b-4d30-9d75-c2a9c0da1ed7_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Ljir!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ccbbdae-994b-4d30-9d75-c2a9c0da1ed7_1536x1024.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Figure 2. The same DuckDB notebook runs locally in a virtual environment or inside a VS Code Dev Container managed by Docker Compose, with both options using the persistent DuckDB workflow.</em></figcaption></figure></div><p>Let&#8217;s start by cloning the tutorial supporting repository and moving into its root directory:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;c0443471-1475-446e-9e60-9c458caf16a6&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">git clone https://github.com/RamiKrispin/sql-ai-agent.git
cd sql-ai-agent</code></pre></div><p>The project declares its Python dependencies in <code>docker/requirements.txt</code>. Both environment options use that file, which keeps the package set consistent between the local and container workflows.</p><h2><strong>Configure persistent DuckDB storage</strong></h2><p>By default, calling <code>ibis.duckdb.connect()</code> without a file path creates an in-memory DuckDB database. That database exists only for the duration of the Python session and disappears when the session ends. To make the database persistent, we will save it to a local directory defined by <code>DUCKDB_DATABASES_PATH</code>. This allows us to reconnect to the same database and continue from the same table state in a later session.</p><p>The notebook stores this database file outside the repository. Keeping the database separate from the tutorial code reduces the risk of committing it to Git and provides one configurable storage location for both the local and container workflows. On a Mac that uses zsh, we add the following environment variable to <code>~/.zshenv</code>, then reload the file and create the directory:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;a6133216-75b8-4925-9a00-659845497749&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">export DUCKDB_DATABASES_PATH="$HOME/databases/duckdb"
source ~/.zshenv
mkdir -p "$DUCKDB_DATABASES_PATH"</code></pre></div><p>This setting applies whether we use a local virtual environment or the Docker option. On Linux, the process is similar: we add the same <code>export</code> command to the startup file used by our shell, such as <code>~/.bashrc</code> for Bash or <code>~/.zshenv</code> for zsh, reload the file, and create the directory. On Windows, we can define <code>DUCKDB_DATABASES_PATH</code> as a persistent user environment variable through the Environment Variables settings or PowerShell. The following PowerShell commands save the user-level variable, make it available in the current session, and create the directory:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;a7fd2e11-fbcd-4fe1-9cd2-c2426426d0ef&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">$duckdbPath = Join-Path $HOME "databases\duckdb"
[Environment]::SetEnvironmentVariable(
    "DUCKDB_DATABASES_PATH", $duckdbPath, "User"
)
$env:DUCKDB_DATABASES_PATH = $duckdbPath
New-Item -ItemType Directory -Force -Path $duckdbPath</code></pre></div><p>After setting a persistent variable using either Windows method, we restart the terminal or VS Code so that new processes inherit it.</p><p>With the storage location configured, we can choose one of the following environment options.</p><h2><strong>Option 1: Use a local virtual environment</strong></h2><p>For the local option, I recommend uv. The standard library <code>venv,</code> and pip workflow is available as an alternative when we prefer not to install uv.</p><h3><strong>Recommended: Use uv</strong></h3><p>If uv is not already available, we can follow the <a href="iframe.php?url=https%3A%2F%2Fdocs.astral.sh%2Fuv%2Fgetting-started%2Finstallation%2F">uv installation guide</a>. From the repository root, we create a Python 3.12 virtual environment, activate it, and install the dependencies:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;56559ef2-2b43-4547-9bfa-501eb28467b5&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">uv venv --python 3.12
source .venv/bin/activate
uv pip install --no-cache-dir -r docker/requirements.txt</code></pre></div><p>The <code>uv venv</code> command creates the environment in <code>.venv</code> and installs Python 3.12 if necessary.</p><h3><strong>Alternative: Use venv and pip</strong></h3><p>Alternatively, if we prefer not to use uv, we can use Python&#8217;s built-in <code>venv</code> module to create the virtual environment and pip to install the dependencies. First, we confirm that <code>python3</code> resolves to Python 3.12. We then create the environment and install the same declared dependencies:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;2827620b-099d-48ee-99d0-9a17a3626378&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">python3 --version
# Python 3.12.x
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install --no-cache-dir -r docker/requirements.txt</code></pre></div><p>On Windows PowerShell, we confirm the version with <code>py -3.12 --version</code>, create the environment with <code>py -3.12 -m venv .venv</code>, and activate it with <code>.\.venv\Scripts\Activate.ps1</code>.</p><p>At this point, the local Python environment is ready. The following command is not part of the environment setup: it starts Jupyter and opens the DuckDB notebook that we will use in Part II to prepare the SFO passenger data and create the DuckDB table. Opening it now lets us run the code interactively, but we can skip this step when we only want to read this tutorial and run the notebook later:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;0b68f714-381e-439d-b32e-3def9bf73add&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">jupyter notebook tutorials/03a_duckdb_settings.ipynb</code></pre></div><p>Alternatively, we can open <code>tutorials/03a_duckdb_settings.ipynb</code> directly in VS Code and select the Python interpreter from <code>.venv</code> as the notebook kernel. This option requires the Jupyter extension for VS Code to be installed.</p><p>For either local method, we stop Jupyter with <code>Ctrl+C</code> and run <code>deactivate</code> when finished.</p><h2><strong>Option 2: Use Docker with VS Code Dev Containers</strong></h2><p>Docker provides a reproducible alternative to setting up the Python environment directly on our machine. The repository defines the Python version, dependencies, and supporting services in shared configuration files, which help us use a consistent setup across development environments. With VS Code Dev Containers, we can continue working in VS Code while the notebook and its dependencies run inside the container.</p><p>For a deeper introduction to Docker, see my <a href="iframe.php?url=https%3A%2F%2Ftheaiops.substack.com%2F">Docker 101 series for AI/ML developers</a> in the AIOps newsletter.</p><p>This option uses the repository&#8217;s <code>.devcontainer/devcontainer.json</code> and <code>docker-compose.yaml</code> configuration. Before starting, we install <a href="iframe.php?url=https%3A%2F%2Fwww.docker.com%2Fproducts%2Fdocker-desktop%2F">Docker Desktop</a>, <a href="iframe.php?url=https%3A%2F%2Fcode.visualstudio.com%2F">VS Code</a>, and the <a href="iframe.php?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dms-vscode-remote.remote-containers">Dev Containers extension</a>.</p><p>The Docker environment supports the DuckDB path used by the series and the optional PostgreSQL example described below.</p><h3><strong>Database settings for the Docker option</strong></h3><p>Docker Compose reuses the DuckDB path configured above. For the same reasons, we will also define a local path for the PostgreSQL data. The Compose configuration includes a PostgreSQL service alongside the Python service. The Compose file provides local defaults for the PostgreSQL connection values, which we can override if needed.</p><p>When VS Code opens the Dev Container, it starts the services defined in <code>docker-compose.yaml</code>. At runtime, Docker Compose reads these values from the environment inherited from the shell that launched VS Code and substitutes them for the matching <code>${...}</code> entries in the Compose file. <code>DUCKDB_DATABASES_PATH</code> identifies the host directory where the DuckDB database file is stored, while <code>POSTGRES_DATABASES_PATH</code> identifies the host directory used to persist PostgreSQL data. <code>POSTGRES_USER</code>, <code>POSTGRES_PASSWORD</code>, and <code>POSTGRES_DB</code> are passed to both the PostgreSQL and Python services so that the database and the notebook use the same connection settings. If we do not define them, Docker Compose uses the local defaults shown below. These values are provided when the containers start rather than stored in the Docker image.</p><p>On a Mac that uses zsh, we can make the required Compose variables persistent for our user account by adding them to <code>~/.zshenv</code>:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;26e2dc45-e03e-4b73-b7c9-57b2992270d6&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">export DUCKDB_DATABASES_PATH="$HOME/databases/duckdb"
export POSTGRES_DATABASES_PATH="$HOME/databases/postgres"

# Optional PostgreSQL overrides
export POSTGRES_USER="postgres"
export POSTGRES_PASSWORD="password"
export POSTGRES_DB="my_db"</code></pre></div><p>The <code>~/.zshenv</code> file is loaded when a new zsh session starts, which makes these variables available to commands launched from that shell. After saving the file, we quit any running VS Code instance completely, reload the file, create the database directories, and launch VS Code from the same terminal:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;502f6013-23e3-4fda-9ee8-26b57af776d6&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">source ~/.zshenv
mkdir -p "$DUCKDB_DATABASES_PATH"
mkdir -p "$POSTGRES_DATABASES_PATH/sql-ai-agent"
code .</code></pre></div><p>The <code>mkdir</code> commands create both host storage locations. Docker mounts the DuckDB directory at <code>/databases/duckdb</code> inside the Python container and passes that internal path to the notebook as <code>DUCKDB_DATABASES_PATH</code>. It bind-mounts the PostgreSQL host directory at <code>/var/lib/postgresql/data</code> inside the PostgreSQL container. Both databases therefore remain available after we stop or recreate the containers. Deleting either host directory would also delete the corresponding persisted database data.</p><p>These values are local development defaults. The password is stored as plain text in the shell configuration, so we should <strong>not</strong> reuse a real or shared database <strong>password</strong> here. On Linux, we can add the same exports to the startup file for our shell, such as <code>~/.bashrc</code> for Bash or <code>~/.zshenv</code> for zsh, reload that file, and launch VS Code from the same terminal after quitting any running VS Code instance. On Windows, we use the same PowerShell pattern as the DuckDB setting to create the PostgreSQL storage path and persist its variable:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;8c98af73-ba07-4dae-a247-89c3ced7435d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">$postgresPath = Join-Path $HOME "databases\postgres"
[Environment]::SetEnvironmentVariable(
    "POSTGRES_DATABASES_PATH", $postgresPath, "User"
)
$env:POSTGRES_DATABASES_PATH = $postgresPath
New-Item -ItemType Directory -Force -Path (Join-Path $postgresPath "sql-ai-agent")</code></pre></div><p>We then restart PowerShell and VS Code so the new processes inherit the variable. This tutorial does not invoke a model, so model-provider credentials can remain unset.</p><p>We open the cloned repository in VS Code and, when prompted, select <strong>Reopen in Container</strong>. We can also open the Command Palette and select <strong>Dev Containers: Reopen in Container</strong>. Docker Compose builds the Python service from <code>docker/Dockerfile_Dev</code>, starts it with PostgreSQL, mounts the repository at <code>/workspace</code>, and selects the container&#8217;s Python 3.12.11 environment at <code>/opt/sql-ai-agent-dev/bin/python3</code>.</p><h3><strong>DuckDB notebook: the tutorial-series path</strong></h3><p>After the container starts, we open <code>tutorials/03a_duckdb_settings.ipynb</code> and select the container&#8217;s Python interpreter as the notebook kernel. This is the same DuckDB example used with the local virtual environment and the database path used by the tutorials that follow.</p><h3><strong>PostgreSQL notebook: an optional Docker example</strong></h3><p>If we prefer PostgreSQL, we open <code>tutorials/03a_postgresql_settings.ipynb</code> and run its cells instead. This notebook uses the PostgreSQL service and environment variables supplied by the Docker setup. It prepares the same dataset and runs the same SQL checks, but it is not required for this tutorial or any later tutorial in the series.</p><p>PostgreSQL itself does not require Docker. We could install it locally or connect to a PostgreSQL database hosted elsewhere, then adjust the connection settings accordingly. Those setups are outside the scope of this tutorial; the optional PostgreSQL notebook is tested only with the repository&#8217;s Docker and VS Code Dev Container configuration.</p><p>When finished, we reopen a local terminal in the repository root and run <code>docker compose down</code>. Closing VS Code does not stop the services because the Dev Container uses <code>"shutdownAction": "none"</code>.</p><h2><strong>Confirm the environment is ready</strong></h2><p>From the activated local environment or a terminal inside the Dev Container, we run this smoke test to confirm that Python can import the four core packages:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;8c1e67b6-4776-4e67-958b-e4ce7c00f84c&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">python -c 'import sys, ibis, pandas, duckdb; print(f"Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}; pandas {pandas.__version__}; DuckDB {duckdb.__version__}; Ibis {ibis.__version__}")'</code></pre></div><p>The verified local Python 3.12 environment returns:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;4d0563b6-d08f-4118-9843-d1f3772f0c25&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Python 3.12.10; pandas 2.3.3; DuckDB 1.4.2; Ibis 11.0.0</code></pre></div><p>The Dev Container uses Python 3.12.11, so its Python patch version differs, while the verified package versions remain the same.</p><p>The setup is complete when the DuckDB notebook opens with the expected Python kernel: <code>.venv</code> for the local option or <code>/opt/sql-ai-agent-dev/bin/python3</code> for the Dev Container. Both options provide the packages needed for the next prerequisite. No model is invoked at this stage, so model-provider credentials are not required.</p><p>With the Python environment and persistent storage location in place, we are ready to load and prepare the data. Continue with Part 2, <em>Prepare data for a SQL AI agent with DuckDB and Ibis</em>.</p><h2><strong>Summary</strong></h2><p>In this first prerequisite, we cloned the tutorial supporting repository and configured <code>DUCKDB_DATABASES_PATH</code> so the database created in the next part can persist outside the repository. We then prepared a Python 3.12 environment using either the recommended uv workflow, the <code>venv</code> and pip alternative, or the repository&#8217;s Docker and VS Code Dev Container configuration.</p><p>We also reviewed the optional PostgreSQL settings available through the Docker workflow. PostgreSQL is not required by this series; DuckDB remains the database used by the tutorials that follow.</p><p>The environment is now ready. In <a href="iframe.php?url=https%3A%2F%2Ffile%2B.vscode-resource.vscode-cdn.net%2FUsers%2Framikrispin%2FProjects%2Ftutorials%2Fsql-ai-agent-tutorials%2Ftutorials%2Ft03b-prepare-data-for-sql-ai-agent%2FREADME.md">Part 2, </a><em>Prepare data for a SQL AI agent with DuckDB and Ibis</em>, we will load and validate the SFO passenger traffic dataset, prepare its fields for agent context, and create the persistent DuckDB table.</p><h2><strong>References</strong></h2><ul><li><p><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FRamiKrispin%2Fsql-ai-agent">Tutorial supporting repository</a></p></li><li><p><a href="iframe.php?url=https%3A%2F%2Fdocs.astral.sh%2Fuv%2Fgetting-started%2Finstallation%2F">uv installation guide</a></p></li><li><p><a href="iframe.php?url=https%3A%2F%2Fdocs.python.org%2F3%2Flibrary%2Fvenv.html">Python </a><code>venv</code><a href="iframe.php?url=https%3A%2F%2Fdocs.python.org%2F3%2Flibrary%2Fvenv.html"> documentation</a></p></li><li><p><a href="iframe.php?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dms-toolsai.jupyter">VS Code Jupyter extension</a></p></li><li><p><a href="iframe.php?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dms-vscode-remote.remote-containers">VS Code Dev Containers extension</a></p></li><li><p><a href="iframe.php?url=https%3A%2F%2Fwww.docker.com%2Fproducts%2Fdocker-desktop%2F">Docker Desktop</a></p></li></ul><div><hr></div><p>To follow the rest of the SQL AI agent series, <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">subscribe to the newsletter</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Agent Top, Designing AI Interfaces | Issue 104]]></title><description><![CDATA[A weekly curated update on data science and engineering topics and resources.]]></description><link>https://ramikrispin.substack.com/p/agent-top-designing-ai-interfaces</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/agent-top-designing-ai-interfaces</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sat, 05 Sep 2026 12:46:50 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21TpJF%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Faffc3d51-d53b-4728-b9da-3e768a229746_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - the agent-top project</p></li><li><p>New learning resources - Docker Sandboxes, local real-time speech, TrueForge, and pure Python AI agents</p></li><li><p>Book of the week - Designing AI Interfaces: Design Principles for Creative and Autonomous AI by Louise Macfadyen</p></li></ul><p>The newsletter is also available on <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a> and <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21TpJF%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Faffc3d51-d53b-4728-b9da-3e768a229746_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TpJF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faffc3d51-d53b-4728-b9da-3e768a229746_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!TpJF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faffc3d51-d53b-4728-b9da-3e768a229746_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!TpJF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faffc3d51-d53b-4728-b9da-3e768a229746_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!TpJF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faffc3d51-d53b-4728-b9da-3e768a229746_1920x1080.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21TpJF%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Faffc3d51-d53b-4728-b9da-3e768a229746_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/affc3d51-d53b-4728-b9da-3e768a229746_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4818668,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/214255388?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faffc3d51-d53b-4728-b9da-3e768a229746_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TpJF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faffc3d51-d53b-4728-b9da-3e768a229746_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!TpJF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faffc3d51-d53b-4728-b9da-3e768a229746_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!TpJF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faffc3d51-d53b-4728-b9da-3e768a229746_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!TpJF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faffc3d51-d53b-4728-b9da-3e768a229746_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>Are you interested in learning about SQL AI agents in production? If so, please check out my LinkedIn Learning course: </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.linkedin.com/learning/build-with-ai-sql-ai-agents-in-production&quot;,&quot;text&quot;:&quot;SQL AI Agents in Production&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-ai-agents-in-production"><span>SQL AI Agents in Production</span></a></p><div><hr></div><h2><strong>Open Source of the Week</strong></h2><p>This week&#8217;s focus is on agent-top, a new open-source project by <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Kannan Kalidasan&quot;,&quot;id&quot;:3128655,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/257b05dc-3a10-4c9d-b917-954f800ab6bd_284x284.png&quot;,&quot;uuid&quot;:&quot;1b7d4ee5-855e-4125-82b4-2c6eac879d35&quot;}" data-component-name="MentionToDOM"></span>. This Rust-based project is an htop-style terminal dashboard for monitoring local AI coding agents, including Claude Code, Codex, and Gemini CLI. It reads local transcripts and operating-system process data to show which sessions are running or waiting, their token usage and estimated cost, CPU and memory consumption, tool activity, subprocesses, and orphaned MCP servers. It can also export session timelines for analysis in tools such as Perfetto or OpenTelemetry-compatible platforms, without requiring agents to enable telemetry or send prompt content off the machine.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Fkannandreams%2Fagent-top">https://github.com/kannandreams/agent-top</a></strong></p><h3><strong>Key Features</strong></h3><ul><li><p><strong>Session overview</strong> &#8212; distinguishes active, waiting, and recently stopped agent sessions</p></li><li><p><strong>Usage and costs</strong> &#8212; reads token counts from agent transcripts and applies a configurable model-price table</p></li><li><p><strong>Process monitoring</strong> &#8212; aggregates CPU and memory use across each agent&#8217;s complete process tree</p></li><li><p><strong>MCP leak detection</strong> &#8212; highlights MCP servers that remain alive after their parent agent has stopped</p></li><li><p><strong>Tool tracing</strong> &#8212; displays a timeline of model activity, tool calls, subagent work, failures, and calls still in progress</p></li><li><p><strong>Trace export</strong> &#8212; writes Chrome trace or OTLP JSON for analysis in tools such as Perfetto and Jaeger</p></li><li><p><strong>Scriptable snapshots</strong> &#8212; prints one-time terminal tables or JSON snapshots for automation and bug reports</p></li><li><p><strong>Local operation</strong> &#8212; reads local metadata and sends nothing unless an export endpoint is explicitly supplied</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21pSuI%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fa55b2da2-bbf7-4211-af77-df100006fff3_1660x976.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pSuI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa55b2da2-bbf7-4211-af77-df100006fff3_1660x976.png 424w, https://substackcdn.com/image/fetch/$s_!pSuI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa55b2da2-bbf7-4211-af77-df100006fff3_1660x976.png 848w, https://substackcdn.com/image/fetch/$s_!pSuI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa55b2da2-bbf7-4211-af77-df100006fff3_1660x976.png 1272w, https://substackcdn.com/image/fetch/$s_!pSuI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa55b2da2-bbf7-4211-af77-df100006fff3_1660x976.png 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21pSuI%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fa55b2da2-bbf7-4211-af77-df100006fff3_1660x976.png" width="1456" height="856" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a55b2da2-bbf7-4211-af77-df100006fff3_1660x976.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:856,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:731156,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/214255388?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa55b2da2-bbf7-4211-af77-df100006fff3_1660x976.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pSuI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa55b2da2-bbf7-4211-af77-df100006fff3_1660x976.png 424w, https://substackcdn.com/image/fetch/$s_!pSuI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa55b2da2-bbf7-4211-af77-df100006fff3_1660x976.png 848w, https://substackcdn.com/image/fetch/$s_!pSuI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa55b2da2-bbf7-4211-af77-df100006fff3_1660x976.png 1272w, https://substackcdn.com/image/fetch/$s_!pSuI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa55b2da2-bbf7-4211-af77-df100006fff3_1660x976.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>License: MIT</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><div><hr></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>Docker Sandboxes: Run AI Agents Safely</strong></h3><p>This video from Docker features Eric Jia and Kevin Wittek, members of the Docker Sandboxes team, walking through isolated environments for coding agents. The 23-minute video covers network and filesystem controls, secrets, stateful environments, the clone option, Git worktrees, GUI access over SSH, and reusable kits and mixins.</p><div id="youtube2-4JB-iqtSr_8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;4JB-iqtSr_8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F4JB-iqtSr_8%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>BreezeTTS2 - Local Real-Time Voice</strong></h3><p>This video from Sam Witteveen examines BreezeTTS2, a 3B open-weight text-to-speech model for local real-time inference. The 14-minute video covers voice design and direction, voice events, multilingual generation, latency, benchmarks, licensing, voice cloning, and streaming.</p><div id="youtube2-xDHD09fDUkQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;xDHD09fDUkQ&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FxDHD09fDUkQ%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>TrueForge Agent Harness</strong></h3><p>This video from NeuralNine introduces TrueForge, an open-source agent harness that runs model calls, MCP tools, skills, sandboxing, approvals, context management, and session state. The 21-minute video focuses on a project that can be accessed through a chat interface, HTTP API, TypeScript SDK, or embeddable UI.</p><div id="youtube2-lcMf0W0cxig" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;lcMf0W0cxig&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FlcMf0W0cxig%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Building AI Agents in Pure Python</strong></h3><p>This beginner course from Tech With Tim builds an AI agent in pure Python without using an agent framework. The 37-minute course covers agent fundamentals, model API calls, conversation history, tool calling, and assembling the complete agent.</p><div id="youtube2-c9AnqCeyxbI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;c9AnqCeyxbI&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2Fc9AnqCeyxbI%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is on a new book &#8212; <em>Designing AI Interfaces: Design Principles for Creative and Autonomous AI</em> by Louise Macfadyen. The book takes a design-first approach to building interfaces for large language models and autonomous systems. It connects the technical stages of an AI system &#8212; inputs, processing, and outputs &#8212; with practical UX concerns such as discoverability, latency, errors, transparency, permissions, oversight, and user control.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>AI system foundations</strong> &#8212; LLM behavior, user experience, technical literacy, and ethical considerations</p></li><li><p><strong>Capability discovery and orchestration</strong> &#8212; helping users understand available models, tools, agents, permissions, and usage</p></li><li><p><strong>Input design</strong> &#8212; implicit context, explicit prompts, direct manipulation, and text, image, and voice modalities</p></li><li><p><strong>Processing and latency</strong> &#8212; communicating routing, generation, delays, notifications, and system status</p></li><li><p><strong>Error recovery</strong> &#8212; designing useful error messages and handling midstream failures without breaking user momentum</p></li><li><p><strong>Output design</strong> &#8212; improving clarity, verifiability, grounding, actionability, adjustability, and multiturn interactions</p></li><li><p><strong>Content risks</strong> &#8212; addressing problematic outputs, misuse, watermarking, and detection</p></li><li><p><strong>Agentic design patterns</strong> &#8212; reflection, tool use, planning, multiagent collaboration, and ReAct workflows</p></li><li><p><strong>Human oversight</strong> &#8212; revealing plans, communicating progress, adding checkpoints, and maintaining shared control</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21L47v%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F9c385235-fe69-4e0b-8e97-40e95ddcbb44_1143x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L47v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c385235-fe69-4e0b-8e97-40e95ddcbb44_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!L47v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c385235-fe69-4e0b-8e97-40e95ddcbb44_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!L47v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c385235-fe69-4e0b-8e97-40e95ddcbb44_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!L47v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c385235-fe69-4e0b-8e97-40e95ddcbb44_1143x1500.jpeg 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21L47v%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F9c385235-fe69-4e0b-8e97-40e95ddcbb44_1143x1500.jpeg" width="1143" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c385235-fe69-4e0b-8e97-40e95ddcbb44_1143x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1143,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:130730,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/214255388?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c385235-fe69-4e0b-8e97-40e95ddcbb44_1143x1500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!L47v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c385235-fe69-4e0b-8e97-40e95ddcbb44_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!L47v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c385235-fe69-4e0b-8e97-40e95ddcbb44_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!L47v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c385235-fe69-4e0b-8e97-40e95ddcbb44_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!L47v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c385235-fe69-4e0b-8e97-40e95ddcbb44_1143x1500.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is ideal for product designers, UX practitioners, product managers, and engineers who want to design AI products that balance system capability with transparency, safety, and user control.</p><p>The book is available on the <strong><a href="iframe.php?url=https%3A%2F%2Flearning.oreilly.com%2Flibrary%2Fview%2Fdesigning-ai-interfaces%2F9798341639812%2F">publisher&#8217;s website</a></strong> and on <strong><a href="iframe.php?url=https%3A%2F%2Fwww.amazon.com%2FDesigning-AI-Interfaces-Principles-Autonomous%2Fdp%2FB0FYC7XRP7%2F">Amazon</a></strong>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><div><hr></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p>]]></content:encoded></item><item><title><![CDATA[The Archify Project, Vector Databases: A Practical Introduction | Issue 103]]></title><description><![CDATA[A weekly curated update on data science and engineering topics and resources.]]></description><link>https://ramikrispin.substack.com/p/the-archify-project-vector-databases</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/the-archify-project-vector-databases</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sat, 29 Aug 2026 13:15:33 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21fiwr%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F7c1c8fec-716e-4ec7-af4c-93d93f0cf79a_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - The Archify project</p></li><li><p>New learning resources - Docker debugging, RecBole recommender systems, agentic harnesses, visual data structures and algorithms, reinforcement learning for unverifiable tasks, and LLM inference system design</p></li><li><p>Book of the week - Vector Databases: A Practical Introduction by Nitin Borwankar</p></li></ul><p>The newsletter is also available on <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a> and <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21fiwr%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F7c1c8fec-716e-4ec7-af4c-93d93f0cf79a_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fiwr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1c8fec-716e-4ec7-af4c-93d93f0cf79a_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!fiwr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1c8fec-716e-4ec7-af4c-93d93f0cf79a_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!fiwr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1c8fec-716e-4ec7-af4c-93d93f0cf79a_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!fiwr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1c8fec-716e-4ec7-af4c-93d93f0cf79a_1920x1080.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21fiwr%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F7c1c8fec-716e-4ec7-af4c-93d93f0cf79a_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c1c8fec-716e-4ec7-af4c-93d93f0cf79a_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4605713,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/213234604?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1c8fec-716e-4ec7-af4c-93d93f0cf79a_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fiwr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1c8fec-716e-4ec7-af4c-93d93f0cf79a_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!fiwr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1c8fec-716e-4ec7-af4c-93d93f0cf79a_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!fiwr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1c8fec-716e-4ec7-af4c-93d93f0cf79a_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!fiwr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1c8fec-716e-4ec7-af4c-93d93f0cf79a_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>Are you interested in learning about SQL AI agents in production? If so, please check out my LinkedIn Learning course:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.linkedin.com/learning/build-with-ai-sql-ai-agents-in-production&quot;,&quot;text&quot;:&quot;SQL AI Agents in Production&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-ai-agents-in-production"><span>SQL AI Agents in Production</span></a></p><div><hr></div><h2><strong>Open Source of the Week</strong></h2><p>This week&#8217;s focus is on the <strong>Archify</strong> project. Archify is an open-source Node.js rendering and validation system that turns a codebase or system description into an interactive system map. It works with coding agents such as Cursor, Claude Code, Codex CLI, and OpenCode. Rather than producing a static diagram directly from a prompt, Archify has the agent generate a typed JSON intermediate representation, validate it, and deterministically compile it into HTML and SVG. This workflow keeps the diagram source reproducible and allows validation failures to identify the specific element that needs repair.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Ftt-a1i%2Farchify">https://github.com/tt-a1i/archify</a></strong></p><h3><strong>Key Features</strong></h3><ul><li><p><strong>Five diagram types</strong> &#8212; Create architecture, workflow, sequence, data-flow, and lifecycle diagrams for different system-design views.</p></li><li><p><strong>Typed diagram source</strong> &#8212; Represents nodes, relationships, views, and presentation settings in a JSON intermediate representation.</p></li><li><p><strong>Validation before delivery</strong> &#8212; Check schemas, layout, HTML and SVG output, routes, and label clearance before replacing the last valid artifact.</p></li><li><p><strong>Grounded interaction</strong> &#8212; Search nodes, trace authored upstream or downstream reach, inspect routes, compare semantic roles, and play guided stories without adding unmodeled topology.</p></li><li><p><strong>Architecture change review</strong> &#8212; Compare validated snapshots through Before, Delta, and After views that identify added, removed, changed, moved, and rerouted facts.</p></li><li><p><strong>Interactive presentation</strong> &#8212; Switch visual presets and themes, focus on diagram elements, zoom, and present bounded views from a self-contained HTML file.</p></li><li><p><strong>Portable exports</strong> &#8212; Generate self-contained HTML alongside PNG, SVG, WebM, and 1200&#215;630 share-card outputs.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21gk72%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F61a73818-5cf0-4be9-9956-338ed6149c3a_960x540.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gk72!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a73818-5cf0-4be9-9956-338ed6149c3a_960x540.gif 424w, https://substackcdn.com/image/fetch/$s_!gk72!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a73818-5cf0-4be9-9956-338ed6149c3a_960x540.gif 848w, https://substackcdn.com/image/fetch/$s_!gk72!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a73818-5cf0-4be9-9956-338ed6149c3a_960x540.gif 1272w, https://substackcdn.com/image/fetch/$s_!gk72!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a73818-5cf0-4be9-9956-338ed6149c3a_960x540.gif 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21gk72%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F61a73818-5cf0-4be9-9956-338ed6149c3a_960x540.gif" width="960" height="540" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61a73818-5cf0-4be9-9956-338ed6149c3a_960x540.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:540,&quot;width&quot;:960,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:918340,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/213234604?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a73818-5cf0-4be9-9956-338ed6149c3a_960x540.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gk72!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a73818-5cf0-4be9-9956-338ed6149c3a_960x540.gif 424w, https://substackcdn.com/image/fetch/$s_!gk72!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a73818-5cf0-4be9-9956-338ed6149c3a_960x540.gif 848w, https://substackcdn.com/image/fetch/$s_!gk72!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a73818-5cf0-4be9-9956-338ed6149c3a_960x540.gif 1272w, https://substackcdn.com/image/fetch/$s_!gk72!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a73818-5cf0-4be9-9956-338ed6149c3a_960x540.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>More details are available in the project <a href="iframe.php?url=https%3A%2F%2Ftt-a1i.github.io%2Farchify%2F">documentation</a>.</p><p>License: MIT</p><div><hr></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>AI Inferencing and System Design Patterns</strong></h3><p>This video from <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Abi Aryan&quot;,&quot;id&quot;:462718,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f7bfd96-a4dc-436f-97c0-4851ff5c9e93_378x378.png&quot;,&quot;uuid&quot;:&quot;b40b25f4-e008-4cfa-85fe-c62f76e03191&quot;}" data-component-name="MentionToDOM"></span> explains the infrastructure behind production LLM inference. The 78-minute walkthrough covers batching economics, latency at high utilization, routing, prefill/decode disaggregation, KV-cache tiers, GPU networking, orchestration, and observability.</p><div id="youtube2-gOsDddG67yc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;gOsDddG67yc&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FgOsDddG67yc%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>AI Model vs. Agentic Harness: What Actually Drives AI</strong></h3><p>This video from IBM Technology, presented by Martin Keen, explains agentic harnesses through tools, MCP, persistent instructions, context management, iterative loops, and verification.</p><div id="youtube2-ZELPNFXJ4_o" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;ZELPNFXJ4_o&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FZELPNFXJ4_o%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Stop Debugging Docker Containers the Hard Way</strong></h3><p>This video from DevOps Toolbox covers Docker commands for scaffolding projects, inspecting containers, following events, checking disk use, and analyzing Buildx history.</p><div id="youtube2-wowLWDe3vL4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;wowLWDe3vL4&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FwowLWDe3vL4%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>RecBole Crash Course: Recommender Systems in Python</strong></h3><p>This video from NeuralNine uses RecBole to build Python recommender systems with MovieLens and Retail Rocket, comparing BERT4Rec, SASRec, and an LSTM baseline.</p><div id="youtube2-IiEQt7TLwJA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;IiEQt7TLwJA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FIiEQt7TLwJA%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Learn Data Structures and Algorithms Visually</strong></h3><p>This course from freeCodeCamp.org provides a visual introduction to arrays, linked lists, stacks, queues, trees, graphs, searching, sorting, recursion, DFS, BFS, and Dijkstra&#8217;s algorithm.</p><div id="youtube2-RpLnQnurpLY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;RpLnQnurpLY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FRpLnQnurpLY%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Reinforcement Learning for Unverifiable Tasks</strong></h3><p>This video from Neural Breakdown with AVB covers reinforcement learning without a simple deterministic verifier, including GRPO, reward design, training stages, and reward hacking.</p><div id="youtube2-kxypcfrkUBI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;kxypcfrkUBI&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FkxypcfrkUBI%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is on a new data engineering book &#8212; <em>Vector Databases: A Practical Introduction</em> by Nitin Borwankar. The book explains how vector databases support semantic search and retrieval-augmented generation by storing and querying embeddings. It moves from vector and embedding fundamentals to hands-on systems built with FAISS, SQLite, PostgreSQL with pgvector, and local models through Ollama. The examples focus on Python, self-hosted tools, and CPU-based workflows, providing a practical path from similarity search to hybrid retrieval and RAG applications.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>Vector database foundations</strong> &#8212; Compare vector databases with SQL and NoSQL systems, and explore metadata filtering and hybrid architectures.</p></li><li><p><strong>Embeddings</strong> &#8212; Work with Word2Vec, Doc2Vec, transformers, sentence-transformers, and vector arithmetic.</p></li><li><p><strong>Similarity search</strong> &#8212; Learn distance metrics, approximate nearest-neighbor search, quantization, and FAISS indexes such as flat, IVF, LSH, and HNSW.</p></li><li><p><strong>Semantic search with SQLite</strong> &#8212; Prepare content, generate embeddings, build indexes, and query data with SQLite vector extensions.</p></li><li><p><strong>PostgreSQL and pgvector</strong> &#8212; Design schemas and build vector-search pipelines for scientific papers and other document collections.</p></li><li><p><strong>Text-processing pipelines</strong> &#8212; Extract text from PDFs, split documents into chunks, create embeddings in batches, and store the results.</p></li><li><p><strong>Hybrid retrieval</strong> &#8212; Combine semantic and keyword search, then merge and rank their results.</p></li><li><p><strong>Local RAG applications</strong> &#8212; Connect SQLite VSS or pgvector with Ollama to retrieve context and generate answers with local models.</p></li><li><p><strong>Application delivery</strong> &#8212; Package services with Docker, build interactive search interfaces, and tune retrieval performance.</p></li><li><p><strong>Vector Query Language</strong> &#8212; Explore an experimental SQL-inspired proposal for vector similarity, hybrid, range, and batch queries.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%2119Kr%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F2b9292be-e690-45d6-af27-b1147c3b2429_1143x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!19Kr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b9292be-e690-45d6-af27-b1147c3b2429_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!19Kr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b9292be-e690-45d6-af27-b1147c3b2429_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!19Kr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b9292be-e690-45d6-af27-b1147c3b2429_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!19Kr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b9292be-e690-45d6-af27-b1147c3b2429_1143x1500.jpeg 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%2119Kr%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F2b9292be-e690-45d6-af27-b1147c3b2429_1143x1500.jpeg" width="1143" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b9292be-e690-45d6-af27-b1147c3b2429_1143x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1143,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:137498,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/213234604?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b9292be-e690-45d6-af27-b1147c3b2429_1143x1500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!19Kr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b9292be-e690-45d6-af27-b1147c3b2429_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!19Kr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b9292be-e690-45d6-af27-b1147c3b2429_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!19Kr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b9292be-e690-45d6-af27-b1147c3b2429_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!19Kr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b9292be-e690-45d6-af27-b1147c3b2429_1143x1500.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is ideal for Python developers, data engineers, machine learning practitioners, and backend engineers who understand basic databases and SQL and want to build small- to medium-scale semantic search or RAG systems with self-hosted tools.</p><p>You can get the book from <a href="iframe.php?url=https%3A%2F%2Flearning.oreilly.com%2Flibrary%2Fview%2Fvector-databases%2F9781098177584%2F">O&#8217;Reilly Learning</a> or <a href="iframe.php?url=https%3A%2F%2Fwww.amazon.com%2FVector-Databases-Introduction-Nitin-Borwankar%2Fdp%2F1098177592">Amazon</a>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><div><hr></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p>]]></content:encoded></item><item><title><![CDATA[Skills for Real Engineers, Learning AutoML | Issue 102]]></title><description><![CDATA[A weekly curated update on data science and engineering topics and resources.]]></description><link>https://ramikrispin.substack.com/p/skills-for-real-engineers-learning</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/skills-for-real-engineers-learning</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sat, 22 Aug 2026 12:31:02 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21bRhl%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F832e9e39-332b-49cb-94df-48b8681ba427_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - Skills for Real Engineers</p></li><li><p>New learning resources - Qwen3.8 serving and local testing, graph-powered road agents, Kimi K3 coding, and two Unsloth fine-tuning workflows</p></li><li><p>Book of the week - Learning AutoML</p></li></ul><p>The newsletter is also available on <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a> and <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21bRhl%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F832e9e39-332b-49cb-94df-48b8681ba427_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bRhl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F832e9e39-332b-49cb-94df-48b8681ba427_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!bRhl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F832e9e39-332b-49cb-94df-48b8681ba427_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!bRhl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F832e9e39-332b-49cb-94df-48b8681ba427_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!bRhl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F832e9e39-332b-49cb-94df-48b8681ba427_1920x1080.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21bRhl%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F832e9e39-332b-49cb-94df-48b8681ba427_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/832e9e39-332b-49cb-94df-48b8681ba427_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4886768,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/212248101?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F832e9e39-332b-49cb-94df-48b8681ba427_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bRhl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F832e9e39-332b-49cb-94df-48b8681ba427_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!bRhl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F832e9e39-332b-49cb-94df-48b8681ba427_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!bRhl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F832e9e39-332b-49cb-94df-48b8681ba427_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!bRhl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F832e9e39-332b-49cb-94df-48b8681ba427_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>Are you interested in learning about SQL AI agents in production? If so, please check out my LinkedIn Learning course: </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.linkedin.com/learning/build-with-ai-sql-ai-agents-in-production&quot;,&quot;text&quot;:&quot;SQL AI Agents in Production&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-ai-agents-in-production"><span>SQL AI Agents in Production</span></a></p><div><hr></div><h2><strong>Open Source of the Week</strong></h2><p>This week&#8217;s focus is on <strong>Skills for Real Engineers</strong>, an open-source collection of agent skills from Matt Pocock for structuring software engineering work with Claude Code, Codex, and other coding agents. Rather than handing an agent one large process, the repository packages small, adaptable workflows for alignment, specifications, issue tracking, implementation, testing, debugging, design, and review. Skills are split between user-invoked orchestrators and model-invoked disciplines, allowing teams to compose a workflow while keeping each procedure explicit and editable.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Fmattpocock%2Fskills">https://github.com/mattpocock/skills</a></strong></p><h3><strong>Key Features</strong></h3><ul><li><p><strong>Flexible installation</strong> &#8212; use a managed Claude Code plugin or copy selected, editable skills into Codex and other agents with skills.sh</p></li><li><p><strong>Repository setup</strong> &#8212; configure GitHub, Linear, or local issue tracking, triage labels, and where generated documentation is stored</p></li><li><p><strong>Requirements alignment</strong> &#8212; use grilling workflows to clarify a change, establish shared terminology, and document architectural decisions</p></li><li><p><strong>Planning and delivery</strong> &#8212; turn conversations into specifications and tickets, map dependencies, and drive implementation from the agreed work</p></li><li><p><strong>Engineering feedback loops</strong> &#8212; apply test-driven development, structured bug diagnosis, and two-axis code review</p></li><li><p><strong>Domain and architecture practices</strong> &#8212; maintain a shared domain model, design deeper modules, and identify codebase architecture improvements</p></li><li><p><strong>Productivity workflows</strong> &#8212; create handoffs, questionnaires, teaching sessions, and clearer explanations when context is missing</p></li></ul><p>License: MIT</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/p/skills-for-real-engineers-learning?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fp%2Fskills-for-real-engineers-learning%3Futm_source%3Dsubstack%26utm_medium%3Demail%26utm_content%3Dshare%26action%3Dshare"><span>Share</span></a></p><div><hr></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>Qwen3.8-27B and Fast Serving</strong></h3><p>This video from Sam Witteveen examines Qwen3.8-27B and how to serve it for token throughput. The 18-minute video covers Qwen3.8 model variants, benchmark comparisons, Hugging Face model materials, a hands-on demo, and serving with SGLang.</p><div id="youtube2-PTuGGdDuyPI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;PTuGGdDuyPI&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FPTuGGdDuyPI%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Graph-Powered Road AI Agents</strong></h3><p>This tutorial from Dr. Maryam Miradi walks through converting OpenStreetMap road topology into a NetworkX domain graph and exposing graph algorithms as deterministic tools for specialist AI agents. The 18-minute tutorial covers graph features, maintenance and closure analysis, Folium mapping, LangGraph orchestration, and a Gradio dashboard.</p><div id="youtube2-LUraTgGgnSE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;LUraTgGgnSE&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FLUraTgGgnSE%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Qwen3.8-27B Local Test with llama.cpp</strong></h3><p>This livestream from Venelin Valkov tests Qwen3.8-27B locally with llama.cpp. The 68-minute session explores local inference, coding and agentic tasks, comparison with Qwen3.6-27B, and the DaBench benchmark.</p><div id="youtube2-nFxQ9quHjdY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;nFxQ9quHjdY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FnFxQ9quHjdY%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Kimi K3 for Coding</strong></h3><p>This video from Tech With Tim examines Kimi K3 through its model overview, benchmarks, subscription and API pricing, and coding access. The 14-minute video demonstrates the Kimi Code CLI, Claude Code configuration, Cursor integration, and a single-prompt application build.</p><div id="youtube2-mq-rVs7oUXw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;mq-rVs7oUXw&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2Fmq-rVs7oUXw%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Fine-Tune Gemma 4 with Unsloth Studio</strong></h3><p>This tutorial from the Prompt Engineer channel walks through a no-code Gemma 4 fine-tuning workflow in Unsloth Studio. The nine-minute tutorial covers RunPod GPU setup, Unsloth installation, Playground configuration, dataset preparation, training, Hugging Face export, and comparison of the base and fine-tuned models.</p><div id="youtube2-d9LGtygWEKQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;d9LGtygWEKQ&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2Fd9LGtygWEKQ%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Unsloth LLM Fine-Tuning Explained</strong></h3><p>This video from Naveen Tech Hub explains how Unsloth approaches LLM fine-tuning on consumer GPUs. The seven-minute video covers LoRA and QLoRA, VRAM usage, supported model families, dataset preparation, the fine-tuning workflow, a Hugging Face comparison, and deployment with Ollama.</p><div id="youtube2-6KCewdJy_1A" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;6KCewdJy_1A&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F6KCewdJy_1A%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is on a new machine learning book &#8212; <em>Learning AutoML: Automating ML Pipelines with AutoGluon, Leading Frameworks, and Real-World Integration</em> by Kerem Tomak. The book explains how automated machine learning can reduce manual work across data preparation, feature engineering, model selection, hyperparameter tuning, and deployment. Instead of treating AutoML as a one-click black box, it examines the underlying pipeline, the trade-offs between automation and customization, and the practices required to operate automated models in production. AutoGluon serves as the primary toolkit, with comparisons to cloud platforms and other open-source frameworks.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>AutoML foundations</strong> &#8212; the evolution of automated machine learning, its use cases, leading frameworks, and current limitations</p></li><li><p><strong>End-to-end pipelines</strong> &#8212; data preprocessing, feature engineering, model selection, ensembling, monitoring, and continuous learning</p></li><li><p><strong>Data preparation</strong> &#8212; automated profiling, type handling, feature generation, selection, and production-ready preprocessing</p></li><li><p><strong>Model optimization</strong> &#8212; grid and random search, Bayesian optimization, Hyperband, multifidelity methods, and neural architecture search</p></li><li><p><strong>Tabular machine learning</strong> &#8212; classification and regression with AutoGluon, model interpretation, customization, and deployment preparation</p></li><li><p><strong>Text and NLP</strong> &#8212; text classification, transformer-based models, multimodal prediction, drift detection, and retraining</p></li><li><p><strong>Time series forecasting</strong> &#8212; AutoGluon TimeSeriesPredictor, foundation models, covariates, backtesting, and model monitoring</p></li><li><p><strong>Computer vision</strong> &#8212; image classification, object detection, multimodal data, foundation models, and cloud or edge deployment</p></li><li><p><strong>MLOps integration</strong> &#8212; experiment tracking, model management, Kubeflow pipelines, MLflow, Airflow, reproducibility, and governance</p></li><li><p><strong>Production deployment</strong> &#8212; CI/CD, testing, containerization, serving, observability, drift detection, security, and continuous feedback</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21ngqC%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F23bf0bd0-b573-4ea2-909e-2660c9e3ef22_1143x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ngqC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23bf0bd0-b573-4ea2-909e-2660c9e3ef22_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ngqC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23bf0bd0-b573-4ea2-909e-2660c9e3ef22_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ngqC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23bf0bd0-b573-4ea2-909e-2660c9e3ef22_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ngqC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23bf0bd0-b573-4ea2-909e-2660c9e3ef22_1143x1500.jpeg 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21ngqC%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F23bf0bd0-b573-4ea2-909e-2660c9e3ef22_1143x1500.jpeg" width="1143" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23bf0bd0-b573-4ea2-909e-2660c9e3ef22_1143x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1143,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:140671,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/212248101?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23bf0bd0-b573-4ea2-909e-2660c9e3ef22_1143x1500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ngqC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23bf0bd0-b573-4ea2-909e-2660c9e3ef22_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ngqC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23bf0bd0-b573-4ea2-909e-2660c9e3ef22_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ngqC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23bf0bd0-b573-4ea2-909e-2660c9e3ef22_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ngqC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23bf0bd0-b573-4ea2-909e-2660c9e3ef22_1143x1500.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is ideal for intermediate-to-advanced data scientists, machine learning engineers, and AI researchers who want to build AutoML workflows that extend beyond experimentation into reproducible, monitored production systems.</p><p>The book is available on <strong><a href="iframe.php?url=https%3A%2F%2Flearning.oreilly.com%2Flibrary%2Fview%2Flearning-automl%2F9798341643178%2F">O&#8217;Reilly</a></strong> and for purchase on <strong><a href="iframe.php?url=https%3A%2F%2Fwww.amazon.com%2FLearning-AutoML-Automating-Frameworks-Integration-ebook%2Fdp%2FB0DQLSLS8W%2F">Amazon</a></strong>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><div><hr></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Unsloth Studio, Imbalanced Data | Issue 101]]></title><description><![CDATA[A weekly curated update on data science and engineering topics and resources.]]></description><link>https://ramikrispin.substack.com/p/unsloth-studio-imbalanced-data-issue</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/unsloth-studio-imbalanced-data-issue</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sat, 15 Aug 2026 12:40:24 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%2176xw%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F29041972-385f-4213-95bd-3f728d3f04d9_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - Unsloth Studio</p></li><li><p>New learning resources - Hermes desktop workflows, ML system design, and Docker Sandboxes</p></li><li><p>Book of the week - Imbalanced Data: Myths, Mistakes and Modern Solutions</p></li></ul><p>The newsletter is also available on <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a> and <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%2176xw%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F29041972-385f-4213-95bd-3f728d3f04d9_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!76xw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29041972-385f-4213-95bd-3f728d3f04d9_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!76xw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29041972-385f-4213-95bd-3f728d3f04d9_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!76xw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29041972-385f-4213-95bd-3f728d3f04d9_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!76xw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29041972-385f-4213-95bd-3f728d3f04d9_1920x1080.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%2176xw%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F29041972-385f-4213-95bd-3f728d3f04d9_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/29041972-385f-4213-95bd-3f728d3f04d9_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1849545,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/211285571?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29041972-385f-4213-95bd-3f728d3f04d9_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!76xw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29041972-385f-4213-95bd-3f728d3f04d9_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!76xw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29041972-385f-4213-95bd-3f728d3f04d9_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!76xw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29041972-385f-4213-95bd-3f728d3f04d9_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!76xw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29041972-385f-4213-95bd-3f728d3f04d9_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>Are you interested in learning about SQL AI agents in production? If so, please check out my LinkedIn Learning course: </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.linkedin.com/learning/build-with-ai-sql-ai-agents-in-production&quot;,&quot;text&quot;:&quot;SQL AI Agents in Production&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-ai-agents-in-production"><span>SQL AI Agents in Production</span></a></p><div><hr></div><h2><strong>Open Source of the Week</strong></h2><p><strong>Unsloth Studio</strong> is the new open-source, browser-based interface from Unsloth AI for running and training models locally without building the workflow in code. It brings model discovery, chat and inference, dataset preparation, fine-tuning, training monitoring, export, and serving into one interface. Rather than moving between notebooks, command-line tools, and separate model runners, Studio organizes the local model workflow around dedicated tools for chat, Data Recipes, training, and export.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Funslothai%2Funsloth">https://github.com/unslothai/unsloth</a></strong></p><h3><strong>Key Features</strong></h3><ul><li><p><strong>Local Studio interface</strong> &#8212; Use a browser-based GUI to run and train models on local Mac, Windows, and Linux systems.</p></li><li><p><strong>Model discovery and chat</strong> &#8212; Search for, download, and run GGUF and Safetensors models from the Studio Chat interface.</p></li><li><p><strong>Side-by-side comparison</strong> &#8212; Compare responses from two models in the same interface before selecting one for a workflow.</p></li><li><p><strong>Tools and code execution</strong> &#8212; Give local models access to tool calling, web search, and Python or Bash execution.</p></li><li><p><strong>No-code training</strong> &#8212; Configure fine-tuning runs and monitor training progress, loss, and hardware usage without writing the training pipeline in code.</p></li><li><p><strong>Data Recipes</strong> &#8212; Turn files such as PDFs, CSVs, JSON, and Word documents into training datasets through a visual workflow.</p></li><li><p><strong>Model export</strong> &#8212; Export trained models and checkpoints as GGUF, Safetensors, or LoRA files for local inference and deployment tools.</p></li><li><p><strong>API serving</strong> &#8212; Expose local models through an OpenAI-compatible API for use by other applications and agents.</p></li></ul><p>More details are available in the <a href="iframe.php?url=https%3A%2F%2Funsloth.ai%2Fdocs%2Fnew%2Fstudio">Unsloth Studio documentation</a>.</p><p>License: Apache 2.0</p><div><hr></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>ML System Design for Data Scientists</strong></h3><p>This video from <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Andres Vourakis&quot;,&quot;id&quot;:135808578,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9ebf6fc-4ed6-47e1-938e-a1fa37a2347e_1601x1646.jpeg&quot;,&quot;uuid&quot;:&quot;c8de92d0-c91d-47f7-af75-1e7e5bb6b67f&quot;}" data-component-name="MentionToDOM"></span> walks through a framework for designing production machine learning systems. The 17-minute video covers a six-step design process, four production-system requirements drawn from Chip Huyen&#8217;s work, and a layer-by-layer application of the framework to a trial-to-paid conversion system.</p><div id="youtube2-t3W3TJrNUnQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;t3W3TJrNUnQ&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2Ft3W3TJrNUnQ%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Hermes Desktop: SSH, Custom Layouts, Widgets, and Kanban</strong></h3><p>This video from Tonbi&#8217;s AI Garage walks through recent Hermes desktop workflows. The 16-minute video covers connecting to remote machines over SSH, arranging multi-session panes and tabs, dragging context into sessions, building widgets with the Plugin SDK, and using the Kanban plugin to delegate a knowledge-base workflow across researcher, writer, and verifier profiles.</p><div id="youtube2-bifDX18uyUk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;bifDX18uyUk&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FbifDX18uyUk%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Getting Started with Docker Sandboxes</strong></h3><p>This tutorial from Docker walks through setting up an isolated development environment for AI-assisted coding. The five-minute tutorial covers installing the Sandbox CLI, authenticating a Docker account, launching a sandbox, mounting a workspace, and using the same environment with Claude and Codex.</p><div id="youtube2-9jfk1fdhXZo" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;9jfk1fdhXZo&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F9jfk1fdhXZo%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is on a new machine learning book &#8212; <em>Imbalanced Data: Myths, Mistakes and Modern Solutions</em> by Soledad Galli, PhD. The book challenges the common assumption that class imbalance must be fixed through resampling. Instead, it explains how model evaluation, probability thresholds, real-world error costs, and calibration shape classification decisions. It also examines where oversampling, undersampling, and SMOTE can introduce bias or discard useful data, then presents an evidence-driven workflow for choosing models, metrics, and interventions.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>Class imbalance foundations</strong> &#8212; Separate class frequency from the factors that actually affect model performance.</p></li><li><p><strong>Classification metrics</strong> &#8212; Understand what common metrics measure, where they can mislead, and how to choose metrics that fit the decision problem.</p></li><li><p><strong>Decision thresholds</strong> &#8212; Move beyond the default 0.5 cutoff and select thresholds that reflect practical requirements.</p></li><li><p><strong>Probability calibration</strong> &#8212; Assess reliability, identify what breaks calibration, and recalibrate biased probabilities in Python.</p></li><li><p><strong>Cost-sensitive learning</strong> &#8212; Connect thresholds, class weights, resampling, and the real costs of different errors.</p></li><li><p><strong>Undersampling and cleaning</strong> &#8212; Examine when removing observations discards useful information and how modern models change the tradeoffs.</p></li><li><p><strong>Oversampling and SMOTE</strong> &#8212; Review why synthetic sampling can introduce bias and the limited cases where oversampling may still help.</p></li><li><p><strong>Imbalanced learning with AI</strong> &#8212; Use AI to analyze data and build a pipeline, then audit and revise its methodological choices.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21vtz2%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fec4d7b4a-b06f-4d4f-8d95-286b87fe0ee7_989x1280.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vtz2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec4d7b4a-b06f-4d4f-8d95-286b87fe0ee7_989x1280.png 424w, https://substackcdn.com/image/fetch/$s_!vtz2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec4d7b4a-b06f-4d4f-8d95-286b87fe0ee7_989x1280.png 848w, https://substackcdn.com/image/fetch/$s_!vtz2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec4d7b4a-b06f-4d4f-8d95-286b87fe0ee7_989x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!vtz2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec4d7b4a-b06f-4d4f-8d95-286b87fe0ee7_989x1280.png 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21vtz2%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fec4d7b4a-b06f-4d4f-8d95-286b87fe0ee7_989x1280.png" width="989" height="1280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec4d7b4a-b06f-4d4f-8d95-286b87fe0ee7_989x1280.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:989,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:425562,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/211285571?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec4d7b4a-b06f-4d4f-8d95-286b87fe0ee7_989x1280.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vtz2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec4d7b4a-b06f-4d4f-8d95-286b87fe0ee7_989x1280.png 424w, https://substackcdn.com/image/fetch/$s_!vtz2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec4d7b4a-b06f-4d4f-8d95-286b87fe0ee7_989x1280.png 848w, https://substackcdn.com/image/fetch/$s_!vtz2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec4d7b4a-b06f-4d4f-8d95-286b87fe0ee7_989x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!vtz2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec4d7b4a-b06f-4d4f-8d95-286b87fe0ee7_989x1280.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is ideal for data scientists, machine learning engineers, and practitioners who build classification systems and want to make better decisions about metrics, thresholds, calibration, and resampling.</p><p>The ebook is available for purchase on the <strong><a href="iframe.php?url=https%3A%2F%2Fwww.trainindata.com%2Fp%2Fimbalanced-data-myths-mistakes-solutions-book">publisher&#8217;s website</a></strong>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><div><hr></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p>]]></content:encoded></item><item><title><![CDATA[Prime Agent, Generative AI at AWS | Issue 100]]></title><description><![CDATA[A weekly curated update on data science and engineering topics and resources.]]></description><link>https://ramikrispin.substack.com/p/prime-agent-generative-ai-at-aws</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/prime-agent-generative-ai-at-aws</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sat, 08 Aug 2026 13:00:41 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21MVFD%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F49b764df-31f5-45b5-981b-6cbf997652aa_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - Prime Agent</p></li><li><p>New learning resources - Stanford CS229 Machine Learning, CS329A Self-Improving AI Agents, a SciPy crash course, RAG from first principles, and a Claude Code full course</p></li><li><p>Book of the week - Generative AI at AWS</p></li></ul><p>The newsletter is also available on <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a> and <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21MVFD%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F49b764df-31f5-45b5-981b-6cbf997652aa_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MVFD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49b764df-31f5-45b5-981b-6cbf997652aa_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!MVFD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49b764df-31f5-45b5-981b-6cbf997652aa_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!MVFD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49b764df-31f5-45b5-981b-6cbf997652aa_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!MVFD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49b764df-31f5-45b5-981b-6cbf997652aa_1920x1080.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21MVFD%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F49b764df-31f5-45b5-981b-6cbf997652aa_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49b764df-31f5-45b5-981b-6cbf997652aa_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:289464,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/210307201?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49b764df-31f5-45b5-981b-6cbf997652aa_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MVFD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49b764df-31f5-45b5-981b-6cbf997652aa_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!MVFD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49b764df-31f5-45b5-981b-6cbf997652aa_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!MVFD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49b764df-31f5-45b5-981b-6cbf997652aa_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!MVFD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49b764df-31f5-45b5-981b-6cbf997652aa_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>Are you interested in learning about SQL AI agents in production? If so, please check out my LinkedIn Learning course: </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.linkedin.com/learning/build-with-ai-sql-ai-agents-in-production&quot;,&quot;text&quot;:&quot;SQL AI Agents in Production&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fbuild-with-ai-sql-ai-agents-in-production"><span>SQL AI Agents in Production</span></a></p><div><hr></div><h2><strong>Open Source of the Week</strong></h2><p>This week&#8217;s focus is on the <strong>Prime Agent</strong> project. Prime Agent is an open-source coding and research agent from Prime Intellect for general and long-running work. It combines a persistent Python control environment with a <strong>Recursive Language Model (RLM)</strong> approach and a <strong>Continual Harness</strong>. Rather than treating every session as a fresh chat, it can retain supplemental prompts, memories, skill descriptions, subagent specifications, goals, schedules, and execution state across turns and terminal sessions. Its programmatic model exposes file operations, shell commands, tool calls, subagents, and context management through code. The <code>/refine</code> command can review a trajectory and store small, evidence-backed improvements in supplemental state while leaving the base system prompt unchanged and preserving snapshots for rollback. The project is designed for coding workflows and research evaluations that need parallel agents, detachment and reattachment, and bounded autonomous execution. Prime Agent runs generated Python and project commands with the user&#8217;s permissions; it is not a security sandbox, so untrusted work should run in an external sandbox or restricted environment.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FPrimeIntellect-ai%2Fprime-agent">https://github.com/PrimeIntellect-ai/prime-agent</a></strong></p><h3><strong>Key Features</strong></h3><ul><li><p><strong>Programmatic control</strong> &#8212; uses persistent IPython as the built-in model tool for files, shell commands, tools, context management, and other operations</p></li><li><p><strong>Recursive subagents</strong> &#8212; lets the main agent start child agents for parallel or background work and consume their results through code</p></li><li><p><strong>Continual harness</strong> &#8212; stores supplemental prompts, memories, skill descriptions, and subagent specifications as durable, reviewable state</p></li><li><p><strong>Background continuity</strong> &#8212; daemon-backed sessions keep agents, Python state, schedules, and subagents running when the terminal disconnects</p></li><li><p><strong>Direct agent communication</strong> &#8212; enables running agents to discover one another, exchange messages, and coordinate work</p></li><li><p><strong>Long-running controls</strong> &#8212; provides persistent goals, heartbeats, schedules, automatic compaction, retained subagents, and bounded autonomous mode</p></li><li><p><strong>Reusable skills</strong> &#8212; treats skills as importable Python packages and includes tooling for creating project or personal skills</p></li><li><p><strong>Automation interfaces</strong> &#8212; documents JSON and RPC modes for headless workflows and integrations</p></li></ul><p>More details are available in the project <a href="iframe.php?url=https%3A%2F%2Fgithub.com%2FPrimeIntellect-ai%2Fprime-agent%2Ftree%2Fmain%2Fpackages%2Fcoding-agent%2Fdocs">documentation</a>.</p><p>License: MIT</p><div><hr></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>Stanford CS229 Machine Learning | Spring 2026</strong></h3><p>This 17-lecture playlist from Stanford Online presents a graduate-level introduction to machine learning and statistical pattern recognition. It covers supervised learning, neural networks, clustering, Gaussian mixture models, PCA, diffusion and representation learning, LLMs and transformers, and reinforcement learning.</p><p><a href="iframe.php?url=https%3A%2F%2Fwww.youtube.com%2Fplaylist%3Flist%3DPLaqpC4kq8Gpw">https://www.youtube.com/playlist?list=PLaqpC4kq8Gpw</a></p><h3><strong>Stanford CS329A Self-Improving AI Agents</strong></h3><p>This graduate seminar from Stanford examines how AI agents can improve through interaction with themselves and their environment. It covers test-time compute scaling, robust verification, feedback from tools and code, multi-step reasoning, reinforcement learning, agent evolution, search and deep research, memory, evaluation, coding agents, and robotics.</p><p><a href="iframe.php?url=https%3A%2F%2Fwww.youtube.com%2Fplaylist%3Flist%3DPLangBM27OtEA">https://www.youtube.com/playlist?list=PLangBM27OtEA</a></p><h3><strong>SciPy Crash Course - Scientific Computing in Python</strong></h3><p>This crash course from NeuralNine introduces scientific computing with SciPy in Python. The 53-minute video covers sparse arrays and matrices, scientific constants, linear algebra, numerical differentiation and integration, optimization, interpolation, statistics, fast Fourier transforms, spatial transforms, and multidimensional image processing.</p><div id="youtube2-tDre3k_ClOo" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;tDre3k_ClOo&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FtDre3k_ClOo%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>RAG Explained from First Principle | Embeddings, Vector Databases &amp; Retrieval</strong></h3><p>Ankit Bansal&#8217;s tutorial builds an intuitive explanation of retrieval-augmented generation before moving into implementation. The 38-minute video covers why LLMs use RAG, embeddings, text vectors, cosine similarity, semantic search, vector databases, document retrieval, and the end-to-end RAG architecture.</p><div id="youtube2-0EFWzqpX8mE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;0EFWzqpX8mE&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F0EFWzqpX8mE%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Claude Code Full Course &#8211; Autonomous Goals, MCP, and VS Code Setup</strong></h3><p>This course from freeCodeCamp, developed by EricWTech, walks through Claude Code setup and development workflows. The 82-minute video covers VS Code installation, permission and plan modes, autonomous goals, skills, file structures, context and token management, slash commands, GitHub, MCP integrations, and application deployment.</p><div id="youtube2-7l6bXLAKyEI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;7l6bXLAKyEI&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F7l6bXLAKyEI%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><div><hr></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is on a new cloud and AI book &#8212; <em>Generative AI at AWS: Turn Business Strategy into Production-Ready AI Applications and Agents</em> by Nestor Gandara, Eduardo Ordax, Srikanth Daggumalli, and Ashutosh Dubey. The book connects business planning with the technical work required to build and operate generative AI systems on AWS. Instead of stopping at model demos, it moves from use-case selection and data readiness through agent development, production deployment, governance, and business measurement. Amazon Bedrock, SageMaker AI, AgentCore, and related AWS services provide the platform context, while case studies and decision frameworks show where generative AI fits and where a traditional approach may be sufficient.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>Generative AI foundations</strong> &#8212; model architectures, transformers, diffusion models, prompting, fine-tuning, RAG, and guardrails</p></li><li><p><strong>AWS generative AI stack</strong> &#8212; Amazon Bedrock, SageMaker AI, Nova Forge, AgentCore, Strands Agents, and supporting infrastructure</p></li><li><p><strong>Data and model readiness</strong> &#8212; preparing data, selecting foundation models, and designing evaluation workflows</p></li><li><p><strong>Agentic application development</strong> &#8212; building an AWS-based agent application with tools, storage, a web interface, and MCP concepts</p></li><li><p><strong>Production deployment</strong> &#8212; Docker, ECS, Fargate, EKS, Lambda, infrastructure as code, CI/CD, scaling, and cost controls</p></li><li><p><strong>Monitoring and security</strong> &#8212; observability, model metrics, authentication, network isolation, secrets management, and prompt-injection defenses</p></li><li><p><strong>Advanced agent patterns</strong> &#8212; multi-agent communication, memory, reasoning strategies, computer use, voice agents, and neuro-symbolic systems</p></li><li><p><strong>Business use cases</strong> &#8212; selecting valuable applications and examining examples across analytics, healthcare, marketing, customer service, and operations</p></li><li><p><strong>Governance and responsible AI</strong> &#8212; evaluation, human oversight, bias mitigation, content controls, traceability, and lifecycle governance</p></li><li><p><strong>Organizational adoption</strong> &#8212; AI fluency, evolving roles, team structures, change management, and measuring enterprise impact</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21k6Op%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F20f72ad6-3eab-40cb-a77d-4c0596945300_1216x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k6Op!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f72ad6-3eab-40cb-a77d-4c0596945300_1216x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!k6Op!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f72ad6-3eab-40cb-a77d-4c0596945300_1216x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!k6Op!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f72ad6-3eab-40cb-a77d-4c0596945300_1216x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!k6Op!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f72ad6-3eab-40cb-a77d-4c0596945300_1216x1500.jpeg 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21k6Op%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F20f72ad6-3eab-40cb-a77d-4c0596945300_1216x1500.jpeg" width="1216" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20f72ad6-3eab-40cb-a77d-4c0596945300_1216x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1216,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:165052,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/210307201?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f72ad6-3eab-40cb-a77d-4c0596945300_1216x1500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!k6Op!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f72ad6-3eab-40cb-a77d-4c0596945300_1216x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!k6Op!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f72ad6-3eab-40cb-a77d-4c0596945300_1216x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!k6Op!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f72ad6-3eab-40cb-a77d-4c0596945300_1216x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!k6Op!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f72ad6-3eab-40cb-a77d-4c0596945300_1216x1500.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>This book is ideal for developers, solutions architects, technical product managers, innovation leaders, and business decision-makers who want to move AWS generative AI initiatives from experimentation into production.</p><p>The book is available on the <strong><a href="iframe.php?url=https%3A%2F%2Fwww.packtpub.com%2Fen-us%2Fproduct%2Fgenerative-ai-at-aws-9781806104451">publisher's website</a></strong> and for purchase on <strong><a href="iframe.php?url=https%3A%2F%2Fwww.amazon.com%2FGenerative-AI-AWS-production-ready-applications%2Fdp%2F1806104458">Amazon</a></strong>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p>]]></content:encoded></item><item><title><![CDATA[The Forge3D Project, Transformers Beyond NLP | Issue 99]]></title><description><![CDATA[A weekly curated update on data science and engineering topics and resources.]]></description><link>https://ramikrispin.substack.com/p/the-forge3d-project-transformers</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/the-forge3d-project-transformers</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Sat, 01 Aug 2026 14:13:17 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21o8D_%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F9998619d-fb77-4c34-b88a-897d9b3cb399_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week&#8217;s agenda:</p><ul><li><p>Open Source of the Week - Forge3D by Milos Popovic</p></li><li><p>New learning resources - Codex workflows, local model fine-tuning, context layers for AI agents, and Terraform by Nicole Koenigstein</p></li><li><p>Book of the week - Transformers: The Definitive Guide</p></li></ul><p>The newsletter is also available on <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fnewsletters%2Frami-s-data-newsletter-7230119265956216833%2F">LinkedIn</a>, <a href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2F">Substack</a>, and <a href="iframe.php?url=https%3A%2F%2Fmedium.com%2F%40rami.krispin%2Flist%2Framis-data-newsletter-41c3c8470f64">Medium</a>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="iframe.php?url=https%3A%2F%2Framikrispin.substack.com%2Fsubscribe%3F"><span>Subscribe now</span></a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21o8D_%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F9998619d-fb77-4c34-b88a-897d9b3cb399_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o8D_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9998619d-fb77-4c34-b88a-897d9b3cb399_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!o8D_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9998619d-fb77-4c34-b88a-897d9b3cb399_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!o8D_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9998619d-fb77-4c34-b88a-897d9b3cb399_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!o8D_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9998619d-fb77-4c34-b88a-897d9b3cb399_1920x1080.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21o8D_%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F9998619d-fb77-4c34-b88a-897d9b3cb399_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9998619d-fb77-4c34-b88a-897d9b3cb399_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4303592,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/209343051?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9998619d-fb77-4c34-b88a-897d9b3cb399_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!o8D_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9998619d-fb77-4c34-b88a-897d9b3cb399_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!o8D_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9998619d-fb77-4c34-b88a-897d9b3cb399_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!o8D_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9998619d-fb77-4c34-b88a-897d9b3cb399_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!o8D_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9998619d-fb77-4c34-b88a-897d9b3cb399_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>Do you want to learn how to containerize your AI and machine learning applications with Docker? Check out my new LinkedIn Learning course:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;24a7582f-6aba-4ec9-83ec-4c9fbe2239d2&quot;,&quot;caption&quot;:&quot;I am super excited about the release of my new course with LinkedIn Learning&#8212;Docker &#128051; for Local AI App Development: Build Lightweight, Containerized AI Applications! &#128640;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;New Course: Docker for Local AI App Development&#8212;from Prototype to Production&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:116325603,&quot;name&quot;:&quot;Rami Krispin&quot;,&quot;bio&quot;:&quot;I write about data science, AI, MLOps, and forecasting.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17d6b557-4338-48c7-ba47-12899dddc77e_3541x3541.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-07-31T16:18:31.091Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!qS0X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e928626-209d-4d40-b642-d1c30a47c62a_1672x941.png&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://ramikrispin.substack.com/p/new-course-docker-for-local-ai-app&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:209272875,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1676629,&quot;publication_name&quot;:&quot;Rami's Data Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!M-EE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99852d65-3983-4d8e-b04f-2e6d902beab9_1280x1280.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2><strong>Open Source of the Week</strong></h2><p>This week&#8217;s focus is on the <strong>Forge3D</strong> project. Forge3D is an open-source, Python-first terrain and scene renderer built on Rust and WebGPU. It combines interactive viewing with native and off-screen rendering, giving GIS and Python users one workflow for exploring terrain and generating output images. Rather than building a separate rendering stack around geographic data, users can load GeoTIFF files or NumPy digital elevation models, add overlays, labels, and point clouds, and control the camera and lighting from Python. The project is distributed as Python wheels and includes optional extras for Jupyter widgets and sample datasets. Its repository also documents a separate Pro workflow for cartographic composition, vector export, building imports, and scene bundles.</p><p>Project repo: <strong><a href="iframe.php?url=https%3A%2F%2Fgithub.com%2Fmilos-agathon%2Fforge3d">https://github.com/milos-agathon/forge3d</a></strong></p><h3><strong>Key Features</strong></h3><ul><li><p><strong>Interactive terrain viewing</strong> &#8212; opens terrain scenes through an asynchronous viewer and a Python viewer handle</p></li><li><p><strong>Flexible terrain inputs</strong> &#8212; creates terrain snapshots from GeoTIFF files or NumPy digital elevation models</p></li><li><p><strong>Map overlays and automation</strong> &#8212; support raster and vector overlays, labels, camera controls, and scripted camera movement</p></li><li><p><strong>Point-cloud loading</strong> &#8212; works with LAZ, COPC, and EPT point-cloud sources</p></li><li><p><strong>Geospatial utilities</strong> &#8212; include cloud-optimized GeoTIFF access, coordinate reference system helpers, datasets, and presets</p></li><li><p><strong>Offscreen rendering</strong> &#8212; provide scene, session, and terrain-rendering APIs for native and headless workflows</p></li><li><p><strong>3D rendering helpers</strong> &#8212; cover geometry, meshes, vectors, signed distance fields, path tracing, lighting, and terrain scattering</p></li><li><p><strong>Notebook and example support</strong> &#8212; offer Jupyter widgets plus runnable scripts and notebooks for common rendering workflows</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21Q0J4%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fc3f17c98-4fd5-41fc-861a-71999fbc3076_3840x3840.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q0J4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3f17c98-4fd5-41fc-861a-71999fbc3076_3840x3840.png 424w, https://substackcdn.com/image/fetch/$s_!Q0J4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3f17c98-4fd5-41fc-861a-71999fbc3076_3840x3840.png 848w, https://substackcdn.com/image/fetch/$s_!Q0J4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3f17c98-4fd5-41fc-861a-71999fbc3076_3840x3840.png 1272w, https://substackcdn.com/image/fetch/$s_!Q0J4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3f17c98-4fd5-41fc-861a-71999fbc3076_3840x3840.png 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21Q0J4%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252Fc3f17c98-4fd5-41fc-861a-71999fbc3076_3840x3840.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c3f17c98-4fd5-41fc-861a-71999fbc3076_3840x3840.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8672035,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/209343051?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3f17c98-4fd5-41fc-861a-71999fbc3076_3840x3840.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Q0J4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3f17c98-4fd5-41fc-861a-71999fbc3076_3840x3840.png 424w, https://substackcdn.com/image/fetch/$s_!Q0J4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3f17c98-4fd5-41fc-861a-71999fbc3076_3840x3840.png 848w, https://substackcdn.com/image/fetch/$s_!Q0J4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3f17c98-4fd5-41fc-861a-71999fbc3076_3840x3840.png 1272w, https://substackcdn.com/image/fetch/$s_!Q0J4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3f17c98-4fd5-41fc-861a-71999fbc3076_3840x3840.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Swiss terrain with land-cover classification draped as a lit overlay; Image credit: project documentation</figcaption></figure></div><p>More details are available in the project <a href="iframe.php?url=https%3A%2F%2Fmilos-agathon.github.io%2Fforge3d%2F">documentation</a>.</p><p>License: Apache-2.0 OR MIT for the open-source core; Pro-gated features require a commercial license</p><div><hr></div><h2><strong>New Learning Resources</strong></h2><p>Here are some new learning resources that I came across this week.</p><h3><strong>Setting Yourself Up for Success with Codex</strong></h3><p>This workshop from Jason Liu, an AI Engineer from OpenAI, walks through a practical Codex workflow. This 75-minute workshop covers personal memory vaults, long-running project threads, collaboration between threads, skills and plugins, computer use, scheduled automations, goals with verification, and choosing lower reasoning levels when the task does not require extra thinking.</p><div id="youtube2-il1c1a2FufU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;il1c1a2FufU&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2Fil1c1a2FufU%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>How to Fine-Tune any AI Model Locally</strong></h3><p>This tutorial from Tech With Tim walks through local fine-tuning with Unsloth Studio. The 41-minute video covers fine-tuning basics, LoRA vs. QLoRA, model and dataset selection, training with a custom dataset, comparison with the base model, and model export.</p><div id="youtube2-4JofSJIrjwU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;4JofSJIrjwU&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2F4JofSJIrjwU%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Your AI Agent Doesn&#8217;t Know Your Business</strong></h3><p>This talk from MotherDuck&#8217;s Bev Turnbaugh explains why correct SQL is not enough when an AI agent lacks a company&#8217;s business definitions. The 31-minute session compares semantic and context layers, surveys RAG pipelines and rules files, and demonstrates how MotherDuck guides can surface relevant context through MCP.</p><div id="youtube2-hmjRc6KJ-hw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;hmjRc6KJ-hw&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FhmjRc6KJ-hw%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Terraform Crash Course - Infrastructure as Code</strong></h3><p>This tutorial from NeuralNine provides a practical introduction to Terraform. The 40-minute video moves from installation and a minimal AWS example to combining multiple AWS services, then demonstrates smaller configurations with GCP and Docker.</p><div id="youtube2-pnzlqoYNuQc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;pnzlqoYNuQc&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="iframe.php?url=https%3A%2F%2Fwww.youtube-nocookie.com%2Fembed%2FpnzlqoYNuQc%3Frel%3D0%26amp%3Bautoplay%3D0%26amp%3Bshowinfo%3D0%26amp%3Benablejsapi%3D0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>Book of the Week</strong></h2><p>This week&#8217;s focus is on a new AI book &#8212; <em>Transformers: The Definitive Guide&#8212;Applications Beyond NLP</em> by Nicole Koenigstein. The book starts with transformer fundamentals and then examines how the architecture is applied beyond language tasks. Rather than treating transformers only as the foundation of LLMs, this covers their use across time series, images, video, audio, reinforcement learning, reasoning, and agentic systems. It also connects model architecture with optimization and production deployment, giving readers both a conceptual foundation and examples of how transformer-based systems are built for different data types and applications.</p><h3><strong>Topics Covered</strong></h3><ul><li><p><strong>Transformer foundations</strong> &#8212; tokenization, embeddings, attention, encoder-decoder architectures, longer context windows, and attention variations</p></li><li><p><strong>Time series modeling</strong> &#8212; Chronos, PatchTST, TimesFM, fine-tuning workflows, and transformer-based anomaly detection</p></li><li><p><strong>Computer vision</strong> &#8212; vision embeddings, Swin Transformer V2, image classification, and segmentation with Segment Anything</p></li><li><p><strong>Image and video generation</strong> &#8212; diffusion transformers, classifier-free guidance, PixArt, LTX-Video, Latte, and Tora</p></li><li><p><strong>Audio and music</strong> &#8212; waveforms, spectrograms, speech transformers, audio foundation models, transcription, and music generation</p></li><li><p><strong>Reinforcement learning</strong> &#8212; online and offline learning, decision transformers, world models, and transformer-based control</p></li><li><p><strong>Reasoning and coding</strong> &#8212; reasoning models, coding agents, test-time scaling, and search strategies for code generation</p></li><li><p><strong>AI agents</strong> &#8212; agent workflows, multi-agent architectures, memory, communication, human oversight, and coding-agent applications</p></li><li><p><strong>Model optimization</strong> &#8212; training-time reinforcement learning, adaptive compute allocation, and systems-level optimization</p></li><li><p><strong>Production deployment</strong> &#8212; model selection, runtime engineering, security, evaluation, cost and hardware trade-offs, and quantization</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21dbOy%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F1ce3f6a7-4e8f-49ee-aca4-b2437b8ac098_1143x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dbOy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ce3f6a7-4e8f-49ee-aca4-b2437b8ac098_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dbOy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ce3f6a7-4e8f-49ee-aca4-b2437b8ac098_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dbOy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ce3f6a7-4e8f-49ee-aca4-b2437b8ac098_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dbOy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ce3f6a7-4e8f-49ee-aca4-b2437b8ac098_1143x1500.jpeg 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21dbOy%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F1ce3f6a7-4e8f-49ee-aca4-b2437b8ac098_1143x1500.jpeg" width="1143" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1ce3f6a7-4e8f-49ee-aca4-b2437b8ac098_1143x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1143,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:110829,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/209343051?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ce3f6a7-4e8f-49ee-aca4-b2437b8ac098_1143x1500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dbOy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ce3f6a7-4e8f-49ee-aca4-b2437b8ac098_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dbOy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ce3f6a7-4e8f-49ee-aca4-b2437b8ac098_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dbOy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ce3f6a7-4e8f-49ee-aca4-b2437b8ac098_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dbOy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ce3f6a7-4e8f-49ee-aca4-b2437b8ac098_1143x1500.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is ideal for intermediate-to-advanced machine learning engineers, data scientists, and researchers who want to understand how transformers work across multiple domains and how to optimize and deploy them in real applications.</p><p>The book is available on <strong><a href="iframe.php?url=https%3A%2F%2Flearning.oreilly.com%2Flibrary%2Fview%2Ftransformers-the-definitive%2F9781098167004%2F">O&#8217;Reilly</a></strong> and for purchase on <strong><a href="iframe.php?url=https%3A%2F%2Fwww.amazon.com%2FTransformers-Definitive-Guide-Applications-Beyond%2Fdp%2F1098167015">Amazon</a></strong>.</p><div><hr></div><p><strong>Have any questions? Please comment below!</strong></p><p>See you next Saturday!</p><p>Thanks,</p><p>Rami</p><p>Thanks for reading Rami&#8217;s Data Newsletter! Subscribe for free to receive new posts and support my work.</p><div><hr></div><p><em>Disclaimer: I use AI to help edit the content in this newsletter. If you spot a mistake, please leave a comment &#8212; I&#8217;d appreciate the heads-up.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramikrispin.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Rami's Data Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[New Course: Docker for Local AI App Development—from Prototype to Production]]></title><description><![CDATA[New Course on LinkedIn Learning]]></description><link>https://ramikrispin.substack.com/p/new-course-docker-for-local-ai-app</link><guid isPermaLink="false">https://ramikrispin.substack.com/p/new-course-docker-for-local-ai-app</guid><dc:creator><![CDATA[Rami Krispin]]></dc:creator><pubDate>Fri, 31 Jul 2026 16:18:31 GMT</pubDate><enclosure url="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21qS0X%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F8e928626-209d-4d40-b642-d1c30a47c62a_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I am super excited about the release of my new course with LinkedIn Learning&#8212;Docker &#128051; for Local AI App Development: Build Lightweight, Containerized AI Applications! &#128640;</p><p>Course website: <a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Flearning%2Fdocker-for-local-ai-app-development-build-lightweight-containerized-ai-applications">https://www.linkedin.com/learning/docker-for-local-ai-app-development-build-lightweight-containerized-ai-applications</a></p><h3><strong>What is the course about?</strong></h3><p>This course focuses on using Docker throughout the AI application development lifecycle&#8212;from a local prototype to a reproducible, testable, and production-ready containerized application &#9881;&#65039;.</p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qS0X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e928626-209d-4d40-b642-d1c30a47c62a_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!qS0X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e928626-209d-4d40-b642-d1c30a47c62a_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!qS0X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e928626-209d-4d40-b642-d1c30a47c62a_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!qS0X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e928626-209d-4d40-b642-d1c30a47c62a_1672x941.png 1456w" sizes="100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21qS0X%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F8e928626-209d-4d40-b642-d1c30a47c62a_1672x941.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e928626-209d-4d40-b642-d1c30a47c62a_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1902787,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramikrispin.substack.com/i/209272875?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e928626-209d-4d40-b642-d1c30a47c62a_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qS0X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e928626-209d-4d40-b642-d1c30a47c62a_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!qS0X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e928626-209d-4d40-b642-d1c30a47c62a_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!qS0X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e928626-209d-4d40-b642-d1c30a47c62a_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!qS0X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e928626-209d-4d40-b642-d1c30a47c62a_1672x941.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></div></figure></div><p>We use a Retrieval-Augmented Generation (RAG) application as our running example and progressively transform it into a complete multi-service stack.</p><blockquote><p>&#8220;The RAG application is the example. The reusable container workflow is the lesson.&#8221;</p></blockquote><p>Although we use a RAG application as the running example, this is not a course about building RAG applications. The focus is Docker and the reusable workflows required to containerize AI and machine learning applications. The course gives you practical knowledge and a toolbox that you can apply to your own AI/ML applications&#8212;from local development to reproducible testing and production preparation.</p><h3><strong>Who is this course for?</strong></h3><p>The course is designed for data scientists, machine learning and AI engineers, and software engineers who build AI applications locally and want a more reliable path from prototype to a shareable, testable system. It is also relevant for MLOps, platform, and DevOps practitioners who want to understand how Dockerfiles, Docker Compose, Dev Containers, testing, registries, and CI fit together around a practical AI workload.</p><h3><strong>What will you learn?</strong></h3><p>In Chapter One, we will explore why containers are particularly useful for AI applications, review the architecture of our RAG application, and learn how to define the right container boundaries. We will also map the workflow from application requirements through development, testing, and deployment preparation.</p><p>In Chapter Two, we will dive into the core Docker workflow: defining requirements, writing a Dockerfile, building an image, and running a container. Along the way, we will learn about build contexts, image layers, caching, tags, registries, container management, and Dockerfile best practices.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21op1Y%21%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F27074c1f-5d37-4c5d-a736-726b8d45e769_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!op1Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27074c1f-5d37-4c5d-a736-726b8d45e769_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!op1Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27074c1f-5d37-4c5d-a736-726b8d45e769_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!op1Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27074c1f-5d37-4c5d-a736-726b8d45e769_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!op1Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27074c1f-5d37-4c5d-a736-726b8d45e769_1672x941.png 1456w" sizes="auto, 100vw"><img src="iframe.php?url=https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21op1Y%21%2Cw_1456%2Cc_limit%2Cf_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F27074c1f-5d37-4c5d-a736-726b8d45e769_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27074c1f-5d37-4c5d-a736-726b8d45e769_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!op1Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27074c1f-5d37-4c5d-a736-726b8d45e769_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!op1Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27074c1f-5d37-4c5d-a736-726b8d45e769_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!op1Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27074c1f-5d37-4c5d-a736-726b8d45e769_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!op1Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27074c1f-5d37-4c5d-a736-726b8d45e769_1672x941.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In Chapter Three, we will build a reproducible AI development environment. We will use Docker Compose to run our Python application alongside ChromaDB and configure a VS Code Dev Container so the editor, terminal, dependencies, and application all run in the same environment. We will then develop and validate the RAG workflow with notebooks and a Streamlit dashboard.</p><p>In Chapter Four, we will split the application into dedicated ingestion and query services and orchestrate the complete stack with Docker Compose. We will learn how to configure service networking, health and readiness checks, integration tests, and reproducible test data&#8212;and see how these pieces fit into a CI workflow.</p><p>We will close the course by preparing our container images for production. In Chapter Five, we will reduce image size with multi-stage builds, apply least-privilege and secret-management practices, scan images for vulnerabilities, build for both amd64 and arm64, publish versioned images to a registry, and add runtime safeguards &#128272;.</p><p>By the end of the course, you will have a practical framework for using Docker to develop, test, and prepare multi-service AI applications for production.</p><p>A huge thanks to the LinkedIn Learning team for supporting the creation of this course, in particular, the course producer <strong><a href="iframe.php?url=https%3A%2F%2Fwww.linkedin.com%2Fpreload%2F%3F_bprMode%3Dvanilla%23">Todd Howard</a></strong>! &#128591;&#127996;</p>]]></content:encoded></item></channel></rss>