<?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>Forem: Woda Toki</title>
    <description>The latest articles on Forem by Woda Toki (@woda_toki).</description>
    <link>https://forem.com/woda_toki</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2145999%2Fa7eec28d-bd50-4584-8c5f-ba3ec3137227.png</url>
      <title>Forem: Woda Toki</title>
      <link>https://forem.com/woda_toki</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/woda_toki"/>
    <language>en</language>
    <item>
      <title>Meet Vantura: Build Stateful Agentic AI Brains That Run *Inside* Your Flutter App</title>
      <dc:creator>Woda Toki</dc:creator>
      <pubDate>Wed, 04 Mar 2026 07:47:40 +0000</pubDate>
      <link>https://forem.com/woda_toki/meet-vantura-build-stateful-agentic-ai-brains-that-run-inside-your-flutter-app-3p4j</link>
      <guid>https://forem.com/woda_toki/meet-vantura-build-stateful-agentic-ai-brains-that-run-inside-your-flutter-app-3p4j</guid>
      <description>&lt;p&gt;Building AI features in mobile apps usually goes like this: send a prompt to a &lt;strong&gt;backend server&lt;/strong&gt;, &lt;strong&gt;wait&lt;/strong&gt;, then pipe the &lt;strong&gt;response&lt;/strong&gt; into a chat bubble. You end up maintaining a Python &lt;strong&gt;orchestration&lt;/strong&gt; server, an API gateway, and a queue — just so your chatbot can tell the user the weather.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if the entire reasoning engine lived on the client?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meet &lt;a href="https://pub.dev/packages/vantura" rel="noopener noreferrer"&gt;&lt;strong&gt;Vantura&lt;/strong&gt;&lt;/a&gt; — the first &lt;strong&gt;Stateful Agentic AI Framework&lt;/strong&gt; designed exclusively for Flutter. Vantura brings a full &lt;strong&gt;ReAct (Reason + Act)&lt;/strong&gt; loop to your Dart code, so the agent can think, call local tools, observe results, and iterate — all without a middleware server in between.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Vantura Exists
&lt;/h3&gt;

&lt;p&gt;Most "AI SDKs" for mobile are thin wrappers around an HTTP call. Vantura is an &lt;strong&gt;orchestration framework&lt;/strong&gt;. Here's what that means in practice:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What It Actually Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧠 &lt;strong&gt;On-Device ReAct Loop&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;The agent's decision cycle (Thought → Action → Observation → Repeat) runs entirely in your Dart process. It can call &lt;code&gt;sqflite&lt;/code&gt;, trigger a &lt;code&gt;GoRouter&lt;/code&gt; navigation, or read a sensor — without any network hop to a backend orchestrator.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🛠️ &lt;strong&gt;Type-Safe Tooling&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Define tool arguments as a plain Dart class. &lt;code&gt;SchemaHelper&lt;/code&gt; auto-generates the JSON Schema the LLM needs. No hand-written JSON.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💾 &lt;strong&gt;Dual-Layer Memory&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;A sliding window of recent messages (short-term) plus automatic LLM-powered summarization of older context (long-term). Your agent remembers, without blowing up token costs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⏸️ &lt;strong&gt;Agent Checkpointing&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;The ReAct loop serializes its state between tool calls. If the user kills the app mid-reasoning, &lt;code&gt;agent.resume(resumeFrom: checkpoint)&lt;/code&gt; picks up exactly where it left off.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🤝 &lt;strong&gt;Multi-Agent Coordination&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AgentCoordinator&lt;/code&gt; manages multiple specialized agents. The built-in &lt;code&gt;transfer_to_agent&lt;/code&gt; tool lets them hand off tasks at runtime.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔒 &lt;strong&gt;Privacy-First Security&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Built-in PII redaction, input sanitization (100 KB limit, control-character stripping), anti-jailbreak system directives, and redacted logging by default.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Show Me the Code
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Spin Up an Agent in Under 20 Lines
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:vantura/vantura.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 1. Pick your LLM provider — swap one line to switch models.&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;VanturaClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;apiKey:&lt;/span&gt; &lt;span class="s"&gt;'YOUR_OPENAI_KEY'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;baseUrl:&lt;/span&gt; &lt;span class="s"&gt;'https://api.openai.com/v1/chat/completions'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;model:&lt;/span&gt; &lt;span class="s"&gt;'gpt-4o'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Initialize memory (short-term window + auto-summarization).&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;VanturaMemory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sdkLogger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Create the agent.&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;VanturaAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s"&gt;'inventory_bot'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;instructions:&lt;/span&gt; &lt;span class="s"&gt;'You help manage the user&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s"&gt;s local product inventory.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;memory:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;client:&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;state:&lt;/span&gt; &lt;span class="n"&gt;VanturaState&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="nl"&gt;tools:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStandardTools&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// Calculator, Connectivity, DeviceInfo, ApiTest&lt;/span&gt;
    &lt;span class="n"&gt;CheckStockTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;      &lt;span class="c1"&gt;// Your custom tool (see below)&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 4. Run with streaming — each chunk arrives as it's generated.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runStreaming&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'How many MacBooks are in stock?'&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="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textChunk&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&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="na"&gt;textChunk&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// stream to your UI&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;VanturaState&lt;/code&gt; is a &lt;code&gt;ChangeNotifier&lt;/code&gt;. Wrap it with &lt;code&gt;AnimatedBuilder&lt;/code&gt; or &lt;code&gt;ListenableBuilder&lt;/code&gt; to drive real-time UI updates — show "Thinking…", "Calling tool: check_stock", or the final answer, all reactively.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  2. Define a Custom Tool (Type-Safe)
