<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="388633" data-post-id="388633">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="aaronrussell" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/aaronrussell/120/39972_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  aaronrussell
                      <span class="op-star" title="Thread Starter">
                        <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                      </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>A few updates have landed in omni over the last week, plus a new package to share:</p>
<h2><a name="p-388633-omni-v141-1" class="anchor" href="#p-388633-omni-v141-1" aria-label="Heading link" rel="nofollow"></a>Omni v1.4.1</h2>
<ul>
<li>New <code>Omni.Schema.Adapter</code> module for generated structured outputs using any 3rd party schema and validation tool - eg JSV, Zoi, Xema, Peri - whatever you like (discussed a few posts above with examples)</li>
<li>Improved support of JSON schema constraints when using Omni’s built in schema builder - <code>multipleOf</code>, <code>minItems</code>, <code>maxItems</code>, <code>uniqueItems</code>, <code>const</code>, <code>null</code>, <code>oneOf</code>, <code>allOf</code>, union types, and string <code>format</code> are all validated.</li>
<li>New provider module: Venice AI</li>
<li>Updated model catalogue</li>
</ul>
<h2><a name="p-388633-omni-tools-v020-2" class="anchor" href="#p-388633-omni-tools-v020-2" aria-label="Heading link" rel="nofollow"></a>Omni Tools v0.2.0 <img src="https://forum.elixirforum.com/images/emoji/apple/new_button.png?v=15" title=":new_button:" class="emoji" alt=":new_button:" loading="lazy" width="20" height="20"></h2>
<ul>
<li>A package containing a small number of ready-to-use tools for Omni-powered agents:</li>
<li><strong>Bash</strong> - shell command execution with timeout, environment, and output capture</li>
<li><strong>Files</strong> - scoped file CRUD with read-only and flat modes</li>
<li><strong>Repl</strong> - Elixir code evaluation in isolated peer nodes with pluggable extensions</li>
<li><strong>WebFetch</strong> - URL fetching with HTML-to-Markdown, JSON pretty-printing, and pluggable strategies</li>
</ul>
<p>The Repl tool is particularly cool. Model ability with Elixir can vary, but choose a good coding model and you can have a lot of fun with this.</p>
<h2><a name="p-388633-links-3" class="anchor" href="#p-388633-links-3" aria-label="Heading link" rel="nofollow"></a>Links</h2>
<p>Omni - <a href="https://github.com/aaronrussell/omni" rel="noopener nofollow ugc">GitHub</a> | <a href="https://hexdocs.pm/omni" rel="noopener nofollow ugc">Docs</a><br>
Omni Tools - <a href="https://github.com/aaronrussell/omni_tools" rel="noopener nofollow ugc">GitHub</a> | <a href="https://hexdocs.pm/omni_tools" rel="noopener nofollow ugc">Docs</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="388633" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/omni-a-universal-elixir-client-for-llm-apis/74589/22">Post #21</a>
	                </div>
	            </div>
              <div id="likers-container-388633" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="388633"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #21"></div>
  </section>
</div>
    <div class="postbit" id="389157" data-post-id="389157">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="aaronrussell" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/aaronrussell/120/39972_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  aaronrussell
                      <span class="op-star" title="Thread Starter">
                        <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                      </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>A few updates over the last few days across all the omni packages to share:</p>
