[{"data":1,"prerenderedAt":3477},["ShallowReactive",2],{"header-counts":3,"review-list":6,"footer-counts":3476},{"tools":4,"reviews":5},65,7,[7,655,1131,1805,2425,2723,3092],{"id":8,"title":9,"body":10,"cover":636,"description":637,"extension":638,"meta":639,"navigation":640,"path":641,"published":642,"relatedTools":643,"seo":648,"stem":649,"tags":650,"updated":642,"verdict":653,"__hash__":654},"review\u002Freview\u002Fai-code-review-comparison.md","AI 代码审查工具横评：CodeRabbit vs Ellipsis vs Qodo vs Greptile",{"type":11,"value":12,"toc":620},"minimark",[13,18,186,189,212,215,220,227,246,251,262,268,272,276,287,291,302,307,311,315,326,330,341,346,350,354,365,369,380,385,388,391,509,512,516,573,576,586,589],[14,15,17],"h2",{"id":16},"tldr","TL;DR",[19,20,21,43],"table",{},[22,23,24],"thead",{},[25,26,27,31,34,37,40],"tr",{},[28,29,30],"th",{},"维度",[28,32,33],{},"CodeRabbit",[28,35,36],{},"Ellipsis",[28,38,39],{},"Qodo",[28,41,42],{},"Greptile",[44,45,46,64,81,97,112,126,141,154,171],"tbody",{},[25,47,48,52,55,58,61],{},[49,50,51],"td",{},"定位",[49,53,54],{},"全面 review",[49,56,57],{},"只报 bug",[49,59,60],{},"测试 + review",[49,62,63],{},"大仓库理解",[25,65,66,69,72,75,78],{},[49,67,68],{},"评论数\u002FPR",[49,70,71],{},"15-25 条",[49,73,74],{},"3-5 条",[49,76,77],{},"8-12 条",[49,79,80],{},"6-10 条",[25,82,83,86,89,92,95],{},[49,84,85],{},"噪音率",[49,87,88],{},"中（含风格）",[49,90,91],{},"极低",[49,93,94],{},"低",[49,96,94],{},[25,98,99,102,105,108,110],{},[49,100,101],{},"Bug 检出",[49,103,104],{},"⭐⭐⭐⭐",[49,106,107],{},"⭐⭐⭐⭐⭐",[49,109,104],{},[49,111,104],{},[25,113,114,117,120,122,124],{},[49,115,116],{},"安全审查",[49,118,119],{},"⭐⭐⭐",[49,121,107],{},[49,123,119],{},[49,125,119],{},[25,127,128,131,133,136,138],{},[49,129,130],{},"测试建议",[49,132,119],{},[49,134,135],{},"❌",[49,137,107],{},[49,139,140],{},"⭐⭐",[25,142,143,146,148,150,152],{},[49,144,145],{},"大仓库",[49,147,119],{},[49,149,119],{},[49,151,119],{},[49,153,107],{},[25,155,156,159,162,165,168],{},[49,157,158],{},"价格（私有仓库）",[49,160,161],{},"$24\u002Fseat\u002Fmo",[49,163,164],{},"$20\u002Fseat\u002Fmo",[49,166,167],{},"$19\u002Fseat\u002Fmo",[49,169,170],{},"$50\u002Fseat\u002Fmo",[25,172,173,176,179,181,184],{},[49,174,175],{},"开源免费",[49,177,178],{},"✅",[49,180,178],{},[49,182,183],{},"CLI 免费",[49,185,135],{},[14,187,188],{"id":188},"测试环境",[190,191,192,200,206],"ul",{},[193,194,195,199],"li",{},[196,197,198],"strong",{},"仓库","：Nuxt 项目，50 万行 TS，20+ 贡献者",[193,201,202,205],{},[196,203,204],{},"时长","：2 周，约 40 个 PR",[193,207,208,211],{},[196,209,210],{},"PR 类型","：功能开发、bug 修复、重构、依赖升级",[14,213,214],{"id":214},"各工具实测",[216,217,219],"h3",{"id":218},"coderabbit最全面","CodeRabbit：最全面",[221,222,223,226],"p",{},[196,224,225],{},"优点","：",[190,228,229,232,235,243],{},[193,230,231],{},"评论最全——bug、安全、测试、文档、风格都覆盖",[193,233,234],{},"摘要做得好，PR 一眼看完改动意图",[193,236,237,238,242],{},"支持 ",[239,240,241],"code",{},".coderabbit.yml"," 自定义规则",[193,244,245],{},"开源仓库完全免费",[221,247,248,226],{},[196,249,250],{},"缺点",[190,252,253,256,259],{},[193,254,255],{},"评论数多（15-25 条\u002FPR），部分是风格建议",[193,257,258],{},"开发者容易\"忽略所有评论\"",[193,260,261],{},"私有仓库 $24\u002Fseat\u002Fmo 偏贵",[221,263,264,267],{},[196,265,266],{},"最佳场景","：团队统一 review 标准，需要全面覆盖。",[216,269,271],{"id":270},"ellipsis信噪比最高","Ellipsis：信噪比最高",[221,273,274,226],{},[196,275,225],{},[190,277,278,281,284],{},[193,279,280],{},"只报 bug 和安全，3-5 条\u002FPR，条条有价值",[193,282,283],{},"自动修复功能好用，一键生成 fix commit",[193,285,286],{},"评论格式统一（🔴\u002F🟡\u002F🟢），扫一眼就分清严重度",[221,288,289,226],{},[196,290,250],{},[190,292,293,296,299],{},[193,294,295],{},"不评论测试和文档",[193,297,298],{},"不支持自定义审查规则（只能描述自然语言规则）",[193,300,301],{},"中文项目评论全英文",[221,303,304,306],{},[196,305,266],{},"：嫌评论太多噪音的团队，只关心 bug。",[216,308,310],{"id":309},"qodo-codiumai测试生成最强","Qodo (CodiumAI)：测试生成最强",[221,312,313,226],{},[196,314,225],{},[190,316,317,320,323],{},[193,318,319],{},"测试生成独一档——理解代码逻辑生成边界用例",[193,321,322],{},"开源 CLI（pr-agent）可自托管，完全免费",[193,324,325],{},"支持 40+ 语言",[221,327,328,226],{},[196,329,250],{},[190,331,332,335,338],{},[193,333,334],{},"PR review 质量中等，不如 CodeRabbit 全面",[193,336,337],{},"IDE 插件偶尔卡顿",[193,339,340],{},"测试生成有时过度（生成 50 个用例太多）",[221,342,343,345],{},[196,344,266],{},"：提升测试覆盖率，个人开发者用 CLI。",[216,347,349],{"id":348},"greptile大仓库理解最强","Greptile：大仓库理解最强",[221,351,352,226],{},[196,353,225],{},[190,355,356,359,362],{},[193,357,358],{},"能理解整个仓库上下文，不只看 diff",[193,360,361],{},"跨文件关联分析强（\"这个改动会影响哪些调用方\"）",[193,363,364],{},"语义搜索，可以问\"这个函数在哪里被调用\"",[221,366,367,226],{},[196,368,250],{},[190,370,371,374,377],{},[193,372,373],{},"最贵（$50\u002Fseat\u002Fmo）",[193,375,376],{},"首次索引慢（50 万行仓库约 30 分钟）",[193,378,379],{},"评论数偏少，全面性不如 CodeRabbit",[221,381,382,384],{},[196,383,266],{},"：大型仓库（100 万行+），需要跨文件理解。",[14,386,387],{"id":387},"检出率对比",[221,389,390],{},"2 周内我们人工标记了 30 个真实问题，看各工具检出多少：",[19,392,393,408],{},[22,394,395],{},[25,396,397,400,402,404,406],{},[28,398,399],{},"问题类型",[28,401,33],{},[28,403,36],{},[28,405,39],{},[28,407,42],{},[44,409,410,426,441,455,469,482],{},[25,411,412,415,418,421,424],{},[49,413,414],{},"空指针\u002F未处理异常 (8)",[49,416,417],{},"6",[49,419,420],{},"8",[49,422,423],{},"5",[49,425,417],{},[25,427,428,431,434,436,439],{},[49,429,430],{},"SQL 注入\u002F安全 (5)",[49,432,433],{},"3",[49,435,423],{},[49,437,438],{},"2",[49,440,433],{},[25,442,443,446,449,451,453],{},[49,444,445],{},"边界条件错误 (7)",[49,447,448],{},"4",[49,450,423],{},[49,452,417],{},[49,454,448],{},[25,456,457,460,462,464,467],{},[49,458,459],{},"并发问题 (4)",[49,461,438],{},[49,463,433],{},[49,465,466],{},"1",[49,468,433],{},[25,470,471,474,476,478,480],{},[49,472,473],{},"逻辑错误 (6)",[49,475,448],{},[49,477,448],{},[49,479,433],{},[49,481,423],{},[25,483,484,489,494,499,504],{},[49,485,486],{},[196,487,488],{},"总检出率",[49,490,491],{},[196,492,493],{},"63%",[49,495,496],{},[196,497,498],{},"83%",[49,500,501],{},[196,502,503],{},"57%",[49,505,506],{},[196,507,508],{},"70%",[221,510,511],{},"Ellipsis 检出率最高——因为它只报确定的问题，不猜。",[14,513,515],{"id":514},"价格对比10-人团队私有仓库","价格对比（10 人团队，私有仓库）",[19,517,518,531],{},[22,519,520],{},[25,521,522,525,528],{},[28,523,524],{},"工具",[28,526,527],{},"月费",[28,529,530],{},"年费",[44,532,533,543,553,563],{},[25,534,535,537,540],{},[49,536,33],{},[49,538,539],{},"$240",[49,541,542],{},"$2,880",[25,544,545,547,550],{},[49,546,36],{},[49,548,549],{},"$200",[49,551,552],{},"$2,400",[25,554,555,557,560],{},[49,556,39],{},[49,558,559],{},"$190",[49,561,562],{},"$2,280",[25,564,565,567,570],{},[49,566,42],{},[49,568,569],{},"$500",[49,571,572],{},"$6,000",[14,574,575],{"id":575},"最终推荐",[577,578,583],"pre",{"className":579,"code":581,"language":582},[580],"language-text","全面 review → CodeRabbit（含风格\u002F测试\u002F文档）\n只报 bug → Ellipsis（信噪比最高）\n测试生成 → Qodo（CLI 免费自托管）\n大仓库 → Greptile（跨文件理解）\n\n最佳实践：CodeRabbit + Ellipsis 双挂\n  - CodeRabbit 做全面 review\n  - Ellipsis 做 bug 专项\n  - 两者互补，检出率 > 90%\n","text",[239,584,581],{"__ignoreMap":585},"",[14,587,588],{"id":588},"踩坑记录",[590,591,592,602,608,614],"ol",{},[193,593,594,597,598,601],{},[196,595,596],{},"多 bot 同时用会刷屏","——在 ",[239,599,600],{},".github\u002Fworkflows\u002F"," 里控制触发条件，避免每个 PR 触发全部 4 个。",[193,603,604,607],{},[196,605,606],{},"CodeRabbit 的 path_filters 必配","——否则会 review lock 文件，浪费配额。",[193,609,610,613],{},[196,611,612],{},"Greptile 首次索引慢","——新仓库加完先等索引完成再开 review，否则前几个 PR 没有上下文。",[193,615,616,619],{},[196,617,618],{},"Ellipsis 自动修复要 review","——生成的 fix commit 有时会改不该改的，别无脑点。",{"title":585,"searchDepth":621,"depth":621,"links":622},3,[623,625,626,632,633,634,635],{"id":16,"depth":624,"text":17},2,{"id":188,"depth":624,"text":188},{"id":214,"depth":624,"text":214,"children":627},[628,629,630,631],{"id":218,"depth":621,"text":219},{"id":270,"depth":621,"text":271},{"id":309,"depth":621,"text":310},{"id":348,"depth":621,"text":349},{"id":387,"depth":624,"text":387},{"id":514,"depth":624,"text":515},{"id":575,"depth":624,"text":575},{"id":588,"depth":624,"text":588},"\u002Fog\u002Freview\u002Fai-code-review-comparison.png","四款主流 AI PR review 工具两周真实对比——我们在同一个中型仓库（50 万行 TS）上挂了四个 bot，记录了评论质量、噪音率、检出率、价格。给选型建议。","md",{},true,"\u002Freview\u002Fai-code-review-comparison","2026-06-21",[644,645,646,647],"coding\u002Freview\u002Fcoderabbit","coding\u002Freview\u002Fellipsis","coding\u002Freview\u002Fqodo","coding\u002Freview\u002Fgreptile",{"title":9,"description":637},"review\u002Fai-code-review-comparison",[651,652,33,36,39,42],"代码审查","对比","全面 review 选 CodeRabbit，只要 bug 选 Ellipsis，测试生成选 Qodo，大仓库理解选 Greptile。最佳实践：CodeRabbit + Ellipsis 双挂。","CsqnLsz5x7-cRSGSXvBKpor3Gw6GQO2WbHnw23XbuCI",{"id":656,"title":657,"body":658,"cover":1115,"description":1116,"extension":638,"meta":1117,"navigation":640,"path":1118,"published":642,"relatedTools":1119,"seo":1123,"stem":1124,"tags":1125,"updated":642,"verdict":1129,"__hash__":1130},"review\u002Freview\u002Fclaude-skills-practice.md","Claude Skills 实战：用 SKILL.md 让 Agent 学会部署 Nuxt 项目",{"type":11,"value":659,"toc":1101},[660,662,669,673,745,749,753,795,802,806,881,890,894,915,919,940,944,952,958,961,967,971,1059,1062,1065,1068,1088,1091,1094,1097],[14,661,17],{"id":16},[221,663,664,665,668],{},"Skills 把 Agent 能力从「写代码注册 tool」降维到「写 Markdown 描述步骤」。我们写了 5 个生产级 Skill，总结出",[196,666,667],{},"什么样的 SKILL.md 才能让 Claude 真正按你的预期执行","。",[14,670,672],{"id":671},"我们写了哪-5-个-skill","我们写了哪 5 个 Skill",[19,674,675,688],{},[22,676,677],{},[25,678,679,682,685],{},[28,680,681],{},"Skill",[28,683,684],{},"场景",[28,686,687],{},"效果",[44,689,690,701,712,723,734],{},[25,691,692,695,698],{},[49,693,694],{},"deploy-to-vercel",[49,696,697],{},"部署 Nuxt 项目到 Vercel",[49,699,700],{},"从 15 分钟手动操作 → 30 秒一行指令",[25,702,703,706,709],{},[49,704,705],{},"audit-deps",[49,707,708],{},"审计 package.json 依赖安全",[49,710,711],{},"每周自动跑，输出安全报告",[25,713,714,717,720],{},[49,715,716],{},"gen-sitemap",[49,718,719],{},"生成 sitemap.xml",[49,721,722],{},"改路由后自动更新，不用手动跑脚本",[25,724,725,728,731],{},[49,726,727],{},"db-migration",[49,729,730],{},"数据库 schema 迁移",[49,732,733],{},"生成迁移文件 + 回滚脚本",[25,735,736,739,742],{},[49,737,738],{},"gen-api-docs",[49,740,741],{},"从代码生成 API 文档",[49,743,744],{},"提交 PR 时自动更新文档",[14,746,748],{"id":747},"skillmd-怎么写才有效","SKILL.md 怎么写才有效",[216,750,752],{"id":751},"反面教材无效","反面教材（无效）",[577,754,758],{"className":755,"code":756,"language":757,"meta":585,"style":585},"language-markdown shiki shiki-themes github-light github-dark","---\nname: deploy-to-vercel\ndescription: Deploy to Vercel\n---\n\nDeploy the project to Vercel.\n","markdown",[239,759,760,768,773,778,783,789],{"__ignoreMap":585},[761,762,765],"span",{"class":763,"line":764},"line",1,[761,766,767],{},"---\n",[761,769,770],{"class":763,"line":624},[761,771,772],{},"name: deploy-to-vercel\n",[761,774,775],{"class":763,"line":621},[761,776,777],{},"description: Deploy to Vercel\n",[761,779,781],{"class":763,"line":780},4,[761,782,767],{},[761,784,786],{"class":763,"line":785},5,[761,787,788],{"emptyLinePlaceholder":640},"\n",[761,790,792],{"class":763,"line":791},6,[761,793,794],{},"Deploy the project to Vercel.\n",[221,796,797,798,801],{},"Claude 看到这个会问一堆问题：用什么命令？要不要 ",[239,799,800],{},"--prod","？环境变量怎么配？",[216,803,805],{"id":804},"正面教材有效","正面教材（有效）",[577,807,809],{"className":755,"code":808,"language":757,"meta":585,"style":585},"---\nname: deploy-to-vercel\ndescription: Deploy a Nuxt\u002FVite\u002FNext project to Vercel\n---\n\n## When to use\n\nUser says \"部署\" \u002F \"deploy\" \u002F \"上线\" or asks to deploy to Vercel.\n\n## Prerequisites\n\n1. Check `vercel.json` exists. If not, create one:\n   ```json\n   { \"framework\": \"nuxt\", \"buildCommand\": \"pnpm run build\" }\n",[239,810,811,815,819,824,828,832,837,841,847,852,858,863,869,875],{"__ignoreMap":585},[761,812,813],{"class":763,"line":764},[761,814,767],{},[761,816,817],{"class":763,"line":624},[761,818,772],{},[761,820,821],{"class":763,"line":621},[761,822,823],{},"description: Deploy a Nuxt\u002FVite\u002FNext project to Vercel\n",[761,825,826],{"class":763,"line":780},[761,827,767],{},[761,829,830],{"class":763,"line":785},[761,831,788],{"emptyLinePlaceholder":640},[761,833,834],{"class":763,"line":791},[761,835,836],{},"## When to use\n",[761,838,839],{"class":763,"line":5},[761,840,788],{"emptyLinePlaceholder":640},[761,842,844],{"class":763,"line":843},8,[761,845,846],{},"User says \"部署\" \u002F \"deploy\" \u002F \"上线\" or asks to deploy to Vercel.\n",[761,848,850],{"class":763,"line":849},9,[761,851,788],{"emptyLinePlaceholder":640},[761,853,855],{"class":763,"line":854},10,[761,856,857],{},"## Prerequisites\n",[761,859,861],{"class":763,"line":860},11,[761,862,788],{"emptyLinePlaceholder":640},[761,864,866],{"class":763,"line":865},12,[761,867,868],{},"1. Check `vercel.json` exists. If not, create one:\n",[761,870,872],{"class":763,"line":871},13,[761,873,874],{},"   ```json\n",[761,876,878],{"class":763,"line":877},14,[761,879,880],{},"   { \"framework\": \"nuxt\", \"buildCommand\": \"pnpm run build\" }\n",[590,882,883],{"start":624},[193,884,885,886,889],{},"Check ",[239,887,888],{},"VERCEL_TOKEN"," env var is set. If not, ask user to provide it.",[14,891,893],{"id":892},"steps","Steps",[590,895,896,903,909,912],{},[193,897,898,899,902],{},"Run ",[239,900,901],{},"vercel build"," to verify build passes locally",[193,904,898,905,908],{},[239,906,907],{},"vercel --prod --yes"," to deploy",[193,910,911],{},"Wait for deployment URL in output",[193,913,914],{},"Return the deployment URL to user",[14,916,918],{"id":917},"error-handling","Error handling",[190,920,921,924,930],{},[193,922,923],{},"If build fails: show error, do NOT retry automatically",[193,925,926,927,929],{},"If ",[239,928,888],{}," missing: ask user to set it, do NOT guess",[193,931,926,932,935,936,939],{},[239,933,934],{},"vercel"," CLI not installed: ",[239,937,938],{},"npm i -g vercel"," first",[14,941,943],{"id":942},"do-not","Do NOT",[190,945,946,949],{},[193,947,948],{},"Do not deploy to preview without asking",[193,950,951],{},"Do not modify nuxt.config during deploy",[577,953,956],{"className":954,"code":955,"language":582},[580],"\n**关键要素**：\n1. **When to use** — 明确触发条件，避免 Claude 瞎调\n2. **Prerequisites** — 前置检查，缺什么先补\n3. **Steps** — 具体命令，不要含糊\n4. **Error handling** — 出错了怎么办\n5. **Do NOT** — 禁止事项，防止 Claude 自作主张\n\n## 附带脚本和模板\n\nSkill 目录可以放脚本和模板，Claude 会按需读取：\n\n",[239,957,955],{"__ignoreMap":585},[221,959,960],{},"deploy-to-vercel\u002F\nSKILL.md\nscripts\u002F\ncheck-env.sh        # 检查环境变量\ntemplates\u002F\nvercel.json         # 默认配置模板\nnuxt.vercel.json    # Nuxt 专用配置",[577,962,965],{"className":963,"code":964,"language":582},[580],"\nSKILL.md 里引用：\n```markdown\n## Steps\n\n1. Run `bash scripts\u002Fcheck-env.sh` to verify prerequisites\n2. If `vercel.json` missing, copy from `templates\u002Fnuxt.vercel.json`\n3. Run `vercel --prod --yes`\n",[239,966,964],{"__ignoreMap":585},[14,968,970],{"id":969},"skills-vs-cursorrules-vs-mcp","Skills vs .cursorrules vs MCP",[19,972,973,988],{},[22,974,975],{},[25,976,977,979,982,985],{},[28,978,30],{},[28,980,981],{},"Skills",[28,983,984],{},".cursorrules",[28,986,987],{},"MCP",[44,989,990,1004,1018,1031,1045],{},[25,991,992,995,998,1001],{},[49,993,994],{},"本质",[49,996,997],{},"能力描述（按需加载）",[49,999,1000],{},"全局 prompt（每次带）",[49,1002,1003],{},"工具接入协议",[25,1005,1006,1009,1012,1015],{},[49,1007,1008],{},"格式",[49,1010,1011],{},"Markdown + 脚本",[49,1013,1014],{},"纯文本",[49,1016,1017],{},"JSON + 代码",[25,1019,1020,1023,1026,1029],{},[49,1021,1022],{},"Context 占用",[49,1024,1025],{},"低（按需加载）",[49,1027,1028],{},"高（每次对话带）",[49,1030,94],{},[25,1032,1033,1036,1039,1042],{},[49,1034,1035],{},"适合",[49,1037,1038],{},"固化团队流程",[49,1040,1041],{},"项目规范",[49,1043,1044],{},"接外部 API",[25,1046,1047,1050,1053,1056],{},[49,1048,1049],{},"支持",[49,1051,1052],{},"Claude 系列",[49,1054,1055],{},"Cursor \u002F Windsurf",[49,1057,1058],{},"Claude \u002F Cursor",[221,1060,1061],{},"三者互补：.cursorrules 定项目规范，Skills 定操作流程，MCP 接外部工具。",[14,1063,1064],{"id":1064},"效果数据",[221,1066,1067],{},"部署 Skill 上线两周后：",[190,1069,1070,1076,1082],{},[193,1071,1072,1075],{},[196,1073,1074],{},"部署操作时间","：15 min → 30 sec（Claude Code 执行 Skill）",[193,1077,1078,1081],{},[196,1079,1080],{},"部署错误率","：2 次\u002F周 → 0（Skill 里有前置检查）",[193,1083,1084,1087],{},[196,1085,1086],{},"新人上手","：不需要看部署文档，直接说\"部署\"就行",[14,1089,1090],{"id":1090},"结论",[221,1092,1093],{},"Skills 的核心价值不是「教 AI 新知识」，而是**「固化团队最佳实践」**。写好一个 Skill = 新人不用看文档也能按规范操作。",[221,1095,1096],{},"建议从高频、易出错的流程开始写 Skill——部署、迁移、审计这类。",[1098,1099,1100],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":585,"searchDepth":621,"depth":621,"links":1102},[1103,1104,1105,1109,1110,1111,1112,1113,1114],{"id":16,"depth":624,"text":17},{"id":671,"depth":624,"text":672},{"id":747,"depth":624,"text":748,"children":1106},[1107,1108],{"id":751,"depth":621,"text":752},{"id":804,"depth":621,"text":805},{"id":892,"depth":624,"text":893},{"id":917,"depth":624,"text":918},{"id":942,"depth":624,"text":943},{"id":969,"depth":624,"text":970},{"id":1064,"depth":624,"text":1064},{"id":1090,"depth":624,"text":1090},"\u002Fog\u002Freview\u002Fclaude-skills-practice.png","Anthropic Skills 推出后，Agent 能力复用从代码降维到 Markdown。我们写了 5 个实战 Skill（部署 Vercel \u002F 审计依赖 \u002F 生成 sitemap \u002F 数据库迁移 \u002F API 文档），记录了 SKILL.md 怎么写才有效。",{},"\u002Freview\u002Fclaude-skills-practice",[1120,1121,1122],"agent\u002Fskills\u002Fclaude-skills","coding\u002Fcli\u002Fclaude-code","agent\u002Fprotocol\u002Fsmithery",{"title":657,"description":1116},"review\u002Fclaude-skills-practice",[1126,981,1127,1128],"Claude","Agent","实战","Skills 的核心价值不是「教 AI 新知识」，而是「固化团队最佳实践」。写好一个 Skill = 新人不用看文档也能按规范操作。","yJOSR1KXWRpMNGMzs6xAu4lJAOfYBTw0hEmtVZkDRkU",{"id":1132,"title":1133,"body":1134,"cover":1791,"description":1792,"extension":638,"meta":1793,"navigation":640,"path":1794,"published":642,"relatedTools":1795,"seo":1799,"stem":1800,"tags":1801,"updated":642,"verdict":1803,"__hash__":1804},"review\u002Freview\u002Fllm-gateway-comparison.md","LLM API 网关实测：OpenRouter vs Portkey vs 自建 LiteLLM",{"type":11,"value":1135,"toc":1778},[1136,1138,1253,1255,1280,1283,1287,1351,1356,1376,1382,1386,1438,1442,1462,1467,1471,1526,1563,1567,1587,1592,1595,1669,1672,1675,1678,1736,1739,1741,1747,1749,1775],[14,1137,17],{"id":16},[19,1139,1140,1155],{},[22,1141,1142],{},[25,1143,1144,1146,1149,1152],{},[28,1145,30],{},[28,1147,1148],{},"OpenRouter",[28,1150,1151],{},"Portkey",[28,1153,1154],{},"LiteLLM (自建)",[44,1156,1157,1171,1185,1199,1213,1227,1240],{},[25,1158,1159,1162,1165,1168],{},[49,1160,1161],{},"模式",[49,1163,1164],{},"托管聚合",[49,1166,1167],{},"Gateway + 托管",[49,1169,1170],{},"开源自托管",[25,1172,1173,1176,1179,1182],{},[49,1174,1175],{},"接入成本",[49,1177,1178],{},"极低（一个 key）",[49,1180,1181],{},"低（改 base URL）",[49,1183,1184],{},"中（部署 + 配置）",[25,1186,1187,1190,1193,1196],{},[49,1188,1189],{},"模型数",[49,1191,1192],{},"300+",[49,1194,1195],{},"1600+",[49,1197,1198],{},"取决于你接几家",[25,1200,1201,1204,1207,1210],{},[49,1202,1203],{},"Fallback",[49,1205,1206],{},"✅ 基础",[49,1208,1209],{},"✅ 高级",[49,1211,1212],{},"✅ 可配",[25,1214,1215,1218,1221,1224],{},[49,1216,1217],{},"成本透明",[49,1219,1220],{},"透传 + 5%",[49,1222,1223],{},"透传 + 按量",[49,1225,1226],{},"纯透传",[25,1228,1229,1232,1235,1237],{},[49,1230,1231],{},"数据隐私",[49,1233,1234],{},"过第三方",[49,1236,1234],{},[49,1238,1239],{},"完全自有",[25,1241,1242,1244,1247,1250],{},[49,1243,1035],{},[49,1245,1246],{},"个人 \u002F 试水",[49,1248,1249],{},"生产团队",[49,1251,1252],{},"企业 \u002F 合规",[14,1254,188],{"id":188},[190,1256,1257,1263,1269,1274],{},[193,1258,1259,1262],{},[196,1260,1261],{},"应用","：多模型 Agent，同时调 Claude \u002F GPT \u002F Gemini",[193,1264,1265,1268],{},[196,1266,1267],{},"调用量","：日均 10K 次请求",[193,1270,1271,1273],{},[196,1272,204],{},"：2 周，每种方案各跑 4-5 天",[193,1275,1276,1279],{},[196,1277,1278],{},"关注指标","：延迟、成本、可靠性、运维负担",[14,1281,1282],{"id":1282},"各方案实测",[216,1284,1286],{"id":1285},"openrouter最省心","OpenRouter：最省心",[577,1288,1292],{"className":1289,"code":1290,"language":1291,"meta":585,"style":585},"language-python shiki shiki-themes github-light github-dark","import openai\nclient = openai.OpenAI(\n    base_url=\"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\",\n    api_key=\"or-xxx\"\n)\n# 一个 key 调 300+ 模型\n","python",[239,1293,1294,1304,1315,1330,1340,1345],{"__ignoreMap":585},[761,1295,1296,1300],{"class":763,"line":764},[761,1297,1299],{"class":1298},"szBVR","import",[761,1301,1303],{"class":1302},"sVt8B"," openai\n",[761,1305,1306,1309,1312],{"class":763,"line":624},[761,1307,1308],{"class":1302},"client ",[761,1310,1311],{"class":1298},"=",[761,1313,1314],{"class":1302}," openai.OpenAI(\n",[761,1316,1317,1321,1323,1327],{"class":763,"line":621},[761,1318,1320],{"class":1319},"s4XuR","    base_url",[761,1322,1311],{"class":1298},[761,1324,1326],{"class":1325},"sZZnC","\"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\"",[761,1328,1329],{"class":1302},",\n",[761,1331,1332,1335,1337],{"class":763,"line":780},[761,1333,1334],{"class":1319},"    api_key",[761,1336,1311],{"class":1298},[761,1338,1339],{"class":1325},"\"or-xxx\"\n",[761,1341,1342],{"class":763,"line":785},[761,1343,1344],{"class":1302},")\n",[761,1346,1347],{"class":763,"line":791},[761,1348,1350],{"class":1349},"sJ8bj","# 一个 key 调 300+ 模型\n",[221,1352,1353,226],{},[196,1354,1355],{},"体验",[190,1357,1358,1361,1364,1367,1370,1373],{},[193,1359,1360],{},"✅ 接入 5 分钟，一个 key 通吃",[193,1362,1363],{},"✅ 自带模型路由和基础 fallback",[193,1365,1366],{},"✅ Dashboard 看消耗明细",[193,1368,1369],{},"⚠️ 多收 5% 路由费",[193,1371,1372],{},"⚠️ 偶尔有限流（高峰期 Claude 请求排队）",[193,1374,1375],{},"❌ 所有请求过 OpenRouter 服务器，数据隐私无保障",[221,1377,1378,1381],{},[196,1379,1380],{},"成本","：日均 $50（模型费 $47.6 + OpenRouter 路由费 $2.4）",[216,1383,1385],{"id":1384},"portkey生产级控制","Portkey：生产级控制",[577,1387,1391],{"className":1388,"code":1389,"language":1390,"meta":585,"style":585},"language-javascript shiki shiki-themes github-light github-dark","const portkey = new Portkey({\n  config: {\n    strategy: { mode: \"fallback\" },\n    targets: [\n      { provider: \"anthropic\", override_params: { model: \"claude-sonnet-4\" } },\n      { provider: \"openai\", override_params: { model: \"gpt-5\" } },\n    ]\n  }\n})\n","javascript",[239,1392,1393,1398,1403,1408,1413,1418,1423,1428,1433],{"__ignoreMap":585},[761,1394,1395],{"class":763,"line":764},[761,1396,1397],{},"const portkey = new Portkey({\n",[761,1399,1400],{"class":763,"line":624},[761,1401,1402],{},"  config: {\n",[761,1404,1405],{"class":763,"line":621},[761,1406,1407],{},"    strategy: { mode: \"fallback\" },\n",[761,1409,1410],{"class":763,"line":780},[761,1411,1412],{},"    targets: [\n",[761,1414,1415],{"class":763,"line":785},[761,1416,1417],{},"      { provider: \"anthropic\", override_params: { model: \"claude-sonnet-4\" } },\n",[761,1419,1420],{"class":763,"line":791},[761,1421,1422],{},"      { provider: \"openai\", override_params: { model: \"gpt-5\" } },\n",[761,1424,1425],{"class":763,"line":5},[761,1426,1427],{},"    ]\n",[761,1429,1430],{"class":763,"line":843},[761,1431,1432],{},"  }\n",[761,1434,1435],{"class":763,"line":849},[761,1436,1437],{},"})\n",[221,1439,1440,226],{},[196,1441,1355],{},[190,1443,1444,1447,1450,1453,1456,1459],{},[193,1445,1446],{},"✅ Fallback 逻辑强大——主模型挂了 0 延迟切备用",[193,1448,1449],{},"✅ 负载均衡——多个 API key 轮询，突破单 key 限流",[193,1451,1452],{},"✅ 语义缓存——相似请求命中缓存，省钱",[193,1454,1455],{},"⚠️ 配置比 OpenRouter 复杂",[193,1457,1458],{},"⚠️ 托管版数据也过第三方",[193,1460,1461],{},"❌ 无中国区节点",[221,1463,1464,1466],{},[196,1465,1380],{},"：日均 $48（模型费 $47.6 + Portkey $0.4 缓存省了点）",[216,1468,1470],{"id":1469},"自建-litellm完全可控","自建 LiteLLM：完全可控",[577,1472,1476],{"className":1473,"code":1474,"language":1475,"meta":585,"style":585},"language-bash shiki shiki-themes github-light github-dark","# 部署\ndocker run -p 4000:4000 \\\n  -e ANTHROPIC_API_KEY=xxx \\\n  -e OPENAI_API_KEY=xxx \\\n  ghcr.io\u002Fberriai\u002Flitellm:main\n","bash",[239,1477,1478,1483,1502,1512,1521],{"__ignoreMap":585},[761,1479,1480],{"class":763,"line":764},[761,1481,1482],{"class":1349},"# 部署\n",[761,1484,1485,1489,1492,1496,1499],{"class":763,"line":624},[761,1486,1488],{"class":1487},"sScJk","docker",[761,1490,1491],{"class":1325}," run",[761,1493,1495],{"class":1494},"sj4cs"," -p",[761,1497,1498],{"class":1325}," 4000:4000",[761,1500,1501],{"class":1494}," \\\n",[761,1503,1504,1507,1510],{"class":763,"line":621},[761,1505,1506],{"class":1494},"  -e",[761,1508,1509],{"class":1325}," ANTHROPIC_API_KEY=xxx",[761,1511,1501],{"class":1494},[761,1513,1514,1516,1519],{"class":763,"line":780},[761,1515,1506],{"class":1494},[761,1517,1518],{"class":1325}," OPENAI_API_KEY=xxx",[761,1520,1501],{"class":1494},[761,1522,1523],{"class":763,"line":785},[761,1524,1525],{"class":1325},"  ghcr.io\u002Fberriai\u002Flitellm:main\n",[577,1527,1529],{"className":1289,"code":1528,"language":1291,"meta":585,"style":585},"client = openai.OpenAI(\n    base_url=\"http:\u002F\u002Flocalhost:4000\u002Fv1\",\n    api_key=\"anything\"\n)\n",[239,1530,1531,1539,1550,1559],{"__ignoreMap":585},[761,1532,1533,1535,1537],{"class":763,"line":764},[761,1534,1308],{"class":1302},[761,1536,1311],{"class":1298},[761,1538,1314],{"class":1302},[761,1540,1541,1543,1545,1548],{"class":763,"line":624},[761,1542,1320],{"class":1319},[761,1544,1311],{"class":1298},[761,1546,1547],{"class":1325},"\"http:\u002F\u002Flocalhost:4000\u002Fv1\"",[761,1549,1329],{"class":1302},[761,1551,1552,1554,1556],{"class":763,"line":621},[761,1553,1334],{"class":1319},[761,1555,1311],{"class":1298},[761,1557,1558],{"class":1325},"\"anything\"\n",[761,1560,1561],{"class":763,"line":780},[761,1562,1344],{"class":1302},[221,1564,1565,226],{},[196,1566,1355],{},[190,1568,1569,1572,1575,1578,1581,1584],{},[193,1570,1571],{},"✅ 完全自托管，数据不出公司",[193,1573,1574],{},"✅ 纯透传，0 额外费用",[193,1576,1577],{},"✅ 统一 100+ 提供商到 OpenAI 格式",[193,1579,1580],{},"⚠️ 需要自己运维（监控、备份、升级）",[193,1582,1583],{},"⚠️ Fallback 配置是 YAML，不如 Portkey 灵活",[193,1585,1586],{},"❌ 没有托管 Dashboard（要自己接 Grafana）",[221,1588,1589,1591],{},[196,1590,1380],{},"：日均 $47.6（纯模型费）+ 服务器费 $2\u002F天 ≈ $49.6",[14,1593,1594],{"id":1594},"延迟对比",[19,1596,1597,1613],{},[22,1598,1599],{},[25,1600,1601,1604,1607,1610],{},[28,1602,1603],{},"方案",[28,1605,1606],{},"P50 延迟",[28,1608,1609],{},"P95 延迟",[28,1611,1612],{},"说明",[44,1614,1615,1629,1642,1655],{},[25,1616,1617,1620,1623,1626],{},[49,1618,1619],{},"直连 OpenAI",[49,1621,1622],{},"320ms",[49,1624,1625],{},"850ms",[49,1627,1628],{},"基准",[25,1630,1631,1633,1636,1639],{},[49,1632,1148],{},[49,1634,1635],{},"380ms",[49,1637,1638],{},"1100ms",[49,1640,1641],{},"+60ms 路由开销",[25,1643,1644,1646,1649,1652],{},[49,1645,1151],{},[49,1647,1648],{},"350ms",[49,1650,1651],{},"900ms",[49,1653,1654],{},"+30ms，缓存命中更快",[25,1656,1657,1660,1663,1666],{},[49,1658,1659],{},"LiteLLM",[49,1661,1662],{},"340ms",[49,1664,1665],{},"880ms",[49,1667,1668],{},"+20ms，自建网络近",[221,1670,1671],{},"LiteLLM 延迟最低（自建内网），OpenRouter 最慢（多一跳）。",[14,1673,1674],{"id":1674},"可靠性对比",[221,1676,1677],{},"2 周内记录的故障：",[19,1679,1680,1695],{},[22,1681,1682],{},[25,1683,1684,1686,1689,1692],{},[28,1685,1603],{},[28,1687,1688],{},"故障次数",[28,1690,1691],{},"平均恢复",[28,1693,1694],{},"影响",[44,1696,1697,1710,1723],{},[25,1698,1699,1701,1704,1707],{},[49,1700,1148],{},[49,1702,1703],{},"2 次（限流）",[49,1705,1706],{},"15 分钟",[49,1708,1709],{},"请求排队",[25,1711,1712,1714,1717,1720],{},[49,1713,1151],{},[49,1715,1716],{},"0 次",[49,1718,1719],{},"—",[49,1721,1722],{},"Fallback 生效",[25,1724,1725,1727,1730,1733],{},[49,1726,1659],{},[49,1728,1729],{},"1 次（OOM）",[49,1731,1732],{},"5 分钟",[49,1734,1735],{},"重启恢复",[221,1737,1738],{},"Portkey 最稳——fallback 机制让上游故障对用户不可见。",[14,1740,575],{"id":575},[577,1742,1745],{"className":1743,"code":1744,"language":582},[580],"个人 \u002F 试水 → OpenRouter（5 分钟接入）\n生产团队 → Portkey（fallback + 缓存 + 可观测）\n企业 \u002F 合规 → 自建 LiteLLM（数据自有 + 0 路由费）\n\n成本敏感 + 有运维 → LiteLLM（省 5% 路由费）\n快速上线 → OpenRouter（最快）\n高可用 → Portkey（fallback 最强）\n",[239,1746,1744],{"__ignoreMap":585},[14,1748,588],{"id":588},[590,1750,1751,1757,1763,1769],{},[193,1752,1753,1756],{},[196,1754,1755],{},"OpenRouter 限流不分模型","——所有模型共享一个 rate limit，高峰期排队。",[193,1758,1759,1762],{},[196,1760,1761],{},"Portkey 缓存要配 TTL","——默认永久缓存，prompt 微调就命中不了。",[193,1764,1765,1768],{},[196,1766,1767],{},"LiteLLM 内存","——高并发时 OOM，调大容器内存或加 Redis 做队列。",[193,1770,1771,1774],{},[196,1772,1773],{},"三家都不支持流式 fallback","——fallback 只在非流式请求生效，流式请求主模型挂了就直接报错。",[1098,1776,1777],{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":585,"searchDepth":621,"depth":621,"links":1779},[1780,1781,1782,1787,1788,1789,1790],{"id":16,"depth":624,"text":17},{"id":188,"depth":624,"text":188},{"id":1282,"depth":624,"text":1282,"children":1783},[1784,1785,1786],{"id":1285,"depth":621,"text":1286},{"id":1384,"depth":621,"text":1385},{"id":1469,"depth":621,"text":1470},{"id":1594,"depth":624,"text":1594},{"id":1674,"depth":624,"text":1674},{"id":575,"depth":624,"text":575},{"id":588,"depth":624,"text":588},"\u002Fog\u002Freview\u002Fllm-gateway-comparison.png","三种 LLM API 统一方案对比——OpenRouter（托管聚合）、Portkey（Gateway + fallback）、自建 LiteLLM（开源自托管）。在同一个多模型应用里跑了 2 周，记录了延迟、成本、可靠性。",{},"\u002Freview\u002Fllm-gateway-comparison",[1796,1797,1798],"coding\u002Fapi\u002Fopenrouter","coding\u002Fapi\u002Fportkey","coding\u002Fapi\u002Flitellm",{"title":1133,"description":1792},"review\u002Fllm-gateway-comparison",[1802,652,1148,1151,1659],"API 网关","省事用 OpenRouter，生产级控制用 Portkey，完全自托管用 LiteLLM。成本敏感 + 有运维能力 → LiteLLM。","8md3Mw0ZXoBA5A5oxP45VovigdwkT8vpBMLy0BlrUmI",{"id":1806,"title":1807,"body":1808,"cover":2411,"description":2412,"extension":638,"meta":2413,"navigation":640,"path":2414,"published":642,"relatedTools":2415,"seo":2418,"stem":2419,"tags":2420,"updated":642,"verdict":2423,"__hash__":2424},"review\u002Freview\u002Fmcp-ecosystem-review.md","MCP 生态实测：Smithery vs Composio vs 手搓，Agent 接工具的最优解",{"type":11,"value":1809,"toc":2401},[1810,1812,1901,1905,1911,1914,1921,1924,1943,1947,1954,2123,2127,2141,2146,2150,2204,2207,2211,2228,2233,2237,2240,2319,2322,2326,2350,2355,2357,2363,2365,2398],[14,1811,17],{"id":16},[19,1813,1814,1829],{},[22,1815,1816],{},[25,1817,1818,1820,1823,1826],{},[28,1819,30],{},[28,1821,1822],{},"手搓 MCP Server",[28,1824,1825],{},"Smithery 安装",[28,1827,1828],{},"Composio 托管",[44,1830,1831,1845,1859,1873,1887],{},[25,1832,1833,1836,1839,1842],{},[49,1834,1835],{},"上手成本",[49,1837,1838],{},"高（写 TS\u002FPython）",[49,1840,1841],{},"低（npx 一行）",[49,1843,1844],{},"中（注册 + 配 Auth）",[25,1846,1847,1850,1853,1856],{},[49,1848,1849],{},"定制度",[49,1851,1852],{},"最高",[49,1854,1855],{},"低（用别人写好的）",[49,1857,1858],{},"中（250+ 预置 + 自定义）",[25,1860,1861,1864,1867,1870],{},[49,1862,1863],{},"Auth 管理",[49,1865,1866],{},"自己写",[49,1868,1869],{},"Server 自带",[49,1871,1872],{},"托管平台帮你管",[25,1874,1875,1878,1881,1884],{},[49,1876,1877],{},"生产可用",[49,1879,1880],{},"看你写得好不好",[49,1882,1883],{},"参差，需自己审",[49,1885,1886],{},"有 SLA + 日志",[25,1888,1889,1892,1895,1898],{},[49,1890,1891],{},"适合场景",[49,1893,1894],{},"特殊定制需求",[49,1896,1897],{},"快速试 \u002F 个人用",[49,1899,1900],{},"团队 \u002F 生产级",[14,1902,1904],{"id":1903},"背景mcp-协议解决了什么","背景：MCP 协议解决了什么",[221,1906,1907,1908,668],{},"MCP（Model Context Protocol）是 Anthropic 2025 年底开放的协议标准，核心解决一个问题：",[196,1909,1910],{},"AI 模型调外部工具太碎片",[221,1912,1913],{},"之前每个 Agent 框架有自己的 tool 格式——LangChain 用 Python function，AutoGPT 用 JSON schema，OpenAI 用 function calling。MCP 统一了这些：一个 MCP Server 对外暴露工具，任何支持 MCP 的客户端（Claude、Cursor、Windsurf）都能调。",[221,1915,1916,1917,1920],{},"协议好是好，但",[196,1918,1919],{},"谁来写 Server？"," 这就是 Smithery 和 Composio 要解决的问题。",[14,1922,1923],{"id":1923},"实测环境",[190,1925,1926,1932,1938],{},[193,1927,1928,1931],{},[196,1929,1930],{},"Agent 客户端","：Claude Code (CLI) + Cursor (IDE)",[193,1933,1934,1937],{},[196,1935,1936],{},"要接的工具","：GitHub（读 PR + 评论）、Slack（发消息）、PostgreSQL（查数据）",[193,1939,1940,1942],{},[196,1941,204],{},"：每种方案各用 3 天",[14,1944,1946],{"id":1945},"方案一手搓-mcp-server","方案一：手搓 MCP Server",[221,1948,1949,1950,1953],{},"用 ",[239,1951,1952],{},"@modelcontextprotocol\u002Fsdk"," 从零写一个 GitHub MCP Server：",[577,1955,1959],{"className":1956,"code":1957,"language":1958,"meta":585,"style":585},"language-typescript shiki shiki-themes github-light github-dark","import { Server } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\";\n\nconst server = new Server({\n  name: \"github-mcp\",\n  version: \"1.0.0\",\n});\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({\n  tools: [\n    {\n      name: \"get_pr\",\n      description: \"Get a GitHub PR by number\",\n      inputSchema: { type: \"object\", properties: { repo: { type: \"string\" }, pr: { type: \"number\" } } },\n    },\n  ],\n}));\n","typescript",[239,1960,1961,1977,1981,2001,2011,2021,2026,2030,2053,2058,2063,2073,2083,2106,2111,2117],{"__ignoreMap":585},[761,1962,1963,1965,1968,1971,1974],{"class":763,"line":764},[761,1964,1299],{"class":1298},[761,1966,1967],{"class":1302}," { Server } ",[761,1969,1970],{"class":1298},"from",[761,1972,1973],{"class":1325}," \"@modelcontextprotocol\u002Fsdk\u002Fserver\"",[761,1975,1976],{"class":1302},";\n",[761,1978,1979],{"class":763,"line":624},[761,1980,788],{"emptyLinePlaceholder":640},[761,1982,1983,1986,1989,1992,1995,1998],{"class":763,"line":621},[761,1984,1985],{"class":1298},"const",[761,1987,1988],{"class":1494}," server",[761,1990,1991],{"class":1298}," =",[761,1993,1994],{"class":1298}," new",[761,1996,1997],{"class":1487}," Server",[761,1999,2000],{"class":1302},"({\n",[761,2002,2003,2006,2009],{"class":763,"line":780},[761,2004,2005],{"class":1302},"  name: ",[761,2007,2008],{"class":1325},"\"github-mcp\"",[761,2010,1329],{"class":1302},[761,2012,2013,2016,2019],{"class":763,"line":785},[761,2014,2015],{"class":1302},"  version: ",[761,2017,2018],{"class":1325},"\"1.0.0\"",[761,2020,1329],{"class":1302},[761,2022,2023],{"class":763,"line":791},[761,2024,2025],{"class":1302},"});\n",[761,2027,2028],{"class":763,"line":5},[761,2029,788],{"emptyLinePlaceholder":640},[761,2031,2032,2035,2038,2041,2044,2047,2050],{"class":763,"line":843},[761,2033,2034],{"class":1302},"server.",[761,2036,2037],{"class":1487},"setRequestHandler",[761,2039,2040],{"class":1302},"(ListToolsRequestSchema, ",[761,2042,2043],{"class":1298},"async",[761,2045,2046],{"class":1302}," () ",[761,2048,2049],{"class":1298},"=>",[761,2051,2052],{"class":1302}," ({\n",[761,2054,2055],{"class":763,"line":849},[761,2056,2057],{"class":1302},"  tools: [\n",[761,2059,2060],{"class":763,"line":854},[761,2061,2062],{"class":1302},"    {\n",[761,2064,2065,2068,2071],{"class":763,"line":860},[761,2066,2067],{"class":1302},"      name: ",[761,2069,2070],{"class":1325},"\"get_pr\"",[761,2072,1329],{"class":1302},[761,2074,2075,2078,2081],{"class":763,"line":865},[761,2076,2077],{"class":1302},"      description: ",[761,2079,2080],{"class":1325},"\"Get a GitHub PR by number\"",[761,2082,1329],{"class":1302},[761,2084,2085,2088,2091,2094,2097,2100,2103],{"class":763,"line":871},[761,2086,2087],{"class":1302},"      inputSchema: { type: ",[761,2089,2090],{"class":1325},"\"object\"",[761,2092,2093],{"class":1302},", properties: { repo: { type: ",[761,2095,2096],{"class":1325},"\"string\"",[761,2098,2099],{"class":1302}," }, pr: { type: ",[761,2101,2102],{"class":1325},"\"number\"",[761,2104,2105],{"class":1302}," } } },\n",[761,2107,2108],{"class":763,"line":877},[761,2109,2110],{"class":1302},"    },\n",[761,2112,2114],{"class":763,"line":2113},15,[761,2115,2116],{"class":1302},"  ],\n",[761,2118,2120],{"class":763,"line":2119},16,[761,2121,2122],{"class":1302},"}));\n",[221,2124,2125,226],{},[196,2126,1355],{},[190,2128,2129,2132,2135,2138],{},[193,2130,2131],{},"✅ 完全可控，想加什么工具加什么",[193,2133,2134],{},"❌ GitHub OAuth 流程写了一整天",[193,2136,2137],{},"❌ Rate Limit \u002F 重试 \u002F 错误处理全得自己写",[193,2139,2140],{},"❌ 3 天才搞定 3 个工具，而且只有我自己能维护",[221,2142,2143,2145],{},[196,2144,1090],{},"：除非你有特殊定制需求（内部系统、私有协议），否则不推荐。时间成本太高。",[14,2147,2149],{"id":2148},"方案二smithery-一键安装","方案二：Smithery 一键安装",[577,2151,2153],{"className":1473,"code":2152,"language":1475,"meta":585,"style":585},"# 装 GitHub Server\nnpx @smithery\u002Fcli install @modelcontextprotocol\u002Fserver-github --client claude\n\n# 装 PostgreSQL Server\nnpx @smithery\u002Fcli install @modelcontextprotocol\u002Fserver-postgres --client claude\n",[239,2154,2155,2160,2180,2184,2189],{"__ignoreMap":585},[761,2156,2157],{"class":763,"line":764},[761,2158,2159],{"class":1349},"# 装 GitHub Server\n",[761,2161,2162,2165,2168,2171,2174,2177],{"class":763,"line":624},[761,2163,2164],{"class":1487},"npx",[761,2166,2167],{"class":1325}," @smithery\u002Fcli",[761,2169,2170],{"class":1325}," install",[761,2172,2173],{"class":1325}," @modelcontextprotocol\u002Fserver-github",[761,2175,2176],{"class":1494}," --client",[761,2178,2179],{"class":1325}," claude\n",[761,2181,2182],{"class":763,"line":621},[761,2183,788],{"emptyLinePlaceholder":640},[761,2185,2186],{"class":763,"line":780},[761,2187,2188],{"class":1349},"# 装 PostgreSQL Server\n",[761,2190,2191,2193,2195,2197,2200,2202],{"class":763,"line":785},[761,2192,2164],{"class":1487},[761,2194,2167],{"class":1325},[761,2196,2170],{"class":1325},[761,2198,2199],{"class":1325}," @modelcontextprotocol\u002Fserver-postgres",[761,2201,2176],{"class":1494},[761,2203,2179],{"class":1325},[221,2205,2206],{},"重启 Claude Desktop，自动出现 GitHub 和 PostgreSQL 工具。",[221,2208,2209,226],{},[196,2210,1355],{},[190,2212,2213,2216,2219,2222,2225],{},[193,2214,2215],{},"✅ 5 分钟搞定 2 个工具，体验极爽",[193,2217,2218],{},"✅ 社区已有几百个 Server，常见 SaaS 都有",[193,2220,2221],{},"⚠️ Slack Server 找到 3 个版本，质量参差——第一个试的版本有 bug，第二个才正常",[193,2223,2224],{},"⚠️ Auth 需要手动配（Smithery 不帮你管 token）",[193,2226,2227],{},"❌ 生产环境心里没底——Server 是社区上传的，没有 SLA",[221,2229,2230,2232],{},[196,2231,1090],{},"：个人开发 \u002F 快速试水首选。生产用需要自己审代码 + 自托管。",[14,2234,2236],{"id":2235},"方案三composio-托管","方案三：Composio 托管",[221,2238,2239],{},"注册 Composio → 连 GitHub \u002F Slack 账号（OAuth 流程 Composio 帮你跑）→ 装 MCP Server：",[577,2241,2245],{"className":2242,"code":2243,"language":2244,"meta":585,"style":585},"language-json shiki shiki-themes github-light github-dark","{\n  \"mcpServers\": {\n    \"composio\": {\n      \"command\": \"npx\",\n      \"args\": [\"@composio\u002Fmcp\", \"--api-key\", \"xxx\"]\n    }\n  }\n}\n","json",[239,2246,2247,2252,2260,2267,2280,2305,2310,2314],{"__ignoreMap":585},[761,2248,2249],{"class":763,"line":764},[761,2250,2251],{"class":1302},"{\n",[761,2253,2254,2257],{"class":763,"line":624},[761,2255,2256],{"class":1494},"  \"mcpServers\"",[761,2258,2259],{"class":1302},": {\n",[761,2261,2262,2265],{"class":763,"line":621},[761,2263,2264],{"class":1494},"    \"composio\"",[761,2266,2259],{"class":1302},[761,2268,2269,2272,2275,2278],{"class":763,"line":780},[761,2270,2271],{"class":1494},"      \"command\"",[761,2273,2274],{"class":1302},": ",[761,2276,2277],{"class":1325},"\"npx\"",[761,2279,1329],{"class":1302},[761,2281,2282,2285,2288,2291,2294,2297,2299,2302],{"class":763,"line":785},[761,2283,2284],{"class":1494},"      \"args\"",[761,2286,2287],{"class":1302},": [",[761,2289,2290],{"class":1325},"\"@composio\u002Fmcp\"",[761,2292,2293],{"class":1302},", ",[761,2295,2296],{"class":1325},"\"--api-key\"",[761,2298,2293],{"class":1302},[761,2300,2301],{"class":1325},"\"xxx\"",[761,2303,2304],{"class":1302},"]\n",[761,2306,2307],{"class":763,"line":791},[761,2308,2309],{"class":1302},"    }\n",[761,2311,2312],{"class":763,"line":5},[761,2313,1432],{"class":1302},[761,2315,2316],{"class":763,"line":843},[761,2317,2318],{"class":1302},"}\n",[221,2320,2321],{},"Claude Desktop 自动获得 250+ 工具能力。",[221,2323,2324,226],{},[196,2325,1355],{},[190,2327,2328,2331,2334,2337,2344,2347],{},[193,2329,2330],{},"✅ Auth 全托管——不用自己管 token 续期",[193,2332,2333],{},"✅ 有调用日志和 trace，生产级可观测",[193,2335,2336],{},"✅ Rate Limit 帮你管，不会打爆 API",[193,2338,2339,2340,2343],{},"⚠️ 250+ 工具全暴露给模型，有时 Claude 会调错工具（用 ",[239,2341,2342],{},"allowed_tools"," 过滤可缓解）",[193,2345,2346],{},"⚠️ 国内 SaaS 覆盖少（无飞书\u002F钉钉\u002F微信）",[193,2348,2349],{},"❌ 托管版 $29\u002Fmo 起，对个人开发者偏贵",[221,2351,2352,2354],{},[196,2353,1090],{},"：团队 \u002F 生产级 Agent 首选。个人开发者用免费版也能跑，但 Auth 自己管。",[14,2356,575],{"id":575},[577,2358,2361],{"className":2359,"code":2360,"language":582},[580],"个人试水 → Smithery（免费 + 一键装）\n生产 Agent → Composio（Auth + 日志 + SLA）\n特殊定制 → 手搓 MCP Server（最后选项）\n",[239,2362,2360],{"__ignoreMap":585},[14,2364,588],{"id":588},[590,2366,2367,2373,2383,2392],{},[193,2368,2369,2372],{},[196,2370,2371],{},"Smithery 的 Server 不是官方审核的","——装之前看 star 数和最近 commit",[193,2374,2375,2378,2379,2382],{},[196,2376,2377],{},"Composio 的 MCP 模式默认暴露全部工具","——用 ",[239,2380,2381],{},"--tools"," 参数过滤只暴露需要的",[193,2384,2385,226,2388,2391],{},[196,2386,2387],{},"Claude Code CLI 的 MCP 配置文件路径",[239,2389,2390],{},"~\u002F.claude\u002Fclaude_desktop_config.json","，不是项目级",[193,2393,2394,2397],{},[196,2395,2396],{},"Cursor 的 MCP 支持","：Settings → MCP → Add Server，支持 stdio 和 SSE 两种模式",[1098,2399,2400],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":585,"searchDepth":621,"depth":621,"links":2402},[2403,2404,2405,2406,2407,2408,2409,2410],{"id":16,"depth":624,"text":17},{"id":1903,"depth":624,"text":1904},{"id":1923,"depth":624,"text":1923},{"id":1945,"depth":624,"text":1946},{"id":2148,"depth":624,"text":2149},{"id":2235,"depth":624,"text":2236},{"id":575,"depth":624,"text":575},{"id":588,"depth":624,"text":588},"\u002Fog\u002Freview\u002Fmcp-ecosystem.png","Anthropic MCP 协议发布半年后，Agent 接外部工具有了哪些变化？我们用 Claude Code + 3 种方案（手搓 MCP Server \u002F Smithery 一键安装 \u002F Composio 托管平台）接 GitHub + Slack + Postgres，记录了真实体验和踩坑。",{},"\u002Freview\u002Fmcp-ecosystem-review",[1122,2416,2417],"agent\u002Fprotocol\u002Fcomposio","agent\u002Fprotocol\u002Fmcp-toolbox",{"title":1807,"description":2412},"review\u002Fmcp-ecosystem-review",[987,1127,652,2421,2422],"Smithery","Composio","个人开发 \u002F 试水用 Smithery，生产级 Agent 用 Composio，有特殊定制需求才手搓。MCP 生态仍在早期，Server 质量参差是最大痛点。","TPseZv1ae1GJqzOHG8e5GQBZQCQ0L5lnYzr_RpaCySg",{"id":2426,"title":2427,"body":2428,"cover":2706,"description":2707,"extension":638,"meta":2708,"navigation":640,"path":2709,"published":2710,"relatedTools":2711,"seo":2715,"stem":2716,"tags":2717,"updated":2720,"verdict":2721,"__hash__":2722},"review\u002Freview\u002Fclaude-code-deep-review.md","Claude Code 深度评测：终端 AI Coding Agent 标杆",{"type":11,"value":2429,"toc":2693},[2430,2433,2443,2447,2450,2470,2474,2477,2481,2492,2516,2520,2523,2534,2538,2548,2556,2559,2609,2615,2618,2641,2644,2661,2664,2667,2681,2690],[14,2431,2432],{"id":2432},"一句话结论",[221,2434,2435,2438,2439,2442],{},[196,2436,2437],{},"Claude Code 是目前长任务能力最强的 CLI Coding Agent","——只要预算够，几乎不会让你失望。但它",[196,2440,2441],{},"不是给所有人的","：每月几百到几千美元的 token 账单不是开玩笑。",[14,2444,2446],{"id":2445},"为什么是-cli-而不是-ide","为什么是 CLI 而不是 IDE？",[221,2448,2449],{},"Claude Code 跑在终端里，没有自己的 IDE。这件事 Anthropic 想得很清楚：",[190,2451,2452,2458,2464],{},[193,2453,2454,2457],{},[196,2455,2456],{},"不绑定编辑器","：你用 VSCode、Cursor、Vim、JetBrains 都行——Claude Code 通过 git worktree、文件读写、shell 命令直接和文件系统打交道。",[193,2459,2460,2463],{},[196,2461,2462],{},"多窗口并行","：可以同时开 3-5 个 Claude Code 终端，每个跑不同任务，互不干扰。",[193,2465,2466,2469],{},[196,2467,2468],{},"CI 友好","：因为是 CLI，可以直接被脚本调用，做\"夜间自动重构\"这类工作流。",[14,2471,2473],{"id":2472},"实测长任务的真正含义","实测：长任务的真正含义",[221,2475,2476],{},"我们让它做了几件\"在 IDE 里不敢想\"的事：",[216,2478,2480],{"id":2479},"_1-跨-50-个文件的-api-重构","1. 跨 50 个文件的 API 重构",[221,2482,2483,2484,2487,2488,2491],{},"让它把一个老项目里所有\"返回 ",[239,2485,2486],{},"{ok: true, data}","\"的接口统一改成\"返回 ",[239,2489,2490],{},"{success, payload}","\"，并同步所有调用点。",[190,2493,2494,2500,2506],{},[193,2495,2496,2499],{},[196,2497,2498],{},"Claude Code","：一次跑完，自己跑测试、自己改测试、最后输出一份变更总结。耗时约 22 分钟。",[193,2501,2502,2505],{},[196,2503,2504],{},"Cursor Composer","（对照）：跑到 20 多个文件后开始忘记原始格式，需要人工接管。",[193,2507,2508,2511,2512,2515],{},[196,2509,2510],{},"Aider","（对照）：稳，但需要手动 ",[239,2513,2514],{},"add"," 文件，跑 50 个文件得分批。",[216,2517,2519],{"id":2518},"_2-修一个诡异-bug","2. 修一个\"诡异 bug\"",[221,2521,2522],{},"复杂的 SSR hydration 错误，错误信息没指向真实原因。让它自己定位 + 修。",[190,2524,2525,2528],{},[193,2526,2527],{},"它读了 13 个文件，跑了 8 次本地 build，最终定位到一个 Pinia store 的 SSR 序列化问题。",[193,2529,2530,2531,668],{},"整个过程花了 $4.7 token（Sonnet 4.5）。值不值见仁见智，但",[196,2532,2533],{},"它真的修好了",[216,2535,2537],{"id":2536},"_3-接手一个完全陌生的项目","3. 接手一个完全陌生的项目",[221,2539,2540,2543,2544,2547],{},[239,2541,2542],{},"git clone"," 后直接 ",[239,2545,2546],{},"claude-code"," 进去，问\"这个项目是干嘛的，给我画个架构图\"。",[190,2549,2550,2553],{},[193,2551,2552],{},"它读了 README、package.json、关键 entry 文件、路由表，给出了一份非常准确的项目概览。",[193,2554,2555],{},"比让新人读两天文档还快。",[14,2557,2558],{"id":2558},"计费现实",[19,2560,2561,2574],{},[22,2562,2563],{},[25,2564,2565,2568,2571],{},[28,2566,2567],{},"用法",[28,2569,2570],{},"月费区间（USD）",[28,2572,2573],{},"备注",[44,2575,2576,2587,2598],{},[25,2577,2578,2581,2584],{},[49,2579,2580],{},"偶尔用（每天 \u003C 1 小时）",[49,2582,2583],{},"$30-80",[49,2585,2586],{},"Sonnet 为主",[25,2588,2589,2592,2595],{},[49,2590,2591],{},"重度用（每天 4 小时+）",[49,2593,2594],{},"$200-500",[49,2596,2597],{},"频繁触发 Opus",[25,2599,2600,2603,2606],{},[49,2601,2602],{},"团队\u002FCI 全自动跑",[49,2604,2605],{},"$500-2000+",[49,2607,2608],{},"需要严格预算监控",[2610,2611,2612],"blockquote",{},[221,2613,2614],{},"强烈建议接入 Anthropic 的 budget alert，否则月底容易心脏病发。",[14,2616,2617],{"id":2617},"与同类对比",[190,2619,2620,2629,2635],{},[193,2621,2622,2625,2626,668],{},[196,2623,2624],{},"vs Cursor \u002F Windsurf","：CLI 路线更灵活，但失去 Tab 补全这种 IDE 强项。日常写代码 Cursor 更顺，",[196,2627,2628],{},"重型任务 Claude Code 更强",[193,2630,2631,2634],{},[196,2632,2633],{},"vs Aider","：Aider 更精细可控（每次操作都问你），适合\"我知道要改什么但懒得敲\"。Claude Code 更\"放手让 AI 想\"。",[193,2636,2637,2640],{},[196,2638,2639],{},"vs Codex CLI","：OpenAI 的 Codex CLI 是直接竞品，目前能力略弱于 Claude Code，但 GPT-5 模型在某些代码生成场景更准。",[14,2642,2643],{"id":2643},"适合谁",[190,2645,2646,2649,2652,2655,2658],{},[193,2647,2648],{},"✅ 独立开发者 \u002F 小团队 leader",[193,2650,2651],{},"✅ 做大量重构、迁移、新项目搭建的人",[193,2653,2654],{},"✅ 喜欢\"放手让 AI 跑一会\"再回来检查的工作风格",[193,2656,2657],{},"❌ 学生 \u002F 兼职 \u002F token 预算有限的人",[193,2659,2660],{},"❌ 写小脚本、单文件项目（杀鸡用牛刀）",[14,2662,2663],{"id":2663},"我们的工作流",[221,2665,2666],{},"实战中我们这样用：",[590,2668,2669,2675],{},[193,2670,2671,2674],{},[196,2672,2673],{},"Cursor 处理日常","（85% 时间）：写新代码、单文件修改、Tab 补全。",[193,2676,2677,2680],{},[196,2678,2679],{},"Claude Code 处理重型任务","（15%）：跨文件重构、调试、新项目脚手架、CI 集成。",[2610,2682,2683],{},[221,2684,2685,2686,668],{},"完整工作流见 ",[2687,2688,2689],"a",{"href":2689},"\u002Fplaybook\u002Frefactor\u002Flarge-refactor-with-ai-agent",[221,2691,2692],{},"本文持续更新。Claude Code 每个月都在迭代，我们会跟踪关键变化。",{"title":585,"searchDepth":621,"depth":621,"links":2694},[2695,2696,2697,2702,2703,2704,2705],{"id":2432,"depth":624,"text":2432},{"id":2445,"depth":624,"text":2446},{"id":2472,"depth":624,"text":2473,"children":2698},[2699,2700,2701],{"id":2479,"depth":621,"text":2480},{"id":2518,"depth":621,"text":2519},{"id":2536,"depth":621,"text":2537},{"id":2558,"depth":624,"text":2558},{"id":2617,"depth":624,"text":2617},{"id":2643,"depth":624,"text":2643},{"id":2663,"depth":624,"text":2663},"\u002Fog\u002Freview\u002Fclaude-code.png","Anthropic 官方 CLI Agent 一个月真实使用报告：上下文长度、长任务能力、IDE 集成、定价模型、与 Cursor \u002F Aider 的对比。",{},"\u002Freview\u002Fclaude-code-deep-review","2026-05-08",[1121,2712,2713,2714],"coding\u002Fcli\u002Fcodex","coding\u002Fcli\u002Faider","coding\u002Fcli\u002Fcline",{"title":2427,"description":2707},"review\u002Fclaude-code-deep-review",[2718,1126,1127,2719],"CLI","深度评测","2026-06-10","目前可用 CLI Agent 中的天花板。长任务能力强，与 IDE 解耦灵活，缺点是计费心理压力大、Anthropic 限流偶尔出现。","RJUYF1jhLpzwj8YBVDv1YZC-10VjUjjbmRHwFxm0uQE",{"id":2724,"title":2725,"body":2726,"cover":3075,"description":3076,"extension":638,"meta":3077,"navigation":640,"path":3078,"published":3079,"relatedTools":3080,"seo":3085,"stem":3086,"tags":3087,"updated":3089,"verdict":3090,"__hash__":3091},"review\u002Freview\u002Fcursor-vs-windsurf-vs-trae.md","Cursor vs Windsurf vs Trae：2026 年 AI IDE 三国杀实测",{"type":11,"value":2727,"toc":3057},[2728,2730,2835,2837,2862,2866,2869,2871,2900,2903,2914,2918,2925,2928,2948,2951,2965,2969,2976,2979,2999,3002,3013,3016,3036,3044,3047,3050],[14,2729,17],{"id":16},[19,2731,2732,2747],{},[22,2733,2734],{},[25,2735,2736,2738,2741,2744],{},[28,2737,30],{},[28,2739,2740],{},"Cursor",[28,2742,2743],{},"Windsurf",[28,2745,2746],{},"Trae",[44,2748,2749,2762,2774,2785,2796,2810,2821],{},[25,2750,2751,2754,2757,2760],{},[49,2752,2753],{},"单文件补全\u002F编辑",[49,2755,2756],{},"★★★★★",[49,2758,2759],{},"★★★★",[49,2761,2759],{},[25,2763,2764,2767,2769,2771],{},[49,2765,2766],{},"多文件 Agent 任务",[49,2768,2759],{},[49,2770,2756],{},[49,2772,2773],{},"★★★",[25,2775,2776,2779,2781,2783],{},[49,2777,2778],{},"上下文准确度（10 万行项目）",[49,2780,2759],{},[49,2782,2759],{},[49,2784,2773],{},[25,2786,2787,2790,2792,2794],{},[49,2788,2789],{},"中文交互",[49,2791,2773],{},[49,2793,2773],{},[49,2795,2756],{},[25,2797,2798,2801,2804,2807],{},[49,2799,2800],{},"价格（重度用户\u002F月）",[49,2802,2803],{},"$20 起",[49,2805,2806],{},"$15 起",[49,2808,2809],{},"免费 \u002F 试用期长",[25,2811,2812,2815,2817,2819],{},[49,2813,2814],{},"稳定性",[49,2816,2756],{},[49,2818,2759],{},[49,2820,2759],{},[25,2822,2823,2826,2829,2832],{},[49,2824,2825],{},"推荐人群",[49,2827,2828],{},"全栈\u002F独立开发者",[49,2830,2831],{},"重 Agent 工作流",[49,2833,2834],{},"国内团队、新手",[14,2836,1923],{"id":1923},[190,2838,2839,2845,2851,2857],{},[193,2840,2841,2844],{},[196,2842,2843],{},"测试项目","：一个真实的 Vue 3 + Nuxt 3 + TypeScript 中型仓库（约 4.2 万行）",[193,2846,2847,2850],{},[196,2848,2849],{},"测试任务","：5 类共 23 个真实工单（bug 修复 \u002F 重构 \u002F 新功能 \u002F 迁移 \u002F 性能优化）",[193,2852,2853,2856],{},[196,2854,2855],{},"测试模型","：Claude Sonnet 4.5（三家都默认这个）",[193,2858,2859,2861],{},[196,2860,204],{},"：每家用满 7 天",[14,2863,2865],{"id":2864},"cursor综合最强tab-键体验依然封神","Cursor：综合最强，Tab 键体验依然封神",[221,2867,2868],{},"Cursor 1.x 进入了\"无聊但稳定\"的阶段——这是个褒义词。",[216,2870,225],{"id":225},[190,2872,2873,2879,2888,2894],{},[193,2874,2875,2878],{},[196,2876,2877],{},"Tab Tab Tab 流畅得不像话","。预测下一处编辑的能力业界第一，写代码节奏完全不打断。",[193,2880,2881,668,2884,2887],{},[196,2882,2883],{},"上下文检索准确",[239,2885,2886],{},"@codebase"," 在 4 万行项目里准确率明显高于另外两家。",[193,2889,2890,2893],{},[196,2891,2892],{},"Composer Agent 模式","靠谱，多步任务不容易跑偏。",[193,2895,2896,2899],{},[196,2897,2898],{},"生态最完善","：扩展兼容 VSCode 99% 插件，团队配置同步成熟。",[216,2901,2902],{"id":2902},"槽点",[190,2904,2905,2908,2911],{},[193,2906,2907],{},"价格涨了。$20 是入门，重度用户 Pro 套餐很容易月底再续 $20。",[193,2909,2910],{},"国内访问需要走代理，新手门槛高。",[193,2912,2913],{},"中文 prompt 生成的代码注释偶尔英文混搭。",[14,2915,2917],{"id":2916},"windsurfcascade-多步任务能力一骑绝尘","Windsurf：Cascade 多步任务能力一骑绝尘",[221,2919,2920,2921,2924],{},"Windsurf 现在最大的差异化是 ",[196,2922,2923],{},"Cascade","——它的 Agent 能持续跑 30+ 步骤而不偏离目标。",[216,2926,225],{"id":2927},"优点-1",[190,2929,2930,2936,2942],{},[193,2931,2932,2935],{},[196,2933,2934],{},"长任务能力","：实测让它\"把项目从 Pinia 1.x 迁到 2.x\"，自己读代码、改、跑测试、再改，全程基本不需要人盯。",[193,2937,2938,2941],{},[196,2939,2940],{},"本地命令执行更激进","：默认放手让 Agent 跑 shell 命令（用户可设黑白名单）。",[193,2943,2944,2947],{},[196,2945,2946],{},"价格便宜 $5","：Pro $15 vs Cursor $20。",[216,2949,2902],{"id":2950},"槽点-1",[190,2952,2953,2956,2962],{},[193,2954,2955],{},"单文件补全不如 Cursor 跟手——按 Tab 时偶尔卡顿。",[193,2957,2958,2959,668],{},"越激进越容易翻车：Agent 偶尔会自作主张 git commit 或改 .env。",[196,2960,2961],{},"强烈建议设白名单",[193,2963,2964],{},"国内连接也要代理。",[14,2966,2968],{"id":2967},"trae国内最稳免费期足够白嫖","Trae：国内最稳，免费期足够白嫖",[221,2970,2971,2972,2975],{},"字节出品，",[196,2973,2974],{},"针对国内开发者优化","，访问无需代理，中文 prompt 体验最自然。",[216,2977,225],{"id":2978},"优点-2",[190,2980,2981,2987,2993,2996],{},[193,2982,2983,2986],{},[196,2984,2985],{},"中文最丝滑","：变量名解释、注释生成、错误诊断输出都默认中文且地道。",[193,2988,2989,2992],{},[196,2990,2991],{},"免费","（截至 2026 年 6 月仍为免费试用期），重度用户也不限量。",[193,2994,2995],{},"上手最快：UI 与 VSCode 几乎一致，国内开发者打开就会用。",[193,2997,2998],{},"内置豆包大模型 + Claude 模型可切。",[216,3000,2902],{"id":3001},"槽点-2",[190,3003,3004,3007,3010],{},[193,3005,3006],{},"Agent 自主性弱于另外两家——多步任务需要更多人工纠偏。",[193,3008,3009],{},"上下文检索精度在 4 万行规模略弱（万行内无差别）。",[193,3011,3012],{},"海外模型偶尔不可用（Anthropic 等会偶发被限流）。",[14,3014,3015],{"id":3015},"选型建议",[190,3017,3018,3024,3030],{},[193,3019,3020,3023],{},[196,3021,3022],{},"独立开发者 \u002F 海外项目 \u002F 长期投入"," → Cursor。生态最稳，长期摩擦最小。",[193,3025,3026,3029],{},[196,3027,3028],{},"重型重构 \u002F 大批量代码改造 \u002F Agent 重度用户"," → Windsurf。Cascade 能让你解放双手。",[193,3031,3032,3035],{},[196,3033,3034],{},"国内团队 \u002F 中文项目 \u002F 新手 \u002F 学生"," → Trae。免费、不用代理、中文体验全网最佳。",[2610,3037,3038],{},[221,3039,3040,3043],{},[196,3041,3042],{},"三家都不是互斥的。"," 实测下来，资深开发者最常见的组合是：日常用 Cursor，重型迁移用 Windsurf，给团队新人推荐 Trae。",[14,3045,3046],{"id":3046},"我们如何测试",[221,3048,3049],{},"每家工具完成同一组 23 个工单，记录：完成度（%）、人工干预次数、生成代码 lint\u002Ftypecheck 通过率、首次响应延迟、出现幻觉次数。",[221,3051,3052,3053,3056],{},"本文持续更新。如果三家中任何一家在大版本更新后体验明显变化，会标注在头部 ",[239,3054,3055],{},"updated"," 日期并在文末加附录。",{"title":585,"searchDepth":621,"depth":621,"links":3058},[3059,3060,3061,3065,3069,3073,3074],{"id":16,"depth":624,"text":17},{"id":1923,"depth":624,"text":1923},{"id":2864,"depth":624,"text":2865,"children":3062},[3063,3064],{"id":225,"depth":621,"text":225},{"id":2902,"depth":621,"text":2902},{"id":2916,"depth":624,"text":2917,"children":3066},[3067,3068],{"id":2927,"depth":621,"text":225},{"id":2950,"depth":621,"text":2902},{"id":2967,"depth":624,"text":2968,"children":3070},[3071,3072],{"id":2978,"depth":621,"text":225},{"id":3001,"depth":621,"text":2902},{"id":3015,"depth":624,"text":3015},{"id":3046,"depth":624,"text":3046},"\u002Fog\u002Freview\u002Fide-three-kingdoms.png","Cursor 1.x、Windsurf、字节 Trae 三家 AI IDE 一周深度实测：上下文准确度、Agent 自主能力、价格、中文支持、踩坑实录与选型建议。",{},"\u002Freview\u002Fcursor-vs-windsurf-vs-trae","2026-04-12",[3081,3082,3083,3084],"coding\u002Fide\u002Fcursor","coding\u002Fide\u002Fwindsurf","coding\u002Fide\u002Ftrae","coding\u002Fide\u002Fqoder",{"title":2725,"description":3076},"review\u002Fcursor-vs-windsurf-vs-trae",[3088,652,2740,2743,2746],"IDE","2026-06-15","Cursor 综合最稳，Windsurf 在 Agent 多步任务上最猛，Trae 国内首选（中文 + 免费白嫖期长）。三家都基于 VSCode 分叉，迁移成本极低。","3V4DCxP4oeu_s_LW25t8ultbjILOgbr1QOf-YqK1HXE",{"id":3093,"title":3094,"body":3095,"cover":3459,"description":3460,"extension":638,"meta":3461,"navigation":640,"path":3462,"published":3463,"relatedTools":3464,"seo":3468,"stem":3469,"tags":3470,"updated":3473,"verdict":3474,"__hash__":3475},"review\u002Freview\u002Fcoze-vs-dify.md","Coze vs Dify：国内 Agent 平台双雄实测",{"type":11,"value":3096,"toc":3440},[3097,3099,3192,3195,3216,3219,3223,3226,3229,3245,3248,3264,3268,3271,3274,3286,3289,3306,3308,3327,3332,3334,3360,3362,3392,3394,3397,3412,3415,3437],[14,3098,17],{"id":16},[19,3100,3101,3113],{},[22,3102,3103],{},[25,3104,3105,3107,3110],{},[28,3106,30],{},[28,3108,3109],{},"Coze",[28,3111,3112],{},"Dify",[44,3114,3115,3124,3135,3144,3153,3162,3171,3182],{},[25,3116,3117,3120,3122],{},[49,3118,3119],{},"上手速度",[49,3121,2756],{},[49,3123,2759],{},[25,3125,3126,3129,3132],{},[49,3127,3128],{},"模型自由度",[49,3130,3131],{},"★★（绑定豆包\u002F字节生态）",[49,3133,3134],{},"★★★★★（任意 OpenAI 兼容 API）",[25,3136,3137,3140,3142],{},[49,3138,3139],{},"工作流编排",[49,3141,2759],{},[49,3143,2756],{},[25,3145,3146,3149,3151],{},[49,3147,3148],{},"知识库（RAG）",[49,3150,2759],{},[49,3152,2756],{},[25,3154,3155,3158,3160],{},[49,3156,3157],{},"私有化部署",[49,3159,135],{},[49,3161,178],{},[25,3163,3164,3167,3169],{},[49,3165,3166],{},"开源",[49,3168,135],{},[49,3170,178],{},[25,3172,3173,3176,3179],{},[49,3174,3175],{},"计费",[49,3177,3178],{},"国内免费 \u002F 海外付费",[49,3180,3181],{},"SaaS 免费版 + 自部署免费",[25,3183,3184,3186,3189],{},[49,3185,1891],{},[49,3187,3188],{},"个人 Bot \u002F 小程序 \u002F 飞书机器人",[49,3190,3191],{},"企业 AI 应用 \u002F 严肃业务",[14,3193,3194],{"id":3194},"五分钟搞清楚定位",[190,3196,3197,3207],{},[193,3198,3199,3202,3203,3206],{},[196,3200,3201],{},"Coze（扣子）"," 是字节出品的 Agent 搭建平台，思路是\"",[196,3204,3205],{},"让你不写代码也能做 Bot","\"，国内版接抖音\u002F飞书生态，海外版接 Discord\u002FTelegram。",[193,3208,3209,3211,3212,3215],{},[196,3210,3112],{}," 是开源 LLMOps 平台（Apache 2.0），定位是\"",[196,3213,3214],{},"让企业能把 LLM 落地成生产级应用","\"，可自托管。",[221,3217,3218],{},"两者都做：Prompt 编排、工作流（Workflow）、知识库（RAG）、API 输出。区别在哲学。",[14,3220,3222],{"id":3221},"实测搭一个客服-bot","实测：搭一个\"客服 Bot\"",[221,3224,3225],{},"任务：用一份 PDF 知识库 + 1 个查订单 API，搭一个能回答客户问题的 Bot。",[216,3227,3109],{"id":3228},"coze",[190,3230,3231,3237,3240],{},[193,3232,3233,3236],{},[196,3234,3235],{},"15 分钟搞定","。UI 引导极强，知识库上传、API 卡片配置、对话流编排都是拖拽。",[193,3238,3239],{},"发布到飞书机器人 = 一键。",[193,3241,3242,3244],{},[196,3243,250],{},"：模型只能选豆包\u002FDoubao（海外版可选 GPT），不能用 Claude；某些深度配置（如自定义切片策略）藏得很深。",[216,3246,3112],{"id":3247},"dify",[190,3249,3250,3256,3261],{},[193,3251,3252,3255],{},[196,3253,3254],{},"40 分钟搞定","（首次熟悉）。流程是：建 App → 选 Chatflow 编排 → 配 LLM Node + 知识库 Node + HTTP Node → 调试 → 发布 API。",[193,3257,3258,3260],{},[196,3259,225],{},"：每一步都能看到底层在干什么，模型可任意切换（OpenAI \u002F Claude \u002F 国产 \u002F 本地 vLLM）。",[193,3262,3263],{},"发布后给一个 OpenAI 兼容 API endpoint，前端怎么对接随你。",[14,3265,3267],{"id":3266},"实测复杂工作流","实测：复杂工作流",[221,3269,3270],{},"任务：用户输入需求 → 拆解子任务 → 并行调用 3 个工具 → 汇总 → 输出报告。",[216,3272,3109],{"id":3273},"coze-1",[190,3275,3276,3283],{},[193,3277,3278,3279,3282],{},"工作流编排做得不错，节点丰富，但",[196,3280,3281],{},"条件分支和循环","没有 Dify 灵活。",[193,3284,3285],{},"调试主要看日志，单步调试体验一般。",[216,3287,3112],{"id":3288},"dify-1",[190,3290,3291,3297,3300],{},[193,3292,3293,3296],{},[196,3294,3295],{},"Workflow 模式完整","：if\u002Felse、迭代器、变量赋值、代码节点（Python）。",[193,3298,3299],{},"单步调试 + 变量追踪 + 历史回放都有。",[193,3301,3302,3303,668],{},"复杂场景下心智负担更低，因为",[196,3304,3305],{},"所见即所得",[14,3307,3157],{"id":3157},[190,3309,3310,3318],{},[193,3311,3312,3314,3315,668],{},[196,3313,3109],{},"：不支持。国内版数据在字节云，",[196,3316,3317],{},"金融\u002F医疗等强合规行业不能用",[193,3319,3320,3322,3323,3326],{},[196,3321,3112],{},"：支持。一条 ",[239,3324,3325],{},"docker compose up -d"," 就能起完整栈，包括 Web、API、Worker、PostgreSQL、Redis、Qdrant。",[2610,3328,3329],{},[221,3330,3331],{},"我们生产环境跑 Dify 的客户已经超过两位数了，自部署稳定性 OK。",[14,3333,2558],{"id":2558},[190,3335,3336,3342,3348,3354],{},[193,3337,3338,3341],{},[196,3339,3340],{},"Coze 国内版","：免费（字节战略性投入），但流量大了之后限流。",[193,3343,3344,3347],{},[196,3345,3346],{},"Coze 海外版","：免费试用 + 按量付费。",[193,3349,3350,3353],{},[196,3351,3352],{},"Dify SaaS","：有免费额度，超出按量付费。",[193,3355,3356,3359],{},[196,3357,3358],{},"Dify 自部署","：完全免费，只需自己付 LLM API 的钱。",[14,3361,3015],{"id":3015},[190,3363,3364,3373,3381],{},[193,3365,3366,3369,3370,3372],{},[196,3367,3368],{},"个人 \u002F 小团队 \u002F 飞书生态 \u002F Bot 玩具"," → ",[196,3371,3109],{},"。免费、快、生态好。",[193,3374,3375,3369,3378,3380],{},[196,3376,3377],{},"B 端 SaaS \u002F 严肃业务 \u002F 数据合规要求",[196,3379,3112],{},"。自部署 + 模型自由 = 长期可控。",[193,3382,3383,3386,3387,3391],{},[196,3384,3385],{},"想要更轻量更专注 RAG"," → 看 ",[2687,3388,3390],{"href":3389},"\u002Fagent\u002Fplatform\u002Ffastgpt","FastGPT","，它在文档问答这块比这两位都更专注。",[14,3393,588],{"id":588},[216,3395,3109],{"id":3396},"coze-2",[190,3398,3399,3405],{},[193,3400,3401,3404],{},[196,3402,3403],{},"海外版 vs 国内版的工作流不互通","——别在国内做完想着搬海外。",[193,3406,3407,3408,3411],{},"知识库切片策略改动后",[196,3409,3410],{},"老数据不会自动重切","，需要重新上传。",[216,3413,3112],{"id":3414},"dify-2",[190,3416,3417,3423,3430],{},[193,3418,3419,3422],{},[196,3420,3421],{},"0.x → 1.x 升级有破坏性变更","，跨版本要看迁移指南。",[193,3424,3425,3426,3429],{},"自部署默认 SQLite，",[196,3427,3428],{},"生产必须切 PostgreSQL","，否则并发 > 50 会崩。",[193,3431,3432,3433,3436],{},"Vector store 默认 Weaviate，",[196,3434,3435],{},"国内访问镜像源问题多","，建议切 Qdrant。",[221,3438,3439],{},"完整 Dify 自部署工作流（playbook 待上线）。",{"title":585,"searchDepth":621,"depth":621,"links":3441},[3442,3443,3444,3448,3452,3453,3454,3455],{"id":16,"depth":624,"text":17},{"id":3194,"depth":624,"text":3194},{"id":3221,"depth":624,"text":3222,"children":3445},[3446,3447],{"id":3228,"depth":621,"text":3109},{"id":3247,"depth":621,"text":3112},{"id":3266,"depth":624,"text":3267,"children":3449},[3450,3451],{"id":3273,"depth":621,"text":3109},{"id":3288,"depth":621,"text":3112},{"id":3157,"depth":624,"text":3157},{"id":2558,"depth":624,"text":2558},{"id":3015,"depth":624,"text":3015},{"id":588,"depth":624,"text":588,"children":3456},[3457,3458],{"id":3396,"depth":621,"text":3109},{"id":3414,"depth":621,"text":3112},"\u002Fog\u002Freview\u002Fcoze-vs-dify.png","字节 Coze 与开源 Dify 横向对比：搭建效率、可定制性、私有化部署、商业模式、踩坑记录与选型建议。",{},"\u002Freview\u002Fcoze-vs-dify","2026-03-22",[3465,3466,3467],"agent\u002Fplatform\u002Fcoze","agent\u002Fplatform\u002Fdify","agent\u002Fplatform\u002Ffastgpt",{"title":3094,"description":3460},"review\u002Fcoze-vs-dify",[3471,652,3109,3112,3472],"Agent 平台","私有化","2026-06-05","Coze 上手最快、生态最热但绑定字节；Dify 开源可自托管、模型自由切换。**B 端深度需求选 Dify，C 端轻量场景选 Coze**。","ZK9O_Oz1nVRg7lDNIOX1CIWTUQBrlIbGhnTBFit_c58",{"tools":4,"reviews":5,"playbooks":854,"news":843},1782316491293]