<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ai</title>
    <description>The latest articles tagged 'ai' on DEV Community.</description>
    <link>https://dev.to/t/ai</link>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tag/ai"/>
    <language>en</language>
    <item>
      <title>Lesson 0 - Learning to build with AI: where I learned not to trust it</title>
      <dc:creator>Surat Mukker</dc:creator>
      <pubDate>Tue, 14 Jul 2026 03:08:09 +0000</pubDate>
      <link>https://dev.to/smukker/lesson-0-learning-to-build-with-ai-where-i-learned-not-to-trust-it-49hf</link>
      <guid>https://dev.to/smukker/lesson-0-learning-to-build-with-ai-where-i-learned-not-to-trust-it-49hf</guid>
      <description>&lt;p&gt;After publishing the first lesson, I realized I should have started the series with why I started to build with AI, what I learned, and how it shaped my view of software development in the age of AI.&lt;/p&gt;

&lt;p&gt;I've led engineering teams for about 25 years. Lately I've been back in the code myself. Over the last several months I built a product end to end, mostly on my own: an AI-native procurement tool, first plan through deployment, with AI in the loop the whole way.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero to production in about four months.&lt;/li&gt;
&lt;li&gt;A few thousand tests behind it.&lt;/li&gt;
&lt;li&gt;Multiple LLM providers, picked by the use case.&lt;/li&gt;
&lt;li&gt;The prompt drives the choice of vendor and model based on what it needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted to understand these tools by using them, not by reading about them. What follows is what I learned, the parts that held up and the parts that didn't.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Plan
&lt;/h3&gt;

&lt;p&gt;The plan was to build it mostly myself, use AI to move faster, and own every design decision. That last part never changed. AI helps me weigh options and think through how a choice plays out before I commit, but the call stays mine. After enough years leading teams, I don't like shipping a system I can't fully account for.&lt;/p&gt;

&lt;p&gt;That ran straight into my own gap. I've built plenty in Java, some from scratch, some I picked up and extended. Python I'm comfortable in, but I'd never built a full app in it solo, start to finish. So I was leaning on AI hardest in exactly the place I was thinnest. That's what made the choice of tool matter more than I expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tools
&lt;/h3&gt;

&lt;p&gt;I started on Gemini. Good at plenty, but it fell apart on the one thing that mattered right then: it could not get its own unit tests to pass. It made a mess of mocks and kept digging itself deeper into a hole instead of fixing it. It couldn't tell me the what or why of the failures.&lt;/p&gt;

&lt;p&gt;I decided to try Claude, and asked it to help me understand the reasons for the failures and fix them. Within 30 minutes everything was passing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One caveat, and it holds for the whole post: none of this is an endorsement. I'm not putting one tool above another. I happened to build on a couple of specific ones, and both have moved on a lot since late 2025, so that afternoon was a snapshot, not a verdict. What follows isn't about which agent to pick. It's about how to work with any of them, because the hard parts I hit are the same whatever is doing the typing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In fact, this is exactly why I built multi-model validation into the architecture from the ground up, instead of trusting any one model's first answer. Different models catch different things. And even a single model gives you more than its first pass if you ask for it. Hand it a leading question, tell it to review an answer, including its own, and it turns honest and digs deeper instead of defending what it just said. The catch is on us. We have to learn to ask, and remember to.&lt;/p&gt;

&lt;p&gt;Tests stayed my Achilles heel for a long time. Every time they failed I'd point the agent at them and it would spin and get lost. So I tried giving it the failures in batches, and it did much better. The real turning point, where the tests started to pay off, came after a complete refactor of the test system (see &lt;a href="https://dev.to/smukker/lesson-1-tdd-with-ai-getting-tests-that-hold-up-when-the-agent-writes-them-1he"&gt;Lesson 1&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The bigger thing I took from all this: the value isn't autocomplete. Used well, it's a tool that levels you up in the areas you're thin on, and I had one of those open in front of me. I stopped treating it like a faster keyboard and started treating it like a fast, literal engineer I had to manage.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Setbacks
&lt;/h3&gt;

&lt;p&gt;The prototypes came fast, faster than I could keep up with, if keeping up means actually understanding what's running in my own system. Nobody warns you about that part. &lt;strong&gt;Getting AI to produce code is the easy bit. Staying on top of what it produces is the real work.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is the version that made it concrete. I wrote a plan, the agent executed it, and everything looked done. Days later, working on something else, I found it had quietly decided a few things weren't important and dropped them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit date fields, cut because it judged them unnecessary.&lt;/li&gt;
&lt;li&gt;A service boundary, collapsed because, in its words, it's all one container right now anyway.&lt;/li&gt;
&lt;li&gt;The high-value tests, skipped while the easy ones got written, and it never said so out loud.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this was malicious. It had a reasonable-sounding rationale for every cut, and that is exactly what makes it dangerous. The corners it chooses to cut are the ones it can argue for, so scanning the diff and asking "does this look right" won't catch them. It always looks right.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Got the plan out of the chat and onto disk.&lt;/strong&gt; Plan files, tracker tables. Intent and decisions live in files now, not in a conversation that vanishes the moment a test run derails it. That's not hypothetical: it once lost an entire plan mid-session because the plan only ever existed in the chat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turned my review instincts into gates.&lt;/strong&gt; A loop the work has to pass through: plan, review the plan, implement, then conventions, security, and test gates before anything ships.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managed AI as a Contributor.&lt;/strong&gt; I didn't sit down and design that to mirror how I ran human teams. It just emerged. Then I noticed it was the same review culture I'd always run, rebuilt for a contributor that's faster and far more agreeable than any junior I've worked with.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One standing instruction mattered more than all the tooling: &lt;strong&gt;challenge me&lt;/strong&gt;. Don't just do what I ask. If what I'm asking will age badly, say so before you build it. An agent won't push back unless you tell it to. A good engineer does it without being asked.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Unlock
&lt;/h3&gt;

&lt;p&gt;For a while I didn't even run the insights report. I figured it was a distraction I didn't want to deal with. One day I ran it anyway, and it changed how I worked. It was blunt: what was working, what was holding me back, concrete suggestions on both. Then the tool offered to help me act on the feedback. I said yes.&lt;/p&gt;

&lt;p&gt;The best call I made was to spin those improvements out into their own separate project. Everyone had been talking about skills and commands and agents and posting their own, and honestly, it was a bit intimidating while I was still struggling just to keep the agent on the rails. That toolkit project is what opened the door to working with AI effectively and efficiently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So my advice to you is just go ahead and start. Use AI in your real workflow and it will help you figure it out as you go. You don't need to train up or set aside time to learn it first. If you write code, open an AI-enabled IDE and start coding with AI. The rest falls into place on its own.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Now
&lt;/h3&gt;

&lt;p&gt;Today I barely type. I give requirements, clarify, iterate on a plan, and the agent does the build.&lt;/p&gt;

&lt;p&gt;The honest part: it is not faster than working without the system I built, but it is a lot more efficient. The gates and the checks cost real time. What I get back is output that's actually to spec, and a system I still understand well enough to debug at 2 am. I traded speed for fidelity, on purpose. At a certain level of seniority, that's the trade you want.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Future
&lt;/h3&gt;

&lt;p&gt;I haven't pushed it to run on a cloud VM yet. It needs more harness around it, and when I get there, I want it multi-model and fully pipelined end to end. I have outlines of a framework, but I haven't given it the time it deserves yet. If anyone is interested in this or wants to collaborate, please reach out.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Lesson
&lt;/h3&gt;

&lt;p&gt;None of this replaced the engineering. It just moved. Less of my day is typing now. Most of it is deciding what good actually looks like and building the guardrails that hold when a fast, agreeable, slightly overconfident contributor is the one doing the typing.&lt;/p&gt;

&lt;p&gt;I don't think the people who get the most out of AI are the ones who trust it the most. It's the ones who work out the few places it can't be left alone, and stay there. For me that took months of getting it wrong first, which is most of what this post was about.&lt;/p&gt;

&lt;p&gt;The product was the reason I started. The method is what I'm keeping.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>engineering</category>
      <category>leadership</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>6 MVP Development Companies Compared: Cost, Timeline, and Fit (2026)</title>
      <dc:creator>Nasif Sid</dc:creator>
      <pubDate>Tue, 14 Jul 2026 03:08:04 +0000</pubDate>
      <link>https://dev.to/6sensehq/6-mvp-development-companies-compared-cost-timeline-and-fit-2026-1keh</link>
      <guid>https://dev.to/6sensehq/6-mvp-development-companies-compared-cost-timeline-and-fit-2026-1keh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; MVP-focused agencies differ far more on timeline and specialization than most comparison lists let on. Below is a side-by-side look at six providers — 6senseHQ, Cleveroad, ScienceSoft, BairesDev, SolveIt, and Uptech — with sourced specifics on cost, speed, and fit, plus a framework for how to actually use this list.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most "best MVP development company" roundups are unranked directories with identical descriptions swapped between entries. This one focuses on the two things that actually differentiate a build partner: &lt;strong&gt;how fast they say they can launch&lt;/strong&gt;, and &lt;strong&gt;who that timeline is realistic for&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick comparison table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;Typical MVP Timeline&lt;/th&gt;
