<liclass="toctree-l2"><aclass="reference internal"href="../concepts/llm_providers/supported_providers.html">Supported Providers & Configuration</a></li>
<spanid="managing-conversational-state"></span><h1>Conversational State<a@click.prevent="window.navigator.clipboard.writeText($el.href); $el.setAttribute('data-tooltip', 'Copied!'); setTimeout(() => $el.setAttribute('data-tooltip', 'Copy link to this element'), 2000)"aria-label="Copy link to this element"class="headerlink"data-tooltip="Copy link to this element"href="#conversational-state"><svgheight="1em"viewbox="0 0 24 24"width="1em"xmlns="http://www.w3.org/2000/svg"><pathd="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path></svg></a></h1>
<p>The OpenAI Responses API (<codeclass="docutils literal notranslate"><spanclass="pre">v1/responses</span></code>) is designed for multi-turn conversations where context needs to persist across requests. Plano provides a unified <codeclass="docutils literal notranslate"><spanclass="pre">v1/responses</span></code> API that works with <strong>any LLM provider</strong>—OpenAI, Anthropic, Azure OpenAI, DeepSeek, or any OpenAI-compatible provider—while automatically managing conversational state for you.</p>
<p>Unlike the traditional Chat Completions API where you manually manage conversation history by including all previous messages in each request, Plano handles state management behind the scenes. This means you can use the Responses API with any model provider, and Plano will persist conversation context across requests—making it ideal for building conversational agents that remember context without bloating every request with full message history.</p>
<sectionid="how-it-works">
<h2>How It Works<a@click.prevent="window.navigator.clipboard.writeText($el.href); $el.setAttribute('data-tooltip', 'Copied!'); setTimeout(() => $el.setAttribute('data-tooltip', 'Copy link to this element'), 2000)"aria-label="Copy link to this element"class="headerlink"data-tooltip="Copy link to this element"href="#how-it-works"x-intersect.margin.0%.0%.-70%.0%="activeSection ='#how-it-works'"><svgheight="1em"viewbox="0 0 24 24"width="1em"xmlns="http://www.w3.org/2000/svg"><pathd="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path></svg></a></h2>
<p>When a client calls the Responses API:</p>
<olclass="arabic simple">
<li><p><strong>First request</strong>: Plano generates a unique <codeclass="docutils literal notranslate"><spanclass="pre">resp_id</span></code> and stores the conversation state (messages, model, provider, timestamp).</p></li>
<li><p><strong>Subsequent requests</strong>: The client includes the <codeclass="docutils literal notranslate"><spanclass="pre">previous_resp_id</span></code> from the previous response. Plano retrieves the stored conversation state, merges it with the new input, and sends the combined context to the LLM.</p></li>
<li><p><strong>Response</strong>: The LLM sees the full conversation history without the client needing to resend all previous messages.</p></li>
</ol>
<p>This pattern dramatically reduces bandwidth and makes it easier to build multi-turn agents—Plano handles the state plumbing so you can focus on agent logic.</p>
<p><strong>Example Using OpenAI Python SDK:</strong></p>
</span><spanid="line-11"><spanclass="n">model</span><spanclass="o">=</span><spanclass="s2">"claude-sonnet-4-5"</span><spanclass="p">,</span><spanclass="c1"># Works with any configured provider</span>
</span><spanid="line-12"><spanclass="nb">input</span><spanclass="o">=</span><spanclass="s2">"My name is Alice and I like Python"</span>
</span><spanid="line-13"><spanclass="p">)</span>
</span><spanid="line-14">
</span><spanid="line-15"><spanclass="c1"># Save the response_id for conversation continuity</span>
</span><spanid="line-21"><spanclass="n">model</span><spanclass="o">=</span><spanclass="s2">"claude-sonnet-4-5"</span><spanclass="p">,</span><spanclass="c1"># Make sure its configured in plano_config.yaml</span>
</span><spanid="line-22"><spanclass="nb">input</span><spanclass="o">=</span><spanclass="s2">"Please list all the messages you have received in our conversation, numbering each one."</span><spanclass="p">,</span>
</span><spanid="line-27"><spanclass="c1"># Output: "Your name is Alice and your favorite language is Python"</span>
</span></code></pre></div>
</div>
<p>Notice how the second request only includes the new user message—Plano automatically merges it with the stored conversation history before sending to the LLM.</p>
</section>
<sectionid="configuration-overview">
<h2>Configuration Overview<a@click.prevent="window.navigator.clipboard.writeText($el.href); $el.setAttribute('data-tooltip', 'Copied!'); setTimeout(() => $el.setAttribute('data-tooltip', 'Copy link to this element'), 2000)"aria-label="Copy link to this element"class="headerlink"data-tooltip="Copy link to this element"href="#configuration-overview"x-intersect.margin.0%.0%.-70%.0%="activeSection ='#configuration-overview'"><svgheight="1em"viewbox="0 0 24 24"width="1em"xmlns="http://www.w3.org/2000/svg"><pathd="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path></svg></a></h2>
<p>State storage is configured in the <codeclass="docutils literal notranslate"><spanclass="pre">state_storage</span></code> section of your <codeclass="docutils literal notranslate"><spanclass="pre">plano_config.yaml</span></code>:</p>
</span><spanid="line-5"><spanclass="linenos"> 5</span><spanclass="w"></span><spanclass="c1"># Connection string for postgres type</span>
</span><spanid="line-6"><mark><spanclass="linenos"> 6</span><spanclass="w"></span><spanclass="c1"># Environment variables are supported using $VAR_NAME or ${VAR_NAME} syntax</span>
</mark></span><spanid="line-7"><mark><spanclass="linenos"> 7</span><spanclass="w"></span><spanclass="c1"># Replace [USER] and [HOST] with your actual database credentials</span>
</mark></span><spanid="line-8"><mark><spanclass="linenos"> 8</span><spanclass="w"></span><spanclass="c1"># Variables like $DB_PASSWORD MUST be set before running config validation/rendering</span>
</mark></span><spanid="line-9"><mark><spanclass="linenos"> 9</span><spanclass="w"></span><spanclass="c1"># Example: Replace [USER] with 'myuser' and [HOST] with 'db.example.com:5432'</span>
<li><p><strong>Memory</strong>: Fast, ephemeral storage for development and testing. State is lost when Plano restarts.</p></li>
<li><p><strong>PostgreSQL</strong>: Durable, production-ready storage with support for Supabase and self-hosted PostgreSQL instances.</p></li>
</ul>
<divclass="admonition note">
<pclass="admonition-title">Note</p>
<p>If you don’t configure <codeclass="docutils literal notranslate"><spanclass="pre">state_storage</span></code>, conversation state management is <strong>disabled</strong>. The Responses API will still work, but clients must manually include full conversation history in each request (similar to the Chat Completions API behavior).</p>
</div>
</section>
<sectionid="memory-storage-development">
<h2>Memory Storage (Development)<a@click.prevent="window.navigator.clipboard.writeText($el.href); $el.setAttribute('data-tooltip', 'Copied!'); setTimeout(() => $el.setAttribute('data-tooltip', 'Copy link to this element'), 2000)"aria-label="Copy link to this element"class="headerlink"data-tooltip="Copy link to this element"href="#memory-storage-development"x-intersect.margin.0%.0%.-70%.0%="activeSection ='#memory-storage-development'"><svgheight="1em"viewbox="0 0 24 24"width="1em"xmlns="http://www.w3.org/2000/svg"><pathd="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path></svg></a></h2>
<p>Memory storage keeps conversation state in-memory using a thread-safe <codeclass="docutils literal notranslate"><spanclass="pre">HashMap</span></code>. It’s perfect for local development, demos, and testing, but all state is lost when Plano restarts.</p>
<p><strong>Configuration</strong></p>
<p>Add this to your <codeclass="docutils literal notranslate"><spanclass="pre">plano_config.yaml</span></code>:</p>
<p><strong>When to Use Memory Storage</strong></p>
<ulclass="simple">
<li><p>Local development and debugging</p></li>
<li><p>Demos and proof-of-concepts</p></li>
<li><p>Automated testing environments</p></li>
<li><p>Single-instance deployments where persistence isn’t critical</p></li>
</ul>
<p><strong>Limitations</strong></p>
<ulclass="simple">
<li><p>State is lost on restart</p></li>
<li><p>Not suitable for production workloads</p></li>
<li><p>Cannot scale across multiple Plano instances</p></li>
</ul>
</section>
<sectionid="postgresql-storage-production">
<h2>PostgreSQL Storage (Production)<a@click.prevent="window.navigator.clipboard.writeText($el.href); $el.setAttribute('data-tooltip', 'Copied!'); setTimeout(() => $el.setAttribute('data-tooltip', 'Copy link to this element'), 2000)"aria-label="Copy link to this element"class="headerlink"data-tooltip="Copy link to this element"href="#postgresql-storage-production"x-intersect.margin.0%.0%.-70%.0%="activeSection ='#postgresql-storage-production'"><svgheight="1em"viewbox="0 0 24 24"width="1em"xmlns="http://www.w3.org/2000/svg"><pathd="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path></svg></a></h2>
<p>PostgreSQL storage provides durable, production-grade conversation state management. It works with both self-hosted PostgreSQL and Supabase (PostgreSQL-as-a-service), making it ideal for scaling multi-agent systems in production.</p>
<sectionid="prerequisites">
<h3>Prerequisites<a@click.prevent="window.navigator.clipboard.writeText($el.href); $el.setAttribute('data-tooltip', 'Copied!'); setTimeout(() => $el.setAttribute('data-tooltip', 'Copy link to this element'), 2000)"aria-label="Copy link to this element"class="headerlink"data-tooltip="Copy link to this element"href="#prerequisites"x-intersect.margin.0%.0%.-70%.0%="activeSection ='#prerequisites'"><svgheight="1em"viewbox="0 0 24 24"width="1em"xmlns="http://www.w3.org/2000/svg"><pathd="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path></svg></a></h3>
<p>Before configuring PostgreSQL storage, you need:</p>
<olclass="arabic simple">
<li><p>A PostgreSQL database (version 12 or later)</p></li>
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">conversation_states</span></code> table created in your database</p></li>
</ol>
<p><strong>Setting Up the Database</strong></p>
<p>Run the SQL schema to create the required table:</p>
<divclass="highlight-sql notranslate"><divclass="highlight"><pre><span></span><code><spanid="line-1"><spanclass="linenos"> 1</span><spanclass="c1">-- Conversation State Storage Table</span>
</span><spanid="line-2"><spanclass="linenos"> 2</span><spanclass="c1">-- This table stores conversational context for the OpenAI Responses API</span>
</span><spanid="line-3"><spanclass="linenos"> 3</span><spanclass="c1">-- Run this SQL against your PostgreSQL/Supabase database before enabling conversation state storage</span>
</span><spanid="line-26"><spanclass="linenos">26</span><spanclass="k">COMMENT</span><spanclass="w"></span><spanclass="k">ON</span><spanclass="w"></span><spanclass="k">TABLE</span><spanclass="w"></span><spanclass="n">conversation_states</span><spanclass="w"></span><spanclass="k">IS</span><spanclass="w"></span><spanclass="s1">'Stores conversation history for OpenAI Responses API continuity'</span><spanclass="p">;</span>
</span><spanid="line-27"><spanclass="linenos">27</span><spanclass="k">COMMENT</span><spanclass="w"></span><spanclass="k">ON</span><spanclass="w"></span><spanclass="k">COLUMN</span><spanclass="w"></span><spanclass="n">conversation_states</span><spanclass="p">.</span><spanclass="n">response_id</span><spanclass="w"></span><spanclass="k">IS</span><spanclass="w"></span><spanclass="s1">'Unique identifier for the conversation state'</span><spanclass="p">;</span>
</span><spanid="line-28"><spanclass="linenos">28</span><spanclass="k">COMMENT</span><spanclass="w"></span><spanclass="k">ON</span><spanclass="w"></span><spanclass="k">COLUMN</span><spanclass="w"></span><spanclass="n">conversation_states</span><spanclass="p">.</span><spanclass="n">input_items</span><spanclass="w"></span><spanclass="k">IS</span><spanclass="w"></span><spanclass="s1">'JSONB array of conversation messages and context'</span><spanclass="p">;</span>
</span><spanid="line-29"><spanclass="linenos">29</span><spanclass="k">COMMENT</span><spanclass="w"></span><spanclass="k">ON</span><spanclass="w"></span><spanclass="k">COLUMN</span><spanclass="w"></span><spanclass="n">conversation_states</span><spanclass="p">.</span><spanclass="n">created_at</span><spanclass="w"></span><spanclass="k">IS</span><spanclass="w"></span><spanclass="s1">'Unix timestamp (seconds) when the conversation started'</span><spanclass="p">;</span>
</span><spanid="line-30"><spanclass="linenos">30</span><spanclass="k">COMMENT</span><spanclass="w"></span><spanclass="k">ON</span><spanclass="w"></span><spanclass="k">COLUMN</span><spanclass="w"></span><spanclass="n">conversation_states</span><spanclass="p">.</span><spanclass="n">model</span><spanclass="w"></span><spanclass="k">IS</span><spanclass="w"></span><spanclass="s1">'Model name used for this conversation'</span><spanclass="p">;</span>
<li><p>Copy and paste the SQL from <codeclass="docutils literal notranslate"><spanclass="pre">docs/db_setup/conversation_states.sql</span></code></p></li>
<li><p>Run the query</p></li>
</ol>
</section>
<sectionid="configuration">
<h3>Configuration<a@click.prevent="window.navigator.clipboard.writeText($el.href); $el.setAttribute('data-tooltip', 'Copied!'); setTimeout(() => $el.setAttribute('data-tooltip', 'Copy link to this element'), 2000)"aria-label="Copy link to this element"class="headerlink"data-tooltip="Copy link to this element"href="#configuration"x-intersect.margin.0%.0%.-70%.0%="activeSection ='#configuration'"><svgheight="1em"viewbox="0 0 24 24"width="1em"xmlns="http://www.w3.org/2000/svg"><pathd="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path></svg></a></h3>
<p>Once the database table is created, configure Plano to use PostgreSQL storage:</p>
</span><spanid="line-2"><spanclass="c1"># Run Plano or config validation</span>
</span><spanid="line-3">./plano
</span></code></pre></div>
</div>
<divclass="admonition warning">
<pclass="admonition-title">Warning</p>
<p><strong>Special Characters in Passwords</strong>: If your password contains special characters like <codeclass="docutils literal notranslate"><spanclass="pre">#</span></code>, <codeclass="docutils literal notranslate"><spanclass="pre">@</span></code>, or <codeclass="docutils literal notranslate"><spanclass="pre">&</span></code>, you must URL-encode them in the connection string. For example, <codeclass="docutils literal notranslate"><spanclass="pre">MyPass#123</span></code> becomes <codeclass="docutils literal notranslate"><spanclass="pre">MyPass%23123</span></code>.</p>
</div>
</section>
<sectionid="supabase-connection-strings">
<h3>Supabase Connection Strings<a@click.prevent="window.navigator.clipboard.writeText($el.href); $el.setAttribute('data-tooltip', 'Copied!'); setTimeout(() => $el.setAttribute('data-tooltip', 'Copy link to this element'), 2000)"aria-label="Copy link to this element"class="headerlink"data-tooltip="Copy link to this element"href="#supabase-connection-strings"x-intersect.margin.0%.0%.-70%.0%="activeSection ='#supabase-connection-strings'"><svgheight="1em"viewbox="0 0 24 24"width="1em"xmlns="http://www.w3.org/2000/svg"><pathd="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path></svg></a></h3>
<p>Supabase requires different connection strings depending on your network setup. Most users should use the <strong>Session Pooler</strong> connection string.</p>
<divclass="highlight-bash notranslate"><divclass="highlight"><pre><span></span><code><spanid="line-1"><spanclass="c1"># If your password is "MyPass#123", encode it as "MyPass%23123"</span>
<h2>Troubleshooting<a@click.prevent="window.navigator.clipboard.writeText($el.href); $el.setAttribute('data-tooltip', 'Copied!'); setTimeout(() => $el.setAttribute('data-tooltip', 'Copy link to this element'), 2000)"aria-label="Copy link to this element"class="headerlink"data-tooltip="Copy link to this element"href="#troubleshooting"x-intersect.margin.0%.0%.-70%.0%="activeSection ='#troubleshooting'"><svgheight="1em"viewbox="0 0 24 24"width="1em"xmlns="http://www.w3.org/2000/svg"><pathd="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path></svg></a></h2>
<p><strong>“Table ‘conversation_states’ does not exist”</strong></p>
<p>Run the SQL schema from <codeclass="docutils literal notranslate"><spanclass="pre">docs/db_setup/conversation_states.sql</span></code> against your database.</p>
<p><strong>Connection errors with Supabase</strong></p>
<ulclass="simple">
<li><p>Verify you’re using the correct connection string format (Session Pooler for IPv4)</p></li>
<li><p>Check that your password is URL-encoded if it contains special characters</p></li>
<li><p>Ensure your Supabase project hasn’t paused due to inactivity (free tier)</p></li>
</ul>
<p><strong>Permission errors</strong></p>
<p>Ensure your database user has the following permissions:</p>
<p><strong>State not persisting across requests</strong></p>
<ulclass="simple">
<li><p>Verify <codeclass="docutils literal notranslate"><spanclass="pre">state_storage</span></code> is configured in your <codeclass="docutils literal notranslate"><spanclass="pre">plano_config.yaml</span></code></p></li>
<li><p>Check Plano logs for state storage initialization messages</p></li>
<li><p>Ensure the client is sending the <codeclass="docutils literal notranslate"><spanclass="pre">prev_response_id={$response_id}</span></code> from previous responses</p></li>
</ul>
</section>
<sectionid="best-practices">
<h2>Best Practices<a@click.prevent="window.navigator.clipboard.writeText($el.href); $el.setAttribute('data-tooltip', 'Copied!'); setTimeout(() => $el.setAttribute('data-tooltip', 'Copy link to this element'), 2000)"aria-label="Copy link to this element"class="headerlink"data-tooltip="Copy link to this element"href="#best-practices"x-intersect.margin.0%.0%.-70%.0%="activeSection ='#best-practices'"><svgheight="1em"viewbox="0 0 24 24"width="1em"xmlns="http://www.w3.org/2000/svg"><pathd="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path></svg></a></h2>
<olclass="arabic simple">
<li><p><strong>Use environment variables for credentials</strong>: Never hardcode database passwords in configuration files.</p></li>
<li><p><strong>Start with memory storage for development</strong>: Switch to PostgreSQL when moving to production.</p></li>
<li><p><strong>Implement cleanup policies</strong>: Prevent unbounded growth by regularly archiving or deleting old conversations.</p></li>
<li><p><strong>Monitor storage usage</strong>: Track conversation state table size and query performance in production.</p></li>
<h2>Next Steps<a@click.prevent="window.navigator.clipboard.writeText($el.href); $el.setAttribute('data-tooltip', 'Copied!'); setTimeout(() => $el.setAttribute('data-tooltip', 'Copy link to this element'), 2000)"aria-label="Copy link to this element"class="headerlink"data-tooltip="Copy link to this element"href="#next-steps"x-intersect.margin.0%.0%.-70%.0%="activeSection ='#next-steps'"><svgheight="1em"viewbox="0 0 24 24"width="1em"xmlns="http://www.w3.org/2000/svg"><pathd="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path></svg></a></h2>
<ulclass="simple">
<li><p>Learn more about building <aclass="reference internal"href="../concepts/agents.html#agents"><spanclass="std std-ref">agents</span></a> that leverage conversational state</p></li>
<li><p>Explore <aclass="reference internal"href="../concepts/filter_chain.html#filter-chain"><spanclass="std std-ref">filter chains</span></a> for enriching conversation context</p></li>
<li><p>See the <aclass="reference internal"href="../concepts/llm_providers/llm_providers.html#llm-providers"><spanclass="std std-ref">LLM Providers</span></a> guide for configuring model routing</p></li>