news 2026/9/8 21:33:25

V3 Memory Specialist:ruflo 记忆系统统一化与 AgentDB + HNSW 检索架构实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
V3 Memory Specialist:ruflo 记忆系统统一化与 AgentDB + HNSW 检索架构实战

V3 Memory Specialist:ruflo 记忆系统统一化与 AgentDB + HNSW 检索架构实战

【免费下载链接】ruflo🌊 The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated项目地址: https://gitcode.com/GitHub_Trending/cl/ruflo

导读:本篇文章以 ruflo 仓库中.claude/agents/v3/v3-memory-specialist.md这一多智能体编排下的"记忆专家 Agent 角色规范"为核心,结合ADR-006 / ADR-009架构决策与@claude-flow/memory模块的真实实现,系统讲解如何把 MemoryManager、SQLiteBackend、MarkdownBackend 等 7 套历史记忆系统收敛为单一 AgentDB + HNSW 向量检索服务。读完你将掌握统一记忆服务的设计模式、HNSW 索引参数选型、迁移策略与性能验证方法,能够在本仓库的 V3 架构上下文里评估或实施一次类似的记忆层整合。

一、为什么要做"记忆系统统一化"

1.1 记忆分裂的困境

ruflo 在 v2 阶段演化出多套并存、职责相互重叠的记忆实现,在 ADR-006 中记录的就有 6 套,而在 V3 记忆专家角色规范中,需要统一的历史系统扩展到了 7 个:

历史记忆系统定位典型问题
MemoryManager基础读写操作功能单一,无检索能力
DistributedMemorySystem集群/分布式记忆侧重分布一致性,接口独立
SwarmMemory面向 swarm 智能体记忆被绑定在单一智能体上,无法跨智能体复用
AdvancedMemoryManager高级特性封装与基础实现接口重复
SQLiteBackend结构化数据存储只支持结构化查询,没有向量搜索
MarkdownBackend文件型存储以文档文件为准,检索能力弱
HybridBackend组合后端开销更高,维护成本大

这带来四个直接后果:查询接口不统一、智能体之间无法共享记忆、不同后端维护成本叠加、检索退化为 O(n) 线性扫描。

1.2 收敛目标:AgentDB + HNSW

统一目标是把上述全部历史系统收敛为单一的高性能 AgentDB 方案,并以 HNSW(Hierarchical Navigable Small World)图索引作为语义检索内核。原文档给出的目标收益包括:搜索性能提升150x–12,500x(视数据集规模而定)、查询统一接口、跨智能体记忆共享、SONA 学习集成、自动持久化。

需要强调的是,v3-memory-specialist是一个执行类 Agent 的职责描述与验收目标,其中 150x–12,500x 属于设计阶段的目标指标(原文档"Performance Targets / Success Criteria"部分以任务验收清单形式出现),真正实现层的可复现测量见下文第六节的仓库实测基线。

二、统一化架构总览

┌─────────────────────────────────────────┐ │ LEGACY SYSTEMS │ ├─────────────────────────────────────────┤ │ • MemoryManager (basic operations) │ │ • DistributedMemorySystem (clustering) │ │ • SwarmMemory (agent-specific) │ │ • AdvancedMemoryManager (features) │ │ • SQLiteBackend (structured) │ │ • MarkdownBackend (file-based) │ │ • HybridBackend (combination) │ └─────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ V3 UNIFIED SYSTEM │ ├─────────────────────────────────────────┤ │ 🚀 AgentDB with HNSW │ │ • 150x-12,500x faster search (target) │ │ • Unified query interface │ │ • Cross-agent memory sharing │ │ • SONA integration learning │ │ • Automatic persistence │ └─────────────────────────────────────────┘

这一两层架构对应 ADR 编号为:ADR-006 (Unified Memory Service)定义"单一 MemoryService + 可插拔后端"的整体形态,ADR-009 (Hybrid Memory Backend)定义 sql.js + AgentDB 混合后端的实现路径。两份决策记录都保存在仓库的 v3/implementation/adrs 目录中,其中 ADR-006-UNIFIED-MEMORY.md 标注状态为 Implemented。

