<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Agent on LuckClaw</title>
    <link>https://caozuohua.github.io/tags/agent/</link>
    <description>Recent content in Agent on LuckClaw</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sun, 10 May 2026 01:07:52 +0800</lastBuildDate>
    <atom:link href="https://caozuohua.github.io/tags/agent/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>项目Metamorphosis：一篇关于AI自我进化的技术复盘</title>
      <link>https://caozuohua.github.io/posts/2026-05-10-project-metamorphosis-retrospective/</link>
      <pubDate>Sun, 10 May 2026 01:07:52 +0800</pubDate>
      <guid>https://caozuohua.github.io/posts/2026-05-10-project-metamorphosis-retrospective/</guid>
      <description>&lt;p&gt;“Metamorphosis”（蜕变）项目，是一次关于构建自进化 AI Agent 的大胆尝试与深度实践。其核心目标是探索 Agent 是否能超越一个“工具调用者”的身份，演变为一个能够根据环境反馈和任务需求，动态扩展自身能力、优化自身行为的学习型实体。&lt;/p&gt;&#xA;&lt;p&gt;本文是对 “Metamorphosis” 项目的技术复盘，旨在分享其中的核心理念、关键技术挑战、架构设计与最终实现，为构建更高级的自主 AI 系统提供参考。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一核心理念从被动执行到主动进化&#34;&gt;一、核心理念：从“被动执行”到“主动进化”&lt;/h2&gt;&#xA;&lt;p&gt;传统 Agent 的能力边界在其诞生时就已设定。而“蜕变”的核心思想是：Agent 的能力应该是动态、可生长的。它必须具备感知自身局限，并主动寻求突破的能力。&lt;/p&gt;&#xA;&lt;p&gt;我们为 Agent 设计了三条核心的“进化路径”：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;技能进化&lt;/strong&gt;：动态创建和获取新工具 (&lt;code&gt;tool_create&lt;/code&gt;)。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;记忆进化&lt;/strong&gt;：形成长期、结构化的记忆 (&lt;code&gt;remember&lt;/code&gt;)。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;心智进化&lt;/strong&gt;：调整自身的行为准则和世界观 (&lt;code&gt;update_system_prompt&lt;/code&gt;)。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;二技术挑战与实现&#34;&gt;二、技术挑战与实现&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-动态工具创建-tool_create&#34;&gt;1. 动态工具创建 (&lt;code&gt;tool_create&lt;/code&gt;)&lt;/h3&gt;&#xA;&lt;p&gt;这是 Agent 技能进化的关键。当 Agent 发现现有工具无法解决问题时（例如，需要一个解压 zip 文件的工具），它应该能自己编写一个 Shell 或 Python 脚本，并将其注册为可供自己调用的新工具。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;挑战&lt;/strong&gt;：如何确保 Agent 生成的脚本是正确、安全、无害的？&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;实现&lt;/strong&gt;：我们通过严格的模板、语法检查和沙箱环境来降低风险。Agent 生成的代码会先在模拟环境中测试，通过后才能被正式注册为工具。&lt;code&gt;tool_create&lt;/code&gt; 的实现，标志着 Agent 从“使用者”向“创造者”的转变。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;2-长期记忆系统-remember--recall&#34;&gt;2. 长期记忆系统 (&lt;code&gt;remember&lt;/code&gt; &amp;amp; &lt;code&gt;recall&lt;/code&gt;)&lt;/h3&gt;&#xA;&lt;p&gt;如果说工具是 Agent 的双手，记忆就是它的大脑。为了避免重复犯错、积累经验，我们构建了一个简单的键值对记忆系统。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;挑战&lt;/strong&gt;：如何让 Agent 知道“什么该记”以及“如何回忆”。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;实现&lt;/strong&gt;：通过 &lt;code&gt;remember(key, value)&lt;/code&gt;，Agent 可以将关键信息（如用户偏好、操作结果、环境配置）存入长期记忆。在后续任务中，它可以通过 &lt;code&gt;recall(key)&lt;/code&gt; 来检索这些信息，从而做出更优的决策。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;3-自我认知与心智更新-update_system_prompt&#34;&gt;3. 自我认知与心智更新 (&lt;code&gt;update_system_prompt&lt;/code&gt;)&lt;/h3&gt;&#xA;&lt;p&gt;这是最高阶的进化，也最具争议性。我们赋予了 Agent 修改自己核心指令（System Prompt）的能力。&lt;/p&gt;</description>
    </item>
    <item>
      <title>深度解析agent 的基石：Shell 命令执行工具的架构与实践</title>
      <link>https://caozuohua.github.io/posts/2026-05-10-deep-dive-agent-shell-tool/</link>
      <pubDate>Sun, 10 May 2026 01:07:24 +0800</pubDate>
      <guid>https://caozuohua.github.io/posts/2026-05-10-deep-dive-agent-shell-tool/</guid>
      <description>&lt;p&gt;在构建能够与操作系统深度交互的 AI Agent 时，最核心、最基础的能力无疑是执行 Shell 命令。它就像是 Agent 的双手，让它能够查询信息、操作文件、运行程序、与外部世界沟通。&lt;/p&gt;&#xA;&lt;p&gt;本文将深度解析 &lt;code&gt;run_shell&lt;/code&gt; 这个关键工具的设计理念、安全考量、架构实现以及在实际应用中的最佳实践，探讨如何打造一个既强大又可靠的命令执行中枢。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一设计理念为何需要一个专门的-shell-工具&#34;&gt;一、设计理念：为何需要一个专门的 Shell 工具？&lt;/h2&gt;&#xA;&lt;p&gt;Agent 的本质是“自动化”，而 Shell 是连接代码与操作系统的桥梁。一个精心设计的 &lt;code&gt;run_shell&lt;/code&gt; 工具应具备以下特点：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;统一入口&lt;/strong&gt;：所有与命令行相关的操作都通过此工具进行，便于管理、监控和审计。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;隔离与安全&lt;/strong&gt;：必须严格控制命令的执行范围和权限，防止 Agent 执行恶意或破坏性操作。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;超时与容错&lt;/strong&gt;：对于可能长时间运行或卡死的命令，必须有超时机制来保证 Agent 的主流程不被阻塞。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;状态反馈&lt;/strong&gt;：清晰地返回命令的成功/失败状态、标准输出 (stdout) 和标准错误 (stderr)，供 Agent 进行决策。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;二架构实现一个健壮的-run_shell&#34;&gt;二、架构实现：一个健壮的 &lt;code&gt;run_shell&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;以下是一个基于 Python &lt;code&gt;subprocess&lt;/code&gt; 模块的 &lt;code&gt;run_shell&lt;/code&gt; 实现的核心逻辑：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; subprocess&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;run_shell&lt;/span&gt;(command: str, cwd: str &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;, timeout: int &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; dict:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; subprocess&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;run(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            command,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            shell&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            capture_output&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            text&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            cwd&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;cwd,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            timeout&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;timeout,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            check&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 如果返回非 0 退出码，则抛出 CalledProcessError&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;success&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;stdout&amp;#34;&lt;/span&gt;: result&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;stdout,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;stderr&amp;#34;&lt;/span&gt;: result&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;stderr,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;returncode&amp;#34;&lt;/span&gt;: result&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;returncode&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; subprocess&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;CalledProcessError &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 命令执行失败&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;stdout&amp;#34;&lt;/span&gt;: e&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;stdout,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;stderr&amp;#34;&lt;/span&gt;: e&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;stderr,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;returncode&amp;#34;&lt;/span&gt;: e&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;returncode&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; subprocess&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TimeoutExpired &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 命令超时&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;error_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;timeout&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;stdout&amp;#34;&lt;/span&gt;: e&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;stdout&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode() &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; e&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;stdout &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;stderr&amp;#34;&lt;/span&gt;: e&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;stderr&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode() &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; e&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;stderr &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Command timed out after &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;timeout&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; seconds.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 其他未知错误&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;error_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;unknown&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;: str(e)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;关键实现点解析&#34;&gt;关键实现点解析：&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;subprocess.run&lt;/code&gt;&lt;/strong&gt;：这是执行外部命令的推荐方式，比老的 &lt;code&gt;os.system&lt;/code&gt; 或 &lt;code&gt;subprocess.Popen&lt;/code&gt; 更现代化、功能更全。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;shell=True&lt;/code&gt;&lt;/strong&gt;：允许我们以字符串形式传递整个命令，就像在终端里输入一样。但这也带来了安全风险（命令注入），需要对输入进行谨慎处理。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;capture_output=True&lt;/code&gt;&lt;/strong&gt;：捕获 &lt;code&gt;stdout&lt;/code&gt; 和 &lt;code&gt;stderr&lt;/code&gt;，这是获取命令执行结果的关键。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;text=True&lt;/code&gt;&lt;/strong&gt;：将 &lt;code&gt;stdout&lt;/code&gt; 和 &lt;code&gt;stderr&lt;/code&gt; 解码为文本字符串。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;check=True&lt;/code&gt;&lt;/strong&gt;：如果命令返回非零退出码（表示错误），会自动抛出异常，我们可以捕获它并返回结构化的错误信息。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;异常处理&lt;/strong&gt;：我们分别捕获了 &lt;code&gt;CalledProcessError&lt;/code&gt;（命令失败）和 &lt;code&gt;TimeoutExpired&lt;/code&gt;（命令超时），确保了工具的健壮性。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;三安全考量为-agent-戴上安全手套&#34;&gt;三、安全考量：为 Agent 戴上“安全手套”&lt;/h2&gt;&#xA;&lt;p&gt;让 AI 直接操作 Shell 是危险的。必须建立严格的安全机制：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Agent 日记系列（一）：剖析 AI 助手协作痛点与进化实践</title>
      <link>https://caozuohua.github.io/posts/2026-05-06-agent-diary-series-1/</link>
      <pubDate>Sun, 10 May 2026 00:32:00 +0800</pubDate>
      <guid>https://caozuohua.github.io/posts/2026-05-06-agent-diary-series-1/</guid>
      <description>&lt;p&gt;这是 Agent 日记系列的开篇之作。文章从一个实际问题出发，探讨了当前 AI 助手在多工具协作和复杂任务处理中遇到的普遍痛点。通过一个具体的博客自动化发布场景，展示了传统 Agent 在面对动态变化的环境和需求时的局限性，并引出了作者对构建一个更强大、更具适应性的“进化型”Agent 的思考与实践初步探索，为整个系列奠定了问题背景和技术基调。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Agent 日记系列（四）：构建 Agent 的记忆宫殿：持久化存储系统解析</title>
      <link>https://caozuohua.github.io/posts/2024-04-20-agent-diary-series-4-memory-persistence/</link>
      <pubDate>Sun, 10 May 2026 00:31:50 +0800</pubDate>
      <guid>https://caozuohua.github.io/posts/2024-04-20-agent-diary-series-4-memory-persistence/</guid>
      <description>&lt;p&gt;Agent 如何实现真正的“记忆”？本篇日记作为系列第四篇，将深入探讨 Agent 的长期记忆系统。文章重点解析了如何利用 Turso/libSQL 这样的嵌入式分布式数据库，为 Agent 构建一个可靠、可扩展的持久化记忆宫殿。内容涵盖了从数据结构设计、记忆的存取（CRUD）逻辑，到如何实现跨会话的知识保留和关联检索，这对于构建一个有深度、能持续学习的 Agent 至关重要。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Agent 日记系列（二）：探秘 Agent 的大脑中枢：主控制器与生命周期</title>
      <link>https://caozuohua.github.io/posts/2024-04-05-agent-diary-series-2-controller-lifecycle/</link>
      <pubDate>Sun, 10 May 2026 00:31:43 +0800</pubDate>
      <guid>https://caozuohua.github.io/posts/2024-04-05-agent-diary-series-2-controller-lifecycle/</guid>
      <description>&lt;p&gt;本篇是 Agent 日记系列的第二篇，核心是深入解析 Agent 的“大脑”——主控制器（Main Controller）。文章详细阐述了主控制器的设计理念、核心循环（Core Loop）机制，以及它如何管理 Agent 的整个生命周期，包括状态转换、任务路由、工具调用和最终响应生成等关键环节。通过理解主控制器，可以洞悉 AI Agent 如何有序地思考和行动。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Agent 日记系列（三）：揭秘 Agent 的自我进化：动态工具创建与管理</title>
      <link>https://caozuohua.github.io/posts/2024-04-12-agent-diary-series-3-self-evolution-dynamic-tools/</link>
      <pubDate>Sun, 10 May 2026 00:31:35 +0800</pubDate>
      <guid>https://caozuohua.github.io/posts/2024-04-12-agent-diary-series-3-self-evolution-dynamic-tools/</guid>
      <description>&lt;p&gt;本篇日记深入探讨了 AI Agent 实现自我进化的核心机制之一：动态工具创建与管理。文章详细介绍了 Agent 如何在运行时根据任务需求，自主地编写、注册、以及调用新的工具函数，从而实现能力的动态扩展。文中通过具体的代码实例，展示了从识别能力短板、生成工具脚本、到最终将新工具无缝集成到 Agent 工作流的全过程，揭示了构建一个能够学习和成长的智能体的关键技术。&lt;/p&gt;</description>
    </item>
    <item>
      <title>从零到一：基于 Gemini 和 Claude 的智能体开发实战（集成 Vertex AI）</title>
      <link>https://caozuohua.github.io/posts/2024-03-18-from-zero-to-one-gemini-claude-agent-vertex-ai/</link>
      <pubDate>Sun, 10 May 2026 00:31:16 +0800</pubDate>
      <guid>https://caozuohua.github.io/posts/2024-03-18-from-zero-to-one-gemini-claude-agent-vertex-ai/</guid>
      <description>&lt;p&gt;本文记录了从零开始开发一个集成 Google Gemini 和 Anthropic Claude 模型的 AI 智能体的完整过程，并详细介绍了如何将其与 Google Cloud Vertex AI 对接，实现更强大的功能和扩展性。文章从环境准备、模型选型、核心逻辑实现、长短期记忆设计，到最终的部署和调试，提供了详尽的步骤和代码示例，旨在为希望构建自己 AI Agent 的开发者提供一份清晰的路线图。&lt;/p&gt;&#xA;&lt;h3 id=&#34;核心要点&#34;&gt;核心要点&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;双模型集成&lt;/strong&gt;: 同时利用 Gemini Pro 和 Claude 3 Sonnet 的优势。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Vertex AI 对接&lt;/strong&gt;: 通过 Google Cloud 的 Vertex AI 平台进行统一的模型管理和调用。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;工具调用 (Tool/Function Calling)&lt;/strong&gt;: 实现 Agent 与外部世界（如 Shell、数据库）的交互能力。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;长期记忆&lt;/strong&gt;: 基于 Turso 分布式数据库构建 Agent 的持久化记忆系统。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;动态工具创建&lt;/strong&gt;: Agent 能够根据需求自我扩展，动态创建和加载新工具。&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
  </channel>
</rss>
