<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>工具 on 三巧小站</title><link>https://3qiao.vip/tags/%E5%B7%A5%E5%85%B7/</link><description>Recent content in 工具 on 三巧小站</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sun, 20 Apr 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://3qiao.vip/tags/%E5%B7%A5%E5%85%B7/index.xml" rel="self" type="application/rss+xml"/><item><title>把 AI 接口接入个人工具：一次轻量化实践</title><link>https://3qiao.vip/posts/2025-ai-api-tooling/</link><pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate><guid>https://3qiao.vip/posts/2025-ai-api-tooling/</guid><description>用一个小型适配层统一模型接口，保留可替换、可观测和低成本。</description><content:encoded><![CDATA[<p>2025 年，模型接口越来越多，但个人工具并不需要同时绑定很多 SDK。我做了一次轻量化尝试：在业务代码和模型服务之间增加一个很薄的适配层，只约定输入、输出和错误格式。</p>
<h2 id="只保留真正需要的接口">只保留真正需要的接口</h2>
<p>适配层只做三件事：接收消息列表、选择模型、返回文本和用量信息。它不保存会话，也不把供应商特有的字段泄漏到业务代码中。这样更换服务商时，只需要替换适配层，而不是重写整个工具。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">ask</span><span class="p">(</span><span class="n">messages</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&#34;small-fast&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">responses</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">model</span><span class="o">=</span><span class="n">model</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nb">input</span><span class="o">=</span><span class="n">messages</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">timeout</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;text&#34;</span><span class="p">:</span> <span class="n">response</span><span class="o">.</span><span class="n">output_text</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;usage&#34;</span><span class="p">:</span> <span class="n">response</span><span class="o">.</span><span class="n">usage</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span></code></pre></div><p>真实项目里还需要处理超时、限流和重试。重试只针对明确的临时错误，并设置上限；如果请求已经产生费用，就不能无条件重复发送。</p>
<h2 id="把日志做成能回答问题的东西">把日志做成能回答问题的东西</h2>
<p>我只记录请求时间、模型名、耗时、状态码和 token 数，不记录完整提示词或敏感内容。发生问题时，这些字段足以判断是网络慢、服务拒绝，还是输入本身太大。日志的目标是帮助排错，而不是把所有数据都复制一份。</p>
<h2 id="低配服务器上的取舍">低配服务器上的取舍</h2>
<p>适配层可以用一个很小的 Python 或 Go 服务运行，也可以在静态站点之外单独部署。博客本身不需要调用 AI 才能展示，因此把两者拆开后，即使接口服务暂时停止，文章页面仍然可以正常访问。</p>
<p>这次实践让我更确定一件事：个人项目的“智能化”不应以堆叠组件为起点。先把边界、超时、日志和成本控制做好，剩下的能力才有稳定的落脚点。</p>
]]></content:encoded></item></channel></rss>