我冻结了上万行项目,只提炼了 120 行设计模式

5 阅读10分钟

两个月前,我还在深夜里一边啃泡面一边翻 OpenClaw 的 GitHub Issues,边翻边骂"这什么鬼报错"。两个月后,我面对自己亲手敲出来的 2.5 万行代码,深吸一口气,做了一个让所有围观群众都以为我疯了的决定——全部冻结,一键休眠

然后,从这堆"代码废墟"里,我像考古学家一样,小心翼翼地拎出了…… 120 行

听起来像什么行为艺术现场对吧?但我就是想告诉你一句大实话:**有时候你写的最值钱的东西,根本不是代码本身,而是你从代码里筛出来的那套"套路"——俗称设计模式。 **

先自报家门,免得你们觉得我是某个大厂退休架构师下凡。我,大一,工商管理专业。不写代码是本分,写代码纯属"自找苦吃"。


一、用户阶段 —— 薅羊毛薅成了"人形爬虫"

故事的开头,我就是一个普普通通的用户,兜里比脸还干净。

一开始迷信 OpenClaw,本地部署 agent、配 skills、写 prompt、搭工作流,全套流程我都能闭眼默写了。然后呢?一天报三次错,版本兼容性问题修到我怀疑人生,GitHub Issues 都快被我翻出包浆了。

于是我开始"海王"式广撒网:Tare、QClaw、WorkBuddy……国产的、免费的,统统拉过来试一遍。选它们的理由极其纯粹——不要钱。为了把"白嫖"进行到底,我每天做 token 成本监测,比盯股票还认真。DeepSeek 的免费额度用完了?切火山引擎。火山用完了?切 Kimi。Kimi 用完?再切智谱。一个接一个,自动 fallback,无缝衔接。

没错,我就靠这套"打一枪换一个地方"的游击战术,硬生生白嫖完了早期开发。

期间还深度宠幸过 DeepSeek TUIReasonix,这俩是专门为 DeepSeek 优化的 agent 应用,缓存命中率确实高,CLI 面板上实时跳动的 token 消耗数字看着就爽。但爽归爽,痛点也越来越扎心:**它们每次都要我重新介绍一遍上下文,就像每次见面都问我"你谁啊"一样——它们是挺好用的工具,但绝不是能跟我并肩作战的"搭档"。 **

混迹 Issues 区这么久,我悟出了一个真理:

所有工具都不完全顺手。每条路我都走到头了,但没一条能真正把我送回家。

行吧,**别人不行,我自己上。 **


二、Builder 阶段 —— 两个月,我从"小白"变身"造轮子狂魔"

一开始我还挺老实的。LangChain + Ollama,所有 agent 本地硬编码,ChromaDB 自己手搭,基础设施全都亲力亲为。典型的"先让它跑起来,跑成啥样再说"阶段。

跑起来之后,我膨胀了——我想让 agent 之间能互相协作,聊天打屁、分工干活。OpenClaw 做不到,LangGraph 的文档写得像天书,CrewAI 用起来总觉得哪里别扭,像穿反了袜子。

于是,我决定继续"闭门造车"。

写了路由、写了记忆、写了工具调用、写了 RAG、写了联邦/州分层架构、写了宪法系统 v2.0、写了注册中心、写了熔断机制、写了 MCP 客户端、写了 Obsidian 集成、写了流式输出、写了 agent 审核机制……前后十几个模块,加起来 2.5 万行。期间键盘都敲坏了一个(夸张,但手确实快废了)。

甚至还顺便生出了几个"私生子"产品:

  • 求是 —— 一个哲学思辨引擎,后来做到 pip 可安装

  • InfoHive —— 本地知识库,我的第二大脑

  • DocsMate —— 文档管理,专治各种文件杂乱

两个月前我连 ORM 是啥都不知道,两个月后我居然写了一个 Agent 编排系统。看着满屏的代码,我一度觉得自己就是天选之子。

然后,我干了件所有人都觉得我有病的事——**把所有项目全冻了,一键冷冻,比冰箱还快。 **

原因嘛,说复杂也复杂,说简单就一句话:**我突然意识到,我在吭哧吭哧造轮子,而且造的还是个方轮子。 **

我去翻了 CrewAI 的源码,又翻了 LangGraph 的源码,再翻了 AutoGen 的。翻完之后,我尴尬地发现——市面上所有 Agent 编排框架,底层逻辑简直像一个妈生的,区别只是 API 设计不同、抽象层级不同、宣传文案不同。