&lt;/h4&gt;

&lt;p&gt;Tools are strongly typed. You define a Dart class for the arguments, and Vantura's &lt;code&gt;SchemaHelper&lt;/code&gt; generates the JSON Schema for the LLM automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// --- Argument class ---&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CheckStockArgs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;productName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;CheckStockArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;productName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;factory&lt;/span&gt; &lt;span class="n"&gt;CheckStockArgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromJson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="n"&gt;CheckStockArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'product_name'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// --- Tool definition ---&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CheckStockTool&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;VanturaTool&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CheckStockArgs&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;'check_stock'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;'Checks current stock level for a product.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;parameters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SchemaHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generateSchema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="s"&gt;'product_name'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SchemaHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stringProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;description:&lt;/span&gt; &lt;span class="s"&gt;'The name of the product to look up'&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="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;CheckStockArgs&lt;/span&gt; &lt;span class="n"&gt;parseArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="n"&gt;CheckStockArgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromJson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CheckStockArgs&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Query your local DB, call an API, read a file — whatever you need.&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_database&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStockCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;productName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;'Product "&lt;/span&gt;&lt;span class="si"&gt;${args.productName}&lt;/span&gt;&lt;span class="s"&gt;" has &lt;/span&gt;&lt;span class="si"&gt;$count&lt;/span&gt;&lt;span class="s"&gt; units in stock.'&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;p&gt;That's it. No hand-written JSON Schema. No &lt;code&gt;Map&amp;lt;String, dynamic&amp;gt;&lt;/code&gt; spaghetti. The LLM sees a clean function signature, calls it, and Vantura routes the result back into the reasoning loop.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Swap Providers With a Single Line
&lt;/h4&gt;

