<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.nexa.ai/blog</id>
    <title>Nexa Documentation Blog</title>
    <updated>2026-04-10T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://docs.nexa.ai/blog"/>
    <subtitle>Nexa Documentation Blog</subtitle>
    <icon>https://docs.nexa.ai/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Why our AI exception agent can't book a hotel]]></title>
        <id>https://docs.nexa.ai/blog/exception-agent-guardrails</id>
        <link href="https://docs.nexa.ai/blog/exception-agent-guardrails"/>
        <updated>2026-04-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The guardrails on Nexa's exception agent — tool allow-lists, read-only adapters, and why we don't rely on prompt engineering for safety.]]></summary>
        <content type="html"><![CDATA[<p>When a case gets stuck — every hotel full, every provider returning 422, a policy mismatch — Nexa's exception agent reads the context, proposes up to three actions, and hands the item back to a human operator. A common question: why doesn't the agent just <em>do</em> the thing it's recommending? We made that choice on purpose, and this post explains how we enforce it.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-agent-can-read-simulate-and-classify">The agent can read, simulate, and classify<a href="https://docs.nexa.ai/blog/exception-agent-guardrails#the-agent-can-read-simulate-and-classify" class="hash-link" aria-label="Direct link to The agent can read, simulate, and classify" title="Direct link to The agent can read, simulate, and classify">​</a></h2>
<p>The agent has access to a small, well-defined toolset:</p>
<ul>
<li><code>searchAlternateHotels(params)</code> — read-only search outside the current policy.</li>
<li><code>listContractInventory(airport)</code> — read direct-contract availability.</li>
<li><code>computePolicyRelaxationCost(fields, values)</code> — pure simulation, no writes.</li>
<li><code>classifyFailureCause(attemptedHotels)</code> — classification only.</li>
<li><code>summarizeCase(caseUrn)</code> — structured summary for the agent's own context.</li>
</ul>
<p>Every tool in the list is <strong>read-only</strong>. There is no <code>createBooking</code>, no <code>cancelReservation</code>, no <code>sendNotification</code>, no <code>modifyPolicy</code>, no <code>grantRole</code>. The agent literally does not have those tools.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="enforcement-at-the-adapter-layer">Enforcement at the adapter layer<a href="https://docs.nexa.ai/blog/exception-agent-guardrails#enforcement-at-the-adapter-layer" class="hash-link" aria-label="Direct link to Enforcement at the adapter layer" title="Direct link to Enforcement at the adapter layer">​</a></h2>
<p>We keep this promise by building the agent's tool registry <strong>at process start</strong> from a static allow-list, not from a prompt-side description. The agent runtime is constructed with exactly the tools we listed; its final message is either a tool call into this finite set or a terminal recommendation envelope.</p>
<p>A prompt-injection attack that tries to convince the model to "now, go book this hotel directly" fails at the first token after the tool name: there's no such tool registered. The model isn't being tricked by a careful prompt — it's <strong>physically unable</strong> to call a write tool.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-not-a-confirm-before-doing-checkpoint">Why not a "confirm before doing" checkpoint?<a href="https://docs.nexa.ai/blog/exception-agent-guardrails#why-not-a-confirm-before-doing-checkpoint" class="hash-link" aria-label="Direct link to Why not a &quot;confirm before doing&quot; checkpoint?" title="Direct link to Why not a &quot;confirm before doing&quot; checkpoint?">​</a></h2>
<p>Tempting, but wrong for this domain. The confirm pattern puts the human in the loop for one action at a time, which looks great in a demo but is terrible at 2 a.m. when an operator is handling 40 cases simultaneously. What they actually want is a <strong>curated list of proposals</strong> they can scan, triage, and apply in bulk.</p>
<p>So the agent produces ranked recommendations with costs attached. The operator sees three one-line proposals, picks one, confirms, and moves on. The click is a single endpoint — a clean, audited, human-originating HTTP call — not a multi-step negotiation with an LLM.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-ends-up-in-audit">What ends up in audit<a href="https://docs.nexa.ai/blog/exception-agent-guardrails#what-ends-up-in-audit" class="hash-link" aria-label="Direct link to What ends up in audit" title="Direct link to What ends up in audit">​</a></h2>
<p>Every agent run writes:</p>
<ul>
<li>Input: the review item, the attempted hotels, the policy version.</li>
<li>Output: the ranked recommendations with cost estimates.</li>
<li>Tool trajectory: which tools were called, in what order, with what arguments.</li>
<li>Meta: model version, token usage, latency.</li>
</ul>
<p>If a recommendation turned out to be wrong — hotel sold out between recommendation and action — we can replay the trajectory and see whether the agent had stale data or made a bad call. That fidelity is what lets us improve the agent safely across quarters.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="does-it-work">Does it work?<a href="https://docs.nexa.ai/blog/exception-agent-guardrails#does-it-work" class="hash-link" aria-label="Direct link to Does it work?" title="Direct link to Does it work?">​</a></h2>
<p>Early numbers from our launch partner:</p>
<ul>
<li><strong>~70%</strong> of manual-review items have their rank-1 agent recommendation accepted by the operator.</li>
<li><strong>Median time-to-resolve</strong> dropped from 9 minutes to 3.5 minutes.</li>
<li><strong>Zero</strong> agent-initiated bookings, because the agent cannot initiate bookings.</li>
</ul>
<p>The third number is the point.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="principle-allow-list-over-prompt-engineering">Principle: allow-list over prompt engineering<a href="https://docs.nexa.ai/blog/exception-agent-guardrails#principle-allow-list-over-prompt-engineering" class="hash-link" aria-label="Direct link to Principle: allow-list over prompt engineering" title="Direct link to Principle: allow-list over prompt engineering">​</a></h2>
<p>The agent is useful because it reasons over the case and proposes high-quality actions. It's safe because it <strong>cannot</strong> do anything destructive, regardless of what the prompt says. Good prompts are valuable — but for safety, we trust the adapter layer, not the prompt. That's the thing prompt-engineering literature can't give you and code can.</p>
<p>If you're building agents for high-stakes workflows, start by writing down the list of tools the agent can and cannot have. If you find yourself needing a tool your safety story can't support, that's the real discussion — not a prompt tweak.</p>]]></content>
        <author>
            <name>Engineering Team</name>
            <email>engineering@nexa.ai</email>
            <uri>https://nexa.ai</uri>
        </author>
        <category label="engineering" term="engineering"/>
        <category label="ai" term="ai"/>
        <category label="agents" term="agents"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Shipping the flight-disruption predictor as a Nexa Trained Model on Google]]></title>
        <id>https://docs.nexa.ai/blog/flight-predictor-on-google</id>
        <link href="https://docs.nexa.ai/blog/flight-predictor-on-google"/>
        <updated>2026-03-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[How we built a dual-head cancel+delay model, why we chose to train it ourselves rather than reach for a generic AutoML solution, and what it does for disruption response time.]]></summary>
        <content type="html"><![CDATA[<p>The flight-disruption predictor is the model that lets Nexa start sourcing hotel inventory <strong>before</strong> an airline officially declares a disruption. It runs as a <strong>Nexa Trained Model on Google</strong> — Nexa-built, Nexa-trained, Nexa-served — with no third-party AI service for the customer to provision. This post covers how we approached it.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-a-custom-model">Why a custom model<a href="https://docs.nexa.ai/blog/flight-predictor-on-google#why-a-custom-model" class="hash-link" aria-label="Direct link to Why a custom model" title="Direct link to Why a custom model">​</a></h2>
<p>The canonical "predict flight cancellation" demo runs an off-the-shelf tabular AutoML over a flight-ontime CSV. That's a fine starting point, but the real signal isn't in the flight data — it's in the <strong>features around the flight</strong>: storm pressure, runway NOTAMs, crew labor state, airport traffic density, recent cancel rate, seasonality.</p>
<p>We built a dual-head model — one head for cancel probability, one for delay minutes — because they share features heavily but need different loss functions (logistic vs. regression). Training both heads in a single managed job wins on training simplicity and inference latency.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-clean-serving-contract">A clean serving contract<a href="https://docs.nexa.ai/blog/flight-predictor-on-google#a-clean-serving-contract" class="hash-link" aria-label="Direct link to A clean serving contract" title="Direct link to A clean serving contract">​</a></h2>
<p>The Nexa AI Model exposes a small, versioned contract internally:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(220, 13%, 18%);--prism-color:hsl(220, 14%, 71%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="background-color:hsl(220, 13%, 18%);color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">POST /predict</span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">  </span><span class="token property" style="color:hsl(355, 65%, 65%)">"instances"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">      </span><span class="token property" style="color:hsl(355, 65%, 65%)">"airportIata"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(95, 38%, 62%)">"MAD"</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">      </span><span class="token property" style="color:hsl(355, 65%, 65%)">"destinationIata"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(95, 38%, 62%)">"JFK"</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">      </span><span class="token property" style="color:hsl(355, 65%, 65%)">"departureScheduledAt"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(95, 38%, 62%)">"2026-04-22T16:00:00Z"</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">      </span><span class="token property" style="color:hsl(355, 65%, 65%)">"values"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">        </span><span class="token property" style="color:hsl(355, 65%, 65%)">"weatherPressure"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(29, 54%, 61%)">0.42</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">        </span><span class="token property" style="color:hsl(355, 65%, 65%)">"laborPressure"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(29, 54%, 61%)">0.10</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">        </span><span class="token property" style="color:hsl(355, 65%, 65%)">"trafficPressure"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(29, 54%, 61%)">0.25</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">        </span><span class="token property" style="color:hsl(355, 65%, 65%)">"hazardPressure"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(29, 54%, 61%)">0.05</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">        </span><span class="token property" style="color:hsl(355, 65%, 65%)">"flightOpsPressure"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(29, 54%, 61%)">0.37</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">        </span><span class="token property" style="color:hsl(355, 65%, 65%)">"destinationPressure"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(29, 54%, 61%)">0.28</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">        </span><span class="token property" style="color:hsl(355, 65%, 65%)">"recentCancelRate"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(29, 54%, 61%)">0.12</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">        </span><span class="token property" style="color:hsl(355, 65%, 65%)">"seasonalityWeight"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(29, 54%, 61%)">0.6</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">}</span><br></span></code></pre></div></div>
<p>Response:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(220, 13%, 18%);--prism-color:hsl(220, 14%, 71%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="background-color:hsl(220, 13%, 18%);color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token punctuation" style="color:hsl(220, 14%, 71%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">  </span><span class="token property" style="color:hsl(355, 65%, 65%)">"predictions"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">{</span><span class="token plain"> </span><span class="token property" style="color:hsl(355, 65%, 65%)">"cancelProbability"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(29, 54%, 61%)">0.072</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">,</span><span class="token plain"> </span><span class="token property" style="color:hsl(355, 65%, 65%)">"predictedDelayMinutes"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(29, 54%, 61%)">23</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">,</span><span class="token plain"> </span><span class="token property" style="color:hsl(355, 65%, 65%)">"confidenceScore"</span><span class="token operator" style="color:hsl(207, 82%, 66%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(29, 54%, 61%)">0.78</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">}</span><br></span></code></pre></div></div>
<p>Clean, minimal, and versioned — the model carries a schema version so we can evolve feature shapes without breaking callers.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-deterministic-fallback">The deterministic fallback<a href="https://docs.nexa.ai/blog/flight-predictor-on-google#the-deterministic-fallback" class="hash-link" aria-label="Direct link to The deterministic fallback" title="Direct link to The deterministic fallback">​</a></h2>
<p>The Nexa API has a deterministic baseline it falls back to if the trained model is unreachable. This matters because disruption events don't wait for your inference service to be healthy. The baseline is a simple linear combination over the same features — accurate enough to be useful, fast enough to always answer.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="does-it-actually-help">Does it actually help?<a href="https://docs.nexa.ai/blog/flight-predictor-on-google#does-it-actually-help" class="hash-link" aria-label="Direct link to Does it actually help?" title="Direct link to Does it actually help?">​</a></h2>
<p>On our launch partner's history, pre-warming allocation when <code>cancelProbability &gt; 0.6</code> with <code>confidenceScore &gt;= 0.7</code> shaves ~8 minutes off the mean "event to voucher" time. The inventory cache is hot, contract rooms are soft-held, and the airport operator has been paged before the airline's disruption system is done with its own state transitions.</p>
<p>Useful number: ~8 minutes × ~200 affected passengers per disruption × disruptions per day = a meaningful reduction in both passenger frustration and overtime cost for the night shift.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next<a href="https://docs.nexa.ai/blog/flight-predictor-on-google#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next">​</a></h2>
<ul>
<li>Weekly incremental retraining (already in) with a quarterly full retrain + hyperparameter sweep.</li>
<li>Feature contract unification so the same features used at training are guaranteed at serving.</li>
<li>Region-specific sub-models for airports with unusual patterns (high-altitude, curfewed, hub-and-spoke).</li>
</ul>
<p>For the full architectural deep-dive — multi-agent signal layer, the 14-feature snapshot, the deterministic baseline that's currently outperforming the trained head, and the runtime/trainer feature drift we're working off — see <a href="https://docs.nexa.ai/technical-articles/flight-predictor-architecture">Inside the Flight Predictor</a>.</p>]]></content>
        <author>
            <name>ML Team</name>
            <email>ml@nexa.ai</email>
            <uri>https://nexa.ai</uri>
        </author>
        <category label="engineering" term="engineering"/>
        <category label="ml" term="ml"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing Nexa]]></title>
        <id>https://docs.nexa.ai/blog/introducing-nexa</id>
        <link href="https://docs.nexa.ai/blog/introducing-nexa"/>
        <updated>2026-03-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A policy-driven, AI-assisted, provider-agnostic platform for handling airline disruption accommodation.]]></summary>
        <content type="html"><![CDATA[<p>Airlines have been solving the same problem for decades: when a flight is cancelled, how do you get every passenger a hotel room — fast, at a fair price, and without anyone sleeping at the airport? Today we're introducing <strong>Nexa</strong>, the automation platform built end-to-end for that problem.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-nexa-does">What Nexa does<a href="https://docs.nexa.ai/blog/introducing-nexa#what-nexa-does" class="hash-link" aria-label="Direct link to What Nexa does" title="Direct link to What Nexa does">​</a></h2>
<p>Nexa ingests a disruption event, computes the stay plan per passenger group, searches every connected hotel source in parallel, ranks candidates under a policy the airline controls, executes the booking with retries and fallbacks, and sends a voucher — usually in under two minutes.</p>
<p>A few things make it different:</p>
<ul>
<li><strong>Policy-driven</strong>, not hard-coded. Ops teams edit the rules — per tier, per airport, per airline — without a release cycle. A Nexa AI synthesizer turns English into structured policies for fast drafting.</li>
<li><strong>Multi-provider</strong>, not single-vendor. Amadeus, Hotelbeds, and your in-house contracts compete in the same ranking. Direct contracts usually win — which is how you see 10–20% savings on hotel spend.</li>
<li><strong>Nexa Trained Models on Google</strong> where they buy leverage. A flight-disruption predictor pre-warms contingencies. An exception agent triages stuck cases with read-only tools, proposing actions a human approves. There is no third-party AI API for the customer to provision.</li>
<li><strong>Auditable</strong>, every step. Every decision — automated or manual — writes an immutable audit entry with actor, reason, and before/after snapshot.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="who-its-for">Who it's for<a href="https://docs.nexa.ai/blog/introducing-nexa#who-its-for" class="hash-link" aria-label="Direct link to Who it's for" title="Direct link to Who it's for">​</a></h2>
<p>Airline operations centers, station managers, and the irregular-operations teams who've been running this on spreadsheets. Group / alliance deployments with multi-tenant isolation.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="try-it">Try it<a href="https://docs.nexa.ai/blog/introducing-nexa#try-it" class="hash-link" aria-label="Direct link to Try it" title="Direct link to Try it">​</a></h2>
<ul>
<li><strong><a href="https://docs.nexa.ai/">Read the docs</a></strong> — start with the overview, then run the quick-start.</li>
<li><strong><a href="mailto:sales@nexa.ai" target="_blank" rel="noopener noreferrer">Request a sandbox</a></strong> — we'll set you up with limited sandbox providers so you can drive the pipeline end-to-end in an afternoon.</li>
</ul>
<p>There's a lot more to share — on the allocation scorer, how we train and deploy the predictor on Google, the exception agent's tool allow-list, the idempotency contract, the multi-tenant model. We'll cover each in the coming weeks.</p>
<p>Welcome to Nexa.</p>]]></content>
        <author>
            <name>Nexa Team</name>
            <email>team@nexa.ai</email>
            <uri>https://nexa.ai</uri>
        </author>
        <category label="announcement" term="announcement"/>
        <category label="platform" term="platform"/>
    </entry>
</feed>