<h2><a name="p-389157-omni-v150-smallhexhttpshexpmpackagesomni-codehttpsgithubcomaaronrussellomnismall-1" class="anchor" href="#p-389157-omni-v150-smallhexhttpshexpmpackagesomni-codehttpsgithubcomaaronrussellomnismall-1" aria-label="Heading link" rel="nofollow"></a>Omni v1.5.0 <small><a href="https://hex.pm/packages/omni" rel="nofollow">hex</a> | <a href="https://github.com/aaronrussell/omni" rel="noopener nofollow ugc">code</a></small></h2>
<ul>
<li>Now all built-providers’s models are loaded by default. No need to set <code>config :omni, :providers, [...]</code> unless to load custom providers or only a filtered set of the built-ins.</li>
<li>Fixed issue where prompt cache usage wasn’t properly being reflected in <code>%Usage{}</code> structs.</li>
<li>Updated model catalogue.</li>
</ul>
<h2><a name="p-389157-omni-agent-v040-smallhexhttpshexpmpackagesomni_agent-codehttpsgithubcomaaronrussellomni_agentsmall-2" class="anchor" href="#p-389157-omni-agent-v040-smallhexhttpshexpmpackagesomni_agent-codehttpsgithubcomaaronrussellomni_agentsmall-2" aria-label="Heading link" rel="nofollow"></a>Omni Agent v0.4.0 <small><a href="https://hex.pm/packages/omni_agent" rel="nofollow">hex</a> | <a href="https://github.com/aaronrussell/omni_agent" rel="noopener nofollow ugc">code</a></small></h2>
<ul>
<li><code>Omni.Session.Store</code> now has an <code>init/1</code> callback that all stores must implement</li>
<li>Watch out - <code>Omni.Session.Store.FileSystem</code> has been renamed <code>Omni.Session.Stores.FileSystem</code> (pluralised namespace). Also the <code>:base_path</code> option has been renamed <code>:base_dir</code> and must be an absolute path.</li>
</ul>
<h2><a name="p-389157-omni-tools-v030-smallhexhttpshexpmpackagesomni_tools-codehttpsgithubcomaaronrussellomni_toolssmall-3" class="anchor" href="#p-389157-omni-tools-v030-smallhexhttpshexpmpackagesomni_tools-codehttpsgithubcomaaronrussellomni_toolssmall-3" aria-label="Heading link" rel="nofollow"></a>Omni Tools v0.3.0 <small><a href="https://hex.pm/packages/omni_tools" rel="nofollow">hex</a> | <a href="https://github.com/aaronrussell/omni_tools" rel="noopener nofollow ugc">code</a></small></h2>
<ul>
<li>New <code>Omni.Tools.WebSearch</code> tool. Comes with a <code>Omni.Tools.WebSearch.Provider</code> behaviour and 3 built-in providers to use (Brave, Serper, and Tavily).</li>
<li>The <code>Omni.Tools.Repl</code> tool now connects to the sandbox with <code>connection: :standard_io</code> rather than Erlang distribution.</li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="389157" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/omni-a-universal-elixir-client-for-llm-apis/74589/23">Post #22</a>
	                </div>
	            </div>
              <div id="likers-container-389157" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="389157"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #22"></div>
  </section>
</div>
    <div class="postbit" id="390619" data-post-id="390619">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="aaronrussell" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/aaronrussell/120/39972_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  aaronrussell
                      <span class="op-star" title="Thread Starter">
                        <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                      </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>A new package in the family: <strong>Omni UI</strong> - a LiveView interface for interacting with Omni-powered agents in the browser.</p>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/6/4/6445b23f1598cc4306d325b39c0e6975bbff6048.jpeg" data-download-href="https://forum.elixirforum.com/uploads/default/6445b23f1598cc4306d325b39c0e6975bbff6048" title="Omni screenshot" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/original/3X/6/4/6445b23f1598cc4306d325b39c0e6975bbff6048.jpeg" alt="Omni screenshot" data-base62-sha1="ej34nu3OsrRQGz3l33LKnDzm9Is" width="690" height="477" data-dominant-color="85848A"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">Omni screenshot</span><span class="informations">1200×830 61.9 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<p>Omni UI is an example of how <code>omni</code>, <code>omni_agent</code>, and <code>omni_tools</code> can be used together to build agents in Elixir, and also a UI kit for building chat interfaces in your own app.</p>