&lt;p&gt;Vantura ships with three deeply integrated clients that all conform to the &lt;code&gt;LlmClient&lt;/code&gt; interface. Swap providers without changing a single line of agent logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// OpenAI / Groq / TogetherAI / Local Ollama (any OpenAI-compatible API)&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;LlmClient&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;VanturaClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;apiKey:&lt;/span&gt; &lt;span class="s"&gt;'sk-...'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;baseUrl:&lt;/span&gt; &lt;span class="s"&gt;'https://api.openai.com/v1/chat/completions'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;model:&lt;/span&gt; &lt;span class="s"&gt;'gpt-4o'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Anthropic Claude — native Messages API, not a compatibility shim&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;LlmClient&lt;/span&gt; &lt;span class="n"&gt;claude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AnthropicClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;apiKey:&lt;/span&gt; &lt;span class="s"&gt;'sk-ant-...'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;model:&lt;/span&gt; &lt;span class="s"&gt;'claude-3-7-sonnet-latest'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Google Gemini — native REST API with structured tool injection&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;LlmClient&lt;/span&gt; &lt;span class="n"&gt;gemini&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GeminiClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;apiKey:&lt;/span&gt; &lt;span class="s"&gt;'AIza...'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;model:&lt;/span&gt; &lt;span class="s"&gt;'gemini-2.0-flash'&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;p&gt;Pass any of these as the &lt;code&gt;client:&lt;/code&gt; parameter to &lt;code&gt;VanturaAgent&lt;/code&gt; and everything — streaming, tool calls, memory — just works.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Multi-Agent Coordination
&lt;/h4&gt;

&lt;p&gt;Need specialized agents? Create a routing layer with &lt;code&gt;AgentCoordinator&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;billingAgent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;VanturaAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s"&gt;'BillingBot'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;instructions:&lt;/span&gt; &lt;span class="s"&gt;'You handle invoicing, payments, and billing questions.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;memory:&lt;/span&gt; &lt;span class="n"&gt;billingMemory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;client:&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;state:&lt;/span&gt; &lt;span class="n"&gt;billingState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;tools:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;CreateInvoiceTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;RefundTool&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;supportAgent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;VanturaAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s"&gt;'SupportBot'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;instructions:&lt;/span&gt; &lt;span class="s"&gt;'You handle general support queries and FAQs.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;memory:&lt;/span&gt; &lt;span class="n"&gt;supportMemory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;client:&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;state:&lt;/span&gt; &lt;span class="n"&gt;supportState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;tools:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SearchFaqTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;TicketTool&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// The coordinator injects a "transfer_to_agent" tool into each agent automatically.&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;coordinator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AgentCoordinator&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;billingAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;supportAgent&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// If the user asks a billing question to SupportBot, it will call&lt;/span&gt;
&lt;span class="c1"&gt;// transfer_to_agent(target_agent: "BillingBot", reason: "...") on its own.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;coordinator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runStreaming&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'I need a refund for order #42'&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="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textChunk&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textChunk&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;h4&gt;
  
  
  5. Human-in-the-Loop Confirmation
&lt;/h4&gt;

&lt;p&gt;Prevent the agent from executing sensitive actions without the user's approval:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DeleteProductTool&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;VanturaTool&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DeleteProductArgs&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;'delete_product'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;'Permanently deletes a product.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Static: always require confirmation&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;requiresConfirmation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Dynamic: only confirm for high-value items&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;requiresConfirmationFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DeleteProductArgs&lt;/span&gt; &lt;span class="n"&gt;args&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="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// skip confirmation for low-value items&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// ... parseArgs, parameters, execute ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When &lt;code&gt;requiresConfirmationFor&lt;/code&gt; returns &lt;code&gt;true&lt;/code&gt;, Vantura pauses the ReAct loop and yields a &lt;code&gt;CONFIRMATION_REQUIRED&lt;/code&gt; message. Your UI can show a dialog, and the agent resumes only after explicit approval.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why You Should Try Vantura
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local-First:&lt;/strong&gt; Query SQLite, read sensors, navigate screens — no backend round-trip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private by Default:&lt;/strong&gt; Sensitive data stays on-device. Logging redacts API keys and PII automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production-Ready:&lt;/strong&gt; Built-in retry logic, rate-limit handling, input sanitization, and anti-jailbreak directives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fully Open Source:&lt;/strong&gt; BSD-3-Clause licensed. PRs welcome.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://pub.dev/packages/vantura" rel="noopener noreferrer"&gt;Get started on pub.dev →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/tayyabmughal676/vantura" rel="noopener noreferrer"&gt;Browse the source on GitHub →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dart ###Flutter ###AI ###Google ###AgenticAI ###AIAgents ###MobileDevs ###LangChain ###LangGraph ###LLamaIndex ###CrewAI ###Autogen
&lt;/h3&gt;

