<?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>LangChain 项目阅读 on On My Way</title>
    <link>https://tuanzi-wow.cn/frameworks/langchain/%E9%A1%B9%E7%9B%AE%E9%98%85%E8%AF%BB%E6%89%80%E5%BE%97/</link>
    <description>Recent content in LangChain 项目阅读 on On My Way</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <atom:link href="https://tuanzi-wow.cn/frameworks/langchain/%E9%A1%B9%E7%9B%AE%E9%98%85%E8%AF%BB%E6%89%80%E5%BE%97/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>DeepFlow</title>
      <link>https://tuanzi-wow.cn/frameworks/langchain/%E9%A1%B9%E7%9B%AE%E9%98%85%E8%AF%BB%E6%89%80%E5%BE%97/deepflow/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tuanzi-wow.cn/frameworks/langchain/%E9%A1%B9%E7%9B%AE%E9%98%85%E8%AF%BB%E6%89%80%E5%BE%97/deepflow/</guid>
      <description>DeepFlow相关学习笔记与实践要点。</description>
      <content:encoded><![CDATA[<h1 id="1langgraphjson文件的作用">1.langgraph.json文件的作用</h1>
<p>when:</p>
<ol>
<li>使用Langgraph cli部署本地API服务</li>
<li>部署到langgraph cloud/langsmith deployment</li>
<li>使用langgraph studio及逆行调试</li>
</ol>
<p>不需要:
使用传统的后端API服务;纯脚本/嵌入式开发</p>
<p>作用:
指定graph入口;生命项目依赖;配置环境变量等等</p>
<h1 id="2sandbox的作用">2.Sandbox的作用</h1>
<p>提供隔离的安全执行环境</p>
<ol>
<li>
<p>安全隔离(防止恶意代码和误操作):主要是限制一些危险操作,比如<code>rm</code>等删除操作,防止访问敏感数据,防止向外发送未经授权的请求等等</p>
</li>
<li>
<p>环境独立和资源限制:</p>
<ol>
<li>资源配额:CPU,内存,磁盘限额</li>
<li>隔离环境:每一个session都有干净的上下文</li>
</ol>
</li>
<li>
<p>支持复杂工具运行:</p>
<ol>
<li>提供工具:文件系统操作工具</li>
<li>提供无头(Headless)浏览器环境</li>
</ol>
</li>
</ol>
<h1 id="3技能加载的递归实现">3.技能加载的递归实现:</h1>
<p>递归发现skills下嵌套的SKILL.md文件</p>
<h1 id="4subagent的sse事件">4.Subagent的SSE事件</h1>
<p>SSE(Server sent evnet):一种基于HTTP协议的单向实时通信技术,创建HTTP连接后,主动,持续地向客户端推送数据</p>
<h2 id="subagent的sse事件">subagent的SSE事件</h2>
<p>subagent持续向用户端暴露该agent的执行情况
可视化的多agent协作;支持中途打断和交互</p>
<h1 id="5常见的工具生态系统">5.常见的工具生态系统</h1>
<p>沙箱;内置工具(自己编写的);社区工具;MCP;Skill</p>
]]></content:encoded>
    </item>
    <item>
      <title>Open-SWE</title>
      <link>https://tuanzi-wow.cn/frameworks/langchain/%E9%A1%B9%E7%9B%AE%E9%98%85%E8%AF%BB%E6%89%80%E5%BE%97/open-swe/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tuanzi-wow.cn/frameworks/langchain/%E9%A1%B9%E7%9B%AE%E9%98%85%E8%AF%BB%E6%89%80%E5%BE%97/open-swe/</guid>
      <description>Open-SWE相关学习笔记与实践要点。</description>
      <content:encoded><![CDATA[<h1 id="convention-part">Convention part</h1>
<h2 id="1使用async方法只在必须的时候才使用sync方法不是通用的设计范式">1.使用async方法,只在必须的时候才使用sync方法(不是通用的设计范式):</h2>
<p>约束之一为:Use async-only implementations. Add a sync method only when an interface requires it, and then raise <code>NotImplementedError</code>.</p>
<p>1.使用async方法优化并发性能 2.使用NotImplementedError显式告知为提供async实现,采用同步方法</p>
<h2 id="2use-strong-types-everywhere">2.Use strong types everywhere</h2>
<ol>
<li>类型安全:防止隐式转换带来的诸多问题</li>
<li>代码即文档(Self-Documenting Code)(可读性)与可维护性:该可读性不只是对于人,也可以是LLM,agent等等</li>
</ol>
<p>常见的情况是:
Never use Any</p>
<h2 id="3use-absolute-imports-across-packages-same-package-imports-may-start-with-one-dot-never-use-parent-relative-imports">3.Use absolute imports across packages; same-package imports may start with one dot. Never use parent-relative imports.</h2>
<p>解释:1.使用绝对路径而非相对路径2.同一个package内部的导入可以使用.
3.但是禁止使用多<code>.</code>来向上级或者祖先目录寻找模块</p>
<p>作用:
1.编码&quot;跨层级重构&quot;引入的导入崩溃
2.增强代码的可读性
3.允许单点<code>.</code>的折中考虑:既保留了同模块的内聚性,又省略了编码的繁琐性</p>
<h2 id="4use-structured-logging-with-a-static-message-and-values-in-extra-never-interpolate-values-into-log-messages-avoid-standard-logrecord-field-names-in-extra">4.Use structured logging with a static message and values in extra; never interpolate values into log messages. Avoid standard LogRecord field names in extra.</h2>
<p>使用结构化日志,保留固定的静态信息,将动态变量放入extra属性中
1.优化了日志聚合和分析系统
2.防止破坏日志结构的内部状态
3.增加日志的安全性,防止个人私密信息的泄露</p>
<h2 id="5never-discard-an-error-every-except-either-propagates-re-raise-or-raise-a-more-useful-error-or-logs-what-it-swallowed--a-bare-except--return-none--pass-hides-the-failure-from-everyone-debugging-it-later">5.Never discard an error. Every <code>except</code> either propagates (re-raise, or raise a more useful error) or logs what it swallowed — a bare <code>except ...: return None</code> / <code>pass</code> hides the failure from everyone debugging it later.</h2>
<p>1.向上抛出更具业务语义的异常
2.记录日志后重新抛出
3.吞掉异常,但必须记录日志</p>
<h1 id="test-part">Test Part</h1>
<p>运行测试:
切勿在本地运行完整测试套件；仅运行与本次变更相关的测试。
添加测试:
仅当测试能有意义地保护可观察行为时才添加测试。不要添加仅简单重复常量、映射、提示词文本、源码结构或内部调用顺序等非本质交互的“变更检测（change-detector）”测试。
覆盖有意义的边缘情况，并保持测试的确定性（deterministic）。</p>
<h1 id="codes">Codes</h1>
<h2 id="1显式导出接口">1.显式导出接口:</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-Py" data-lang="Py"><span class="line"><span class="cl"><span class="c1"># 1. 显式引入（Re-export / Forwarding）：</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 从子模块/深层模块 agent.server 中导入 get_agent 和 traced_agent</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">agent.server</span> <span class="kn">import</span> <span class="n">get_agent</span><span class="p">,</span> <span class="n">traced_agent</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 导出控制（Public API Definition）：</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 定义该模块对外的公开 API 白名单</span>
</span></span><span class="line"><span class="cl"><span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;get_agent&#34;</span><span class="p">,</span> <span class="s2">&#34;traced_agent&#34;</span><span class="p">]</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>1.精简包的导出路径
2.控制from module import * 只有在__all__中的对象才会被导
3.静态类型检查:将&ndash;明确识别为公开给外部调用的Pubilc API</p>
<h2 id="2_function_namefunction_name的关系">2._function_name(),function_name()的关系</h2>
<p>OOP中的封装和面向接口编程的思想
在Python中,函数前带有_下划线的通常被认为是私有函数(认为,这是大家的一种约定俗称,但是并没有真正意义上的private函数),
而通过这个方法,将function_name()暴露为接口,将__function_name()封装为内部实现</p>
<h2 id="3日志的冒泡传递机制">3.日志的冒泡传递机制</h2>
<p>当当前目录的logger是一个没有绑定任何输出目的地(Handler)的节点时,他会把日志信息抛给父级logger</p>
<h1 id="serverpy中关于subagent的创建部分">Server.py中关于subagent的创建部分</h1>
<h2 id="1显式沙盒隔离">1.显式沙盒隔离</h2>
<p>对于敏感工具的调用,不是使用prompt劝导不要调用敏感工具,而是直接使用<code>_SubagentToolGuard</code> 和 <code>is_subagent_excluded_tool</code>的MIddleware进行了切面阻断
且拦截后不抛出异常导致崩溃,而是优雅的返回结构化的ToolMessage进行告知</p>
<h2 id="2纵深防御的中间件分层">2.纵深防御的中间件分层:</h2>
<p>代码将中间件按职责严格分层装配：</p>
<ul>
<li><strong>模型层</strong> (<code>_subagent_model_middleware</code>)：拦截 LLM 调用的基础异常（超时、格式清洗、报错捕捉）。</li>
<li><strong>运行期层</strong> (<code>_subagent_middleware</code>)：工作流推送保护、动态工具注入。</li>
<li><strong>环境守卫层</strong> (<code>_subagent_guard_middleware</code>)：区分 <code>local_run</code> 环境（桌面端自由执行 vs 云端环境 PR 拦截）。 这种模块化的 <code>list</code> 解包组合（<code>*</code> 语法），极大地提升了中间件复用率。</li>
</ul>
<h2 id="3显式继承覆盖机制">3.显式继承覆盖机制</h2>
<p>通过 <code>_DisableInheritedMiddleware</code> 解决了子图继承父图中间件时的冲突问题。子 Agent 作为独立图编译，有时继承父级的某些中间件（如重复检查消息队列）会导致死锁或逻辑冗余，显式声明 <code>inherited_middleware_exclusions</code> 实现了精细的取消重写。</p>
<h2 id="4提示词动态增强">4.提示词动态增强</h2>
<p>SubAgent 的 <code>description</code> 决定了 Parent Agent 能否准确路由任务。源码不仅使用基础描述，还动态追加了 <code>load_prompt('system/general-purpose-subagent-suffix.md')</code>
这个技巧在返回敏感工具调用的ToolMessage也有使用</p>
<h1 id="5创建subagent的标准通用流程">5.创建Subagent的标准通用流程</h1>
<h2 id="1确定运行模式和分叉策略">1.确定运行模式和分叉策略</h2>
<p>确定Subagent的隔离级别</p>
<h2 id="2裁剪工具集和构建安全工具防护网">2.裁剪工具集和构建安全工具防护网</h2>
<p>列出Subagent可用的工具,并使用切面Middleware横切阻断违规操作</p>
<h2 id="3组装中间件栈">3.组装中间件栈</h2>
<p>按顺序:
权限拦截 -&gt; 日志/轨迹记录 -&gt; 动态工具 -&gt; 模型超时/容错控制 -&gt; 上下文卸载</p>
<h2 id="4根据运行环境注入安全守卫">4.根据运行环境注入安全守卫</h2>
<p>根据部署目标（如本地 CLI、Docker 容器或 LangGraph Cloud）注入环境特定的守卫，如禁用高危 Shell 命令或 PR 自动提交</p>
<h2 id="5拼接路由-prompt-与定义能力边界">5.拼接路由 Prompt 与定义能力边界</h2>
<p>为 SubAgent 编写明确的 <code>name</code> 和 <code>description</code>，并附加标准化的系统后缀说明（Suffix），帮助主 Agent 准确判断何种子任务需要委派（Delegate）。</p>
<h2 id="6打包工厂函数并编译子图">6.打包工厂函数并编译子图</h2>
<p>将上述组件封装工厂函数，返回符合框架规范的 SubAgent 配置结构供图引擎（Graph Engine）统一编译。</p>
<h1 id="6海象运算符">6.海象运算符</h1>
<p>:= 含义为赋值并返回赋值之后的值</p>
<h1 id="7创建fastapi应用总结apiapppy文件">7.创建FastAPI应用总结(api/app.py文件)</h1>
<p><strong>配置校验前置</strong>：配置、数据库、云端沙箱和本地 LLM 的校验（<code>validate_*</code>）全部在 <code>lifespan</code> 启动阶段完成，遵循 <strong>Fail-Fast（快速失败）</strong> 原则[cite: 1]。</p>
<p><strong>数据迁移幂等设计</strong>：版本升级时的存储迁移代码应当做成 <strong><code>no-op</code> 驱动的防重入函数</strong>，并容忍局部失败[cite: 1]。</p>
<p><strong>资源清理彻底</strong>：在 <code>lifespan</code> 的 <code>finally</code> 块中集中释放 DB 连接、HTTP Client 和 Worker 句柄，防止 Docker 容器优雅停机（SIGTERM）时出现资源泄漏或数据损坏[cite: 1]。</p>
<h1 id="8版本向下兼容和容错包的导入技巧">8.版本向下兼容和容错包的导入技巧</h1>
<p>try-except Import Error组合
优先尝试符合新规范的导入方式;导入失败自动降级(fallback)到旧版的导入路径</p>
<h1 id="9dispatchpy的思想">9.dispatch.py的思想</h1>
<p>对于不同的data source,将其进行归一化然后在传入进行处理,提高了代码的可阅读性和可复用性,而不是建立对于每个data source都进行独特的处理</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