<p>Either mount <code>Omni.UI.AgentLive</code> in your router for a batteries included chat interface with sessions, files, a REPL and web tools all wired up. Or <code>use Omni.UI</code> in your own LiveView and compose from the component library - you own the layout and agent tooling, the macro handles all the wiring.</p>
<h3><a name="p-390619-highlights-1" class="anchor" href="#p-390619-highlights-1" aria-label="Heading link" rel="nofollow"></a>Highlights</h3>
<ul>
<li><strong>Built on Omni</strong> — multi-provider LLM support, streaming, tool use, structured output, persistent sessions, branching conversations, and pluggable storage</li>
<li><strong>Drop-in agent chat</strong> — AgentLive mounts a complete interface with a files panel, Elixir REPL, and web tools wired up out of the box</li>
<li><strong>Build your own</strong> — <code>use Omni.UI</code> adds session plumbing to any LiveView; compose with ChatUI and CoreUI components for the rendering layer</li>
<li><strong>Themeable</strong> — semantic colour tokens with light and dark mode support</li>
</ul>
<h3><a name="p-390619-links-2" class="anchor" href="#p-390619-links-2" aria-label="Heading link" rel="nofollow"></a>Links</h3>
<ul>
<li><a href="https://github.com/aaronrussell/omni_ui" rel="noopener nofollow ugc">GitHub</a> - The README has a quick start that gets you from zero to a running agent chat in about 10 lines of config.</li>
<li><a href="https://hexdocs.pm/omni_ui" rel="noopener nofollow ugc">Hexdocs</a></li>
</ul>
<hr>
<p>And as it’s been a while since my last update, there’s been a few updates to other Omni packages:</p>
<h2><a name="p-390619-omni-v154-smallhexhttpshexpmpackagesomni-codehttpsgithubcomaaronrussellomnismall-3" class="anchor" href="#p-390619-omni-v154-smallhexhttpshexpmpackagesomni-codehttpsgithubcomaaronrussellomnismall-3" aria-label="Heading link" rel="nofollow"></a>Omni v1.5.4 <small><a href="https://hex.pm/packages/omni" rel="nofollow">hex</a> | <a href="https://github.com/aaronrussell/omni" rel="noopener nofollow ugc">code</a></small></h2>
<ul>
<li>New provider module: Near AI</li>
<li>Updated model catalogue (Opus 4.8, Fable, Minimax M3, GLM 5.2 have all landed in the last month+)</li>
</ul>
<h2><a name="p-390619-omni-agent-v050-smallhexhttpshexpmpackagesomni_agent-codehttpsgithubcomaaronrussellomni_agentsmall-4" class="anchor" href="#p-390619-omni-agent-v050-smallhexhttpshexpmpackagesomni_agent-codehttpsgithubcomaaronrussellomni_agentsmall-4" aria-label="Heading link" rel="nofollow"></a>Omni Agent v0.5.0 <small><a href="https://hex.pm/packages/omni_agent" rel="nofollow">hex</a> | <a href="https://github.com/aaronrussell/omni_agent" rel="noopener nofollow ugc">code</a></small></h2>
<ul>
<li>Session Manager now starts it’s own <code>TitleService</code> which will add session titles based on hueristic or a configured model</li>
<li>New <code>Manager.rename/3</code> function for manually setting a session’s title</li>
<li>The <code>:tool_timeout</code> option on <code>Omni.Agent</code> now accepts a 1-arity function receiving the tool name, for per-tool timeouts</li>
</ul>
<h2><a name="p-390619-omni-tools-v041-smallhexhttpshexpmpackagesomni_tools-codehttpsgithubcomaaronrussellomni_toolssmall-5" class="anchor" href="#p-390619-omni-tools-v041-smallhexhttpshexpmpackagesomni_tools-codehttpsgithubcomaaronrussellomni_toolssmall-5" aria-label="Heading link" rel="nofollow"></a>Omni Tools v0.4.1 <small><a href="https://hex.pm/packages/omni_tools" rel="nofollow">hex</a> | <a href="https://github.com/aaronrussell/omni_tools" rel="noopener nofollow ugc">code</a></small></h2>
<ul>
<li>New bang variants of the <code>Files.FS</code> functions that raise descriptive errros</li>
<li><code>WebSearch</code> tool aligns API key resolution with <code>Omni.Provider.resolve_auth/1</code></li>
<li>Fixed some “clause never used” warnings surfaced by Elixir 1.20’s type checker</li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="390619" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/omni-a-universal-elixir-client-for-llm-apis/74589/24">Post #23</a>
	                </div>
	            </div>
              <div id="likers-container-390619" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="390619"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-most-liked cat-most-liked" title="One of the top 3 liked posts in this thread!"></div>
  </section>
</div>
    <div class="postbit" id="391262" data-post-id="391262">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="aaronrussell" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/aaronrussell/120/39972_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  aaronrussell
                      <span class="op-star" title="Thread Starter">
                        <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                      </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Omni just received a pretty big update that reworks how it loads it’s model catalogue, and brings couple of breaking changes to watch out for too.</p>
