<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Agentkit]]></title><description><![CDATA[Agentkit]]></description><link>https://agentkit-ai.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Agentkit</title><link>https://agentkit-ai.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 20:40:32 GMT</lastBuildDate><atom:link href="https://agentkit-ai.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[A chatbot action timeout is an unknown outcome]]></title><description><![CDATA[A support chatbot asks an integration to create a ticket. The request times out. What should it tell the customer?
"The ticket was not created" is too strong. A timeout can mean that the destination a]]></description><link>https://agentkit-ai.hashnode.dev/a-chatbot-action-timeout-is-an-unknown-outcome</link><guid isPermaLink="true">https://agentkit-ai.hashnode.dev/a-chatbot-action-timeout-is-an-unknown-outcome</guid><category><![CDATA[#chatbots]]></category><dc:creator><![CDATA[Agentkit]]></dc:creator><pubDate>Thu, 10 Sep 2026 04:07:32 GMT</pubDate><content:encoded><![CDATA[<p>A support chatbot asks an integration to create a ticket. The request times out. What should it tell the customer?</p>
<p>"The ticket was not created" is too strong. A timeout can mean that the destination accepted the request and its response never reached the caller. Retrying immediately can create two tickets. Saying "Done" can leave the customer waiting for a ticket that never existed.</p>
<p>Treat an uncertain action as a state worth preserving.</p>
<h2>Separate three things</h2>
<p>The conversation records what the customer asked for. The execution record describes an attempt to carry it out. The destination holds the business outcome. Those records can disagree temporarily.</p>
<p>For a ticket request, a useful execution record contains an operation identifier, the intended destination, a timestamp, a safe summary of the requested action and any returned ticket identifier. It should not contain unnecessary customer secrets.</p>
<p>Use at least these outcomes:</p>
<table>
<thead>
<tr>
<th>Outcome</th>
<th>Evidence</th>
<th>Customer-facing wording</th>
</tr>
</thead>
<tbody><tr>
<td>Confirmed</td>
<td>Destination acknowledged the ticket and returned its identifier.</td>
<td>"Your request was created. The reference is…"</td>
</tr>
<tr>
<td>Rejected</td>
<td>Destination explicitly refused the request.</td>
<td>"I couldn't create the request. Here's another way to reach support."</td>
</tr>
<tr>
<td>Unknown</td>
<td>The request may have reached the destination, but there is no decisive result.</td>
<td>"I couldn't confirm whether it went through. I won't send another copy while that is being checked."</td>
</tr>
</tbody></table>
<p>The words should match the evidence. A successful HTTP response may still represent a queued operation rather than completed business work. Read the destination's documented meaning of success.</p>
<h2>Make retries a product decision</h2>
<p>An idempotency key can help when the destination supports one. Reuse the same key for another attempt at the same operation. A new random key on each retry defeats the purpose. Check the provider's retention window and conflict rules before depending on this behavior.</p>
<p>If the destination does not support idempotency, look for a supported reconciliation method. A ticket identifier, an external reference field or a narrowly scoped search may help. Absence from a search result is not always proof of absence: indexing and asynchronous processing can lag.</p>
<p>For an irreversible or costly action, unresolved uncertainty may need a human. For a harmless read, a bounded retry may be reasonable. Apply that distinction to the action, not to how confident the language model sounds.</p>
<h2>Test the awkward timing</h2>
<p>A happy-path test cannot expose this failure. Add a test in which the destination commits the operation but the caller loses the response. Then check both the destination and the conversation:</p>
<ul>
<li>Does exactly one business operation exist?</li>
<li>Does the conversation avoid a false success or failure claim?</li>
<li>Can a later worker reconcile the operation without creating a fresh one?</li>
<li>Is there a clear route for the customer if reconciliation remains unresolved?</li>
</ul>
<p>Also test an explicit rejection. A design that labels every failure "unknown" can become needlessly paralyzed.</p>
<p>The useful boundary is between evidence of an outcome and evidence that an attempt occurred. Keep both. That distinction matters whenever a chatbot moves from answering questions to changing something outside the conversation.</p>
<p>Written by the <a href="https://agentkit.ai">Agentkit</a> team with AI assistance. This is a design pattern for chatbot integrations, not a claim that every integration implements the same retry guarantees.</p>
]]></content:encoded></item></channel></rss>