三、UnifiedMemoryService:统一记忆服务设计

3.1 服务组件与读写路径

原文档中UnifiedMemoryService以四个依赖组合而成:AgentDBAdapter(存储)、MemoryCache(缓存)、HNSWIndexer(向量索引)、DataMigrator(迁移器)。写入路径是"AgentDB 落盘 + HNSW 同步索引"双写,查询路径则按semantic标记分流:

class UnifiedMemoryService implements IMemoryBackend { constructor( private agentdb: AgentDBAdapter, private cache: MemoryCache, private indexer: HNSWIndexer, private migrator: DataMigrator ) {} async store(entry: MemoryEntry): Promise<void> { // Store in AgentDB with HNSW indexing await this.agentdb.store(entry); await this.indexer.index(entry); } async query(query: MemoryQuery): Promise<MemoryEntry[]> { if (query.semantic) { // Use HNSW vector search return this.indexer.search(query); } else { // Use structured query return this.agentdb.query(query); } } }

注意,在实际演进中该命名经历了调整:ADR-125(Memory Consolidation)落地后,UnifiedMemoryService已由规范 APIMemoryService取代,旧名称以@deprecated导出并计划在3.0.0-rc移除(见 v3/@claude-flow/memory/README.md)。阅读本文的接口命名时应知道这是一条"角色设计稿 → ADR → 真实模块"的持续迭代线。

3.2 ADR-006 定义的服务接口与数据模型

架构决策层面,IMemoryService接口被收敛为三组操作:

interface IMemoryService { // Core operations store(entry: MemoryEntry): Promise<string>; retrieve(id: string): Promise<MemoryEntry | null>; delete(id: string): Promise<boolean>; // Query operations search(query: MemoryQuery): Promise<MemoryEntry[]>; searchSemantic(text: string, k: number): Promise<MemoryEntry[]>; // Namespace operations listNamespaces(): Promise<string[]>; clearNamespace(namespace: string): Promise<void>; }

统一的数据单元MemoryEntry带有命名空间、内容类型与可选的 embedding 字段:

interface MemoryEntry { id: string; namespace: string; content: string; type: 'episodic' | 'semantic' | 'procedural' | 'working'; metadata?: Record<string, unknown>; embedding?: Float32Array; createdAt: Date; ttl?: number; }

type四种取值分别对应情景记忆(episodic)、语义记忆(semantic)、程序性记忆(procedural)、工作记忆(working),namespace用于多智能体/多租户隔离,ttl支持过期淘汰。这套四类记忆划分与实际实现中的MemoryEntry领域实体(domain/entities/memory-entry.ts)保持一致。

3.3 可插拔后端与选择策略

ADR-006 采用"通过配置选择后端"的方式,为每种场景提供取舍:

// Backend selection via config { memory: { backend: 'hybrid', // 'sqlite' | 'agentdb' | 'hybrid' cacheSize: 100, indexing: true } }
后端适用场景优点缺点
SQLite结构化查询、ACID快速、可靠无向量搜索能力
AgentDB语义搜索、RAG原生向量相似度检索需要环境/初始化支持
Hybrid通用目的兼取两者所长内存占用更高

在真实实现中该决策被延续为HybridBackend(src/hybrid-backend.ts),默认路径由 sql.js 提供结构化 SQLite 语义、AgentDB 提供向量检索;当 embedder 不可用时search()自动降级为 FTS5 关键词搜索,并对外暴露health.embedder = 'degraded'状态,混合路径还会叠加 Reciprocal Rank Fusion(RRF)与 MMR 多样性重排。

四、HNSW 向量索引:参数、建索引与检索

4.1 索引初始化与关键参数

HNSW 的效果高度依赖四个参数,原文档给出了默认取值:

class HNSWIndexer { private index: HNSWIndex; constructor(dimensions: number = 1536) { this.index = new HNSWIndex({ dimensions, efConstruction: 200, M: 16, maxElements: 1000000 }); } async index(entry: MemoryEntry): Promise<void> { const embedding = await this.embedContent(entry.content); this.index.addPoint(entry.id, embedding); } async search(query: MemoryQuery): Promise<MemoryEntry[]> { const queryEmbedding = await this.embedContent(query.content); const results = this.index.search(queryEmbedding, query.limit || 10); return this.retrieveEntries(results); } }

参数含义与调参建议如下:

