<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Agent Server on Ulai Docs</title><link>https://docs.ulai.co.in/docs/agent-server/</link><description>Recent content in Agent Server on Ulai Docs</description><generator>Hugo</generator><language>en</language><atom:link href="https://docs.ulai.co.in/docs/agent-server/index.xml" rel="self" type="application/rss+xml"/><item><title>Overview</title><link>https://docs.ulai.co.in/docs/agent-server/overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.ulai.co.in/docs/agent-server/overview/</guid><description>&lt;h2 id="what-it-is"&gt;What it is&lt;a class="td-heading-self-link" href="#what-it-is" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;The Ulai Agent Server is a single Go binary (&lt;code&gt;orchestrator&lt;/code&gt;) that runs one side&#10;of a voice conversation. It joins an Ulai SFU room as an ordinary participant,&#10;connects an AI backend to that room, and manages the conversation until&#10;somebody ends it.&lt;/p&gt;&#10;&lt;p&gt;Everything it owns is timing-critical:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;The audio chain&lt;/strong&gt; — pre-clean, denoise, near-field foreground isolation,&#10;neural VAD.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Turn detection&lt;/strong&gt; — who has the floor, and when that changes.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Barge-in&lt;/strong&gt; — cutting the agent mid-sentence when the caller speaks, and&#10;accounting for how much of the turn was actually heard.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;The silence ladder&lt;/strong&gt; — nudges when a caller goes quiet, and a hangup when&#10;they stay quiet.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;The end-call contract&lt;/strong&gt; — the evidence a model must produce before it is&#10;allowed to hang up on a human.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="what-it-is-not"&gt;What it is not&lt;a class="td-heading-self-link" href="#what-it-is-not" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;It is &lt;strong&gt;not&lt;/strong&gt; a place where anything is stored. There is no database, no agent&#10;table, no recording bucket and no credential file. A call&amp;rsquo;s configuration&#10;arrives in the request that starts it, and everything worth keeping leaves on&#10;the event stream for somebody else to write down.&lt;/p&gt;</description></item><item><title>Configuration</title><link>https://docs.ulai.co.in/docs/agent-server/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.ulai.co.in/docs/agent-server/configuration/</guid><description>&lt;p&gt;Configuration is split by a single rule:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;If it decides &lt;strong&gt;how a call runs&lt;/strong&gt;, it travels with the call.&#10;If it decides &lt;strong&gt;how the process runs&lt;/strong&gt;, it is an environment variable.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;That split is why the environment list below is so short, and why the same&#10;binary can serve agents belonging to different customers at the same time. The&#10;per-call half is documented under&#10;&lt;a href="https://docs.ulai.co.in/docs/agent-server/concepts/agent-profile/"&gt;the agent profile&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;The process prints its whole configuration at boot, including which variables&#10;are set but &lt;em&gt;not read&lt;/em&gt; — usually a rename:&lt;/p&gt;</description></item><item><title>Interfaces</title><link>https://docs.ulai.co.in/docs/agent-server/grpc-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.ulai.co.in/docs/agent-server/grpc-api/</guid><description>&lt;p&gt;The image exposes two ports and nothing else. There is no web UI, no admin&#10;endpoint and no configuration API — the agent server is driven entirely by the&#10;agent client.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Port&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Protocol&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Who connects&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Expose it?&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;50052&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;gRPC&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;the agent client&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Loopback or private network only&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;8000&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTP&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;your monitoring&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;As needed&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="port-8000--health"&gt;Port 8000 — health&lt;a class="td-heading-self-link" href="#port-8000--health" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;One endpoint:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s http://localhost:8000/health &lt;span class="c1"&gt;# → ok&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A &lt;strong&gt;liveness&lt;/strong&gt; check, not a readiness one. It returns &lt;code&gt;ok&lt;/code&gt; as soon as the&#10;process is up, including when no calls are running — which is the normal state.&#10;It does not tell you whether calls succeed; the log does that.&lt;/p&gt;</description></item></channel></rss>