我写了那么多,回头一看,我根本没造出什么新大陆——**我只是在各大框架的共同盲区里,不小心踩到了一个它们都漏掉的小角落。 **

于是,在按下"冻结"键之前,我把那个小角落里的"宝贝"抽了出来。

就 120 行。


三、设计模式 —— Capability-Driven Agent Orchestration(别怕,名字唬人,内容真香)

重头戏来了。当 MyAgentAI 膨胀到上万行时,我发现 CrewAI、LangGraph、AutoGen 都在干同一件事:按名字叫 Agent 干活


# 传统做法:按名字调度(CrewAI / LangGraph 都是这套路)

**if** task == "search":

    agent = SearchAgent()

**elif** task == "code":

    agent = CodeAgent()

**else**:

    agent = DefaultAgent()

这种做法的槽点简直比我的发际线还明显:

  • 耦合度高:路由逻辑和 Agent 列表死死绑在一起,加个新人就得改路由表,烦不烦?

  • 扩展性差:想换个实现?不好意思,改代码吧,动态替换?不存在的。

  • 不具备弹性:某个 Agent 挂了,下游直接陪葬,毫无逃生通道。

我的脑回路是反过来——**编排层不问"你叫啥",而是问"你能干啥" **。像极了相亲时不问名字,先问"会做饭吗""会修电脑吗"。


# 核心代码:按能力调度(真正值钱的 12 行就藏在这里)

  


**class** AgentRegistry:

    """Agent 能力注册与发现中心(单例,独苗)"""

  


    **def** register(self, name, agent_instance, capabilities=**None**):

        """注册一个 Agent 实例,顺便告诉全世界它有什么本事"""

        self._registrations[name] = {

            "instance": agent_instance,

            "capabilities": capabilities **or** [],

        }

  


    **def** discover(self, capability: str):

        """按能力名称发现 Agent——不问你是谁,就问你能不能干这个"""

        results = []

        cap_lower = capability.lower()

        **for** name, reg **in** self._registrations.items():

            **for** cap **in** reg["capabilities"]:

                **if** cap_lower **in** cap.name.lower():

                    results.append((name, reg))

                    **break******

        **return** results

  


    **def** resolve_for_capability(self, capability: str):

        """找出第一个能扛起这个任务的 Agent(前提是它没挂)"""

        **for** name, reg **in** self.discover(capability):

            **if** self.is_available(name):

                **return** reg["instance"]

        **return** **None******

这 12 行就是灵魂所在。整套系统不关心 Agent 叫什么阿猫阿狗,只关心它拍胸脯承诺了哪些能力。能力描述用 JSON Schema 写得明明白白,输入输出清清楚楚:


**class** AgentCapability(BaseModel):

    """Agent 能力说明书——干什么、怎么调、给啥结果"""

    name: str                       # 能力名称,比如 'web_search'

    description: str                # 能力描述,像"我能帮你搜遍全网"

    input_schema: dict[str, Any]    # 入参格式(JSON Schema 标准)

    output_schema: dict[str, Any]   # 返回格式(同样规规矩矩)

再配合一个 @agent 装饰器,直接在类上贴标签,声明式编程,一看就懂,一用就爽:


@agent(

    name="search",

    description="搜索互联网获取最新信息",

    capabilities=[{"name": "web_search", "input_schema": {...}, "output_schema": {...}}]

)

**class** SearchAgent(BaseAgent):

    ...

看图说话:Mermaid 架构对比(左边是死板,右边是灵活)


graph TD

    subgraph "传统方案(按名字调度)"

        A[编排层] -->|"调用 search_agent"| B[SearchAgent]

        A -->|"调用 code_agent"| C[CodeAgent]

        A -->|"调用 knowledge_agent"| D[KnowledgeAgent]

        B -.->|硬编码名字| A

    end

  


    subgraph "本方案(按能力调度)"

        E[编排层] -->|"需要 web_search"| F[AgentRegistry]

        F -->|"发现"| G[SearchAgent]

        E -->|"需要 code_gen"| F

        F -->|"发现"| H[CodeAgent]

        E -->|"需要 knowledge_qa"| F

        F -->|"发现"| I[KnowledgeAgent]

        G -.->|"声明 capability: web_search"| F

        H -.->|"声明 capability: code_gen"| F

    end