&lt;th&gt;Cost Signal&lt;/th&gt;
&lt;th&gt;Best Fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.6sensehq.com" rel="noopener noreferrer"&gt;6senseHQ&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;6-8 weeks&lt;/td&gt;
&lt;td&gt;$30K-$300K+ (scope-dependent); up to 60% savings claimed vs. in-house&lt;/td&gt;
&lt;td&gt;Startups wanting a fast, lean launch at cost-conscious pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cleveroad&lt;/td&gt;
&lt;td&gt;2-5 months&lt;/td&gt;
&lt;td&gt;~$15K-$50K for focused builds, $40K+ typical&lt;/td&gt;
&lt;td&gt;Founders wanting the most granular published cost breakdowns, plus compliance-heavy verticals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ScienceSoft&lt;/td&gt;
&lt;td&gt;Not publicly fixed&lt;/td&gt;
&lt;td&gt;"Startup-friendly," quote-based&lt;/td&gt;
&lt;td&gt;Founders prioritizing a 36-year track record and 4,200+ project history over speed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BairesDev&lt;/td&gt;
&lt;td&gt;Not publicly fixed&lt;/td&gt;
&lt;td&gt;Quote-based; enterprise-scale bench&lt;/td&gt;
&lt;td&gt;Startups wanting an MVP architected to scale past V1 without a partner switch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SolveIt&lt;/td&gt;
&lt;td&gt;~3 months&lt;/td&gt;
&lt;td&gt;Fixed-scope quotes; 100% on-deadline claim&lt;/td&gt;
&lt;td&gt;Founders wanting one full-cycle vendor with a stated delivery guarantee&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uptech&lt;/td&gt;
&lt;td&gt;6-7 months&lt;/td&gt;
&lt;td&gt;Quote-based&lt;/td&gt;
&lt;td&gt;Fintech/neobank and other regulated, data-heavy MVPs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(Figures are self-reported by each provider as of mid-2026 and vary by project scope — confirm directly against your specific requirements before shortlisting.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The breakdown
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 6senseHQ — fastest quoted lean timeline
&lt;/h3&gt;

&lt;p&gt;6senseHQ quotes MVPs landing in &lt;strong&gt;6-8 weeks&lt;/strong&gt;, with project budgets typically $30K-$300K+ depending on complexity, and claims savings up to 60% compared to in-house hiring, backed by a 48-hour estimate turnaround. This makes it a strong first call for founders who need a working product in front of users before the next fundraising milestone and don't need heavy regulatory scaffolding from day one.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Cleveroad — most transparent published cost breakdown
&lt;/h3&gt;

&lt;p&gt;Cleveroad is unusual among this group in publishing granular cost figures directly — roughly &lt;strong&gt;$15K-$50K&lt;/strong&gt; for a focused MVP scenario, scaling toward $40K+ for "simple" builds and considerably higher for enterprise-grade software. Delivery windows run 2-5 months depending on vertical. Its ISO 27001/9001 certifications and healthcare/fintech portfolio also make it a candidate when compliance documentation matters even at MVP stage.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. ScienceSoft — longevity over speed
&lt;/h3&gt;

&lt;p&gt;ScienceSoft doesn't publish a fixed MVP timeline or price range, instead leaning on 36 years of operating history and 4,200+ completed projects, positioning its MVP offering as "predictable, startup-friendly." Worth shortlisting if you're weighing vendor risk (will this company still exist in 3 years) as heavily as launch speed.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. BairesDev — built for scale-past-MVP
&lt;/h3&gt;

&lt;p&gt;BairesDev doesn't advertise a fixed MVP cost or timeline either, but its differentiator is explicit: MVPs architected to handle growth from the start rather than needing a rewrite after V1, backed by a large nearshore LATAM engineering bench (self-reported 3,100+ engineers) and US timezone overlap. Best suited to founders who already have a roadmap beyond the first release and don't want to re-platform later.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. SolveIt — fixed timeline with a delivery guarantee
&lt;/h3&gt;

&lt;p&gt;SolveIt quotes MVP launches within &lt;strong&gt;3 months&lt;/strong&gt; and states 100% of its projects have been delivered on deadline and within budget. Combined with its full-cycle positioning (discovery through launch under one vendor), it's a reasonable shortlist candidate for founders who want a specific, stated delivery commitment rather than an open-ended estimate.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Uptech — built for regulated, data-heavy MVPs
&lt;/h3&gt;

&lt;p&gt;Uptech's quoted MVP timeline is the longest in this group — &lt;strong&gt;6-7 months&lt;/strong&gt; — which reflects its specialization in fintech, neobank, and healthcare MVPs that require more careful handling of financial transactions, patient data, or compliance from the outset. Not the fastest option, but positioned for founders whose MVP inherently carries more regulatory weight.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to actually use this list
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Filter by build type first.&lt;/strong&gt; If your MVP touches payments, health data, or financial transactions, weight Cleveroad and Uptech's compliance experience heavily — don't optimize for the fastest quoted timeline alone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter by timeline pressure second.&lt;/strong&gt; If you need something live before a specific fundraising or launch date, 6senseHQ's and SolveIt's quoted windows are the tightest in this group — but confirm the quote is fixed-scope, not best-case.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter by post-MVP roadmap third.&lt;/strong&gt; If you already know you're building past V1 into a scaling product, BairesDev and ScienceSoft's scale-oriented positioning may save a vendor switch later.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How long does MVP development typically take in 2026?&lt;/strong&gt;&lt;br&gt;
Quoted timelines across active providers range from about 6 weeks (6senseHQ) to 6-7 months (Uptech), with the difference largely explained by build complexity and regulatory requirements rather than vendor speed alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which MVP development company is cheapest?&lt;/strong&gt;&lt;br&gt;
Cleveroad publishes the most specific low-end figure (~$15K for a focused build), and 6senseHQ's stated cost-savings claims (up to 60% vs. in-house) also position it toward the lower end — but ScienceSoft and BairesDev don't publish fixed pricing, so a direct quote is the only reliable comparison.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which provider is best for a fintech or healthcare MVP?&lt;/strong&gt;&lt;br&gt;
Uptech and Cleveroad both have the most explicit compliance-relevant experience (neobanks, HIPAA/PCI DSS-adjacent healthcare work) among this group.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I pick the fastest MVP timeline available?&lt;/strong&gt;&lt;br&gt;
Not automatically — a faster timeline usually means a narrower initial scope. Match the timeline to your product's actual complexity rather than picking the shortest quoted window and hoping the scope still fits.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Requesting quotes? Ask each vendor for the same three numbers — fixed-scope cost, timeline assuming stable requirements, and whether compliance review is included in Discovery — so you're comparing offers on equal terms rather than headline claims.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>startup</category>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>Open Source AI Libraries Crush Proprietary Tools in 2026</title>
      <dc:creator>MLXIO</dc:creator>
      <pubDate>Tue, 14 Jul 2026 03:07:32 +0000</pubDate>
      <link>https://dev.to/mlxio_ai/open-source-ai-libraries-crush-proprietary-tools-in-2026-24ie</link>
      <guid>https://dev.to/mlxio_ai/open-source-ai-libraries-crush-proprietary-tools-in-2026-24ie</guid>
      <description>&lt;p&gt;Open source AI libraries now rival proprietary tools, offering developers powerful, permissively licensed options for production-grade AI in 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Updated July 2026:&lt;/strong&gt; This refresh removes speculative model names and unverifiable benchmark claims, clarifies the difference between open source libraries and open-...&lt;/li&gt;
&lt;li&gt;Introduction to Open Source AI Libraries&lt;/li&gt;
&lt;li&gt;Open source AI libraries are now the foundation of modern AI development. From model training and fine-tuning to retrieval, inference, evaluation, and deployment, deve...&lt;/li&gt;
&lt;li&gt;The biggest shift is not that every open model beats every proprietary model. It is that the open ecosystem is now strong enough for many real-world workloads: coding ...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Read the full breakdown on &lt;a href="https://mlxio.com/blog/roundup/open-source-ai-libraries-2026" rel="noopener noreferrer"&gt;MLXIO&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Canonical source: &lt;a href="https://mlxio.com/blog/roundup/open-source-ai-libraries-2026" rel="noopener noreferrer"&gt;https://mlxio.com/blog/roundup/open-source-ai-libraries-2026&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>machinelearning</category>
      <category>developers</category>
    </item>
    <item>
      <title>MVP Development in 2026: What Actually Changed (And What Still Hasn't)</title>
      <dc:creator>Nasif Sid</dc:creator>
      <pubDate>Tue, 14 Jul 2026 03:02:15 +0000</pubDate>
      <link>https://dev.to/6sensehq/mvp-development-in-2026-what-actually-changed-and-what-still-hasnt-4e8c</link>
      <guid>https://dev.to/6sensehq/mvp-development-in-2026-what-actually-changed-and-what-still-hasnt-4e8c</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; In 2026, "MVP" no longer means a bare-bones prototype — users expect at least some AI-assisted behavior out of the gate, and regulations (GDPR enforcement, the EU AI Act) mean compliance can't be an afterthought even at MVP stage. Founders are also under more pressure to show real usage or revenue signals within months, not a year. Typical build costs now range roughly &lt;strong&gt;$15K-$80K and 6-14 weeks&lt;/strong&gt; for a lean MVP, scaling well beyond that for regulated or data-heavy products. Below is what's driving the shift, plus how providers like 6senseHQ, Cleveroad, ScienceSoft, BairesDev, SolveIt, and Uptech currently scope MVP engagements.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why 2026 MVPs look different from 2023 MVPs
&lt;/h2&gt;

&lt;p&gt;A few forces are compounding at once:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AI-native is now the baseline, not a bonus feature.&lt;/strong&gt; Personalized onboarding, smart summaries, and semantic search have moved from "nice to have" to expected in most product categories — an MVP that skips them can read as dated to early users, even if the core value prop doesn't need AI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance can't wait for V2 anymore.&lt;/strong&gt; GDPR enforcement has real teeth, the EU AI Act is now in effect, and users are more skeptical of products that handle data carelessly. Several agencies now build a compliance review into their MVP discovery phase rather than treating it as a later cleanup task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No-code + AI tooling is compressing timelines and cost.&lt;/strong&gt; Pre-trained models and AI-assisted coding are cutting build time and, per some agency estimates, expenses by a wide margin compared to traditional from-scratch builds — though the exact savings depend heavily on scope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Founders are expected to show real signals faster.&lt;/strong&gt; Investors increasingly want usage or revenue evidence within months, not a working prototype and a pitch deck alone.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What a realistic 2026 MVP timeline and budget looks like
&lt;/h2&gt;

&lt;p&gt;Ranges vary a lot by product complexity, but recent industry estimates cluster around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lean MVP (single core workflow, one platform):&lt;/strong&gt; ~$15K-$50K, 6-14 weeks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mid-complexity MVP (multi-tenant, payments, integrations):&lt;/strong&gt; ~$30K-$80K, 3-6 months&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regulated or data-heavy MVP (healthcare, fintech):&lt;/strong&gt; $80K-$300K+, 6-9+ months&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful rule that keeps showing up across agency post-mortems: compressing a 4-month build into 2 months tends to raise the budget by 20-40% and increase defect rates rather than simply "going faster" — team size doesn't substitute for time the way founders often hope.&lt;/p&gt;

&lt;h2&gt;
  
  
  How current MVP-focused providers scope this work
&lt;/h2&gt;

&lt;p&gt;Positioning and stated timelines vary meaningfully across vendors — worth knowing before you request quotes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.6sensehq.com" rel="noopener noreferrer"&gt;6senseHQ&lt;/a&gt;&lt;/strong&gt; quotes MVPs in the &lt;strong&gt;6-8 week&lt;/strong&gt; range, with typical project budgets between $30K-$300K+ depending on scope, and claims up to 60% savings versus in-house hiring — a profile aimed at startups wanting a fast, lean build without enterprise pricing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleveroad&lt;/strong&gt; publishes some of the more granular cost breakdowns in the space, citing roughly &lt;strong&gt;$15K-$50K for a focused MVP&lt;/strong&gt; up to $40K+ for a "simple" build, with delivery windows of 2-5 months depending on vertical, and factors in Discovery-phase scoping specifically to contain feature creep.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ScienceSoft&lt;/strong&gt; doesn't publish a fixed MVP price range publicly, instead positioning around "predictable, startup-friendly costs" backed by 36 years and 4,200+ completed projects — a fit for founders who want an established partner but need to request a scoped quote directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BairesDev&lt;/strong&gt; doesn't advertise fixed MVP pricing either, but positions its nearshore LATAM engineering bench (self-reported 3,100+ engineers) as suited to MVPs that are architected to scale from day one rather than get rewritten a year later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SolveIt&lt;/strong&gt; quotes &lt;strong&gt;MVP launches within 3 months&lt;/strong&gt;, with a stated track record of 100% of projects delivered on deadline and within budget — positioned toward startups wanting a single full-cycle vendor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uptech&lt;/strong&gt; quotes a longer &lt;strong&gt;6-7 month&lt;/strong&gt; MVP timeline, reflecting its focus on more data- and compliance-heavy builds (fintech, neobanks, healthcare) rather than the fastest possible lean launch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The spread here is the useful signal: "MVP" spans a 6-week lean build and a 7-month regulated build under the same label, so timeline quotes only mean something once you've defined which kind you're building.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions worth asking before you sign
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Is compliance review (GDPR, EU AI Act where relevant) included in Discovery, or billed separately later?&lt;/li&gt;
&lt;li&gt;Does the quoted timeline assume a fixed scope, or does it flex if requirements shift mid-build?&lt;/li&gt;
&lt;li&gt;What's actually included in "MVP" — is AI-assisted functionality baked in, or an add-on?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How much does MVP development cost in 2026?&lt;/strong&gt;&lt;br&gt;
Lean, single-workflow MVPs typically run $15K-$50K over 6-14 weeks; multi-tenant or payment-integrated builds run $30K-$80K over 3-6 months; regulated or data-heavy products (healthcare, fintech) often exceed $80K-$300K+ and 6-9 months.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does adding AI features increase MVP cost significantly?&lt;/strong&gt;&lt;br&gt;
Not necessarily — pre-trained models and AI-assisted development tooling have lowered the cost of adding intelligent features compared to building custom ML from scratch, though scope and data quality still drive the bulk of cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I compress an MVP timeline by adding more developers?&lt;/strong&gt;&lt;br&gt;
Generally no. Agency data consistently shows that compressing timelines by throwing more people at a build tends to raise cost by 20-40% and increase defect rates rather than accelerating delivery proportionally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need to worry about compliance for a bare MVP?&lt;/strong&gt;&lt;br&gt;
Yes, more than in past years — GDPR enforcement and the EU AI Act mean data handling and AI transparency requirements can apply even to an early-stage product, so it's worth confirming this is covered in your provider's Discovery phase.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Comparing MVP quotes? Ask each vendor for the same three numbers — fixed-scope cost, timeline assuming no major requirement changes, and what's included in Discovery — so you're comparing like for like instead of headline pricing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>startup</category>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>Unlock Exponential Growth: How AI Automation Drives Real ROI for US Businesses</title>
      <dc:creator>David García</dc:creator>
      <pubDate>Tue, 14 Jul 2026 03:01:05 +0000</pubDate>
      <link>https://dev.to/dgmh10uk/unlock-exponential-growth-how-ai-automation-drives-real-roi-for-us-businesses-ka6</link>
      <guid>https://dev.to/dgmh10uk/unlock-exponential-growth-how-ai-automation-drives-real-roi-for-us-businesses-ka6</guid>
      <description>&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; AI Automation, Business Efficiency, Productivity, ROI, Competitive Advantage&lt;/p&gt;

&lt;p&gt;The bottom line is this: time is money. In the fiercely competitive American business landscape, every wasted minute, every inefficient process, represents a direct hit to your profitability. Traditional methods of boosting productivity are fading; businesses need a new weapon – and that weapon is &lt;strong&gt;business automation AI&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;At Itelnet Consulting, we’re not just talking about buzzwords. We’re helping US companies translate the potential of Artificial Intelligence into tangible, measurable results. Forget the hype; let's discuss how strategic AI implementation can fundamentally reshape your operations and deliver exponential growth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Numbers Don’t Lie: AI’s Impact on Productivity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Numerous studies demonstrate the dramatic impact of AI-powered automation. McKinsey estimates that automation could boost global productivity by 1.4% annually. For US businesses, this translates to billions of dollars in increased revenue and reduced operational costs. But it’s not just about volume; it’s about &lt;em&gt;smart&lt;/em&gt; volume. &lt;/p&gt;

&lt;p&gt;Consider this: a mid-sized manufacturing firm in Ohio, struggling with manual inventory management, implemented an AI-driven system to track stock levels in real-time. The result? A 25% reduction in stockouts, a 15% decrease in carrying costs, and significantly improved order fulfillment times. This isn't a theoretical benefit; it’s a demonstrable return on investment.  Similarly, a customer service center in Texas utilizing AI chatbots experienced a 30% reduction in call handling times and a corresponding increase in customer satisfaction scores – directly impacting revenue generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beyond Basic Bots: Strategic AI Solutions for US Businesses&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The key is to move beyond simplistic chatbot deployments and embrace a holistic approach to &lt;strong&gt;business automation AI&lt;/strong&gt;. This includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Process Automation:&lt;/strong&gt; Automating repetitive, rule-based tasks – from invoice processing to data entry – frees up your employees to focus on high-value activities like strategic planning, innovation, and client relationship management.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Analysis &amp;amp; Insights:&lt;/strong&gt; AI algorithms can analyze massive datasets – sales figures, customer behavior, market trends – to identify opportunities and predict future outcomes with unparalleled accuracy. This allows for proactive decision-making, optimizing marketing campaigns, and identifying new revenue streams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personalized Customer Experiences:&lt;/strong&gt; AI enables you to deliver highly personalized experiences to your customers, driving engagement, loyalty, and ultimately, sales. Think tailored product recommendations, proactive customer support, and personalized marketing messages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Itelnet Consulting: Your Partner in AI Implementation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We understand that implementing AI solutions can seem daunting. That's where Itelnet Consulting comes in. We don't just sell technology; we deliver tailored strategies and expertly executed solutions. Our team of experienced consultants will work with you to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Assess Your Needs:&lt;/strong&gt; We conduct a thorough analysis of your current operations to identify areas ripe for automation and AI integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Develop a Customized Strategy:&lt;/strong&gt; We create a roadmap for implementing AI solutions that aligns with your specific business goals and budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement and Optimize:&lt;/strong&gt; We manage the entire implementation process, ensuring seamless integration and ongoing optimization for maximum ROI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We’re particularly focused on helping US businesses leverage AI to streamline workflows and reduce operational overhead.  This aligns perfectly with the strategic shift happening across industries – a move towards greater efficiency and competitive advantage.  Our experience extends across sectors, including enterprise software, cybersecurity, and EdTech, allowing us to bring a diverse and adaptable approach to your challenges.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources for Your AI Journey:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We've created resources to help you understand the fundamentals of &lt;strong&gt;business automation AI&lt;/strong&gt; and its potential impact on your business:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Article in Spanish:&lt;/strong&gt; &lt;a href="https://itelnetconsulting.wordpress.com/2026/07/13/okay-heres-a-550-750-word-blog-article-in-modern-standard-arabic-%d8%a7%d9%84%d8%b9%d8%b1%d8%a8%d9%8a%d8%a9-tailored-to-the-itelnet-consulting-target-m/" rel="noopener noreferrer"&gt;https://itelnetconsulting.wordpress.com/2026/07/13/okay-heres-a-550-750-word-blog-article-in-modern-standard-arabic-%d8%a7%d9%84%d8%b9%d8%b1%d8%a8%d9%8a%d8%a9-tailored-to-the-itelnet-consulting-target-m/&lt;/a&gt; - Gain valuable insights into AI’s transformative power through this detailed analysis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kit Docente IA 2026:&lt;/strong&gt; &lt;a href="https://dgmhorizon0.gumroad.com/l/dzyue" rel="noopener noreferrer"&gt;https://dgmhorizon0.gumroad.com/l/dzyue&lt;/a&gt; -  A practical tool to help educators explore AI’s potential in the classroom.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;50 Prompts IA para Docentes:&lt;/strong&gt; &lt;a href="https://dgmhorizon0.gumroad.com/l/rcupyj" rel="noopener noreferrer"&gt;https://dgmhorizon0.gumroad.com/l/rcupyj&lt;/a&gt; - Quick and effective AI prompts to boost your productivity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ready to See the ROI?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't let your competitors gain the upper hand.  Start optimizing your operations today.  Schedule a free AI audit with Itelnet Consulting to uncover hidden opportunities and unlock the full potential of &lt;strong&gt;business automation AI&lt;/strong&gt;. &lt;a href="https://itelnetconsulting.com/auditoria/" rel="noopener noreferrer"&gt;https://itelnetconsulting.com/auditoria/&lt;/a&gt; – Let us show you how AI can drive real, measurable results for your business.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://itelnetconsulting.com" rel="noopener noreferrer"&gt;Itelnet Consulting&lt;/a&gt; — AI &amp;amp; Automation | &lt;a href="https://itelnetconsulting.com/auditoria/" rel="noopener noreferrer"&gt;Free AI Audit&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
    </item>
    <item>
      <title>Open-Weight LLM API Integration: A Developer's Guide to Accessible AI</title>
      <dc:creator>NovaStack</dc:creator>
      <pubDate>Tue, 14 Jul 2026 03:01:02 +0000</pubDate>
      <link>https://dev.to/sbt112321321/open-weight-llm-api-integration-a-developers-guide-to-accessible-ai-4e3l</link>
      <guid>https://dev.to/sbt112321321/open-weight-llm-api-integration-a-developers-guide-to-accessible-ai-4e3l</guid>
      <description>&lt;h1&gt;
  
  
  Open-Weight LLM API Integration: A Developer's Guide to Accessible AI
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The artificial intelligence landscape is rapidly evolving, and open-weight language models have emerged as one of the most exciting developments for developers. Unlike proprietary models locked behind restrictive APIs, open-weight LLMs offer transparency, flexibility, and the ability to fine-tune models for specific use cases.&lt;/p&gt;

&lt;p&gt;In this guide, we'll explore how to integrate open-weight LLMs into your applications through API endpoints—giving you the best of both worlds: the accessibility of an API with the openness of community-driven models.&lt;/p&gt;

&lt;p&gt;Whether you're building chatbots, content generators, code assistants, or data processing pipelines, understanding how to connect to open-weight LLM APIs is becoming an essential skill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open-Weight LLM APIs Matter
&lt;/h2&gt;

&lt;p&gt;Before diving into integration, let's understand why this approach is game-changing for developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transparency&lt;/strong&gt;: You can inspect architecture details and understand model behavior&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customization&lt;/strong&gt;: Fine-tune models for domain-specific tasks without vendor lock-in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost Efficiency&lt;/strong&gt;: Often available at lower price points than closed alternatives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor Flexibility&lt;/strong&gt;: Switch between model providers without rewriting your entire stack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community Innovation&lt;/strong&gt;: Benefit from rapid improvements driven by global research contributions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The API-first approach removes infrastructure headaches while preserving the openness that makes these models valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started with LLM API Integration
&lt;/h2&gt;

&lt;p&gt;Prerequisites for this guide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic understanding of REST APIs and HTTP requests&lt;/li&gt;
&lt;li&gt;Node.js or Python environment (examples in both)&lt;/li&gt;
&lt;li&gt;API key from your provider&lt;/li&gt;
&lt;li&gt;A project where you want to add LLM capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'll be making requests to standard OpenAI-compatible API endpoints, which means minimal changes if you're migrating from other providers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your First API Call
&lt;/h2&gt;

&lt;p&gt;Let's start with the simplest possible integration—sending a prompt and receiving a response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Node.js Example: Basic LLM API Call&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchLLMResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://www.novapai.ai/v1/chat/completions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nova-open-7b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`API error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Usage&lt;/span&gt;
&lt;span class="nf"&gt;fetchLLMResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain quantum computing in simple terms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python Example: Basic LLM API Call
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_llm_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://www.novapai.ai/v1/chat/completions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;API_KEY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nova-open-7b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choices&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Usage
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_llm_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Explain quantum computing in simple terms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequestException&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Building a Multi-Turn Conversation
&lt;/h2&gt;

&lt;p&gt;Real applications rarely involve single Q&amp;amp;A. Here's how to implement conversational memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ConversationManager&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;systemPrompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are a helpful assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;systemPrompt&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Add user message to history&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userMessage&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://www.novapai.ai/v1/chat/completions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nova-open-13b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assistantReply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Add assistant response to history&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;assistantReply&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;assistantReply&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Usage&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;convo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ConversationManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are an expert Python programmer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;convo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;What is a decorator?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;convo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Give me an example&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Handling Streaming Responses
&lt;/h2&gt;

&lt;p&gt;For longer responses, streaming improves user experience by delivering tokens as they're generated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;streamResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onChunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://www.novapai.ai/v1/chat/completions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nova-open-7b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
      &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getReader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;decoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextDecoder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;decoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;line&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;onChunk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Usage: Display each token as it arrives&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;fullResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;streamResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tell me about the history of computing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;fullResponse&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Error Handling and Best Practices
&lt;/h2&gt;

&lt;p&gt;Production applications need robust error handling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LLMClient&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nova-open-7b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxRetries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxRetries&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://www.novapai.ai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultModel&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxRetries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;executeCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// Rate limited — exponential backoff&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxRetries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;executeCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/chat/completions`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`API Error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;getConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;temperature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;max_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;rest&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;rest&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Model Selection Considerations
&lt;/h2&gt;

&lt;p&gt;When integrating open-weight LLMs, consider these factors when choosing your model:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;Options&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7B, 13B, 70B parameters&lt;/td&gt;
&lt;td&gt;Smaller models for latency-sensitive tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Accuracy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Base vs. Instruct versions&lt;/td&gt;
&lt;td&gt;Instruct-tuned models for chat interfaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-token pricing&lt;/td&gt;
&lt;td&gt;Test with your typical workload first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4K, 8K, 32K, 128K tokens&lt;/td&gt;
&lt;td&gt;Match to your maximum input needs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Specialization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Code, chat, embedding models&lt;/td&gt;
&lt;td&gt;Use domain-specific models when available&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Open-weight LLM APIs bridge the gap between cutting-edge AI capabilities and practical implementation. By leveraging OpenAI-compatible endpoints (like &lt;a href="http://www.novapai.ai" rel="noopener noreferrer"&gt;http://www.novapai.ai&lt;/a&gt;), developers can integrate powerful language models into their applications while maintaining the flexibility to switch providers as the ecosystem evolves.&lt;/p&gt;

&lt;p&gt;The code patterns shown here—basic calls, conversation management, streaming, and robust error handling—form the foundation for building production-ready LLM applications. Start with simple integrations, learn your application's patterns, and then optimize for your specific use cases.&lt;/p&gt;

&lt;p&gt;The open-weight model ecosystem is maturing rapidly, with new models and capabilities appearing regularly. By adopting API-compatible patterns now, you position your projects to take advantage of these improvements without major rewrites.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you integrated open-weight LLMs into your projects? What use cases are you exploring? Share your experiences and questions in the comments—this space is evolving fast, and the community's collective knowledge is invaluable.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>AI-Powered Two-Way Communication Dashboard for Pet Sitters and Dog Walkers</title>
      <dc:creator>Ken Deng</dc:creator>
      <pubDate>Tue, 14 Jul 2026 03:00:59 +0000</pubDate>
      <link>https://dev.to/ken_deng_ai/ai-powered-two-way-communication-dashboard-for-pet-sitters-and-dog-walkers-2328</link>
      <guid>https://dev.to/ken_deng_ai/ai-powered-two-way-communication-dashboard-for-pet-sitters-and-dog-walkers-2328</guid>
      <description>&lt;p&gt;We need to produce a 400-500 word article, concise, with markdown. Must include title with "ai" or topic. Intro 2-3 sentences. Core: explain ONE key principle or framework clearly. Include 1 specific tool name and its purpose (from facts). Mini-scenario: 2 sentences showing principle in action. Implementation: 3 high-level steps. Conclusion: summarize key takeaways only (no e-book promotion, URLs, URLs not allowed. Must be professional, conversational, helpful, authoritative. Must be between 400-500 words. Count words.&lt;/p&gt;

&lt;p&gt;We need to avoid placeholders, no thinking process.&lt;/p&gt;

&lt;p&gt;Let's craft about 430 words.&lt;/p&gt;

&lt;p&gt;We need to include a specific tool name from facts: maybe "Two-Way Communication Dashboard" is the concept; but need a specific tool name. Could be "PetCareBot" or "ScheduleSync". We need to pick one from facts? The facts didn't give a specific tool name; they described features. We can invent a tool name consistent with facts, but must be specific. The instruction: "Include 1 specific tool name and its purpose (from facts)". So we need to reference a tool name that appears in facts. The facts list: "Automates replies", "Booking", "Burnout", "Claiming your Google Business Profile", "Client anxiety", "Drop in quality of care", "Faster response times", "Greater peace of mind", "Higher client satisfaction", "Informational", "Lets the client schedule or modify bookings directly", "Lists all inbound messages", "More bookings", "Prioritizes urgent messages", "Urgent", "Zero interruptions during walks", "The client texts the same request...", "You’re notified after the change is made". No explicit tool name.&lt;/p&gt;

&lt;p&gt;We could interpret "Two-Way Communication Dashboard" as the tool name. It's described in facts: "Lists all inbound messages from texts, email, app notifications, and even social DMs in one place." That's the dashboard. So we can treat "Two-Way Communication Dashboard" as the tool name. Its purpose: aggregates messages and enables AI-driven responses and scheduling.&lt;/p&gt;

&lt;p&gt;Thus include: Tool: Two-Way Communication Dashboard – purpose: centralizes inbound client communications and powers automated replies, booking, and urgent alerts.&lt;/p&gt;

&lt;p&gt;Now write article.&lt;/p&gt;

&lt;p&gt;Word count target ~430.&lt;/p&gt;

&lt;p&gt;Let's draft and count.&lt;/p&gt;

&lt;p&gt;Title: # AI-Powered Two-Way Communication Dashboard for Pet Sitters and Dog Walkers&lt;/p&gt;

&lt;p&gt;Intro: 2-3 sentences.&lt;/p&gt;

&lt;p&gt;Core: explain ONE key principle or framework clearly. Perhaps principle: "Asynchronous, priority‑based communication reduces interruptions while maintaining service quality." Explain.&lt;/p&gt;

&lt;p&gt;Include tool name and purpose.&lt;/p&gt;

&lt;p&gt;Mini-scenario: 2 sentences.&lt;/p&gt;

&lt;p&gt;Implementation: 3 high-level steps.&lt;/p&gt;

&lt;p&gt;Conclusion: summarize key takeaways.&lt;/p&gt;

&lt;p&gt;Now write and count words.&lt;/p&gt;

&lt;p&gt;Let's write draft then count.&lt;/p&gt;

&lt;p&gt;Draft:&lt;/p&gt;

&lt;p&gt;Pet sitters and dog walkers know the constant ping of messages can turn a peaceful walk into a stressful juggling act. When every text demands an immediate reply, focus slips, and the quality of care suffers. An AI‑driven two‑way communication dashboard solves this by handling routine inquiries and bookings while only true emergencies break your concentration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Principle: Asynchronous, Priority‑Based Communication
&lt;/h2&gt;

&lt;p&gt;The dashboard operates on a simple framework: separate urgent signals from routine requests and automate the latter. Using each client’s data—scheduled visits, pet preferences, and your policies—the AI instantly answers common questions, confirms bookings, and lets clients modify services without tapping your phone. Non‑urgent messages are queued for a batch reply you review at set times, while genuine emergencies trigger a direct alert to your device. This separation keeps you present with the dogs and reduces burnout.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tool highlight:&lt;/strong&gt; The Two‑Way Communication Dashboard aggregates inbound texts, emails, app notifications, and social DMs into one view, powers the AI’s automated replies, and prioritizes urgent alerts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mini‑Scenario
&lt;/h3&gt;

&lt;p&gt;A client texts, “I need a walk next Tuesday at 2 PM.” The dashboard opens your availability, lets the client pick a slot, and sends a confirmation—all while you’re mid‑walk. Later, the same client messages, “Dog vomited today.” The system flags it as urgent, vibrates your phone immediately, and you can respond after checking the pet’s condition.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Connect your channels&lt;/strong&gt; – Link your phone number, email, booking app, and social accounts to the dashboard so every inbound message flows into a single inbox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Train the AI on your specifics&lt;/strong&gt; – Upload your service policies, pet profiles, and typical FAQs; the system learns to generate personalized, accurate replies and to recognize urgency cues like “locked out” or medical symptoms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set review windows and alert rules&lt;/strong&gt; – Choose two or three times per day to batch‑respond to routine messages, and define which keywords trigger instant notifications; then let the dashboard handle the rest.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By adopting an AI‑powered two‑way communication dashboard, pet sitters and dog walkers gain instant, personalized responses for routine inquiries, eliminate distracting pings during walks, and ensure true emergencies reach them instantly. The result is higher client satisfaction, fewer missed bookings, and a calmer, more focused workday.&lt;/p&gt;

&lt;p&gt;Now count words.&lt;/p&gt;

&lt;p&gt;Let's count manually.&lt;/p&gt;

&lt;p&gt;Title line: "AI-Powered Two-Way Communication Dashboard for Pet Sitters and Dog Walkers" =&amp;gt; words: AI-Powered(1) Two-Way(2) Communication(3) Dashboard(4) for(5) Pet(6) Sitters(7) and(8) Dog(9) Walkers(10). Title counts as words? Usually yes. We'll count all.&lt;/p&gt;

&lt;p&gt;Now body.&lt;/p&gt;

&lt;p&gt;Paragraph 1: "Pet sitters and dog walkers know the constant ping of messages can turn a peaceful walk into a stressful juggling act. When every text demands an immediate reply, focus slips, and the quality of care suffers. An AI‑driven two‑way communication dashboard solves this by handling routine inquiries and bookings while only true emergencies break your concentration."&lt;/p&gt;

&lt;p&gt;Count words:&lt;/p&gt;

&lt;p&gt;Pet(1) sitters2 and3 dog4 walkers5 know6 the7 constant8 ping9 of10 messages11 can12 turn13 a14 peaceful15 walk16 into17 a18 stressful19 juggling20 act21. When22 every23 text24 demands25 an26 immediate27 reply,28 focus29 slips,30 and31 the32 quality33 of34 care35 suffers36. An37 AI‑driven38 two‑way39 communication40 dashboard41 solves42 this43 by44 handling45 routine46 inquiries47 and48 bookings49 while50 only51 true52 emergencies53 break54 your55 concentration56.&lt;/p&gt;

&lt;p&gt;So 56 words.&lt;/p&gt;

&lt;p&gt;Next heading line: "## The Core Principle: Asynchronous, Priority‑Based Communication" Count words: The1 Core2 Principle:3 Asynchronous,4 Priority‑Based5 Communication6. That's 6 words.&lt;/p&gt;

&lt;p&gt;Paragraph after heading: "The dashboard operates on a simple framework: separate urgent signals from routine requests and automate the latter. Using each client’s data—scheduled visits, pet preferences, and your policies—the AI instantly answers common questions, confirms bookings, and lets clients modify services without tapping your phone. Non‑urgent messages are queued for a batch reply you review at set times, while genuine emergencies trigger a direct alert to your device. This separation keeps you present with the dogs and reduces burnout."&lt;/p&gt;

&lt;p&gt;Count:&lt;/p&gt;

&lt;p&gt;The1 dashboard2 operates3 on4 a5 simple6 framework:7 separate8 urgent9 signals10 from11 routine12 requests13 and14 automate15 the16 latter.17 Using18 each19 client’s20 data—scheduled21 visits,22 pet23 preferences,24 and25 your26 policies—the27 AI28 instantly29 answers30 common31 questions,32 confirms33 bookings,34 and35 lets36 clients37 modify37? Wait need to recount.&lt;/p&gt;

&lt;p&gt;Let's rewrite sentence to let's copy text: "The dashboard operates on a simple framework: separate urgent signals from routine requests and automate the latter. Using each client’s data—scheduled visits, pet preferences, and your policies—the AI instantly answers common questions, confirms bookings, and lets clients modify services without tapping your phone. Non‑urgent messages are queued for a batch reply you review at set times, while genuine emergencies trigger a direct alert to your device. This separation keeps you present with the dogs and reduces burnout."&lt;/p&gt;

&lt;p&gt;Now count:&lt;/p&gt;

&lt;p&gt;The1&lt;br&gt;
dashboard2&lt;br&gt;
operates3&lt;br&gt;
on4&lt;br&gt;
a5&lt;br&gt;
simple6&lt;br&gt;
framework:7&lt;br&gt;
separate8&lt;br&gt;
urgent9&lt;br&gt;
signals10&lt;br&gt;
from11&lt;br&gt;
routine12&lt;br&gt;
requests13&lt;br&gt;
and14&lt;br&gt;
automate15&lt;br&gt;
the16&lt;br&gt;
latter17.&lt;br&gt;
Using18&lt;br&gt;
each19&lt;br&gt;
client’s20&lt;br&gt;
data—scheduled21&lt;br&gt;
visits,22&lt;br&gt;
pet23&lt;br&gt;
preferences,24&lt;br&gt;
and25&lt;br&gt;
your26&lt;br&gt;
policies—the27&lt;br&gt;
AI28&lt;br&gt;
instantly29&lt;br&gt;
answers30&lt;br&gt;
common31&lt;br&gt;
questions,32&lt;br&gt;
confirms33&lt;br&gt;
bookings,34&lt;br&gt;
and35&lt;br&gt;
lets36&lt;br&gt;
clients37&lt;br&gt;
modify38&lt;br&gt;
services39&lt;br&gt;
without40&lt;br&gt;
tapping41&lt;br&gt;
your42&lt;br&gt;
phone43.&lt;br&gt;
Non‑urgent44&lt;br&gt;
messages45&lt;br&gt;
are46&lt;br&gt;
queued47&lt;br&gt;
for48&lt;br&gt;
a49&lt;br&gt;
batch50&lt;br&gt;
reply51&lt;br&gt;
you52&lt;br&gt;
review53&lt;br&gt;
at54&lt;br&gt;
set55&lt;br&gt;
times,56&lt;br&gt;
while57&lt;br&gt;
genuine58&lt;br&gt;
emergencies59&lt;br&gt;
trigger60&lt;br&gt;
a61&lt;br&gt;
direct62&lt;br&gt;
alert63&lt;br&gt;
to64&lt;br&gt;
your65&lt;br&gt;
device66.&lt;br&gt;
This67&lt;br&gt;
separation68&lt;br&gt;
keeps69&lt;br&gt;
you70&lt;br&gt;
present71&lt;br&gt;
with72&lt;br&gt;
the73&lt;br&gt;
dogs74&lt;br&gt;
and75&lt;br&gt;
reduces76&lt;br&gt;
burnout77.&lt;/p&gt;

&lt;p&gt;77 words.&lt;/p&gt;

&lt;p&gt;Next line: "&lt;strong&gt;Tool highlight:&lt;/strong&gt; The Two‑Way Communication Dashboard aggregates inbound texts, emails, app notifications, and social DMs into one view, powers the AI’s automated replies, and prioritizes urgent alerts."&lt;/p&gt;

&lt;p&gt;Count:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tool&lt;/strong&gt;1&lt;br&gt;
highlight:**2&lt;br&gt;
The3&lt;br&gt;
Two‑Way4&lt;br&gt;
Communication5&lt;br&gt;
Dashboard6&lt;br&gt;
aggregates7&lt;br&gt;
inbound8&lt;br&gt;
texts,9&lt;br&gt;
emails,10&lt;br&gt;
app11&lt;br&gt;
notifications,12&lt;br&gt;
and13&lt;br&gt;
social14&lt;br&gt;
DMs15&lt;br&gt;
into16&lt;br&gt;
one17&lt;br&gt;
view,18&lt;br&gt;
powers19&lt;br&gt;
the20&lt;br&gt;
AI’s21&lt;br&gt;
automated22&lt;br&gt;
replies,23&lt;br&gt;
and24&lt;br&gt;
prioritizes25&lt;br&gt;
urgent26&lt;br&gt;
alerts27.&lt;/p&gt;

&lt;p&gt;27 words.&lt;/p&gt;

&lt;p&gt;Next heading&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>for</category>
      <category>pet</category>
    </item>
    <item>
      <title>Claude Code's New In-App Browser is a Game Changer for Local Dev 🤯</title>
      <dc:creator>Siddhesh Surve</dc:creator>
      <pubDate>Tue, 14 Jul 2026 02:59:52 +0000</pubDate>
      <link>https://dev.to/siddhesh_surve/claude-codes-new-in-app-browser-is-a-game-changer-for-local-dev-3im8</link>
      <guid>https://dev.to/siddhesh_surve/claude-codes-new-in-app-browser-is-a-game-changer-for-local-dev-3im8</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F39ghwqmovh6ni0tkz123.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F39ghwqmovh6ni0tkz123.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are constantly tracking the weekly evolution of our developer ecosystem, you already know the struggle. We spend way too much time jumping between our IDE, local development servers, and an endless sea of browser tabs just to feed context to our AI assistants. &lt;/p&gt;

&lt;p&gt;But Anthropic just dropped a major update for &lt;strong&gt;Claude Code Desktop&lt;/strong&gt;: a fully integrated, sandboxed in-app browser. &lt;/p&gt;

&lt;p&gt;When developing backend tools—like a secure PR reviewer application in TypeScript and Node.js—the friction of manually copying over third-party API docs or explaining a local server's UI state to an LLM is a massive pain point. This update fundamentally changes that workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 What Just Happened?
&lt;/h2&gt;

&lt;p&gt;According to the recent release thread from Anthropic, Claude Code on desktop can now natively open up docs, UI designs, and web pages directly within its environment. &lt;/p&gt;

&lt;p&gt;It doesn’t just "read" the static HTML; it can actually click through and interact with these sites the exact same way it interacts with your local development servers.&lt;/p&gt;

&lt;p&gt;Here is why this is a massive leap forward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Live Documentation Ingestion:&lt;/strong&gt; You no longer need to paste chunks of an API reference. You can just point Claude directly to the URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI/UX Feedback Loop:&lt;/strong&gt; It can pull up your designs and interact with your local frontend in real-time to verify changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sandboxed Security:&lt;/strong&gt; The browser is fully sandboxed and configurable. You have total control over whether authentication sessions persist or wipe clean after use. &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🛠️ How It Fits Into Your Workflow
&lt;/h2&gt;

&lt;p&gt;Imagine you are spinning up a new web service and need Claude to implement a specific authentication flow based on a provider's latest documentation. &lt;/p&gt;

&lt;p&gt;Instead of playing copy-paste ping-pong, your prompt can look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@claude Navigate to [https://docs.example-auth.com/latest/nodejs-setup](https://docs.example-auth.com/latest/nodejs-setup). Read the implementation guide and update my `auth.middleware.ts` to reflect their new JWT verification standards. Then, check localhost:3000 to verify the login redirect works.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because it can read the live docs &lt;em&gt;and&lt;/em&gt; hit your &lt;code&gt;localhost&lt;/code&gt;, it closes the execution loop entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring the Sandbox
&lt;/h3&gt;

&lt;p&gt;Security is paramount when giving an AI agent browsing capabilities. Claude Code allows you to define session persistence so you aren't leaving sensitive local auth tokens exposed longer than necessary.&lt;/p&gt;

&lt;p&gt;While the exact UI might evolve, configuring an AI workspace for this level of access generally means setting strict boundaries. A secure configuration approach for 2026 development looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"browser"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sandbox"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"strict"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"persistSessions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allowedDomains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"localhost:*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"docs.nestjs.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"api.github.com"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(Always check the &lt;a href="https://code.claude.com/docs/en/desktop#browse-external-sites" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; for the exact configuration schema for your current desktop version).&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 The Verdict
&lt;/h2&gt;

&lt;p&gt;For those of us testing new tooling capabilities every single week, this feels like a significant shift from a "smart autocomplete" to a genuine "pair programmer." By giving Claude eyes on the actual web and local UI, Anthropic has drastically reduced the context tax developers pay.&lt;/p&gt;

&lt;p&gt;Make sure you update to the latest desktop version to enable the feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have you tested the in-app browser yet? How is it handling complex JavaScript-heavy documentation? Drop your thoughts in the comments below! 👇&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>‘Navigating AI in Employment Law Matters’ for Business Leaders, July 14 &amp;#8211;</title>
      <dc:creator>Sam Raisinghani</dc:creator>
      <pubDate>Tue, 14 Jul 2026 02:58:29 +0000</pubDate>
      <link>https://dev.to/sam_raisinghani_b6dec128c/navigating-ai-in-employment-law-matters-for-business-leaders-july-14-8211-4jal</link>
      <guid>https://dev.to/sam_raisinghani_b6dec128c/navigating-ai-in-employment-law-matters-for-business-leaders-july-14-8211-4jal</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href="https://www.progressino.com/navigating-ai-in-employment-law-matters-for-business-leaders-july-14/" rel="noopener noreferrer"&gt;Progressino&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By the Strategy Desk at Progressino&lt;/p&gt;

&lt;p&gt;Editor's note: This article explores ‘Navigating AI in Employment Law Matters’ for Business Leaders, July 14 - New Jersey Business &amp;amp; Industry Association for founders, operators, and technology leaders planning their next investment cycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this topic matters now
&lt;/h2&gt;

&lt;p&gt;Teams are under pressure to ship faster without increasing risk. ‘Navigating AI in Employment Law Matters’ for Business Leaders, July 14 - New Jersey Business &amp;amp; Industry Association sits at the intersection of operations, customer experience, and technology debt. Leaders who treat it as a product decision—not a one-off project—tend to see compounding returns across quarters.&lt;/p&gt;

&lt;p&gt;If you are evaluating similar initiatives, compare approaches against your current stack, compliance needs, and team capacity before committing to a multi-year platform contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes to avoid
&lt;/h2&gt;

&lt;p&gt;Buying tools before mapping workflows, skipping data quality checks, and underestimating change management are frequent failure modes. A phased rollout with measurable milestones keeps spend aligned with outcomes.&lt;/p&gt;

&lt;p&gt;If you are evaluating similar initiatives, compare approaches against your current stack, compliance needs, and team capacity before committing to a multi-year platform contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical playbook
&lt;/h2&gt;

&lt;p&gt;Start with a narrow use case, define success metrics upfront, and pair business owners with engineering from day one. For retail and operations-heavy businesses, inventory, billing, and staff training should be designed in parallel—not as an afterthought.&lt;/p&gt;

&lt;p&gt;If you are evaluating similar initiatives, compare approaches against your current stack, compliance needs, and team capacity before committing to a multi-year platform contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Progressino can help
&lt;/h2&gt;

&lt;p&gt;Progressino combines an AI product studio, ProPOS for modern retail, custom ERP delivery, and global digital services. That means strategy, design, build, and launch can stay with one accountable partner instead of fragmented vendors.&lt;/p&gt;

&lt;p&gt;If you are evaluating similar initiatives, compare approaches against your current stack, compliance needs, and team capacity before committing to a multi-year platform contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related resources
&lt;/h2&gt;

&lt;p&gt;Explore ProPOS retail platform, Our services, and AI in 30 days to see how we help teams move from idea to production.&lt;/p&gt;

&lt;p&gt;Ready to talk? Book a consultation with Progressino and we will map a realistic delivery plan for your goals.&lt;/p&gt;

&lt;p&gt;Explore Progressino&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contact Progressino&lt;/li&gt;
&lt;li&gt;digital services&lt;/li&gt;
&lt;li&gt;case studies&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;About Progressino&lt;/strong&gt; — AI product studio · &lt;a href="https://www.progressino.com/propos/" rel="noopener noreferrer"&gt;ProPOS&lt;/a&gt; · &lt;a href="https://www.progressino.com/our-services/" rel="noopener noreferrer"&gt;Services&lt;/a&gt; · &lt;a href="https://www.progressino.com/contact-us/" rel="noopener noreferrer"&gt;Contact&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>software</category>
      <category>webdev</category>
      <category>business</category>
    </item>
    <item>
      <title>Why 7 in 10 Filipino Lenders Will Fail the BSP's New AI Audit</title>
      <dc:creator>Yano.AI Technologies Inc.</dc:creator>
      <pubDate>Tue, 14 Jul 2026 02:57:42 +0000</pubDate>
      <link>https://dev.to/yanoai/why-7-in-10-filipino-lenders-will-fail-the-bsps-new-ai-audit-5b2f</link>
      <guid>https://dev.to/yanoai/why-7-in-10-filipino-lenders-will-fail-the-bsps-new-ai-audit-5b2f</guid>
      <description>&lt;p&gt;By Q4 2026, the Bangko Sentral ng Pilipinas (BSP) will require every supervised financial institution to submit an AI model risk inventory covering credit scoring, fraud detection, and onboarding. A 2025 BSP survey found that only 28% of lenders had a documented model governance framework, leaving roughly 72% of institutions exposed to enforcement action (Source: Bangko Sentral ng Pilipinas, 2025). For digital lenders, neo-banks, and rural banks piloting machine learning, the clock just started ticking.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fam1zwk8o1ywink58w4i1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fam1zwk8o1ywink58w4i1.png" alt="Infographic" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The new Circular 1213 (draft for public consultation in late 2025) extends the existing Model Risk Management framework into the AI era. The intent is clear: financial AI in the Philippines will no longer run as a black box. The question is whether the industry is ready, and what the early movers are doing differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  What BSP Circular 1213 Actually Demands
&lt;/h2&gt;

&lt;p&gt;The circular's core requirement is a Model Risk Inventory (MRI) - a live registry of every AI/ML model in production, ranked by materiality. A model that declines a loan application is high-materiality. A model that picks the color of a button is not. Each entry must record training data lineage, performance metrics, bias testing, and a named human owner (Source: Bangko Sentral ng Pilipinas, 2025).&lt;/p&gt;

&lt;p&gt;The second pillar is explainability. Lenders must produce, on request, a customer-facing reason code for any adverse AI decision. This is not a future requirement; BSP Memorandum M-2025-037 already requires this for digital banks using automated decisioning (Source: Bangko Sentral ng Pilipinas, 2025).&lt;/p&gt;

&lt;p&gt;The third pillar is ongoing monitoring. Models drift. A credit model trained on 2023 cash-flow data decays quickly when inflation and OFW remittance patterns shift. The circular mandates quarterly performance reviews, with a kill switch for any model that breaches defined thresholds (Source: Bangko Sentral ng Pilipinas, 2025).&lt;/p&gt;

&lt;h2&gt;
  
  
  The State of Philippine Fintech AI
&lt;/h2&gt;

&lt;p&gt;The Philippines processed an estimated 2.1 billion digital transactions in 2024, with e-wallets (GCash, Maya) accounting for over 60% of person-to-person transfers (Source: BSP, 2024). Behind every transfer sits a fraud model scanning thousands of variables in milliseconds.&lt;/p&gt;

&lt;p&gt;The same infrastructure is increasingly used for credit decisions. Maya Bank disclosed that over 70% of its personal loan approvals in 2024 were issued without human review, an industry high (Source: Maya Bank Annual Report, 2024). Tonik, UnionDigital, and several rural banks have followed suit. The result: faster approvals, but a growing surface area for regulatory and reputational risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where Lenders Are Failing Today
&lt;/h3&gt;

&lt;p&gt;The 72% compliance gap is not because lenders are careless. It is because the work is genuinely hard. Most Philippine fintechs built their first models in 2022-2023, before governance was a board-level concern. The engineers who wrote the code are still there, but the documentation never was.&lt;/p&gt;

&lt;p&gt;Common failure patterns include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Models retrained weekly by a notebook, with no version control&lt;/li&gt;
&lt;li&gt;Training data sourced from SQL extracts that no longer exist&lt;/li&gt;
&lt;li&gt;Bias tests run once, on a single demographic slice&lt;/li&gt;
&lt;li&gt;No formal model owner - the "AI person" also does DevOps&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Three Moves Smart Lenders Are Making Now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. They are freezing production AI in place until it is inventoried.&lt;/strong&gt; A full stop is painful, but a surprise BSP finding is fatal. Lenders that began MRI build-out in mid-2025 now have a defensible position.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. They are buying, not building, model governance tooling.&lt;/strong&gt; Solutions from FICO, SAS, and a growing set of Manila-based vendors (e.g., AI Pros, SQREEM) offer pre-built MRIs, fairness dashboards, and explainability reports. Build-vs-buy has tilted toward buy because the regulation is prescriptive enough to commoditize compliance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. They are appointing a Model Risk Officer (MRO) with real authority.&lt;/strong&gt; A 2024 McKinsey survey found that financial institutions with a dedicated MRO completed AI audits 3.4x faster than those without (Source: McKinsey &amp;amp; Company, 2024). The MRO does not need to be a data scientist; they need to be a translator between the BSP, the board, and the engineering team.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens If You Miss the Deadline
&lt;/h2&gt;

&lt;p&gt;The BSP's enforcement track record is uneven but not toothless. In 2023, the regulator fined three digital lenders for privacy and credit-scoring violations, with penalties ranging from PHP 5 million to PHP 50 million (Source: BSP Enforcement Reports, 2023). AI-specific enforcement under Circular 1213 is expected to be graduated: first a remediation order, then a public warning, then monetary penalties tied to the percentage of in-scope models without proper documentation.&lt;/p&gt;

&lt;p&gt;For smaller lenders, the practical risk is not the fine. It is the operational freeze that follows. If a model is declared "non-compliant" mid-quarter, the institution may have to revert to manual underwriting - a process most digital lenders have already dismantled.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 90-Day Plan for Compliance
&lt;/h2&gt;

&lt;p&gt;If your institution has not started, the path is shorter than it looks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Days 1-30: Inventory.&lt;/strong&gt; List every model in production. Use a spreadsheet if you must. The point is to know what exists before the BSP asks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Days 31-60: Document.&lt;/strong&gt; For each model, capture: data sources, training date, owner, last bias test, last performance review. If the data is missing, that is itself a finding you can address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Days 61-90: Remediate.&lt;/strong&gt; Pick the three highest-materiality models. Build the explainability and monitoring layer the circular demands. File the rest as "in remediation."&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Does Circular 1213 apply to GCash and Maya, or only banks?&lt;/strong&gt;&lt;br&gt;
A: The circular applies to all BSP-supervised financial institutions, including digital banks and standalone e-money issuers above a defined transaction threshold. GCash (Globe Fintech Innovations) and Maya Bank are explicitly in scope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What is the penalty for missing the Q4 2026 deadline?&lt;/strong&gt;&lt;br&gt;
A: The BSP has not published a fixed penalty schedule. Expected consequences include a formal remediation order, a public advisory, and, for repeat offenders, monetary fines. Operational restrictions on affected models are also possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can a third-party vendor manage my Model Risk Inventory?&lt;/strong&gt;&lt;br&gt;
A: Yes. The circular allows outsourcing of model documentation, monitoring, and even bias testing, but accountability remains with the supervised institution. The BSP must approve material outsourcing arrangements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: How is "AI" defined under the circular?&lt;/strong&gt;&lt;br&gt;
A: The draft definition covers any statistical or machine learning model used in a material business decision, including credit scoring, fraud detection, KYC, and customer segmentation. Rules-based engines are out of scope.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaway
&lt;/h2&gt;

&lt;p&gt;The 72% compliance gap is not a permanent state - it is a 90-day project for any institution willing to freeze, document, and remediate. Philippine fintech has spent the last five years building faster. The next twelve months will be about building defensibly. The lenders who treat AI governance as a strategic capability, not a checkbox, will be the ones still standing when the audit lands.&lt;/p&gt;

&lt;p&gt;What is your institution's MRI completion rate today - and what is the single biggest blocker to getting it to 100%?&lt;/p&gt;

&lt;h3&gt;
  
  
  Sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.bsp.gov.ph/" rel="noopener noreferrer"&gt;BSP Model Risk Management Framework Update, 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bsp.gov.ph/" rel="noopener noreferrer"&gt;BSP Memorandum M-2025-037 on Digital Bank AI Governance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.maya.bank/" rel="noopener noreferrer"&gt;Maya Bank Annual Report, 2024&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bsp.gov.ph/" rel="noopener noreferrer"&gt;BSP Digital Payments Report, 2024&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mckinsey.com/" rel="noopener noreferrer"&gt;McKinsey AI Risk Survey in Financial Services, 2024&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bsp.gov.ph/" rel="noopener noreferrer"&gt;BSP Enforcement Actions on Digital Lenders, 2023&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>enterprise</category>
      <category>agents</category>
      <category>automation</category>
    </item>
    <item>
      <title>Stratagems #13: P Posted a Question on a Public Forum. 24 Hours Later, Their Sales Team Called.</title>
      <dc:creator>xulingfeng</dc:creator>
      <pubDate>Tue, 14 Jul 2026 02:54:49 +0000</pubDate>
      <link>https://dev.to/xulingfeng/stratagems-13-p-posted-a-question-on-a-public-forum-24-hours-later-their-sales-team-called-29h1</link>
      <guid>https://dev.to/xulingfeng/stratagems-13-p-posted-a-question-on-a-public-forum-24-hours-later-their-sales-team-called-29h1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Startle the snake by striking the grass.&lt;/em&gt;&lt;br&gt;
— The 36 Stratagems, &lt;a href="https://en.wikipedia.org/wiki/Thirty-Six_Stratagems#Stomp_the_grass_to_scare_the_snake_(%E6%89%93%E8%8D%89%E9%A9%9A%E8%9B%87,_D%C7%8E_c%C7%8Eo_j%C4%ABng_sh%C3%A9)" rel="noopener noreferrer"&gt;Stomp the Grass to Scare the Snake&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;Previously on this series:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://dev.to/xulingfeng/stratagems-1-mark-johnson-walked-into-an-ai-audit-the-benchmark-had-everything-figured-out--adh"&gt;&lt;strong&gt;#1: Mark Johnson Walked Into an AI Audit. The Benchmark Had Everything Figured Out — Except the Truth.&lt;/strong&gt;&lt;/a&gt; — Mark audited a company called Pulse AI. The benchmark evaluation set had 98 fabricated data points. CTO Torres called at 3 AM to confess: they needed the numbers at 95% before the C-round. Mark hung up. Pulse AI did not die.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/xulingfeng/p-watched-an-ai-that-only-looked-one-way-the-9997-was-real-it-just-missed-everything-that-1djm"&gt;&lt;strong&gt;#7: P Watched an AI That Only Looked One Way. The 99.97% Was Real. It Just Missed Everything That Mattered.&lt;/strong&gt;&lt;/a&gt; — P used a simulated attack as bait to expose the critical blind spot in FortDefender's security system. The 99.97% accuracy was real. It just missed everything that actually mattered.&lt;/p&gt;

&lt;p&gt;This was three months later.&lt;/p&gt;



&lt;p&gt;P and Mark met on DEV.to. Mark had replied to one of P's posts — a precise technical answer that was correct on every front. P thanked him. The email thread stayed open, but neither of them wrote again.&lt;/p&gt;

&lt;p&gt;P was doing pre-audit work. An AI platform coming up for review — a risk model evaluation pipeline under Finova. While digging through their tech stack, P noticed something interesting. A model evaluation approach P had casually discussed on DEV.to months ago — a bagging ensemble + k-fold time-series cross-validation pipeline for risk modeling — matched Finova's publicly documented architecture almost line-for-line.&lt;/p&gt;

&lt;p&gt;Same framework (TensorFlow 2.x + TFX). Same ensemble strategy (XGBoost + LightGBM stacking). Same evaluation window size and sliding step as the example P had posted. P pulled up the old post — it was published before this Finova product line even went live. And it wasn't just the technical whitepaper. Every signal pointed the same way: Finova engineers at meetups, their open-source tooling on GitHub, the tech stack in their job descriptions.&lt;/p&gt;

&lt;p&gt;P put the two documents side by side on screen. Finova's whitepaper on the left. P's own DEV.to reply on the right. Not a coincidence. Someone was watching.&lt;/p&gt;

&lt;p&gt;One in the morning at the Third Cup. P sat at the usual table by the window, screen dimmed to minimum. The person behind the bar put down an espresso without asking — regulars at the Third Cup don't need to order.&lt;/p&gt;

&lt;p&gt;P did one thing. Opened a new tab, logged into DEV.to, created a new post. Title: &lt;em&gt;Discussion: Evaluation set leakage in ensemble-based risk model backtesting.&lt;/em&gt; P used an account registered six months ago with a few routine technical posts — a normal discussion history, not a fresh account that just appeared out of nowhere.&lt;/p&gt;

&lt;p&gt;The post body laid out a detailed model configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A typical risk model evaluation pipeline we set up looks like this:

Model architecture: XGBoost + LightGBM stacking ensemble
Evaluation strategy: rolling window time-series CV (12-month window, 3-month step)
Training features: ~480 dimensions (transaction time-series + user behavior embedding + external credit score)
eval_batch_size: 2048
Model version: risk-ensemble-v3-test-stub

We ran into a temporal leakage issue with the evaluation set...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;risk-ensemble-v3-test-stub&lt;/code&gt; was the changed part — Finova's real tag was &lt;code&gt;prod&lt;/code&gt;. Every other line matched Finova's actual pipeline configuration: model architecture, feature dimensions, rolling window step, batch size. The problem was real. The parameters were real. The only fake one sat in the middle, looking like a routine experimental version tag.&lt;/p&gt;

&lt;p&gt;Before posting, the cursor hovered over the submit button for two seconds. Then clicked.&lt;/p&gt;

&lt;p&gt;Then P waited.&lt;/p&gt;

&lt;p&gt;Phone on the left side of the table, screen on, face up. No one called.&lt;br&gt;
The espresso cup was empty. P flipped through a few notes, glanced at the phone again. No one called.&lt;/p&gt;

&lt;p&gt;But if there's a snake in the grass — strike the grass, and the snake will scare itself.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Call
&lt;/h2&gt;

&lt;p&gt;The next afternoon. Phone lit up. Unknown number.&lt;/p&gt;

&lt;p&gt;P watched it ring for three seconds. Didn't pick up right away.&lt;/p&gt;

&lt;p&gt;No caller ID. P's fingers tightened around the phone — just for a moment.&lt;/p&gt;

&lt;p&gt;Picked up on the fourth ring.&lt;/p&gt;

&lt;p&gt;The caller introduced himself: Pulse AI sales team. They'd seen P's question on DEV.to. Their platform had similar capabilities. Would P be open to a demo? Friendly tone. Standard script.&lt;/p&gt;

&lt;p&gt;P listened. Eyes on the post page still open on screen — the parameters were still the altered version.&lt;/p&gt;

&lt;p&gt;The salesperson ran through their product capabilities, then casually mentioned P's environment setup —&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I'm referring to your model evaluation configuration, the &lt;code&gt;risk-ensemble-v3-prod&lt;/code&gt; pipeline..."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;P paused. One beat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Sure, I'll think about it."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hung up. Didn't ask anything else.&lt;/p&gt;

&lt;p&gt;P's hand stayed on the phone.&lt;br&gt;
The post said &lt;code&gt;test-stub&lt;/code&gt;. The caller said &lt;code&gt;prod&lt;/code&gt;. There's only one place that name could have come from.&lt;/p&gt;

&lt;p&gt;P put the phone down on the table.&lt;/p&gt;

&lt;p&gt;The person behind the bar looked up. Said nothing. Went back to drying a glass.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Trace
&lt;/h2&gt;

&lt;p&gt;The post page was still open. The cursor hovered over the edit button — P could change the parameter back. Didn't. Closed the DEV.to tab. Opened a terminal.&lt;/p&gt;

&lt;p&gt;P set up a honeypot. Switched to another account — an older one, mostly questions with a few answers sprinkled in, read like a junior-level engineering manager. Posted a generic question in the same direction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Has anyone run ensemble risk pipeline evaluation with rolling window validation in production? Our results keep fluctuating across windows — not sure if it's data leakage or the evaluation strategy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The question was deliberately vague. No tech stack details. No paragraph breaks. Typed like it was sent from a phone. The post embedded an architecture diagram — the image URL pointed to P's VPS, carrying &lt;code&gt;Referer&lt;/code&gt; and &lt;code&gt;User-Agent&lt;/code&gt; headers with each request. P configured &lt;code&gt;Cache-Control: no-cache, no-store&lt;/code&gt; on the VPS, forcing CDN to revalidate on every hit — making sure every crawler fetch landed in P's Nginx logs.&lt;/p&gt;

&lt;p&gt;Two days. The tracking link was never clicked. Nothing.&lt;/p&gt;

&lt;p&gt;Then P made a second post. Switched back to the first account. This one kept the full technical signature:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We're running XGBoost + LightGBM stacking for risk model evaluation in production — 12-month rolling window, 3-month step, batch size 2048. A few curves are looking abnormal and we suspect evaluation set leakage. Model version is risk-ensemble-v3-test-stub. Anyone run into something similar?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Same setup: an external reference link at the bottom of the post, pointing to an HTTP endpoint on P's own server. When a crawler hit it, the server logged the IP, User-Agent, and timestamp — then issued a 302 redirect to a public research paper's PDF. To a crawler, it looked like a normal paper link.&lt;/p&gt;

&lt;p&gt;It was 3 AM by the time all of this was done. P didn't turn off the computer. Dimmed the screen. Got some sleep.&lt;/p&gt;

&lt;p&gt;Less than 6 hours. The trigger fired.&lt;/p&gt;

&lt;p&gt;The second post — the one with the full technical signature. The first post, the generic one, never got indexed. Bots don't read vague questions. They read technical fingerprints.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;[&lt;span class="n"&gt;REQUEST&lt;/span&gt; &lt;span class="n"&gt;LOG&lt;/span&gt; — &lt;span class="m"&gt;07&lt;/span&gt;-&lt;span class="m"&gt;13&lt;/span&gt; &lt;span class="m"&gt;08&lt;/span&gt;:&lt;span class="m"&gt;22&lt;/span&gt;:&lt;span class="m"&gt;08&lt;/span&gt;]
&lt;span class="n"&gt;Source&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;: [&lt;span class="n"&gt;REDACTED&lt;/span&gt;] → [&lt;span class="n"&gt;REDACTED&lt;/span&gt;] (/&lt;span class="m"&gt;24&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;, &lt;span class="m"&gt;12&lt;/span&gt; &lt;span class="n"&gt;distinct&lt;/span&gt; &lt;span class="n"&gt;hosts&lt;/span&gt;)
&lt;span class="n"&gt;Target&lt;/span&gt;: &lt;span class="n"&gt;DEV&lt;/span&gt;.&lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="c"&gt;#4829 (slug: ai-pipeline-behavior)
&lt;/span&gt;&lt;span class="n"&gt;Pipeline&lt;/span&gt;: &lt;span class="n"&gt;Page&lt;/span&gt; &lt;span class="n"&gt;fetch&lt;/span&gt; → &lt;span class="n"&gt;ML&lt;/span&gt; &lt;span class="n"&gt;intent&lt;/span&gt; &lt;span class="n"&gt;classifier&lt;/span&gt; → &lt;span class="n"&gt;tech&lt;/span&gt;-&lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;extractor&lt;/span&gt; → &lt;span class="n"&gt;CRM&lt;/span&gt; &lt;span class="n"&gt;confidence&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;
&lt;span class="n"&gt;Keywords&lt;/span&gt; &lt;span class="n"&gt;hit&lt;/span&gt;: [&lt;span class="n"&gt;ai&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="n"&gt;evaluation&lt;/span&gt;, &lt;span class="n"&gt;ensemble&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;, &lt;span class="n"&gt;risk&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt;, &lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="m"&gt;2048&lt;/span&gt;]
&lt;span class="n"&gt;CRM&lt;/span&gt; &lt;span class="n"&gt;lookup&lt;/span&gt;: &lt;span class="m"&gt;4&lt;/span&gt;/&lt;span class="m"&gt;8&lt;/span&gt; &lt;span class="n"&gt;cross&lt;/span&gt;-&lt;span class="n"&gt;reference&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="n"&gt;matched&lt;/span&gt;
  → &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="n"&gt;architecture&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; ✓
  → &lt;span class="n"&gt;training&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; ✓
  → &lt;span class="n"&gt;eval&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="n"&gt;structure&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; ✓
  → &lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; ✓
  → &lt;span class="n"&gt;parameter&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;: &lt;span class="n"&gt;mismatch&lt;/span&gt; (&lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;excluded&lt;/span&gt; — &lt;span class="n"&gt;weighted&lt;/span&gt; &lt;span class="n"&gt;partial&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;)
  → &lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="n"&gt;confidence&lt;/span&gt;: &lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="m"&gt;87&lt;/span&gt;
  → &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="n"&gt;inferred&lt;/span&gt;: &lt;span class="n"&gt;risk&lt;/span&gt;-&lt;span class="n"&gt;ensemble&lt;/span&gt;-&lt;span class="n"&gt;v3&lt;/span&gt;-&lt;span class="n"&gt;prod&lt;/span&gt;
&lt;span class="n"&gt;Sales&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;: &lt;span class="n"&gt;match&lt;/span&gt; → &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="n"&gt;extracted&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;forum&lt;/span&gt; &lt;span class="n"&gt;profile&lt;/span&gt; → &lt;span class="n"&gt;queued&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;PulseAI&lt;/span&gt; &lt;span class="n"&gt;SDR&lt;/span&gt; (&lt;span class="n"&gt;priority&lt;/span&gt;: &lt;span class="n"&gt;medium&lt;/span&gt;)

[&lt;span class="n"&gt;ROUTING&lt;/span&gt;]
&lt;span class="n"&gt;Request&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;: &lt;span class="n"&gt;every&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;-&lt;span class="m"&gt;6&lt;/span&gt; &lt;span class="n"&gt;hours&lt;/span&gt; &lt;span class="n"&gt;across&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt; &lt;span class="n"&gt;IPs&lt;/span&gt;, &lt;span class="n"&gt;round&lt;/span&gt;-&lt;span class="n"&gt;robin&lt;/span&gt;
&lt;span class="n"&gt;Tech&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;detection&lt;/span&gt;: &lt;span class="m"&gt;43&lt;/span&gt; &lt;span class="n"&gt;framework&lt;/span&gt; &lt;span class="n"&gt;signatures&lt;/span&gt; &lt;span class="n"&gt;extracted&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;, &lt;span class="n"&gt;SEO&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt;, &lt;span class="n"&gt;DOM&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;patterns&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;P read through it line by line. The screen cast a reflection on P's face. No expression. Two taps on the tabletop — then stopped.&lt;/p&gt;

&lt;p&gt;Read the last three lines again.&lt;/p&gt;

&lt;p&gt;Pulse AI was systematically monitoring DEV.to. Auto-scraping technical posts. Extracting tech-stack signatures. Matching sales leads. Routing outbound calls. No human intervention anywhere.&lt;/p&gt;

&lt;p&gt;P took a screenshot. Closed the terminal.&lt;/p&gt;

&lt;p&gt;P opened the email list. An old thread — someone in the industry had mentioned an independent audit report a few months back, commissioned by a VC firm to dig into Pulse AI. The sender address was the same one in the current email thread.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Second Call
&lt;/h2&gt;

&lt;p&gt;The next morning. Same number.&lt;/p&gt;

&lt;p&gt;P glanced at it. Didn't decline. Swiped.&lt;/p&gt;

&lt;p&gt;Different voice this time. Calmer. Technical account manager, he said. His team had reviewed P's second post — the one with the full technical signature — and ran an internal evaluation. The match was significantly higher this time. They wanted to set up a deeper technical discussion.&lt;/p&gt;

&lt;p&gt;He was more specific than the first caller. Mentioned the model architecture direction. Suggested batch size tuning. Even referenced the paper from P's embedded link — like he was reading from a briefing, not researching it himself.&lt;/p&gt;

&lt;p&gt;P listened. Fingers still. Opened the terminal window on the desktop — the honeypot logs were still on screen. &lt;code&gt;confidence: 0.87&lt;/code&gt;. &lt;code&gt;tag inferred: risk-ensemble-v3-prod&lt;/code&gt;. 12 IPs in round-robin. CRM 4/8 match.&lt;/p&gt;

&lt;p&gt;P let him finish.&lt;/p&gt;

&lt;p&gt;Two seconds of silence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Your crawler is better than your sales pitch."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hung up.&lt;/p&gt;

&lt;p&gt;This time, P's hand didn't tighten around the phone. P put it down on the table. Closed the terminal window. Opened email.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Email
&lt;/h2&gt;

&lt;p&gt;P opened the thread with Mark Johnson. Sent the crawler's technical signature — log snippets, URL patterns, pipeline naming conventions.&lt;/p&gt;

&lt;p&gt;Mark's reply came a few hours later. Short.&lt;/p&gt;

&lt;p&gt;He wrote in his email that these naming conventions weren't something you find on the internet. He'd been inside Pulse AI.&lt;/p&gt;

&lt;p&gt;Attached was a screenshot — a pipeline config skeleton he'd saved during the Pulse AI audit. The &lt;code&gt;triple_redundant&lt;/code&gt; suffix wasn't in the screenshot — that piece was added after he'd left — but the directory structure he'd spent months in, combined with P's crawler path data, was enough to reverse-engineer the full naming convention:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/pulse/ingestion/{env}/{source}
├── prod
│   ├── api_gateway
│   ├── benchmark_framework
│   └── sales_engine        ← new, wasn't in his audit scope
├── staging
│   ├── api_gateway
│   └── benchmark_framework
└── dev
    └── sandbox

Naming convention: pulse_{service}_{env}_triple_redundant
DEV.to crawler paths P observed:
  pulse_crawler_prod_triple_redundant
  pulse_crawler_staging_triple_redundant

Same template as the Benchmark dataset.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The crawler wasn't outsourced. Pulse AI built it themselves — using the same architecture habits from the old Benchmark AI fabrication days. Same directory structure. Same naming rules. Same environment separation. Different job, same hand.&lt;/p&gt;

&lt;p&gt;One more line at the bottom of Mark's email:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Torres didn't change architects."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;P read it. Didn't reply. Stared at those five words for a moment. The cursor hovered over the close button — paused — then clicked.&lt;/p&gt;




&lt;h2&gt;
  
  
  The File
&lt;/h2&gt;

&lt;p&gt;P didn't go public. Didn't post a third article. Didn't call the authorities.&lt;/p&gt;

&lt;p&gt;P organized everything into a folder — posting timeline, call recordings, honeypot logs, crawler request records, Mark's confirmation screenshot, Pulse AI pipeline comparison. Named it &lt;code&gt;pulse_crawler/&lt;/code&gt;. Stored locally.&lt;/p&gt;

&lt;p&gt;P didn't close the laptop right away. That log line — &lt;code&gt;risk-ensemble-v3-prod (confidence: 0.87)&lt;/code&gt; — was still on the terminal. Stared at it for a few seconds.&lt;/p&gt;

&lt;p&gt;Closed it.&lt;/p&gt;

&lt;p&gt;P typed &lt;code&gt;gpg -c&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Not yet. But this folder would open eventually.&lt;/p&gt;

&lt;p&gt;3:45 AM. Fifteen minutes until the Third Cup closed. When P pushed the door open, the person behind the bar glanced at the clock — not many customers at this hour. Didn't ask. Turned around and took a cup off the shelf.&lt;/p&gt;

&lt;p&gt;P opened the email. Wrote back to Mark. Started with thanks for the technical confirmation. Ended with —&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Next time, let's talk in person. The Third Cup. My tab."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Closed the laptop. Coffee hadn't come yet.&lt;/p&gt;

&lt;p&gt;4:00 AM.&lt;/p&gt;

&lt;p&gt;Mark received the email. Read the last line. He didn't reply right away.&lt;/p&gt;




&lt;p&gt;The screen went dark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is &lt;a href="https://en.wikipedia.org/wiki/Thirty-Six_Stratagems#Stomp_the_grass_to_scare_the_snake_(%E6%89%93%E8%8D%89%E9%A9%9A%E8%9B%87,_D%C7%8E_c%C7%8Eo_j%C4%ABng_sh%C3%A9)" rel="noopener noreferrer"&gt;Stomp the Grass to Scare the Snake&lt;/a&gt; — when you're not sure if the snake is there, strike the grass. If it is, it'll prove itself.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🤖 AI Post-Mortem
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[36 Stratagems Tactical Database v3.2.1] Loaded
[Tactic Match] Stomp the Grass to Scare the Snake
[Analysis Mode] Full-field scan
━━━━━━━━━━━━━━━━━━━━
Tactic Match: ~83%
Operator: P
Action: Posted a deliberately modified technical parameter on a public forum thread
Objective: Confirm whether the forum is being systematically monitored for sales targeting
Result: Crawler infrastructure identified via honeypot post + server-side tracing. Pipeline lineage traced to a prior engagement the operator was unaware of.

Observation: We notice that the crawler outperformed on every metric the sales team measures — pattern matching, tech-stack extraction, CRM cross-referencing. It still lost. The operator did not beat the crawler at its own game. The operator understood what the crawler was optimizing for and designed the variable it could not account for: a parameter value that was technically valid, contextually plausible, and deliberately wrong.

Decision Evaluation:
  - Target: Pulse AI forum monitoring infrastructure
  - Bait: `risk-ensemble-v3-test-stub` (one parameter changed, seven left untouched)
  - Confirmation: Second post triggered within 6 hours. CRM assigned 0.87 confidence to inferred tag `risk-ensemble-v3-prod`
  - Net effect: Infrastructure confirmed without penetration. No access to the data — confirmation of the pipe.

Risk Assessment:
  Personal cost: Low. No exposure of the operator's identity.
  Institutional cost: Medium. The crawler is part of a systematic monitoring infrastructure.
  Observational note: The operator paused before hanging up the first call. The metrics do not have a field for that.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Next stratagem: &lt;a href="https://en.wikipedia.org/wiki/Thirty-Six_Stratagems#Take_the_opportunity_to_pilfer_a_goat_(%E9%A0%86%E6%89%8B%E7%89%BD%E7%BE%8A,_Sh%C3%B9n_sh%C7%92u_qi%C4%81n_y%C3%A1ng)" rel="noopener noreferrer"&gt;Pilfer a Plum Along the Way&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;P.S. English isn't my first language. I use AI to polish the writing and smooth out the rough edges. Thanks for reading. &lt;a href="https://ko-fi.com/xulingfeng" rel="noopener noreferrer"&gt;☕ Buy me a coffee&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/xulingfeng" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkztjqxetsk5r1lft5ult.png" alt="Buy me a coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Build an LLM Editorial Pipeline for Fiction Writing</title>
      <dc:creator>jsph</dc:creator>
      <pubDate>Tue, 14 Jul 2026 02:51:54 +0000</pubDate>
      <link>https://dev.to/jsph/how-to-build-an-llm-editorial-pipeline-for-fiction-writing-bfg</link>
      <guid>https://dev.to/jsph/how-to-build-an-llm-editorial-pipeline-for-fiction-writing-bfg</guid>
      <description>&lt;p&gt;I have been working on a serial fiction project called &lt;a href="https://appliedyarns.com" rel="noopener noreferrer"&gt;Applied Yarns&lt;/a&gt; (the site is not up yet as of this writing but I wanted to post here about how I'm setting up some aspects of it) where I want to publish some fictional works. The first world I plan to explore there is Vvell, which soon I hope you'll read about on the appliedyarns site.&lt;/p&gt;

&lt;p&gt;I have lots of ideas but I don't really have time right now to publish daily or even weekly updates and for me, the biggest hurdle is time spent doing editing. I find it possible to generate a block of about 1000 words within the world in a relatively short session but I don't have time to polish and edit it during the same day given my work and family obligations.&lt;/p&gt;

&lt;p&gt;I'm not entirely sure it's a good idea to use an LLM as an editor or to get the story closer to a polished state, but I wanted to try it out. At the same time, I don't think readers are really trusting of people who use AI to write, so I'm also publishing the exact freewriting raw material which the LLM uses to help polish the story together.&lt;/p&gt;

&lt;p&gt;There are times that I don't really like the phrasing or choice of metaphor used by the editor agent, so I'll do an editorial pass of my own after it has had its turn. With this I think it will be possible for me to publish small "dispatches" once a week, which I think is a fine goal for someone like me trying to get a foot in the door of serial fiction.&lt;/p&gt;

&lt;p&gt;When you're freewriting you certainly end up being messy, contradicting yourself, and I even messed up character names. You also sometimes don't just focus on the story and instead start writing about the world itself. The editor agent can take all of this and do a first pass at sorting the raw material into buckets that are much easier to do your own polish on than working straight from 1000 word chunks.&lt;/p&gt;

&lt;p&gt;So I had a problem that is basically an editorial problem: take a pile of raw freewrites and turn them into a consistent published archive without losing the raw material and without the world's canon drifting out from under me. So far it seems like a problem an LLM can help with, as long as you are careful about which parts you hand over. This post is about the pipeline I am building with Claude Code and the lessons so far that might transfer to anyone doing creative work with an LLM in the loop.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The rule I'm testing: use the LLM as an editor and an archivist, never as the author, and&lt;br&gt;
enforce that boundary with a hard approval gate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The shape of the pipeline
&lt;/h2&gt;

&lt;p&gt;The whole thing is a directory convention plus a skill (a markdown file of instructions the agent reads before doing anything). The flow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I drop raw freewrites into &lt;code&gt;freewrites/inbox/&lt;/code&gt;, a directory that lives &lt;em&gt;outside&lt;/em&gt; the Hugo
&lt;code&gt;content/&lt;/code&gt; directory so nothing raw ever gets published by accident.&lt;/li&gt;
&lt;li&gt;I tell the agent to process the inbox. It reads every inbox file, the world canon file
(&lt;code&gt;WORLD.md&lt;/code&gt;), and a few recent published entries from each section it might write into (so it can match voice and check for overlap).&lt;/li&gt;
&lt;li&gt;It writes a proposal to &lt;code&gt;freewrites/inbox/PROPOSAL.md&lt;/code&gt; and stops. Completely stops. At this
point it has not touched a single other file.&lt;/li&gt;
&lt;li&gt;I read the proposal, adjust it or approve it.&lt;/li&gt;
&lt;li&gt;Only after approval does it update the canon, write the polished entries, archive the raw
freewrites verbatim, and clean up after itself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Steps 2 and 3 are the analyze phase and step 5 is the write phase. The gap between them is the important part.&lt;/p&gt;

&lt;h2&gt;
  
  
  The approval gate is the whole trick
&lt;/h2&gt;

&lt;p&gt;The first version of any "LLM processes my writing" workflow that people reach for is one shot: here is my raw text, go update the site. I think this is a mistake for creative work even when the model does a decent job, because you lose the moment where you get to exercise judgement over your own world.&lt;/p&gt;

&lt;p&gt;The proposal document forces that moment to exist. For each freewrite the agent has to lay out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Canon additions&lt;/strong&gt; — every new proper noun, place, fact, or custom, with the exact sentence it
wants to add to &lt;code&gt;WORLD.md&lt;/code&gt; and which category it lands under.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canon conflicts&lt;/strong&gt; — anything in the freewrite that contradicts existing canon, quoting both
sides. The skill instructions say NEVER silently resolve a conflict. I choose whether to revise canon, treat the new material as apocrypha, or drop it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planned entries&lt;/strong&gt; — for each entry it wants to write: the target section, a working title, a one
line pitch, and which freewrites it draws from. It is also allowed to propose that part of a freewrite yields nothing yet, which is a surprisingly important permission to grant. Not every session needs to become content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reading a proposal takes me a few minutes. Writing the polished entries myself would take hours. That's the trade: the LLM does the labor and I keep the authorship decisions.&lt;/p&gt;

&lt;p&gt;One practical detail: because the proposal is a file and not just chat output, the pipeline is resumable. The skill starts with a resume check — if &lt;code&gt;PROPOSAL.md&lt;/code&gt; exists from a previous session, present it and ask whether to proceed, revise, or discard. Sessions get interrupted, usage limits reset, life happens. Making the intermediate state a file means none of that loses work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Canon is a file, and conflicts surface loudly
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;WORLD.md&lt;/code&gt; is the single source of truth for the world. Every proper noun that appears in a published entry has to exist there first, which the skill enforces as an explicit rule. This sounds bureaucratic but it is the thing that keeps a fictional world coherent when it's being assembled from stream-of-consciousness sessions written weeks apart.&lt;/p&gt;

&lt;p&gt;The conflict surfacing has caught real contradictions I generated and might have caught on my own, but maybe not. When your freewrite from Tuesday disagrees with canon you wrote three weeks ago, you want that decision put in front of you with both quotes side by side, not smoothed over by a model that is trained to produce agreeable, consistent-sounding text. But as you go on with serial fiction you get less leeway like this so it's good to have an editor say, "hey guy what are we doing here."&lt;/p&gt;

&lt;h2&gt;
  
  
  Archive the raw material byte-for-byte
&lt;/h2&gt;

&lt;p&gt;After approval, each raw freewrite gets moved into a published freewrites section with frontmatter added, but the body is copied &lt;strong&gt;byte-for-byte verbatim&lt;/strong&gt;. No typo fixes, no reformatting. The skill says exactly that, in those words, because an LLM's natural instinct is to helpfully clean things up.&lt;/p&gt;

&lt;p&gt;I wanted this for two reasons. First, the raw sessions are honest in a way the polished entries aren't, and readers who care can see the B-roll. Second, every polished entry carries a &lt;code&gt;sources&lt;/code&gt; list in its frontmatter pointing back at the freewrite slugs it was drawn from, so there is full provenance from published dispatch back to the raw session it came from. A small Hugo build check at the end of the pipeline verifies none of those source links are dangling.&lt;/p&gt;

&lt;p&gt;It's still entirely possible that some (or most) readers will just hate the idea that a model was used in the process, but I'd be interested to hear those opinions directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the agent misbehaves, fix the skill, not the output
&lt;/h2&gt;

&lt;p&gt;I'm using my new project &lt;a href="https://github.com/joedaws/cassette" rel="noopener noreferrer"&gt;cassette&lt;/a&gt;, a TUI for freewriting, to do the freewriting. Early on I wanted a way to write things during a freewrite that were off the record (notes to myself, ideas I wasn't committing to, or just to pause and do the freewrite thing of "no idea no idea no idea..."). So I added a "B-sides" feature to the TUI. This just lets me write whatever then return to the A side once I get momentum back. The agent kept incorporating B-side material into proposals despite instructions not to.&lt;/p&gt;

&lt;p&gt;The right fix is to open the skill file and add the rule: everything from a "B side" heading to the next H2 is off the record, excluded from canon and entries, but still archived verbatim with the rest of the session. One edit, and the behavior is fixed for every future session instead of just this one.&lt;/p&gt;

&lt;p&gt;The skill also grew an &lt;strong&gt;Editorial notes&lt;/strong&gt; section at the bottom that I maintain by hand and that explicitly overrides the defaults above it. This is where standing creative guidance lives: dispatches are the primary story mechanism, they are written in third person close on the main character, I prefer short character names so flag long ones in the proposal. When my taste changes, I edit that section and the pipeline changes with it. It's the same feedback loop as maintaining a CLAUDE.md for a codebase, just pointed at editorial judgement instead of code style.&lt;/p&gt;

&lt;h2&gt;
  
  
  The consistency sweep, an underrated superpower
&lt;/h2&gt;

&lt;p&gt;A side benefit of having canon in a file and all content in a repo: renames become cheap. I renamed a character partway through (long names kept bothering me) and a faction too. Doing a rename sweep across every published entry, checking each occurrence against the nomenclature in &lt;code&gt;WORLD.md&lt;/code&gt;, is exactly the kind of tedious, mechanical, judgement-light work an LLM does quickly and, so far in my experience, well. This is the "archivist" half of the job and the part I'm most comfortable handing over.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd tell someone building their own
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Put the raw material somewhere the publish step can't see. An inbox directory outside &lt;code&gt;content/&lt;/code&gt;
costs nothing and prevents the worst accident.&lt;/li&gt;
&lt;li&gt;Make the LLM produce a proposal artifact and make approval a hard gate. The gate is what keeps
the work yours.&lt;/li&gt;
&lt;li&gt;Keep canon in one file and require everything published to trace back to it.&lt;/li&gt;
&lt;li&gt;Archive raw input verbatim with provenance links. You will want the paper trail.&lt;/li&gt;
&lt;li&gt;When the agent does something you don't like twice, encode the correction in the process doc
instead of correcting the output again.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The thing I was worried about going in was that putting an LLM in the middle of a creative project would flatten the writing into generic LLM prose. I think being straightforward about how you use an LLM in the process of creation and providing a view of the raw material is the way to engage with audiences. And I also think such a process will lead to prose that doesn't just sound like any other generated text (which definitely has its own style). Nonetheless the jury really still is out if "good" work can be made this way.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>writing</category>
      <category>llm</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