  • dimensions(默认 1536):embedding 向量维度,必须与生成 embedding 的模型输出维度一致。角色稿默认按 1536 维设计;实际运行中维度随 embedder 配置变化——仓库 ADR-006 的vectors表记录使用768 维,而 README 中的实测基线采用128 维cosine 向量,因此维度应视为与所选模型绑定的配置项而非固定值。
  • efConstruction(默认 200):建图阶段每层候选邻居搜索宽度。越大图质量越高、检索越准,但建索引越慢,适合离线/批处理建索引。
  • M(默认 16):每个节点的最大连接数。M 越大图越稠密、召回越高,内存开销随之上升;16 是 HNSW 中精度/内存平衡的常见起点。
  • maxElements(默认 1000000):索引容量上限,超过后需重建或换分区。注意 HNSW 需要预分配内存,应结合预估条目数设置。

对应的真实实现文件包括 src/hnsw-index.ts(HNSW 索引封装)、src/agentdb-backend.ts(语义搜索后端)。ADR-006 中AgentDBBackend的初始化也体现了同一组参数:

class AgentDBBackend implements IMemoryBackend { private db: AgentDB; constructor(config: AgentDBConfig) { this.db = new AgentDB({ dimensions: config.dimensions, indexType: 'HNSW', hnswM: 16, hnswEfConstruction: 200, }); } async searchSemantic(embedding: Float32Array, k: number): Promise<MemoryEntry[]> { // Uses HNSW for 150x-12,500x faster search return this.db.search(embedding, k); } }

4.2 持久化与自动恢复

HNSW 是纯内存索引,若不持久化,重启即需全量重建。真实实现通过"旁挂快照"解决该问题:服务close()时将索引快照到<dbPath>.hnsw<dbPath>.meta.json,下次以相同路径打开可在毫秒级恢复,实现"搜索就绪的冷启动";同时在每 N 次写入后自动触发增量快照(ADR-125 Phase 3)。这是对角色稿中"Automatic persistence(自动持久化)"目标的落地,相关测试覆盖见 src/hnsw-persistence.test.ts。

4.3 上限控制与合并器

为避免记忆无限增长,真实模块还提供了后台MemoryConsolidator(src/consolidator.ts),周期性执行三件事:按 ttl 淘汰过期条目并同步移除 HNSW 点、按内容哈希去重、在索引碎片化时重建 HNSW 索引;默认每 6 小时自动运行一次。配合 LRU 缓存(src/cache-manager.ts)与向量量化,实现对内存占用的有界控制。

五、分批迁移策略与数据搬迁实战

5.1 三阶段推进路线

原文档将迁移组织为三个时间窗阶段的渐进式策略,与"先搭地基、再逐个搬迁、最后优化"的工程顺序一致:

# Phase 1: Foundation Setup(Week 3) - Create AgentDBAdapter implementing IMemoryBackend - Setup HNSW indexing infrastructure - Establish embedding generation pipeline - Create unified query interface # Phase 2: Gradual Migration(Week 4-5) - SQLiteBackend → AgentDB (structured data) - MarkdownBackend → AgentDB (document storage) - MemoryManager → Unified interface - DistributedMemorySystem → Cross-agent sharing # Phase 3: Advanced Features(Week 6) - SONA integration for learning patterns - Cross-agent memory sharing - Performance benchmarking (150x validation) - Backward compatibility layer cleanup

Phase 2 的关键是"系统逐个切换、全量替换完成前保持向后兼容",这正是 ADR-006 成功标准中"Migration from v2 data"的实操来源;Phase 3 再统一做性能基准验证与兼容层清理。

5.2 从 SQLite 搬迁

结构化数据搬移核心是"按创建时间顺序读取旧表,逐条在新库生成 embedding 后写入":

-- Extract existing data SELECT id, content, metadata, created_at, agent_id FROM memory_entries ORDER BY created_at; -- Migrate to AgentDB with embeddings INSERT INTO agentdb_memories (id, content, embedding, metadata) VALUES (?, ?, generate_embedding(?), ?);

批量场景下,单独逐条插入会因反复生成 embedding 而成为瓶颈。ADR-006 于 2026-01-07 补充了AgentDBAdapter的四阶段批量优化,将写入/检索/更新/删除统一升级为批量原语:

async bulkInsert(entries: MemoryEntry[], options?: { batchSize?: number }): Promise<void> { // Phase 1: Parallel embedding generation in batches // Phase 2: Store all entries (skip individual cache updates) // Phase 3: Batch index embeddings // Phase 4: Batch cache update (only populate hot entries) }

文档记录的对应提速为:批量插入借助并行 embedding 生成快 2–3 倍、批量读取与删除借Promise.all()并行化各快约 2 倍。

5.3 从 Markdown 文件搬迁

文件型记忆的搬迁则是对每个 Markdown 文档"读取全文 → 生成 embedding → 写入 AgentDB,并把原始文件路径记录进 metadata":

// Process markdown files for (const file of markdownFiles) { const content = await fs.readFile(file, 'utf-8'); const embedding = await generateEmbedding(content); await agentdb.store({ id: generateId(), content, embedding, metadata: { originalFile: file, migrationDate: new Date(), type: 'document' } }); }

仓库提供的迁移工具为MemoryMigrator(见 v3/@claude-flow/memory/README.md 的 "Migration Tools"),与DataMigrator职责对应。迁移后如需人工溯源,"原始文件路径 + 迁移时间"这类 metadata 设计是值得保留的审计字段。

六、统一查询接口与性能目标

6.1 双模式查询

收敛的核心收益是上层只面对一个query(),内部按类型分流:

// 1. Semantic similarity queries(语义相似查询:走 HNSW) await memory.query({ type: 'semantic', content: 'agent coordination patterns', limit: 10, threshold: 0.8 }); // 2. Structured queries(结构化查询:走 AgentDB/SQLite 过滤) await memory.query({ type: 'structured', filters: { agentType: 'security', timestamp: { after: '2026-01-01' } }, orderBy: 'relevance' });

语义模式必须带content(会被编码为查询向量)与threshold(相似度阈值,0.8 表示召回与查询向量余弦相似度不低于 0.8 的结果);结构化模式通过filters做字段过滤、orderBy: 'relevance'控制排序。

6.2 目标指标与实测基线的区分

原文档性能目标章节包含一组设计指标:

  • 搜索性能:当前 O(n) 线性扫描 → 目标 O(log n) HNSW 近似最近邻,提升 150x–12,500x(取决于数据集规模),1M+ 条目下查询目标亚 100ms;
  • 内存效率:当前多后端冗余 → 目标统一存储 + 压缩,减少 50–75%,大数据集目标 <1GB;
  • 查询灵活性:语义与结构化双模式统一。

这些是迁移工作的目标/验收口径。仓库中可验证的实测数据来自 v3/@claude-flow/memory/README.md 的基线基准:在 Apple Silicon、Node 22 下单线程运行1k × 128 维 cosine 向量检索,HNSW 搜索基线约为0.53 ms/次、1,889 ops/s,构建 1k 条索引约 533 ms。另外仓库还声明向量量化(binary/scalar/product 三类)可带来 4–32 倍内存缩减,并支持 cosine、欧氏、点积、曼哈顿四种距离度量。撰写结论时应以"角色稿目标 + 仓库实测基线"两层口径呈现,不将目标当已证实结果。

七、SONA 学习集成:模式存储与跨智能体共享

记忆统一不只是"存得住、查得快",还要让自学习智能体产生的模式可复用。原文档定义SONAMemoryIntegration,将 SONA 学习模式以带元数据的形式写入统一记忆:

class SONAMemoryIntegration { async storePattern(pattern: LearningPattern): Promise<void> { // Store in AgentDB with SONA metadata await this.memory.store({ id: pattern.id, content: pattern.data, metadata: { sonaMode: pattern.mode, // real-time, balanced, research, edge, batch reward: pattern.reward, trajectory: pattern.trajectory, adaptation_time: pattern.adaptationTime }, embedding: await this.generateEmbedding(pattern.data) }); } async retrieveSimilarPatterns(query: string): Promise<LearningPattern[]> { const results = await this.memory.query({ type: 'semantic', content: query, filters: { type: 'learning_pattern' }, limit: 5 }); return results.map(r => this.toLearningPattern(r)); } }

要点拆解:

  • SONA 运行模式枚举real-time / balanced / research / edge / batch五种模式对应不同实时性与资源策略;存入 metadata 便于后续按模式统计学习行为。
  • 学习模式检索:查询时用filters: { type: 'learning_pattern' }把语义检索限定在学习模式子集内,默认召回 5 条。
  • 仓库对应层:README 中的 Self-Learning 能力由LearningBridge实现,负责把洞察接入 SONA/ReasoningBank 神经管线(src/learning-bridge.ts);跨智能体方向另有 AutoMemoryBridge 负责 Claude Code 自动记忆与 AgentDB 的双向同步(src/auto-memory-bridge.ts),以及 agent-memory-scope 提供 project/local/user 三作用域的记忆与跨智能体知识迁移(src/agent-memory-scope.ts)。

注意原文档成功标准中的"SONA integration functional with <0.05ms adaptation"同样属于角色稿的目标口径,仓库内并未提供该数值的公开复现测量。

八、验证与测试体系

8.1 基准套件结构

统一后需要一套可持续验证的手段。原文档给出基准类骨架——生成 1000 条测试查询、记录整体耗时,输出每秒查询数、平均延迟与相对旧系统的提升率:

class MemoryBenchmarks { async benchmarkSearchPerformance(): Promise<BenchmarkResult> { const queries = this.generateTestQueries(1000); const startTime = performance.now(); for (const query of queries) { await this.memory.query(query); } const endTime = performance.now(); return { queriesPerSecond: queries.length / (endTime - startTime) * 1000, avgLatency: (endTime - startTime) / queries.length, improvement: this.calculateImprovement() }; } }

对应仓库中npm run bench已可复现运行(vitest.bench 配置见 v3/@claude-flow/memory/vitest.bench.config.ts),除检索外还有 src/benchmark.test.ts 等测试把性能与行为固化进 CI。

8.2 验收清单(Success Criteria)

角色规范以勾选清单形式列出任务完成标准,可作为同类整合项目的验收模板:

  • 150x–12,500x 搜索性能提升得到验证
  • 所有历史记忆系统完成迁移
  • 迁移过渡期间保持向后兼容
  • SONA 集成可用,适应延迟 <0.05ms(目标口径)
  • 跨智能体记忆共享可运行
  • 内存占用降低 50–75%

九、多智能体分工:记忆专家如何协作

v3-memory-specialist是 ruflo 多智能体规划体系(.claude/agents/v3/目录,同目录还有 v3-integration-architect、v3-performance-engineer、v3-security-architect、v3-queen-coordinator 等角色)中的一个专业子 Agent。记忆统一本身也依赖横向协作,原文档给出的分工边界如下:

协作方职责范围
Integration Architect(Agent #10)AgentDB 与 agentic-flow@alpha 集成、SONA 学习模式配置、性能优化协调
Core Architect(Agent #5)DDD 结构中的记忆服务接口、记忆操作的 event sourcing 集成、记忆访问的领域边界定义
Performance Engineer(Agent #14)150x–12,500x 提升的基准验证、内存占用剖析与优化、性能回归测试

这套分工与 v3/@claude-flow/memory 模块的 DDD 分层结构(domain/application/infrastructure 目录,如 src/application/services/memory-application-service.ts)相呼应:角色规范负责"谁做什么",DDD 目录结构落实"领域逻辑与基础设施如何隔离"。对多智能体系统的开发者,可将该文档视为一份"记忆专项子 Agent 的委派契约",也可直接作为编排任务描述使用(见技能文档 plugin/skills/v3-memory-unification/SKILL.md 中的Task("Memory migration", ...)用法)。

十、在本仓库中继续深入

若想基于源码进一步验证本文结论,建议按以下路径阅读:

  • 角色与规划入口:本文主体 .claude/agents/v3/v3-memory-specialist.md,以及配套技能 plugin/skills/v3-memory-unification/SKILL.md;
  • 架构决策:v3/implementation/adrs/ADR-006-UNIFIED-MEMORY.md(统一记忆服务)、ADR-009-IMPLEMENTATION.md(混合记忆后端,位于同目录);
  • 核心实现:HNSW 索引 src/hnsw-index.ts、AgentDB 后端 src/agentdb-backend.ts、混合后端 src/hybrid-backend.ts、合并器 src/consolidator.ts;
  • 测试与基准:HNSW 持久化 src/hnsw-persistence.test.ts、混合后端 src/hybrid-backend.test.ts、AgentDB 后端 src/agentdb-backend.test.ts;
  • 能力总览与安装:v3/@claude-flow/memory/README.md,独立使用无需 CLI,执行npm install @claude-flow/memory即可。

综上,"记忆统一化"在 ruflo 中不是一次性的重构,而是一条贯穿角色规范、ADR、技能与可执行模块的完整落地链:以MemoryService(原UnifiedMemoryService)为统一入口,以 Hybrid(sql.js + AgentDB)为默认后端,以 HNSW 快照持久化保证重启即用,以 Consolidator 控制有界增长,再辅以 AutoMemoryBridge、LearningBridge 与 agent-memory-scope 支撑跨智能体共享与自学习。这套"规范定义目标、ADR 固化决策、源码落实细节"的组合,既是本仓库记忆层当前状态的真实写照,也可作为其他项目做记忆架构收敛时的工程范本。

【免费下载链接】ruflo🌊 The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated项目地址: https://gitcode.com/GitHub_Trending/cl/ruflo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 21:31:50

IAR Embedded Workbench原生Linux版深度解析

1. 项目概述&#xff1a;IAR平台这次真把“跨平台IDE”做实了 最近在嵌入式开发圈里&#xff0c;不少老同事发来截图问&#xff1a;“IAR真出Linux版IDE了&#xff1f;不是插件、不是WSL套壳、不是远程桌面连Windows主机&#xff0c;是原生Linux桌面应用&#xff1f;”——答案…

作者头像 李华
网站建设 2026/9/8 21:31:03

UART帧传输时间精确计算:从115200波特率到7位模式

1. 这不是“背公式”问题&#xff0c;而是理解UART物理层本质的起点你手头正调试一块STM32开发板&#xff0c;串口打印突然卡顿&#xff1b;或者在用FT231X芯片做USB转UART桥接时&#xff0c;发现上位机接收数据错乱&#xff1b;又或者在设计一个低功耗传感器节点&#xff0c;需…

作者头像 李华
网站建设 2026/9/8 21:31:01

Ubuntu 20.04无人机开发环境搭建:ROS+PX4仿真避坑指南

从入门到能跑仿真&#xff1a;Ubuntu 20.04 无人机软件开发环境的搭建与避坑不管你是打算做 PX4/ArduPilot 二次开发&#xff0c;还是想在机载电脑上跑 ROS 做视觉避障&#xff0c;只要跨进无人机软件开发这扇门&#xff0c;第一个绕不开的环境就是Ubuntu 20.04。我见过太多人卡…

作者头像 李华
网站建设 2026/9/8 21:29:18

MCP 实测:3482 个 Server 中真正值得用的只有这4类

MCP 实测&#xff1a;3482 个 Server 只这 4 类值得用 我花了整整两周时间&#xff0c;把 MCP 生态里能搜到的 3482 个 Server 翻了个底朝天。 起因很简单&#xff1a;团队里已经有人把 MCP&#xff08;Model Context Protocol&#xff09;接进了 IDE 和内部工具链&#xff0c…

作者头像 李华
网站建设 2026/9/8 21:29:17

res-downloader 完整指南:3步上手的跨平台资源嗅探器

res-downloader 完整指南&#xff1a;3步上手的跨平台资源嗅探器 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader res-downloa…

作者头像 李华