</description>
      <category>ai</category>
      <category>flutter</category>
      <category>agents</category>
      <category>dart</category>
    </item>
    <item>
      <title>LLMs a guide to daily use</title>
      <dc:creator>Woda Toki</dc:creator>
      <pubDate>Mon, 30 Sep 2024 10:14:04 +0000</pubDate>
      <link>https://forem.com/woda_toki/llms-a-guide-to-daily-use-1ao8</link>
      <guid>https://forem.com/woda_toki/llms-a-guide-to-daily-use-1ao8</guid>
      <description>&lt;p&gt;&lt;strong&gt;Unlocking Efficiency: Leveraging Large Language Models (LLMs) in Your Daily Work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As professionals, we constantly seek ways to optimize workflows and boost productivity. Large Language Models (LLMs) offer a game-changing solution. These AI-powered tools can automate routine tasks, enhance creativity, and drive innovation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are LLMs?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LLMs are advanced algorithms trained on vast amounts of text data, enabling them to understand and generate human-like language.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content Creation:&lt;/strong&gt; Use LLMs to generate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blog posts&lt;/li&gt;
&lt;li&gt;Social media posts&lt;/li&gt;
&lt;li&gt;Product descriptions&lt;/li&gt;
&lt;li&gt;Email templates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt; WordLift, Content Blossom&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Research Assistance:&lt;/strong&gt; LLMs can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summarize long documents&lt;/li&gt;
&lt;li&gt;Provide key findings&lt;/li&gt;
&lt;li&gt;Suggest relevant sources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt; Semantic Scholar, ResearchRabbit&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer Support:&lt;/strong&gt; Implement LLM-powered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chatbots&lt;/li&gt;
&lt;li&gt;Email automation&lt;/li&gt;
&lt;li&gt;FAQ generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt; Dialogflow, ManyChat&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language Translation:&lt;/strong&gt; LLMs facilitate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time translation&lt;/li&gt;
&lt;li&gt;Document translation&lt;/li&gt;
&lt;li&gt;Subtitling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt; Google Translate, DeepL&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Analysis:&lt;/strong&gt; Use LLMs for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text analysis&lt;/li&gt;
&lt;li&gt;Sentiment analysis&lt;/li&gt;
&lt;li&gt;Topic modeling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt; Natural Language Toolkit (NLTK), spaCy&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Practices:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Define clear objectives: Identify tasks that can be optimized with LLMs.&lt;/p&gt;

&lt;p&gt;Choose the right tool: Select LLM-based solutions tailored to your needs.&lt;/p&gt;

&lt;p&gt;Train and fine-tune: Refine LLM performance through data feedback.&lt;/p&gt;

&lt;p&gt;Monitor and adjust: Regularly evaluate LLM output and adjust as needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"The Future of Work: Robots, AI, and Automation" (McKinsey)&lt;/p&gt;

&lt;p&gt;"Large Language Models: A Survey" (arXiv)&lt;/p&gt;

&lt;p&gt;"LLMs for Business: A Guide" (Forbes)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get Started:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Explore LLM-based tools and integrate them into your workflow. Unlock efficiency, enhance productivity, and discover new possibilities.&lt;/p&gt;

&lt;p&gt;To get AI Services &amp;amp; Integrations in your daily businesses, contact &lt;a href="https://www.upwork.com/freelancers/wodat?mp_source=share" rel="noopener noreferrer"&gt;Woda Toki &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Share Your Experience:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How are you leveraging LLMs in your daily work? &lt;/p&gt;

&lt;p&gt;Share your success stories, challenges, or questions in the comments below.&lt;/p&gt;

&lt;h1&gt;
  
  
  LLM #AI #Productivity #Innovation #Efficiency #FutureOfWork
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Additional Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLM-based tools:&lt;/strong&gt; Hugging Face, Stanford Natural Language Processing Group&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Online courses:&lt;/strong&gt; Coursera, edX&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Industry reports:&lt;/strong&gt; Gartner, Forrester&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>chatgpt</category>
      <category>promptengineering</category>
    </item>
  </channel>
</rss>
