<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Rust on Yison's Blog</title><link>https://blog.7ys.top/tags/rust/</link><description>Recent content in Rust on Yison's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Mon, 04 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.7ys.top/tags/rust/index.xml" rel="self" type="application/rss+xml"/><item><title>RTK：让 AI 编码工具的 Token 账单打一折</title><link>https://blog.7ys.top/posts/rtk%E8%AE%A9-ai-%E7%BC%96%E7%A0%81%E5%B7%A5%E5%85%B7%E7%9A%84-token-%E8%B4%A6%E5%8D%95%E6%89%93%E4%B8%80%E6%8A%98/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><guid>https://blog.7ys.top/posts/rtk%E8%AE%A9-ai-%E7%BC%96%E7%A0%81%E5%B7%A5%E5%85%B7%E7%9A%84-token-%E8%B4%A6%E5%8D%95%E6%89%93%E4%B8%80%E6%8A%98/</guid><description>&lt;img src="https://blog.7ys.top/" alt="Featured image of post RTK：让 AI 编码工具的 Token 账单打一折" /&gt;&lt;h1 id="rtk让-ai-编码工具的-token-账单打一折"&gt;RTK：让 AI 编码工具的 Token 账单打一折
&lt;/h1&gt;
 &lt;blockquote&gt;
 &lt;p&gt;用 Cursor 写代码，一次深度交互能烧掉四五百万 tokens，平时也动辄几十万。直到我发现 token 消耗的大头不在 prompt，而在那些被 AI 吞进去的命令输出。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一你的-token-到底花在了哪"&gt;一、你的 token 到底花在了哪？
&lt;/h2&gt;&lt;p&gt;用 AI 编码工具（Claude Code / Cursor / Copilot）写代码，AI 会频繁执行 shell 命令：读文件、搜代码、跑测试、看 diff、查 git 状态。&lt;strong&gt;每条命令的完整输出都会作为 token 塞进上下文窗口。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个典型的中等复杂度编码会话，token 消耗分布大概是这样：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;操作&lt;/th&gt;
 &lt;th&gt;频率&lt;/th&gt;
 &lt;th&gt;典型 token 消耗&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;cat&lt;/code&gt; / &lt;code&gt;read&lt;/code&gt; 读文件&lt;/td&gt;
 &lt;td&gt;20+ 次&lt;/td&gt;
 &lt;td&gt;40,000+&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;grep&lt;/code&gt; / &lt;code&gt;rg&lt;/code&gt; 搜索代码&lt;/td&gt;
 &lt;td&gt;8+ 次&lt;/td&gt;
 &lt;td&gt;16,000+&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;git status&lt;/code&gt; / &lt;code&gt;git diff&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;15+ 次&lt;/td&gt;
 &lt;td&gt;13,000+&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;go test&lt;/code&gt; / &lt;code&gt;pytest&lt;/code&gt; 跑测试&lt;/td&gt;
 &lt;td&gt;8+ 次&lt;/td&gt;
 &lt;td&gt;31,000+&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ls&lt;/code&gt; / &lt;code&gt;tree&lt;/code&gt; 看目录&lt;/td&gt;
 &lt;td&gt;10+ 次&lt;/td&gt;
 &lt;td&gt;2,000+&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;单次会话粗估&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;~100,000+&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果是深度调试或大项目，一次会话轻松突破&lt;strong&gt;百万级&lt;/strong&gt;，最高可达&lt;strong&gt;四五百万 tokens&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;问题在于：这些输出里，&lt;strong&gt;80% 是对 AI 毫无价值的噪音&lt;/strong&gt;——通过的测试输出、git 的提示信息、空行、ANSI 颜色码、样板注释。你在为噪音买单。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二rtk-是什么"&gt;二、RTK 是什么？
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;RTK（Rust Token Killer）&lt;/strong&gt; 是一个高性能 CLI 代理，在命令输出到达 AI 上下文&lt;strong&gt;之前&lt;/strong&gt;进行智能过滤压缩。&lt;/p&gt;
&lt;p&gt;&lt;img alt="RTK 架构总览" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.7ys.top/images/article/2026-05-04/rtk-architecture.svg"&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;项目&lt;/th&gt;
 &lt;th&gt;信息&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;GitHub&lt;/td&gt;
 &lt;td&gt;&lt;a class="link" href="https://github.com/rtk-ai/rtk" target="_blank" rel="noopener"
 &gt;rtk-ai/rtk&lt;/a&gt;（40k+ ⭐）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;语言&lt;/td&gt;
 &lt;td&gt;Rust，单二进制文件，零依赖&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;代理开销&lt;/td&gt;
 &lt;td&gt;&amp;lt; 10ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;支持工具&lt;/td&gt;
 &lt;td&gt;Claude Code、Copilot、Cursor、Gemini CLI、OpenClaw 等 12 种&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;官网&lt;/td&gt;
 &lt;td&gt;&lt;a class="link" href="https://www.rtk-ai.app" target="_blank" rel="noopener"
 &gt;https://www.rtk-ai.app&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;官方宣称的效果：&lt;strong&gt;60-90% 的 token 节省&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="三核心原理三层架构"&gt;三、核心原理：三层架构
