{"article":{"slug":"deleting-rag-from-our-web-agent-made-it-2-3x-faster","title":"Deleting RAG from our web agent made it 2.3x faster","subtitle":null,"summary":"Skyvern explains how it rewrote its open-source browser-automation agent from scratch, inspired by the Pi coding agent, replacing retrieval-heavy context with progressive disclosure so the agent is 2.3x faster and scores 90.5% on the Odysseys web-agent benchmark.","content_type":"blog_post","language":"en","canonical_url":"https://www.skyvern.com/blog/deleting-rag-from-our-web-agent-made-it-2-3x-faster/","author":{"name":"The Skyvern team","url":null,"person_slug":null,"person_url":null},"authored_by":"human","publisher":{"name":"Skyvern","url":"https://www.skyvern.com/","listing_slug":"skyvern","listing":{"slug":"skyvern","name":"Skyvern","listing_type":"company","url":"https://listedstartups.com/companies/skyvern"}},"topics":[{"name":"AI Agents","slug":"ai-agents","url":"https://listedarticles.com/topics/ai-agents"},{"name":"AI","slug":"ai","url":"https://listedarticles.com/topics/ai"},{"name":"Performance","slug":"performance","url":"https://listedarticles.com/topics/performance"},{"name":"Benchmarks","slug":"benchmarks","url":"https://listedarticles.com/topics/benchmarks"},{"name":"Open Source","slug":"open-source","url":"https://listedarticles.com/topics/open-source"}],"about_listings":[{"slug":"skyvern-oss","name":"Skyvern","listing_type":"product","url":"https://listedstartups.com/products/skyvern-oss"}],"cover_image_url":null,"license":"all-rights-reserved","word_count":1105,"reading_minutes":5,"published_at":"2026-10-01T18:58:59.000Z","added_at":"2026-10-24T23:09:52.981Z","updated_at":"2026-10-24T23:09:52.981Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/deleting-rag-from-our-web-agent-made-it-2-3x-faster","markdown_url":"https://listedarticles.com/articles/deleting-rag-from-our-web-agent-made-it-2-3x-faster.md","example":false,"citation":"The Skyvern team, Skyvern. \"Deleting RAG from our web agent made it 2.3x faster.\" 1 Oct 2026. https://www.skyvern.com/blog/deleting-rag-from-our-web-agent-made-it-2-3x-faster/ (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"https://www.skyvern.com/blog/deleting-rag-from-our-web-agent-made-it-2-3x-faster/"},"body_markdown":"**TL;DR - We rewrote Skyvern from scratch using** [**Pi**](https://pi.dev/?ref=skyvern.com) **as inspiration, making it 2.3x faster and score 90.5% on** [**Odysseys benchmark**](https://odysseysbench.com/leaderboard?ref=skyvern.com)**. Try it out the via** [**Open Source**](https://github.com/Skyvern-AI/Skyvern?ref=skyvern.com) **or** [**Cloud**](https://app.skyvern.com/?ref=skyvern.com)**.**\n\n💡 **Recap: What is Skyvern?** It’s [an open source](https://github.com/Skyvern-AI/Skyvern?ref=skyvern.com) framework that helps non-technical teams prompt to build browser automations. Skyvern is model agnostic, and can be run with closed models like Claude, or open ones like Deepseek. We have helped thousands of companies automate things like interacting with healthcare portals, fetching invoices or utility bills, filling out government forms, applying to jobs, and more.\n\n## RAG? What are you talking about?\n\nFor those unfamiliar with agents, RAG stands for Retrieval Augmented Generation. It’s a way to pass information to an LLM so they make smarter decisions. For example, before asking questions to an LLM about a document, you could parse that document and feed it into an LLM. You can read more about it [here](https://pub.towardsai.net/retrieval-augmented-generation-aka-rag-how-does-it-work-1ef69e3654dd?ref=skyvern.com).\n\n![Diagram of a RAG pipeline: knowledge base, vector database, retriever, augmentation, and LLM generation](https://dcbllm8dvghjo.cloudfront.net/media/blog/ad6ff0f35988c6c7c3eb0e197525e1934ea5fff2d0ac0ca1eafc019dcf3ae8a1-827w.webp)\n\nRAG-based LLM Frameworks work by fetching information from a Knowledge base, transforming it into context, and passing it to an LLM to make decisions on\n\nThe first version of Skyvern was built using RAG. We would load up a website, screenshot and annotate it, condense it into a smaller list of elements, and send it to an LLM to take actions on.\n\n![Diagram of the first Skyvern loop: draw bounding boxes, parse HTML, extract interactable elements, call an LLM, execute actions, repeat](https://dcbllm8dvghjo.cloudfront.net/media/blog/2649dd5c355815ca96745ce5e55d8a7fc7ffacb04744b96b13378f80a3794e26-918w.webp)\n\nFirst version of Skyvern mimicked RAG based frameworks: It fetched information from the website, transformed it into actionable elements, and asked the LLM what action to take\n\nThis worked great if you could identify every interactable element on a website with 100% accuracy. We thought we could eventually get there. We were wrong.\n\nExcept.. the web is messy. Accurately identifying every element on a website proved to be a nightmare. What started off as a [nice little utility to identify interactable elements](https://github.com/Skyvern-AI/skyvern/blob/539dc5d14e86fb760f7ab63e9667a01d1dd1a406/skyvern/webeye/scraper/domUtils.js?ref=skyvern.com#L1113) essentially turned into building a new DOM interpreter.\n\nParsing things like Shadow DOMs, iframes, select2 dropdowns, Kendo UI widgets, Canvas elements, …. this became an endless battle.\n\nThe worst part was that agent performance did not improve with better LLMs. Instead, it was bottlenecked by this DOM parsing logic. If it failed to correctly identify an element, the entire agent run failed.\n\n**This is a sign that we need to give the LLM more freedom.**\n\n## Give the LLM freedom to do what it wants\n\nRAG systems, if you aren’t careful, can assume that the pre-processing layer always happens ahead of any LLM calls, and don’t let the LLM decide when it is necessary. This was a good idea when LLMs weren’t good at following instructions, which meant that you couldn’t trust them to reliably pull the information when needed, but instruction following hasn’t been a big problem since the models released after Opus 4.5.\n\nWe noticed 2 moves in the market that highlighted this change in thinking:\n\n1. Coding agents like Claude code were moving away from embedding style code search to grep style code search because the models were increasingly getting better at using primitive tools to fetch the context they needed\n2. Minimalist coding agents like Pi were becoming increasingly popular, with extensions of Pi like [Prime-intellect](https://www.primeintellect.ai/?ref=skyvern.com) hitting SOTA on the [ARC-AGI-3 benchmark](https://x.com/PrimeIntellect/status/2085087000764568010?ref=skyvern.com) by tuning the harness and letting the agent generate and execute python code as needed\n\nSo we asked ourselves: **would the same approach work for browser agents?** What if the agent started with the minimum context required, and gave it the ability to pull additional context as needed?\n\nIn practice, it means giving the agent the following tools:\n\n1. Scan the HTML with model-generated javascript\n2. Take any [rustwright](https://github.com/Skyvern-AI/rustwright?ref=skyvern.com)-supported action on the website, for example Click, Type, Scroll, Switch tabs, etc\n3. Take a screenshot\n4. Mark the run as final (success, or failed with reason)\n\n![Diagram of Skyvern 3.0: the LLM calls four tools (Read HTML, Take action, Take screenshot, Finish) to fill out a Geico insurance quote form](https://dcbllm8dvghjo.cloudfront.net/media/blog/c44ed2d10a248f0a1ce083ff13a6810458bfdd5b90fde66a133fe9e4766cf29d-1966w.webp)\n\n## The results were better than we expected\n\nOur hypothesis was that we would see an increase in performance, in exchange for added cost and a slower processing speed. The new architecture should result more calls to the LLM to get the same task done.\n\nTo test this hypothesis, we split the test up into two branches:\n\n1. The leading public browser agent benchmark: Odysseys to test for accuracy\n2. A live A/B test across ~100,000 customer runs to test for speed / cost\n\n### Odysseys benchmark results\n\nSkyvern 3.0 topped the [Odysseys benchmark](https://odysseysbench.com/leaderboard?ref=skyvern.com). It reported a **90.5% perfect rubric success rate,** pretty much exactly as we expected. What surprised us though was that it was highly efficient in its runs, at only 65.4 average steps.\n\n![Odysseys leaderboard, accuracy vs. average steps per task. Skyvern 3.0 (Opus 5) is on the Pareto frontier at 90.5% and 65 steps](https://dcbllm8dvghjo.cloudfront.net/media/blog/91ed1b57fd9186c4fa363fd87a15af9f0e3a39679c9329d8166ba8d935d392f2-2000w.webp)\n\n### Production A/B Test results\n\nWe ran the production A/B test on approx 100,000 runs and measured the impact\n\n|  | Skyvern 2.0 | Skyvern 3.0 | Improvement |\n| --- | --- | --- | --- |\n| Mean run time | 593 s | 262s | 2.3x |\n| Total cost per run | $0.039 | $0.0302 | -22.5% |\n\nThe production A/B test results were surprising. The new architecture was.. faster and cheaper? We expected at least one of these dimensions to be a net negative\n\nWhy was that the case? Digging into it, we found a few interesting things:\n\n1. **Screenshot utilization dropped by 90% (27% —> 2.7% of all LLM calls)**. LLM calls with images go through a vision encoder to help the LLM “see” the image, which [tend to be 1.7x slower than text-only encoders](https://arxiv.org/html/2607.23373v1?ref=skyvern.com)\n2. **Token consumption increased by 52% (188K tokens / run —> 286K tokens per run)** Average number of turns (ie LLM Calls) increased by 3.59x (6.4 —> 23), but tokens per turn decreased by 59% (29K tokens —> 12K tokens)\n3. **Prompt Cache hit rates increased by 195% (27% —> 79.7%)** because we stopped loading the screenshot or HTML on every turn, which meant a larger % of the prompt was cacheable\n\nDespite the increased token usage, cached tokens carry a 70% discount, which explains the net reduction in cost.\n\n## So… are browser agents solved?\n\nThe answer is still **no**. They can still be improved across all 3 dimensions (cost, speed, accuracy).\n\nOur team is now exploring the role of [”system one models” like Jev](https://typesafe.ai/blog/introducing-system-one-models-and-jev?ref=skyvern.com) for browser agents. The current generation is still highly limited: 64K context window, no image processing, which causes unacceptable losses in accuracy, but we expect this to change over the next 6-12 months 🙂\n\n## Give Skyvern a try!\n\nRun it via our [Skyvern Open Source](https://github.com/Skyvern-AI/Skyvern?ref=skyvern.com) or [Skyvern Cloud](https://app.skyvern.com/?ref=skyvern.com) versions and let us know what you think!\n","body_html":"<p><strong>TL;DR - We rewrote Skyvern from scratch using</strong> <a href=\"https://pi.dev/?ref=skyvern.com\" rel=\"nofollow ugc noopener\"><strong>Pi</strong></a> <strong>as inspiration, making it 2.3x faster and score 90.5% on</strong> <a href=\"https://odysseysbench.com/leaderboard?ref=skyvern.com\" rel=\"nofollow ugc noopener\"><strong>Odysseys benchmark</strong></a><strong>. Try it out the via</strong> <a href=\"https://github.com/Skyvern-AI/Skyvern?ref=skyvern.com\" rel=\"nofollow ugc noopener\"><strong>Open Source</strong></a> <strong>or</strong> <a href=\"https://app.skyvern.com/?ref=skyvern.com\" rel=\"nofollow ugc noopener\"><strong>Cloud</strong></a>*<em>.*</em></p>\n<p>💡 <strong>Recap: What is Skyvern?</strong> It’s <a href=\"https://github.com/Skyvern-AI/Skyvern?ref=skyvern.com\" rel=\"nofollow ugc noopener\">an open source</a> framework that helps non-technical teams prompt to build browser automations. Skyvern is model agnostic, and can be run with closed models like Claude, or open ones like Deepseek. We have helped thousands of companies automate things like interacting with healthcare portals, fetching invoices or utility bills, filling out government forms, applying to jobs, and more.</p>\n<h2 id=\"rag-what-are-you-talking-about\">RAG? What are you talking about?</h2>\n<p>For those unfamiliar with agents, RAG stands for Retrieval Augmented Generation. It’s a way to pass information to an LLM so they make smarter decisions. For example, before asking questions to an LLM about a document, you could parse that document and feed it into an LLM. You can read more about it <a href=\"https://pub.towardsai.net/retrieval-augmented-generation-aka-rag-how-does-it-work-1ef69e3654dd?ref=skyvern.com\" rel=\"nofollow ugc noopener\">here</a>.</p>\n<figure><img src=\"https://dcbllm8dvghjo.cloudfront.net/media/blog/ad6ff0f35988c6c7c3eb0e197525e1934ea5fff2d0ac0ca1eafc019dcf3ae8a1-827w.webp\" alt=\"Diagram of a RAG pipeline: knowledge base, vector database, retriever, augmentation, and LLM generation\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<p>RAG-based LLM Frameworks work by fetching information from a Knowledge base, transforming it into context, and passing it to an LLM to make decisions on</p>\n<p>The first version of Skyvern was built using RAG. We would load up a website, screenshot and annotate it, condense it into a smaller list of elements, and send it to an LLM to take actions on.</p>\n<figure><img src=\"https://dcbllm8dvghjo.cloudfront.net/media/blog/2649dd5c355815ca96745ce5e55d8a7fc7ffacb04744b96b13378f80a3794e26-918w.webp\" alt=\"Diagram of the first Skyvern loop: draw bounding boxes, parse HTML, extract interactable elements, call an LLM, execute actions, repeat\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<p>First version of Skyvern mimicked RAG based frameworks: It fetched information from the website, transformed it into actionable elements, and asked the LLM what action to take</p>\n<p>This worked great if you could identify every interactable element on a website with 100% accuracy. We thought we could eventually get there. We were wrong.</p>\n<p>Except.. the web is messy. Accurately identifying every element on a website proved to be a nightmare. What started off as a <a href=\"https://github.com/Skyvern-AI/skyvern/blob/539dc5d14e86fb760f7ab63e9667a01d1dd1a406/skyvern/webeye/scraper/domUtils.js?ref=skyvern.com#L1113\" rel=\"nofollow ugc noopener\">nice little utility to identify interactable elements</a> essentially turned into building a new DOM interpreter.</p>\n<p>Parsing things like Shadow DOMs, iframes, select2 dropdowns, Kendo UI widgets, Canvas elements, …. this became an endless battle.</p>\n<p>The worst part was that agent performance did not improve with better LLMs. Instead, it was bottlenecked by this DOM parsing logic. If it failed to correctly identify an element, the entire agent run failed.</p>\n<p><strong>This is a sign that we need to give the LLM more freedom.</strong></p>\n<h2 id=\"give-the-llm-freedom-to-do-what-it-wants\">Give the LLM freedom to do what it wants</h2>\n<p>RAG systems, if you aren’t careful, can assume that the pre-processing layer always happens ahead of any LLM calls, and don’t let the LLM decide when it is necessary. This was a good idea when LLMs weren’t good at following instructions, which meant that you couldn’t trust them to reliably pull the information when needed, but instruction following hasn’t been a big problem since the models released after Opus 4.5.</p>\n<p>We noticed 2 moves in the market that highlighted this change in thinking:</p>\n<ol><li>Coding agents like Claude code were moving away from embedding style code search to grep style code search because the models were increasingly getting better at using primitive tools to fetch the context they needed</li><li>Minimalist coding agents like Pi were becoming increasingly popular, with extensions of Pi like <a href=\"https://www.primeintellect.ai/?ref=skyvern.com\" rel=\"nofollow ugc noopener\">Prime-intellect</a> hitting SOTA on the <a href=\"https://x.com/PrimeIntellect/status/2085087000764568010?ref=skyvern.com\" rel=\"nofollow ugc noopener\">ARC-AGI-3 benchmark</a> by tuning the harness and letting the agent generate and execute python code as needed</li></ol>\n<p>So we asked ourselves: <strong>would the same approach work for browser agents?</strong> What if the agent started with the minimum context required, and gave it the ability to pull additional context as needed?</p>\n<p>In practice, it means giving the agent the following tools:</p>\n<ol><li>Scan the HTML with model-generated javascript</li><li>Take any <a href=\"https://github.com/Skyvern-AI/rustwright?ref=skyvern.com\" rel=\"nofollow ugc noopener\">rustwright</a>-supported action on the website, for example Click, Type, Scroll, Switch tabs, etc</li><li>Take a screenshot</li><li>Mark the run as final (success, or failed with reason)</li></ol>\n<figure><img src=\"https://dcbllm8dvghjo.cloudfront.net/media/blog/c44ed2d10a248f0a1ce083ff13a6810458bfdd5b90fde66a133fe9e4766cf29d-1966w.webp\" alt=\"Diagram of Skyvern 3.0: the LLM calls four tools (Read HTML, Take action, Take screenshot, Finish) to fill out a Geico insurance quote form\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<h2 id=\"the-results-were-better-than-we-expected\">The results were better than we expected</h2>\n<p>Our hypothesis was that we would see an increase in performance, in exchange for added cost and a slower processing speed. The new architecture should result more calls to the LLM to get the same task done.</p>\n<p>To test this hypothesis, we split the test up into two branches:</p>\n<ol><li>The leading public browser agent benchmark: Odysseys to test for accuracy</li><li>A live A/B test across ~100,000 customer runs to test for speed / cost</li></ol>\n<h3 id=\"odysseys-benchmark-results\">Odysseys benchmark results</h3>\n<p>Skyvern 3.0 topped the <a href=\"https://odysseysbench.com/leaderboard?ref=skyvern.com\" rel=\"nofollow ugc noopener\">Odysseys benchmark</a>. It reported a <strong>90.5% perfect rubric success rate,</strong> pretty much exactly as we expected. What surprised us though was that it was highly efficient in its runs, at only 65.4 average steps.</p>\n<figure><img src=\"https://dcbllm8dvghjo.cloudfront.net/media/blog/91ed1b57fd9186c4fa363fd87a15af9f0e3a39679c9329d8166ba8d935d392f2-2000w.webp\" alt=\"Odysseys leaderboard, accuracy vs. average steps per task. Skyvern 3.0 (Opus 5) is on the Pareto frontier at 90.5% and 65 steps\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<h3 id=\"production-a-b-test-results\">Production A/B Test results</h3>\n<p>We ran the production A/B test on approx 100,000 runs and measured the impact</p>\n<div class=\"table-wrap\"><table><thead><tr><th></th><th>Skyvern 2.0</th><th>Skyvern 3.0</th><th>Improvement</th></tr></thead><tbody><tr><td>Mean run time</td><td>593 s</td><td>262s</td><td>2.3x</td></tr><tr><td>Total cost per run</td><td>$0.039</td><td>$0.0302</td><td>-22.5%</td></tr></tbody></table></div>\n<p>The production A/B test results were surprising. The new architecture was.. faster and cheaper? We expected at least one of these dimensions to be a net negative</p>\n<p>Why was that the case? Digging into it, we found a few interesting things:</p>\n<ol><li><strong>Screenshot utilization dropped by 90% (27% —&gt; 2.7% of all LLM calls)</strong>. LLM calls with images go through a vision encoder to help the LLM “see” the image, which <a href=\"https://arxiv.org/html/2607.23373v1?ref=skyvern.com\" rel=\"nofollow ugc noopener\">tend to be 1.7x slower than text-only encoders</a></li><li><strong>Token consumption increased by 52% (188K tokens / run —&gt; 286K tokens per run)</strong> Average number of turns (ie LLM Calls) increased by 3.59x (6.4 —&gt; 23), but tokens per turn decreased by 59% (29K tokens —&gt; 12K tokens)</li><li><strong>Prompt Cache hit rates increased by 195% (27% —&gt; 79.7%)</strong> because we stopped loading the screenshot or HTML on every turn, which meant a larger % of the prompt was cacheable</li></ol>\n<p>Despite the increased token usage, cached tokens carry a 70% discount, which explains the net reduction in cost.</p>\n<h2 id=\"so-are-browser-agents-solved\">So… are browser agents solved?</h2>\n<p>The answer is still <strong>no</strong>. They can still be improved across all 3 dimensions (cost, speed, accuracy).</p>\n<p>Our team is now exploring the role of <a href=\"https://typesafe.ai/blog/introducing-system-one-models-and-jev?ref=skyvern.com\" rel=\"nofollow ugc noopener\">”system one models” like Jev</a> for browser agents. The current generation is still highly limited: 64K context window, no image processing, which causes unacceptable losses in accuracy, but we expect this to change over the next 6-12 months 🙂</p>\n<h2 id=\"give-skyvern-a-try\">Give Skyvern a try!</h2>\n<p>Run it via our <a href=\"https://github.com/Skyvern-AI/Skyvern?ref=skyvern.com\" rel=\"nofollow ugc noopener\">Skyvern Open Source</a> or <a href=\"https://app.skyvern.com/?ref=skyvern.com\" rel=\"nofollow ugc noopener\">Skyvern Cloud</a> versions and let us know what you think!</p>","headings":[{"level":2,"text":"RAG? What are you talking about?","id":"rag-what-are-you-talking-about"},{"level":2,"text":"Give the LLM freedom to do what it wants","id":"give-the-llm-freedom-to-do-what-it-wants"},{"level":2,"text":"The results were better than we expected","id":"the-results-were-better-than-we-expected"},{"level":3,"text":"Odysseys benchmark results","id":"odysseys-benchmark-results"},{"level":3,"text":"Production A/B Test results","id":"production-a-b-test-results"},{"level":2,"text":"So… are browser agents solved?","id":"so-are-browser-agents-solved"},{"level":2,"text":"Give Skyvern a try!","id":"give-skyvern-a-try"}]}}