左边:编排层像个点菜员,死记硬背每个服务员的名字。右边:编排层像个吃货,只喊"我要吃辣的",然后注册中心自动把川菜师傅推出来。

再加个"熔断"护体,防止猪队友拖垮全队

既然不写死名字了,那弹性伸缩就顺理成章了——注册中心偷偷记下每个 Agent 的"黑历史":


**class** CircuitBreakerState:

    """熔断状态——记录某个 Agent 失败了多少次,有没有被拉黑"""

    failures: int = 0

    consecutive_failures: int = 0

    is_tripped: bool = **False******

  


# 默认规则:连续失败 3 次就触发熔断,关 60 秒小黑屋再试试

编排层每次要人时,会自动跳过那些已经"熔断"的 Agent,不用改任务逻辑,不用手动下线,全自动避雷,省心到哭。


四、产品化 —— 冻了一个"巨无霸",养了一个"小而美"

那你肯定要问:MyAgentAI 那 2.5 万行就这么打水漂了?不,绝对不。

因为在写 MyAgentAI 的过程中,我顺手养出了一个"州 Agent" —— 就是前面提到的 求是

求是的定位和市面上那些"秒回答案"的 AI 完全不是一个物种——**它不是给你更快的结果,而是帮你把脑子里的浆糊理清楚。 **

你问它"该不该辞职",它不会给你列一堆 pros and cons 像在念 Excel 表格。它会先甩出一个判断,然后自己怼自己,最后给你一个可操作的行动建议。三步走完,你猛然发现,你根本不需要它替你拍板——它只是把你脑子里那团乱麻拆成了顺滑的毛线。

它甚至内置了一群哲学"嘴替":斯多葛派、辩证唯物派、存在主义派,三方针对你的问题各自输出观点,然后再综合。不是吵架,是帮你从不同角度看同一件事,活脱脱一个"思维健身房"。

这个产品本来是 MyAgentAI 里的一个独立模块,后来被我拆出来做成了独立包。24 个源文件,pip 一键安装,CLI 直接开跑——一个完整、清爽、能打的小产品。

**那为什么冻结 MyAgentAI,而不是冻结求是? **

因为求是的体量刚刚好。24 个文件,我一个大学生熬夜能维护、能迭代、能跟朋友吹牛讲清楚。而 MyAgentAI 那 2.5 万行——说实话,以我现有的发量和精力,我根本不可能同时维护一个编排框架和一个产品。

所以,我做了个理性的"渣男"选择。

**MyAgentAI 冻进冰箱,设计模式提炼成 120 行珍藏。求是继续养大。 **

Capability Registry 那套东西,等求是以后做大了、场景复杂了,自然会王者归来。那一天到来的时候,我手里有现成的"武器库"等着它,美滋滋。


五、数据附录 —— 别以为我在吹牛,真实跑过的大场面

图:2026 年 6 月 API 用量统计

图:2026 年 5 月 API 用量统计

  • 总 Token 消耗:1,506,041,940(对,15 亿,不是 15 万)

  • API 请求次数:16,421 次(手都点麻了)

  • 统计周期:2026.05.10 — 2026.06.25(整整 46 天,几乎没断过)

  • **不是玩具,是真实规模上跑过的,实打实的"战场数据" **


六、结尾 —— 代码会过时,模式永流传

回到开头那句扎心的话:**有时候你写的最值钱的东西,不是代码,是从代码里筛出来的模式。 **

两个月前我连"设计模式"四个字都嫌绕口,网上那些讲"工厂模式""策略模式"的文章,我读两段就眼皮打架。但当我亲手从 2.5 万行里拎出这 120 行之后,我忽然开窍了——**设计模式不是哪个神仙发明的高深理论,是你踩过无数坑、摔过无数次之后,自然而然会去提炼的"生存法则"。 **

2.5 万行代码可以冻结,但 120 行模式永远不会过时。等我再做大一个量级的时候,它依然能打。**这就是设计模式比代码值钱的原因,没毛病。 **

我在下面放了一个 demo 仓库,里面包含了完整的 registry + 示例 worker + supervisor 脚本,总共不到 300 行。你可以跑起来看看"按能力调度"到底是个什么神仙操作。

如果你也在搞 Agent 编排,欢迎来唠嗑。在这条赛道上,我大概只懂这一件事——但这一件事,我真的是用头发换来的,想得透透的。


开源 demo 仓库:[capability-orchestration-demo]( github.com/217created/…)****

完整项目源码:myagent-ai