&lt;/h2&gt;&lt;p&gt;作为工程师，我最关心的不是&amp;quot;能省多少&amp;quot;，而是&amp;quot;怎么做到的&amp;quot;。&lt;/p&gt;
&lt;p&gt;RTK 的架构分三层，每一层解决一个独立问题：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────┐
│ Layer 1: Hook 拦截层 — &amp;#34;让 AI 不知不觉用上 RTK&amp;#34; │
│ ──────────────────────────────────────────── │
│ AI 执行 &amp;#34;git status&amp;#34; │
│ ↓ PreToolUse Hook 自动重写 │
│ 实际执行 &amp;#34;rtk git status&amp;#34; │
│ AI 完全无感知，只是收到更精简的输出 │
├──────────────────────────────────────────────────────────────┤
│ Layer 2: 命令路由层 — &amp;#34;不同命令用不同策略&amp;#34; │
│ ──────────────────────────────────────────── │
│ main.rs → Clap 解析器 → 路由到对应处理器 │
│ ├─ git/* → Git 模块（结构化解析 porcelain 格式） │
│ ├─ go/* → Go 模块（解析 NDJSON 格式） │
│ ├─ rust/* → Cargo 模块 │
│ └─ 其他 → TOML 声明式过滤引擎（回退） │
├──────────────────────────────────────────────────────────────┤
│ Layer 3: 过滤引擎层 — &amp;#34;两套系统，各司其职&amp;#34; │
│ ──────────────────────────────────────────── │
│ System A: Rust 原生过滤器（复杂命令） │
│ → git diff, go test, cargo test 等需要结构化解析的命令 │
│ System B: TOML 声明式过滤器（简单命令） │
│ → du, ping, systemctl 等只需正则+截断的命令 │
└──────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="四过滤引擎深度拆解"&gt;四、过滤引擎深度拆解
&lt;/h2&gt;&lt;h3 id="41-system-arust-原生过滤器复杂命令"&gt;4.1 System A：Rust 原生过滤器（复杂命令）
&lt;/h3&gt;&lt;p&gt;用于 git、go test、cargo test 等&lt;strong&gt;需要语义理解&lt;/strong&gt;的命令。核心思路：&lt;strong&gt;用结构化解析代替文本处理&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id="go-test-的压缩-90"&gt;&lt;code&gt;go test&lt;/code&gt; 的压缩（-90%）
&lt;/h4&gt;&lt;p&gt;RTK 强制给 &lt;code&gt;go test&lt;/code&gt; 加上 &lt;code&gt;-json&lt;/code&gt; 参数，输出 NDJSON 格式。然后逐行解析 JSON：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 解析每一行 JSON 事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;match&lt;/span&gt; event.action.as_str() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;pass&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; pkg_result.pass &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 通过 → 只计数，丢弃输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;fail&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pkg_result.fail &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pkg_result.failed_tests.push((test, outputs)); &lt;span style="color:#75715e"&gt;// 失败 → 保留
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;skip&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; pkg_result.skip &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 跳过 → 只计数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _ &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;压缩前&lt;/strong&gt;（6000 tokens）：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;=== RUN TestAdd
--- PASS: TestAdd (0.00s)
=== RUN TestSubtract
--- PASS: TestSubtract (0.00s)
=== RUN TestMultiply
--- FAIL: TestMultiply (0.00s)
 multiply_test.go:15: expected 6, got 5
=== RUN TestDivide
--- PASS: TestDivide (0.00s)
... (重复 100+ 个测试)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;压缩后&lt;/strong&gt;（600 tokens）：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;FAIL github.com/user/project
 ✗ TestMultiply (0.00s)
 multiply_test.go:15: expected 6, got 5

3 passed, 1 failed, 0 skipped
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;关键洞察：&lt;strong&gt;AI 不需要看通过的测试输出，它只需要知道&amp;quot;谁失败了&amp;quot;和&amp;quot;为什么失败&amp;quot;。&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id="git-diff-的压缩-75"&gt;&lt;code&gt;git diff&lt;/code&gt; 的压缩（-75%）
&lt;/h4&gt;&lt;p&gt;核心函数 &lt;code&gt;compact_diff()&lt;/code&gt; 做了四件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;按文件分组&lt;/strong&gt; — 只保留文件名，不保留 diff 头部的 &lt;code&gt;index&lt;/code&gt;、&lt;code&gt;---&lt;/code&gt;/&lt;code&gt;+++&lt;/code&gt; 行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统计 +/- 数量&lt;/strong&gt; — 每个文件末尾显示 &lt;code&gt;+5 -2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hunk 截断&lt;/strong&gt; — 每个 hunk 最多显示 100 行变更&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上下文行裁剪&lt;/strong&gt; — 只在变更附近保留上下文，中间的跳过&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 核心循环
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; line &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; diff.lines() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; line.starts_with(&lt;span style="color:#e6db74"&gt;&amp;#34;diff --git&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 新文件：输出文件名，重置计数器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; line.starts_with(&lt;span style="color:#e6db74"&gt;&amp;#34;@@&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Hunk 头：保留（含函数名信息）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; in_hunk {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; line.starts_with(&lt;span style="color:#e6db74"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;) { added &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 保留 */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; line.starts_with(&lt;span style="color:#e6db74"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;) { removed &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 保留 */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; hunk_shown &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; { &lt;span style="color:#75715e"&gt;/* 上下文行：只在有变更时保留 */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="git-status-的压缩-80"&gt;&lt;code&gt;git status&lt;/code&gt; 的压缩（-80%）
&lt;/h4&gt;&lt;p&gt;解析 &lt;code&gt;git status --porcelain&lt;/code&gt; 输出，按状态码分类汇总：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;* main...origin/main
+ Staged: 2 files
 src/main.rs
 src/utils.rs
~ Modified: 1 files
 src/lib.rs
? Untracked: 2 files
 docs/README.md
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;所有 git 提示信息（&lt;code&gt;use &amp;quot;git restore&amp;quot;...&lt;/code&gt; 等）全部丢弃。&lt;/p&gt;
&lt;h4 id="git-add--commit--push-的暴力压缩-92"&gt;&lt;code&gt;git add&lt;/code&gt; / &lt;code&gt;commit&lt;/code&gt; / &lt;code&gt;push&lt;/code&gt; 的暴力压缩（-92%）
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// git add → 直接输出 &amp;#34;ok&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// git commit → 输出 &amp;#34;ok abc1234&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// git push → 输出 &amp;#34;ok main&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;AI 不需要看 git 的 verbose 输出，只需要知道&amp;quot;成功了没&amp;quot;和关键标识。&lt;/p&gt;
&lt;h3 id="42-system-btoml-声明式过滤器简单命令"&gt;4.2 System B：TOML 声明式过滤器（简单命令）
&lt;/h3&gt;&lt;p&gt;用于 du、ping、systemctl 等&lt;strong&gt;只需正则+截断&lt;/strong&gt;的命令。零代码，纯配置。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ping.toml — 只保留统计摘要，删除逐行响应&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#a6e22e"&gt;filters&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ping&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;match_command&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;^ping\\b&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;strip_ansi&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;strip_lines_matching&lt;/span&gt; = [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;^PING &amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;^\\d+ bytes from &amp;#34;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;# 删除每行 ping 响应&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;^\\s*$&amp;#34;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;# 删除空行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;tail_lines&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 只保留最后 4 行（统计摘要）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TOML 过滤器有 &lt;strong&gt;8 阶段管道&lt;/strong&gt;，按顺序执行：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;① strip_ansi 去除 ANSI 转义码（颜色等）
② replace 正则替换（逐行，可链式）
③ match_output 短路匹配：整个输出匹配某模式 → 直接返回固定消息
④ strip/keep_lines 按正则过滤行（二选一）
⑤ truncate_lines_at 每行截断到 N 字符
⑥ head/tail_lines 只保留前 N / 后 N 行
⑦ max_lines 绝对行数上限
⑧ on_empty 结果为空时的默认消息
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;添加新命令？只需要写一个 TOML 文件，不需要写一行 Rust。仓库里已经有 60+ 个内置过滤器。&lt;/p&gt;
&lt;h3 id="43-故障安全宁可多输出不能丢信息"&gt;4.3 故障安全：宁可多输出，不能丢信息
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 核心原则：如果过滤失败，回退到原始输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; exit_code &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 保存完整原始输出到 ~/.local/share/rtk/tee/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 输出提示：&amp;#34;[full output: /path/to/tee.log]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个设计很工程师——&lt;strong&gt;fail-safe，不是 fail-open&lt;/strong&gt;。AI 永远不会因为 RTK 自身的 bug 而丢失关键信息。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="五安装与使用"&gt;五、安装与使用
&lt;/h2&gt;&lt;h3 id="51-安装"&gt;5.1 安装
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# macOS / Linux（推荐 Homebrew）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install rtk
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 或快速安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 验证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk --version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk gain &lt;span style="color:#75715e"&gt;# 查看 token 节省统计&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Windows 用户从 &lt;a class="link" href="https://github.com/rtk-ai/rtk/releases" target="_blank" rel="noopener"
 &gt;GitHub Releases&lt;/a&gt; 下载 &lt;code&gt;rtk-x86_64-pc-windows-msvc.zip&lt;/code&gt;，解压后加入 PATH。&lt;/p&gt;
&lt;h3 id="52-集成到-ai-工具"&gt;5.2 集成到 AI 工具
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Claude Code / Copilot&lt;/strong&gt;（最无缝）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk init -g &lt;span style="color:#75715e"&gt;# 安装 Hook，重启 Claude Code 即可&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk init -g --agent cursor
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 修改 ~/.cursor/hooks.json，添加 preToolUse 钩子&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Cursor 自动加载&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt;（插件方式）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/rtk-ai/rtk.git &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cd rtk
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openclaw plugins install ./openclaw
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openclaw gateway restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Gemini CLI&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk init -g --gemini
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;其他工具&lt;/strong&gt;（手动使用）：直接在命令前加 &lt;code&gt;rtk&lt;/code&gt; 前缀即可。&lt;/p&gt;
&lt;h3 id="53-常用命令速查"&gt;5.3 常用命令速查
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk ls . &lt;span style="color:#75715e"&gt;# Token 优化的目录树&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk read file.go &lt;span style="color:#75715e"&gt;# 智能文件读取（-70%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk grep &lt;span style="color:#e6db74"&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt; . &lt;span style="color:#75715e"&gt;# 按文件分组的搜索结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk find &lt;span style="color:#e6db74"&gt;&amp;#34;*.go&amp;#34;&lt;/span&gt; . &lt;span style="color:#75715e"&gt;# 紧凑的查找结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk git status &lt;span style="color:#75715e"&gt;# 紧凑状态（-80%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk git log -n &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 单行提交（-80%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk git diff &lt;span style="color:#75715e"&gt;# 精简 diff（-75%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk git push &lt;span style="color:#75715e"&gt;# → &amp;#34;ok main&amp;#34;（-92%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 测试&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk go test &lt;span style="color:#75715e"&gt;# Go 测试（-90%，只显示失败）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk pytest &lt;span style="color:#75715e"&gt;# Python 测试（-90%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk cargo test &lt;span style="color:#75715e"&gt;# Rust 测试（-90%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk test &amp;lt;任意命令&amp;gt; &lt;span style="color:#75715e"&gt;# 通用测试包装器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 构建 &amp;amp; Lint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk cargo build &lt;span style="color:#75715e"&gt;# Cargo 构建（-80%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk golangci-lint run &lt;span style="color:#75715e"&gt;# Go lint（-85%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk ruff check &lt;span style="color:#75715e"&gt;# Python lint（-80%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 容器 &amp;amp; 云&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk docker ps &lt;span style="color:#75715e"&gt;# 紧凑容器列表（-80%）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtk kubectl pods &lt;span style="color:#75715e"&gt;# 紧凑 Pod 列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="54-配置"&gt;5.4 配置
&lt;/h3&gt;&lt;p&gt;配置文件：&lt;code&gt;~/.config/rtk/config.toml&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#a6e22e"&gt;hooks&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;exclude_commands&lt;/span&gt; = [&lt;span style="color:#e6db74"&gt;&amp;#34;curl&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;playwright&amp;#34;&lt;/span&gt;] &lt;span style="color:#75715e"&gt;# 排除某些命令不重写&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#a6e22e"&gt;tee&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;enabled&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 失败时保存完整原始输出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mode&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;failures&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# &amp;#34;failures&amp;#34; / &amp;#34;always&amp;#34; / &amp;#34;never&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;还支持&lt;strong&gt;项目级自定义过滤器&lt;/strong&gt;：在项目根目录创建 &lt;code&gt;.rtk/filters.toml&lt;/code&gt;，可以覆盖或扩展内置规则。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="六为什么能省这么多总结"&gt;六、为什么能省这么多？总结
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;策略&lt;/th&gt;
 &lt;th&gt;节省比例&lt;/th&gt;
 &lt;th&gt;原理&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;删除噪音&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;30-40%&lt;/td&gt;
 &lt;td&gt;git 提示、空行、ANSI 颜色、样板文本&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;结构化解析&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;20-30%&lt;/td&gt;
 &lt;td&gt;JSON/NDJSON 解析，只提取关键字段&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;汇总代替明细&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;15-20%&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;3 passed, 1 failed&amp;rdquo; 代替每个测试的完整输出&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;截断策略&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;10-20%&lt;/td&gt;
 &lt;td&gt;hunk 100 行上限、文件列表 20 个上限&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;短路匹配&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;5-10%&lt;/td&gt;
 &lt;td&gt;match_output：整个输出匹配&amp;quot;成功&amp;quot;→ 返回 &amp;ldquo;ok&amp;rdquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;上下文裁剪&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;10-15%&lt;/td&gt;
 &lt;td&gt;diff 中的上下文行只在变更附近保留&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;核心理念就一句话：&lt;strong&gt;语义理解 + 选择性丢弃&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;它知道 AI 编码场景下哪些信息是噪音（通过的测试、git 提示、上下文行），哪些是关键（失败信息、文件名、行号），然后只保留关键部分。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="七go-工程师的视角"&gt;七、Go 工程师的视角
&lt;/h2&gt;&lt;p&gt;RTK 是 Rust 写的。作为 Go 工程师，我第一反应是&amp;quot;为什么不用 Go？&amp;quot;&lt;/p&gt;
&lt;p&gt;答案很直接：&lt;strong&gt;性能&lt;/strong&gt;。每次命令执行都要过一遍代理，&amp;lt; 10ms 的开销要求极致的零成本抽象。Rust 的 &lt;code&gt;lazy_static!&lt;/code&gt; 正则预编译、&lt;code&gt;include_str!&lt;/code&gt; 编译时嵌入、无 GC 停顿，在这种场景下确实更合适。&lt;/p&gt;
&lt;p&gt;但 RTK 的&lt;strong&gt;架构设计&lt;/strong&gt;——Hook 拦截 → 命令路由 → 策略过滤 → 输出压缩——完全是语言无关的。它的 TOML 声明式过滤器设计特别优雅，添加新命令只需要写配置，不需要写代码。这套思路用 Go 完全可以复刻。&lt;/p&gt;
&lt;p&gt;另外，RTK 的源码值得一读。作为一个 40k+ star 的 Rust 项目，它的代码组织、错误处理、测试策略都是很好的学习材料。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;参考链接：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RTK GitHub: &lt;a class="link" href="https://github.com/rtk-ai/rtk" target="_blank" rel="noopener"
 &gt;https://github.com/rtk-ai/rtk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;RTK 官网: &lt;a class="link" href="https://www.rtk-ai.app" target="_blank" rel="noopener"
 &gt;https://www.rtk-ai.app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;RTK 架构文档: &lt;a class="link" href="https://github.com/rtk-ai/rtk/blob/master/ARCHITECTURE.md" target="_blank" rel="noopener"
 &gt;https://github.com/rtk-ai/rtk/blob/master/ARCHITECTURE.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>