<?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/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Shell | Feisky</title><link>https://feisky.xyz/tags/shell/</link><description>极客时间专栏作者，专注于 Kubernetes、AI Infra、AI Agent 领域的深度技术分享，让 AI 成为你的第二大脑</description><generator>Hugo 0.165.0</generator><language>zh-CN</language><managingEditor>Pengfei Ni</managingEditor><webMaster>Pengfei Ni</webMaster><lastBuildDate>Fri, 14 Aug 2026 12:39:05 +0000</lastBuildDate><atom:link href="https://feisky.xyz/tags/shell/index.xml" rel="self" type="application/rss+xml"/><item><title>OpenAI 长时间 Agent 实战指南：Skills、Shell 与上下文压缩</title><link>https://feisky.xyz/posts/2026-02-13-openai%E9%95%BF%E6%97%B6%E9%97%B4agent%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97skillsshell%E4%B8%8E%E4%B8%8A%E4%B8%8B%E6%96%87%E5%8E%8B%E7%BC%A9/</link><pubDate>Fri, 13 Feb 2026 10:00:00 +0800</pubDate><dc:creator>Pengfei Ni</dc:creator><category>OpenAI</category><category>AI Agent</category><category>Skill</category><category>Shell</category><category>上下文压缩</category><guid>https://feisky.xyz/posts/2026-02-13-openai%E9%95%BF%E6%97%B6%E9%97%B4agent%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97skillsshell%E4%B8%8E%E4%B8%8A%E4%B8%8B%E6%96%87%E5%8E%8B%E7%BC%A9/</guid><description>&lt;blockquote&gt;
&lt;p&gt;题记：本文编译自 OpenAI 开发者博客《&lt;a href="https://developers.openai.com/blog/skills-shell-tips"&gt;Shell + Skills + Compaction: Tips for Long-Running Agents&lt;/a&gt;》，由 Charlie Guo 撰写，发表于 2026 年 2 月 11 日。本文在翻译基础上做了整理和补充。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;用 Agent 做过稍微复杂一点任务的朋友，应该都碰到过这几个问题：跑着跑着上下文爆了，中间结果没地方存，任务流程每次都要从头描述一遍。&lt;/p&gt;</description><content:encoded>&lt;![CDATA[<blockquote><p>题记：本文编译自 OpenAI 开发者博客《<a href="https://developers.openai.com/blog/skills-shell-tips">Shell + Skills + Compaction: Tips for Long-Running Agents</a>》，由 Charlie Guo 撰写，发表于 2026 年 2 月 11 日。本文在翻译基础上做了整理和补充。</p></blockquote><p>用 Agent 做过稍微复杂一点任务的朋友，应该都碰到过这几个问题：跑着跑着上下文爆了，中间结果没地方存，任务流程每次都要从头描述一遍。</p><p>这些问题说白了就是一个核心矛盾：Agent 要做的事越来越重，但它的“工作记忆”和“工具箱”还停留在对话级别。</p><p>OpenAI 最近发了一篇实践指南，专门聊怎么用三个互相配合的能力来解决这些问题：Skills、Shell Tool 和 Compaction。</p><p>我自己在 Claude Code 和 Codex 上都用过类似的机制，读完这篇觉得有几个点挺实用，整理分享一下。</p><h2 id="三个核心概念">三个核心概念</h2><p>先把这三个东西分别说清楚。</p><h3 id="skills可复用的指令包">Skills：可复用的指令包</h3><p>Skills 本质上是一组带版本控制的指令文件，核心是一个<code>SKILL.md</code> 清单文件，里面写着这个技能是干什么的、什么时候该用、怎么用。你可以把它理解成给 Agent 准备的操作手册，平时不用的时候不占上下文，需要的时候按需加载。</p><p>这个概念其实来自 Anthropic。Anthropic 在 Claude Code 上早就实现了类似的机制，Codex CLI 后来也跟进了。OpenAI 这次把它的 API 也标准化了，对齐了 Agent Skills 开放标准。平台会把每个 Skill 的名字、描述和路径暴露给模型，让模型自己决定什么时候调用。</p><p>我自己用 Claude Code 的 Skills 已经有一段时间了，体验下来最大的好处就是：把那些重复性的工作流固化下来，不用每次都在 Prompt 里写一遍。</p><h3 id="shell真正的执行环境">Shell：真正的执行环境</h3><p>Shell Tool 给 Agent 提供了一个真实的终端环境，可以是 OpenAI 托管的容器，也可以是本地运行时。在这个环境里，Agent 可以安装依赖、跑脚本、生成文件，而且有受控的网络访问权限。</p><p>这跟简单的代码执行还是有本质区别的。举个例子，你让 Agent 分析一个 CSV 数据集，它可以在 Shell 里先<code>pip install pandas matplotlib</code>，然后写一段 Python 脚本做数据清洗和可视化，最后把生成的图表存到<code>/mnt/data/</code> 目录。整个过程不需要你提前配环境，Agent 自己就能搞定。</p><p>两种模式（托管容器和本地运行）通过 Responses API 保持了统一的工具语义。开发阶段在本地快速迭代，上线后切到托管容器做隔离，API 调用方式是一样的：</p><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>response<span style="color:#f92672">=</span> client<span style="color:#f92672">.</span>responses<span style="color:#f92672">.</span>create(</span></span><span style="display:flex;"><span> model<span style="color:#f92672">=</span><span style="color:#e6db74">"gpt-5.2"</span>,</span></span><span style="display:flex;"><span> tools<span style="color:#f92672">=</span>[{</span></span><span style="display:flex;"><span><span style="color:#e6db74">"type"</span>:<span style="color:#e6db74">"shell"</span>,</span></span><span style="display:flex;"><span><span style="color:#e6db74">"environment"</span>: {<span style="color:#e6db74">"type"</span>:<span style="color:#e6db74">"container_auto"</span>}<span style="color:#75715e"># 本地模式改成 "local"</span></span></span><span style="display:flex;"><span> }],</span></span><span style="display:flex;"><span> input<span style="color:#f92672">=</span><span style="color:#e6db74">"Install pandas, fetch the CSV from S3, and generate a summary report"</span></span></span><span style="display:flex;"><span>)</span></span></code></pre></div><p>这样做的好处是，本地开发和生产环境的切换只需要把<code>environment</code> 类型从<code>container_auto</code> 改成<code>local</code>。</p><h3 id="compaction上下文不够用怎么办">Compaction：上下文不够用怎么办</h3><p>长时间运行的 Agent 最头疼的问题就是上下文窗口不够用。跑了几十轮工具调用之后，前面的对话内容就被挤出去了，Agent 就可能开始断片。</p><p>Compaction 就是解决这个问题的。它有两种方式：一种是自动压缩，在<code>context_management</code> 里设个阈值，上下文超了就自动触发；另一种是通过<code>/responses/compact</code> 接口手动压缩：</p><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># 方式一：自动压缩，上下文超过阈值时服务端自动触发</span></span></span><span style="display:flex;"><span>response<span style="color:#f92672">=</span> client<span style="color:#f92672">.</span>responses<span style="color:#f92672">.</span>create(</span></span><span style="display:flex;"><span> model<span style="color:#f92672">=</span><span style="color:#e6db74">"gpt-5.2"</span>,</span></span><span style="display:flex;"><span> input<span style="color:#f92672">=</span>conversation,</span></span><span style="display:flex;"><span> context_management<span style="color:#f92672">=</span>[{<span style="color:#e6db74">"type"</span>:<span style="color:#e6db74">"compaction"</span>,<span style="color:#e6db74">"compact_threshold"</span>:<span style="color:#ae81ff">200000</span>}],</span></span><span style="display:flex;"><span>)</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span><span style="color:#75715e"># 方式二：手动压缩，显式调用 compact 接口</span></span></span><span style="display:flex;"><span>compacted<span style="color:#f92672">=</span> client<span style="color:#f92672">.</span>responses<span style="color:#f92672">.</span>compact(</span></span><span style="display:flex;"><span> model<span style="color:#f92672">=</span><span style="color:#e6db74">"gpt-5.2"</span>,</span></span><span style="display:flex;"><span> input<span style="color:#f92672">=</span>long_conversation_items,</span></span><span style="display:flex;"><span>)</span></span></code></pre></div><p>核心思路都是把之前的对话历史压缩成摘要，保留关键信息，释放上下文空间。</p><p>这个功能的关键在于心态转变，也就是不要把 Compaction 当成上下文快爆了才用的应急措施，而是从一开始就把它作为默认实践。设计任务流程的时候就考虑好：容器要复用，<code>previous_response_id</code> 要传递，压缩要常态化。</p><h2 id="五条实践建议">五条实践建议</h2><p>概念说完了，来看具体怎么用好这些能力。OpenAI 在文章里给了几条实操建议，结合我自己的使用经验一起聊聊。</p><h3 id="skill-的描述就是路由逻辑">Skill 的描述就是路由逻辑</h3><p>很多人写 Skill 描述的时候，只写了这个 Skill 是干什么的，这远远不够。描述要能回答三个问题：什么时候该用它、什么时候不该用它、用完之后期望的输出是什么。</p><p>具体来说，要写明 Use when 和 Don&rsquo;t use when 两类场景。举个例子，一个数据分析 Skill 的描述可能是这样的：</p><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span># Data Analysis Skill</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span>Use when:</span></span><span style="display:flex;"><span><span style="color:#66d9ef">-</span> User provides a dataset and asks for trends, patterns, or insights</span></span><span style="display:flex;"><span><span style="color:#66d9ef">-</span> User needs charts or visualizations from raw data</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span>Don't use when:</span></span><span style="display:flex;"><span><span style="color:#66d9ef">-</span> User asks a simple statistical question (e.g., "what's the average of X")</span></span><span style="display:flex;"><span><span style="color:#66d9ef">-</span> User just needs data formatting or conversion</span></span></code></pre></div><p>不只写用于分析数据集，还要明确告诉模型什么时候不需要大费周章地调用这个 Skill。</p><h3 id="反面案例比正面案例更重要">反面案例比正面案例更重要</h3><p>OpenAI 的测试数据显示，光有 Skill 不写反面案例，正确调用率反而会下降大约 20% 。加上什么时候不该用的说明后，路由准确性才恢复并提升。</p><p>这个发现挺有意思的。模型看到一个新工具，本能反应是有锤子就找钉子。如果你不明确告诉它边界在哪，它会倾向于过度使用。</p><h3 id="模板放在-skill-里别放-system-prompt">模板放在 Skill 里，别放 System Prompt</h3><p>这条建议很实用。很多人习惯把示例和模板直接塞进 System Prompt 里，结果不管当前任务用不用得上，每次对话都要消耗这些 token。</p><p>把模板放在 Skill 内部，效果是不用时基本免费。只有模型决定调用这个 Skill 的时候，模板内容才会被加载进上下文。这对 token 消耗的优化是巨大的，也是 Skill 最大的优点。</p><h3 id="需要确定性的时候别让模型自己选">需要确定性的时候，别让模型自己选</h3><p>自动路由在大多数场景下够用了。但在生产环境中对确定性要求高的流程里，最好直接告诉模型用某某 Skill，别让它自己判断。</p><p>这就把模糊的路由变成了明确的指令。特别是在多步骤工作流中，每一步用哪个 Skill、按什么顺序执行，都应该在编排层面写清楚，不留给模型自由发挥的空间。</p><h3 id="网络安全不能马虎">网络安全不能马虎</h3><p>Skill 加上网络访问权限，等于给 Agent 开了一条可以往外发数据的通道。网络安全这事不能大意。</p><p>安全策略说白了就是两层白名单：组织级白名单划定最大范围，请求级白名单只能在这个范围内再缩小。两层都要尽量收紧。</p><p>另外一个关键点是，模型绝对不能看到明文凭证。OpenAI 搞了个<code>domain_secrets</code> 机制，在 Skill 里写占位符（比如<code>Authorization: Bearer {{API_KEY}}</code>），实际的密钥只在请求发往白名单里的目标地址时才替换进去。思路跟环境变量注入差不多，但多了目标地址校验。</p><h2 id="三种构建模式">三种构建模式</h2><p>OpenAI 还总结了三种递进的构建模式，从简单到复杂，适合不同阶段的需求。</p><h3 id="基础模式安装--获取--写入">基础模式：安装 → 获取 → 写入</h3><p>最简单的用法：让 Agent 在 Shell 里安装依赖、拉取外部数据、把结果写到<code>/mnt/data/</code> 目录。</p><p><code>/mnt/data/</code> 相当于一个约定好的交付目录，Agent 生成的需要人来审查或者给下游用的文件都放这里。这样做的好处是划清了 Agent 的工作区和最终交付物的界限，后续取用和审查都方便。</p><h3 id="工作流模式skills--shell-联动">工作流模式：Skills + Shell 联动</h3><p>把重复性工作流封装成 Skill，挂到 Shell 环境里，让 Agent 按固定流程跑。</p><p>这种模式特别适合数据处理类任务。拿数据集清洗来说，你可以在 Skill 里定义好标准流程：先检查缺失值比例，超过阈值的列直接丢掉；然后做类型推断和格式标准化；最后输出清洗报告到<code>/mnt/data/</code>。Agent 每次拿到新数据集，都按这个流程走，不用你重复描述一遍。</p><h3 id="企业级模式skills-作为活的-sop">企业级模式：Skills 作为活的 SOP</h3><p>到了企业场景，Skills 就不只是技术工具了，而是变成了活的 SOP。公司的业务流程改了，对应的 Skill 跟着更新，Agent 的行为自动对齐，不用重新调参。</p><p>OpenAI 提到了 Glean 的早期落地案例：用了这种模式之后，准确率从 73% 提升到 85% ，首次响应延迟降低了 18.1% 。挺有意思的一点是，给 Agent 结构化的指导，不仅提高了质量，还加快了速度。模型不用花那么多 token 去想该怎么做，直接按 Skill 里的步骤走就行了。</p><h2 id="写在最后">写在最后</h2><p>回过头来看，OpenAI 这篇文章的核心观点其实就一个：长时间运行的 Agent 需要从单次对话的思维模式升级到持续工作流的思维模式。</p><p>Skills 解决怎么做的问题，把经验固化成可复用的指令。Shell 解决在哪做的问题，提供真实的执行环境。Compaction 解决记不住的问题，让 Agent 在长任务中保持连贯。</p><p>这三个能力并不是 OpenAI 独有的。Claude Code 的 Skills 和 SubAgent、Codex 的 Shell 执行和 Exec Plan，本质上都在解决同样的问题。各家的具体实现不同，但方向是一致的：让 Agent 从聊天助手进化成能持续干活的工作伙伴。</p><p>如果你正在做 Agent 相关的开发，有几个建议：先把最常用的工作流封装成 Skill，别急着做通用的。Shell 环境从本地开始，跑通了再考虑容器化。Compaction 从第一天就用上，别等上下文爆了再补救。</p><hr><p>原文链接：<a href="https://developers.openai.com/blog/skills-shell-tips">https://developers.openai.com/blog/skills-shell-tips</a></p><hr><p>欢迎长按下面的二维码关注<strong>Feisky</strong> 公众号，了解更多云原生和 AI 知识。</p><p><img src="/images/mp.png" alt="Feisky 公众号二维码" loading="lazy" decoding="async"/></p>
]]></content:encoded><dc:extent>7 min read</dc:extent></item></channel></rss>