<h2><a name="p-391262-omni-v160-smallhexhttpshexpmpackagesomni-codehttpsgithubcomaaronrussellomnismall-1" class="anchor" href="#p-391262-omni-v160-smallhexhttpshexpmpackagesomni-codehttpsgithubcomaaronrussellomnismall-1" aria-label="Heading link" rel="nofollow"></a>Omni v1.6.0  <small><a href="https://hex.pm/packages/omni" rel="nofollow">hex</a> | <a href="https://github.com/aaronrussell/omni" rel="noopener nofollow ugc">code</a></small></h2>
<p>Model data now comes through <strong>pluggable model sources</strong>, so you can choose where catalog data comes from - or plug in your own.</p>
<h3><a name="p-391262-whats-new-2" class="anchor" href="#p-391262-whats-new-2" aria-label="Heading link" rel="nofollow"></a><img src="https://forum.elixirforum.com/images/emoji/apple/new_button.png?v=15" title=":new_button:" class="emoji" alt=":new_button:" loading="lazy" width="20" height="20"> What’s new?</h3>
<ul>
<li><code>Omni.Source</code> behaviour module - pluggable model sources, configurable globally or per provider.</li>
<li><code>Omni.Sources.ModelsDev</code> (the default) - a bundled <a href="https://models.dev" rel="noopener nofollow ugc">models.dev</a> snapshot, with an optional live mode that fetches fresh catalog data when starting your app:<pre data-code-wrap="elixir"><code class="lang-elixir">config :omni, :models, source: {Omni.Sources.ModelsDev, live: true}
</code></pre>
</li>
<li><code>Omni.Sources.LLMDB</code> - an alternative source backed by <a class="mention" href="/u/mikehostetler" rel="nofollow">@mikehostetler</a>’s <a href="https://hex.pm/packages/llm_db" rel="nofollow"><code>llm_db</code></a> package (the model database used by ReqLLM):<pre data-code-wrap="elixir"><code class="lang-elixir"># with {:llm_db, "~&gt; 2026.7"} in your deps
config :omni, :models, source: Omni.Sources.LLMDB
</code></pre>
</li>
<li>The Ollama provider has now been split into two: <code>Omni.Providers.Ollama</code>  for using local models, and <code>Omni.Providers.OllamaCloud</code> for Ollama’s hosted cloud service.</li>
</ul>
<p>A nice side effect: catalog-backed custom providers got much simpler - a provider now only needs an <code>:id</code> and a <code>config/0</code>, and its model list loads from the configured source automatically.</p>
<h3><a name="p-391262-breaking-changes-3" class="anchor" href="#p-391262-breaking-changes-3" aria-label="Heading link" rel="nofollow"></a><img src="https://forum.elixirforum.com/images/emoji/apple/police_car_light.png?v=15" title=":police_car_light:" class="emoji" alt=":police_car_light:" loading="lazy" width="20" height="20"> Breaking changes <img src="https://forum.elixirforum.com/images/emoji/apple/police_car_light.png?v=15" title=":police_car_light:" class="emoji" alt=":police_car_light:" loading="lazy" width="20" height="20"></h3>
<p>A few config pattern changes that might affect users. If affected, you should get noisy boot-time errors with migration instructions:</p>
<ul>
<li>Custom providers must now declare a canonical id: <code>use Omni.Provider, id: :mistral</code></li>
<li>Moonshot AI’s provider ID has changed from <code>:moonshot</code> to <code>:moonshotai</code>, and Ollama is now split into <code>:ollama</code> (local) and <code>:ollama_cloud</code>. These changes align Omni better with models.dev and llm_db’s naming conventions.</li>
<li>Provider registration moved from <code>config :omni, :providers</code> to the <code>providers:</code> key of <code>config :omni, :models</code>. Full module names are required rather than provider ID atoms:<pre data-code-wrap="elixir"><code class="lang-elixir">config :omni, :models, providers: [:builtins, MyApp.Providers.Acme]
</code></pre>
</li>
</ul>
<p>Full details in the <a href="https://github.com/aaronrussell/omni/blob/main/CHANGELOG.md" rel="noopener nofollow ugc">changelog</a>.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="391262" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/omni-a-universal-elixir-client-for-llm-apis/74589/25">Post #24</a>
	                </div>
	            </div>
              <div id="likers-container-391262" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="391262"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>