编程 ECC 深度实战:当 AI 编程助手遇上性能工程——从 Token 优化到多语言统一编排的完全指南(2026)

2026-06-10 05:46:21 +0800 CST views 5

ECC 深度实战:当 AI 编程助手遇上性能工程——从 Token 优化到多语言统一编排的完全指南(2026)

作者:程序员茄子
日期:2026-06-10
字数:约 12000 字
适用读者:使用 AI 编程助手的开发者、AI Agent 框架开发者、对 Token 成本敏感的个人/团队


摘要

2026 年,AI 编程助手已经从"能写代码"进化到"能写好代码、快写代码、便宜地写代码"。ECC(Everything Claude Code) 是这一趋势下最具代表性的开源项目——它不是一个独立的 AI 工具,而是建立在 Claude Code 之上的超级 Harness(执行引擎),通过 249 个技能包、63 个代理角色、统一的多语言 SDK,以及一套系统性的 Token 优化体系,将 AI 辅助编程的效率和成本控制提升到生产级水准。

本文将从架构原理、核心模块、Token 经济学、多语言 SDK 设计、技能包开发、CI/CD 集成、性能调优七个维度,结合大量代码示例,完整拆解 ECC 的设计哲学与工程实践。


目录

  1. 背景介绍:AI 编程助手的「性能墙」
  2. ECC 架构全景:Harness 设计范式
  3. 核心概念一:Agent 角色体系(63 个代理)
  4. 核心概念二:技能包引擎(249 个技能)
  5. Token 经济学:ECC 的成本控制系统
  6. 多语言 SDK 统一编排架构
  7. 实战一:从零搭建 ECC 开发环境
  8. 实战二:编写一个自定义 Skill
  9. 实战三:CI/CD 中集成 ECC 质量门
  10. 性能优化:让 AI 编程快 3 倍的 7 个技巧
  11. 与其他 AI 编程框架的对比
  12. 总结与展望

1. 背景介绍:AI 编程助手的「性能墙」

1.1 问题的本质

2025-2026 年,几乎所有使用 AI 编程助手的开发者都遇到了同一个问题:

「助手越聪明,Token 消耗越疯狂,响应越慢,成本越高」

以 Claude Code(Anthropic 官方 CLI)为例,一次中等复杂度的多文件重构任务,上下文可能膨胀到 50K-100K Token,直接后果是:

问题具体表现成本影响
上下文膨胀每次请求都携带全部对话历史Token 费用 ×3~5
重复计算相同代码被多次重新分析延迟 +200%
无缓存策略系统提示词每次全量发送固定成本无法压缩
单语言局限只支持 Python/JS,多语言项目需多次会话人力成本叠加
技能碎片化每个功能单独 Prompt,无法组合效果 1+1 < 1

1.2 ECC 的解决思路

ECC(Everything Claude Code)的核心设计哲学可以用一句话概括:

「把 AI 编程助手当成编译器来优化——上下文是 IR,Token 是寄存器,技能包是标准库」

项目作者是 affaan-m,2026 年初开源后迅速获得 20 万+ GitHub Stars,每日新增约 1500 Star,成为 GitHub AI 工具类增速第一的项目。

ECC 不直接调用 LLM API,而是作为 Harness(执行引擎) 位于 Claude Code / OpenClaw / Aider 等工具的上层,负责:

用户意图 → ECC Harness(路由/优化/编排)→ 底层 AI 工具 → LLM API

2. ECC 架构全景:Harness 设计范式

2.1 三层架构

┌─────────────────────────────────────────────────────────┐
│                    ECC Harness Layer                    │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐            │
│  │ Agent    │  │ Skill    │  │ Token    │            │
│  │ Router   │  │ Engine   │  │ Optimizer│            │
│  └──────────┘  └──────────┘  └──────────┘            │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐            │
│  │ Context  │  │ Multi-   │  │ Legacy   │            │
│  │ Compres- │  │ Lang SDK │  │ Compat   │            │
│  │ sor      │  │ Layer    │  │ Layer    │            │
│  └──────────┘  └──────────┘  └──────────┘            │
├─────────────────────────────────────────────────────────┤
│              AI Tool Abstraction Layer                  │
│     Claude Code │ OpenClaw │ Aider │ Cursor │ ...      │
├─────────────────────────────────────────────────────────┤
│                   LLM Provider Layer                    │
│     Anthropic API │ OpenRouter │ Ollama │ vLLM │ ...  │
└─────────────────────────────────────────────────────────┘

2.2 关键目录结构

everything-claude-code/
├── agents/              # 63 个 Agent 角色定义(YAML+MD)
├── skills/              # 249 个技能包(每个独立目录)
│   ├── code-review/
│   ├── refactor/
│   ├── test-generator/
│   └── ...
├── sdk/                 # 多语言 SDK
│   ├── python/
│   ├── typescript/
│   ├── rust/
│   └── go/
├── harness/             # 核心执行引擎
│   ├── router.py        # Agent 路由逻辑
│   ├── tokenizer.py     # Token 计数与优化
│   └── compressor.py    # 上下文压缩
├── legacy/              # 79 个遗留命令兼容层
└── docs/

3. 核心概念一:Agent 角色体系(63 个代理)

ECC 预定义了 63 个专业 Agent 角色,每个角色有独立的 System Prompt、工具权限、输出格式约定。

3.1 Agent 路由机制

# harness/router.py(简化版核心逻辑)

from enum import Enum
from dataclasses import dataclass
from typing import Optional

class AgentRole(Enum):
    # 代码质量类
    CODE_REVIEWER = "code-reviewer"
    REFACTORER = "refactorer"
    TESTER = "test-generator"
    SECURITY_AUDITOR = "security-auditor"
    
    # 架构类
    ARCHITECT = "architect"
    DB_DESIGNER = "db-designer"
    API_DESIGNER = "api-designer"
    
    #  DevOps 类
    DEVOPS_ENGINEER = "devops"
    SRE = "sre"
    CI_CD_SPECIALIST = "ci-cd"
    
    # 语言专家类(按技术栈细分)
    PYTHON_EXPERT = "python-expert"
    RUST_EXPERT = "rust-expert"
    GOLANG_EXPERT = "golang-expert"
    FRONTEND_EXPERT = "frontend-expert"
    # ... 共 63 个

@dataclass
class RouteDecision:
    primary_agent: AgentRole
    secondary_agents: list[AgentRole]
    confidence: float
    reason: str

class AgentRouter:
    """意图 → Agent 路由引擎"""
    
    def __init__(self, embedding_model: str = "text-embedding-3-small"):
        self.embedding_model = embedding_model
        # 每个 Agent 的角色描述嵌入向量,用于语义匹配
        self.agent_embeddings = self._precompute_embeddings()
    
    def route(self, user_intent: str, context: dict) -> RouteDecision:
        """
        核心路由逻辑:
        1. 对 user_intent 做嵌入
        2. 与所有 Agent 的描述嵌入计算余弦相似度
        3. 返回 Top-K 匹配结果
        4. 结合上下文(文件类型、项目语言)做二次过滤
        """
        intent_embedding = self._embed(user_intent)
        
        scores = {}
        for agent, emb in self.agent_embeddings.items():
            scores[agent] = self._cosine_similarity(intent_embedding, emb)
        
        # 上下文加权:如果用户打开了 .py 文件,提升 PYTHON_EXPERT 权重
        if context.get("active_file", "").endswith(".py"):
            scores[AgentRole.PYTHON_EXPERT] *= 1.5
        
        # 取 Top-3
        sorted_agents = sorted(scores.items(), key=lambda x: x[1], reverse=True)
        primary = sorted_agents[0][0]
        secondary = [a for a, _ in sorted_agents[1:3]]
        
        return RouteDecision(
            primary_agent=primary,
            secondary_agents=secondary,
            confidence=sorted_agents[0][1],
            reason=f"Semantic match: {primary.value} (score={sorted_agents[0][1]:.3f})"
        )

3.2 多 Agent 协作模式

ECC 支持 链式(Chain)并行(Parallel)专家审议(Review) 三种协作模式:

# 示例:代码重构任务的多 Agent 协作

task = "重构 user_service.py,提升可读性,添加类型注解,补充单元测试"

# ECC 内部执行流程:
# 1. Router 识别主 Agent: REFACTORER
# 2. 自动添加协同 Agent: PYTHON_EXPERT(类型注解)+ TESTER(测试)
# 3. 执行模式: Review(先重构 → 再审查 → 最后测试)

execution_plan = {
    "mode": "review",
    "steps": [
        {"agent": "refactorer", "task": "重构 user_service.py"},
        {"agent": "python-expert", "task": "添加 Pydantic 类型注解"},
        {"agent": "code-reviewer", "task": "审查重构结果"},
        {"agent": "test-generator", "task": "生成 pytest 测试用例"},
    ]
}

4. 核心概念二:技能包引擎(249 个技能)

4.1 技能包的标准结构

每个 Skill 是一个独立目录,包含元数据声明、执行脚本、测试用例:

# skills/code-review/skill.yaml

name: "code-review"
version: "2.4.0"
description: "深度代码审查:安全漏洞 + 性能问题 + 规范违反"
authors: ["affaan-m", "community"]
tags: ["quality", "security", "review"]

# 触发条件(自然语言模式匹配)
triggers:
  - pattern: "审查|review|检查代码"
    language: "any"
  - pattern: "security audit|安全检查"
    language: "any"

# Token 预算(控制该技能的最大上下文消耗)
token_budget:
  input: 15000    # 输入最大 Token 数
  output: 5000     # 输出最大 Token 数

# 依赖的其他技能
depends_on:
  - "syntax-check"
  - "static-analysis"

# 输出格式
output_schema:
  type: "json"
  fields:
    - name: "issues"
      type: "array"
      items:
        severity: "enum[critical, high, medium, low]"
        file: "string"
        line: "integer"
        message: "string"
        suggestion: "string"

4.2 技能包的 Python 实现(简化)

# skills/code-review/execute.py

import ast
import json
import subprocess
from pathlib import Path
from typing import Optional

class CodeReviewSkill:
    """
    ECC 代码审查技能包
    
    设计要点:
    1. 先用静态分析工具(不消耗 Token)做初筛
    2. 只对「静态分析无法判断」的问题调用 LLM
    3. 结果缓存:相同代码片段不重复分析
    """
    
    def __init__(self, workspace: Path, llm_client):
        self.workspace = workspace
        self.llm = llm_client
        self._cache = {}  # 简单的内存缓存
    
    def execute(self, target_files: list[str], depth: str = "deep") -> dict:
        """
        执行代码审查
        
        Args:
            target_files: 需要审查的文件列表
            depth: "quick" | "deep" | "security-focus"
        """
        results = {"issues": [], "stats": {}}
        
        for file_path in target_files:
            file_content = Path(file_path).read_text()
            
            # Step 1: 静态分析(零 Token 消耗)
            static_issues = self._run_static_analysis(file_path)
            results["issues"].extend(static_issues)
            
            # Step 2: AST 分析(零 Token 消耗)
            ast_issues = self._analyze_ast(file_content, file_path)
            results["issues"].extend(ast_issues)
            
            # Step 3: 只用 LLM 分析「语义级」问题(高 Token 价值)
            if depth == "deep":
                semantic_issues = self._llm_semantic_analysis(
                    file_content, file_path
                )
                results["issues"].extend(semantic_issues)
        
        # 去重 + 按严重程度排序
        results["issues"] = self._deduplicate(results["issues"])
        results["issues"].sort(
            key=lambda x: {"critical": 0, "high": 1, "medium": 2, "low": 3}[x["severity"]]
        )
        
        return results
    
    def _run_static_analysis(self, file_path: str) -> list[dict]:
        """运行 ruff/flake8/eslint 等工具,零 Token 消耗"""
        issues = []
        
        if file_path.endswith(".py"):
            # 运行 ruff(比 flake8 快 10-100 倍)
            result = subprocess.run(
                ["ruff", "check", file_path, "--output-format=json"],
                capture_output=True, text=True
            )
            if result.stdout:
                for item in json.loads(result.stdout):
                    issues.append({
                        "severity": self._map_severity(item["code"]),
                        "file": file_path,
                        "line": item["location"]["row"],
                        "message": item["message"],
                        "suggestion": "",  # 静态分析不提供修复建议
                        "source": "ruff"
                    })
        
        return issues
    
    def _analyze_ast(self, content: str, file_path: str) -> list[dict]:
        """Python AST 分析:找死代码、未使用变量、复杂度过高函数"""
        issues = []
        
        if not file_path.endswith(".py"):
            return issues
        
        try:
            tree = ast.parse(content)
        except SyntaxError:
            return [{"severity": "critical", "file": file_path, 
                     "line": 0, "message": "语法错误", "source": "ast"}]
        
        # 检查函数复杂度(McCabe)
        for node in ast.walk(tree):
            if isinstance(node, ast.FunctionDef):
                complexity = self._compute_complexity(node)
                if complexity > 15:
                    issues.append({
                        "severity": "medium",
                        "file": file_path,
                        "line": node.lineno,
                        "message": f"函数 `{node.name}` 圈复杂度 = {complexity},建议拆分",
                        "suggestion": "将复杂分支拆分为独立函数",
                        "source": "ast-complexity"
                    })
        
        return issues
    
    def _llm_semantic_analysis(self, content: str, file_path: str) -> list[dict]:
        """
        语义分析:只发给 LLM 做「静态分析做不了」的判断
        
        关键优化:只发送函数的「签名 + docstring + 前 10 行」,
        而不是整个文件,节省 60-80% 的 Token
        """
        cache_key = hash(content)
        if cache_key in self._cache:
            return self._cache[cache_key]
        
        # 提取「值得 LLM 分析」的代码块
        interesting_blocks = self._extract_interesting_blocks(content)
        
        # 构建精简 Prompt(这是 ECC 的核心优化之一)
        prompt = self._build_compact_review_prompt(interesting_blocks, file_path)
        
        # 调用 LLM
        response = self.llm.complete(
            prompt=prompt,
            max_tokens=2000,
            temperature=0.1  # 代码审查要确定性
        )
        
        issues = self._parse_llm_response(response)
        self._cache[cache_key] = issues
        return issues
    
    def _build_compact_review_prompt(self, blocks: list[str], file_path: str) -> str:
        """
        精简 Prompt 构建:
        
        传统做法(反例):
        "请审查以下代码:\n```{content}```"
        → 消耗 Token = 完整文件大小,通常 3000-8000 Token
        
        ECC 做法(正例):
        "审查重点:以下代码块存在潜在风险,请重点检查:
         [块1] 函数签名 + 前 10 行
         [块2] 错误处理部分
         [块3] SQL 拼接位置"
        → 消耗 Token = 约 800-1500 Token,节省 70%
        """
        return f"""你是一个资深代码审查专家。请审查以下代码块,重点关注:
1. 安全漏洞(SQL 注入、XSS、不安全的反序列化)
2. 并发问题(竞态条件、死锁)
3. 资源管理(内存泄漏、未关闭的连接)

文件:{file_path}

{chr(10).join(f"【代码块 {i+1}】{block}" for i, block in enumerate(blocks))}

以 JSON 格式输出,每个问题包含:severity、line、message、suggestion。
"""

5. Token 经济学:ECC 的成本控制系统

5.1 Token 消耗的「三层漏斗」

ECC 将 Token 消耗分为三个层次,逐层优化:

Layer 1: 上下文压缩(Compressor)
  ↓ 压缩比可达 5:1 ~ 10:1
Layer 2: 智能缓存(Cache)
  ↓ 命中率通常 40%-70%
Layer 3: 技能级预算控制(Budget Controller)
  ↓ 防止单个技能失控消耗

5.2 上下文压缩算法

# harness/compressor.py

import tiktoken
from dataclasses import dataclass
from typing import Optional

@dataclass
class CompressionResult:
    original_tokens: int
    compressed_tokens: int
    ratio: float
    compressed_text: str

class ContextCompressor:
    """
    上下文压缩引擎
    
    策略(按优先级):
    1. 系统提示词缓存:Claude 支持 Cache Control,对固定内容只计费一次
    2. 对话历史摘要:将超过窗口的旧对话压缩为摘要
    3. 代码差异优先:只发送 diff,不发送完整文件
    4. 语义去重:相似的用户指令只保留一个
    """
    
    def __init__(self, model: str = "claude-sonnet-4-20250514"):
        self.model = model
        self.encoder = tiktoken.encoding_for_model("gpt-4")  # 近似估算
    
    def compress(self, full_context: str, strategy: str = "auto") -> CompressionResult:
        original_tokens = len(self.encoder.encode(full_context))
        
        if strategy == "diff_only":
            # 策略:只保留 diff(适用于代码审查/重构场景)
            compressed = self._extract_diff_only(full_context)
        elif strategy == "summary":
            # 策略:旧对话摘要化
            compressed = self._summarize_old_turns(full_context)
        elif strategy == "auto":
            # 自动选择:根据上下文类型智能组合
            compressed = self._auto_compress(full_context)
        else:
            compressed = full_context
        
        compressed_tokens = len(self.encoder.encode(compressed))
        
        return CompressionResult(
            original_tokens=original_tokens,
            compressed_tokens=compressed_tokens,
            ratio=original_tokens / max(compressed_tokens, 1),
            compressed_text=compressed
        )
    
    def _extract_diff_only(self, context: str) -> str:
        """
        从上下文中提取代码 diff
        
        示例转换:
        输入(8000 Token):
        「这是 user_service.py 的完整内容:
        [800 行代码]
        请帮我重构这个函数」
        
        输出(1200 Token):
        「user_service.py 的改动:
        + 新增函数 validate_email()
        - 删除函数 old_validate()
        请帮我审查这些改动」
        """
        # 实际实现会使用 git diff 解析 + 变更块提取
        # 这里展示核心思路
        return self._parse_git_diff(context)
    
    def _auto_compress(self, context: str) -> str:
        """
        自动压缩策略:
        
        1. 如果上下文包含完整文件 → 替换为 diff
        2. 如果对话超过 20 轮 → 前 10 轮压缩为摘要
        3. 如果系统提示词超过 2000 Token → 启用 Cache Control 标记
        4. 如果多个文件内容重复 → 去重只保留一个
        """
        # 检测是否包含完整文件
        if self._contains_full_file(context):
            context = self._replace_files_with_diffs(context)
        
        # 对话历史压缩
        turns = self._parse_conversation_turns(context)
        if len(turns) > 20:
            summary = self._summarize_turns(turns[:10])
            context = summary + "\n\n" + self._format_turns(turns[10:])
        
        return context

5.3 成本追踪与预算告警

# harness/token_tracker.py

from dataclasses import dataclass, field
from datetime import datetime
import json

@dataclass
class TokenUsage:
    input_tokens: int
    output_tokens: int
    cache_creation_tokens: int = 0
    cache_read_tokens: int = 0
    cost_usd: float = 0.0
    
    @property
    def total_tokens(self) -> int:
        return self.input_tokens + self.output_tokens

@dataclass
class BudgetPolicy:
    daily_limit_usd: float = 50.0
    per_request_limit_tokens: int = 50000
    warn_threshold_ratio: float = 0.8  # 达到 80% 预算时警告

class TokenTracker:
    """
    Token 使用追踪器
    
    功能:
    - 实时追踪每次 API 调用的 Token 消耗
    - 预算控制:超过限制自动拒绝或降级
    - 成本分析:按 Agent / Skill / 用户维度统计
    """
    
    def __init__(self, policy: BudgetPolicy):
        self.policy = policy
        self._session_usage: list[TokenUsage] = []
        self._daily_usage: dict[str, TokenUsage] = {}  # date -> usage
    
    def track(self, usage: TokenUsage, metadata: dict = None):
        """记录一次 API 调用的 Token 消耗"""
        self._session_usage.append(usage)
        
        today = datetime.now().strftime("%Y-%m-%d")
        if today not in self._daily_usage:
            self._daily_usage[today] = TokenUsage(0, 0)
        
        day_usage = self._daily_usage[today]
        day_usage.input_tokens += usage.input_tokens
        day_usage.output_tokens += usage.output_tokens
        day_usage.cost_usd += usage.cost_usd
        
        # 预算检查
        if day_usage.cost_usd > self.policy.daily_limit_usd * self.policy.warn_threshold_ratio:
            print(f"⚠️  Token 预算警告:今日已消耗 ${day_usage.cost_usd:.2f},"
                  f"预算 ${self.policy.daily_limit_usd:.2f}")
        
        if day_usage.cost_usd > self.policy.daily_limit_usd:
            raise BudgetExceededError(
                f"今日 Token 预算 ${self.policy.daily_limit_usd} 已用尽,"
                f"当前消耗 ${day_usage.cost_usd:.2f}"
            )
    
    def get_session_summary(self) -> dict:
        """获取当前会话的 Token 使用摘要"""
        total_input = sum(u.input_tokens for u in self._session_usage)
        total_output = sum(u.output_tokens for u in self._session_usage)
        total_cost = sum(u.cost_usd for u in self._session_usage)
        
        return {
            "total_input_tokens": total_input,
            "total_output_tokens": total_output,
            "total_tokens": total_input + total_output,
            "total_cost_usd": round(total_cost, 4),
            "request_count": len(self._session_usage),
            "avg_tokens_per_request": (total_input + total_output) // max(len(self._session_usage), 1),
        }

6. 多语言 SDK 统一编排架构

ECC 最工程化的设计之一是其 多语言 SDK 统一编排层,支持 Python、TypeScript、Rust、Go 四种语言调用同一套技能包。

6.1 SDK 架构设计

┌──────────────────────────────────────────────┐
│           User Code (任何语言)               │
├──────────────────────────────────────────────┤
│         ECC SDK (Python/TS/Rust/Go)         │
│  - 统一的 Skill 调用接口                    │
│  - 本地 Token 预算控制                      │
│  - 结果类型定义                             │
├──────────────────────────────────────────────┤
│         Harness HTTP API (本地)              │
│  POST /api/v1/run-skill                     │
│  POST /api/v1/route-agent                   │
│  GET  /api/v1/status                        │
├──────────────────────────────────────────────┤
│         ECC Harness Core (Python)            │
└──────────────────────────────────────────────┘

6.2 TypeScript SDK 示例

// sdk/typescript/src/index.ts

import { EventEmitter } from "events";
import axios, { AxiosInstance } from "axios";

// ─── 类型定义 ───

export interface SkillResult {
  success: boolean;
  data: any;
  tokens_used: number;
  execution_time_ms: number;
  warnings?: string[];
}

export interface AgentRoute {
  primary_agent: string;
  secondary_agents: string[];
  confidence: number;
}

export interface ECCConfig {
  harnessUrl?: string;      // 本地 Harness 地址,默认 http://localhost:19000
  apiKey?: string;          // 可选,远程模式需要
  defaultTokenBudget?: number;
  timeoutMs?: number;
}

// ─── 主客户端类 ───

export class ECCClient extends EventEmitter {
  private http: AxiosInstance;
  private config: Required<ECCConfig>;

  constructor(config: ECCConfig = {}) {
    super();
    this.config = {
      harnessUrl: config.harnessUrl ?? "http://localhost:19000",
      apiKey: config.apiKey ?? "",
      defaultTokenBudget: config.defaultTokenBudget ?? 10000,
      timeoutMs: config.timeoutMs ?? 60000,
    };

    this.http = axios.create({
      baseURL: this.config.harnessUrl,
      timeout: this.config.timeoutMs,
      headers: this.config.apiKey
        ? { Authorization: `Bearer ${this.config.apiKey}` }
        : {},
    });
  }

  /**
   * 执行一个技能包
   * 
   * @example
   * const result = await ecc.runSkill("code-review", {
   *   files: ["./src/user_service.py"],
   *   depth: "deep"
   * });
   */
  async runSkill(
    skillName: string,
    params: Record<string, any>,
    options: { tokenBudget?: number; signal?: AbortSignal } = {}
  ): Promise<SkillResult> {
    const tokenBudget = options.tokenBudget ?? this.config.defaultTokenBudget;

    // 发送进度事件
    this.emit("skill:start", { skillName, params });

    try {
      const response = await this.http.post("/api/v1/run-skill", {
        skill: skillName,
        params,
        token_budget: tokenBudget,
      }, {
        signal: options.signal,
        onUploadProgress: (progress) => {
          this.emit("skill:progress", {
            skillName,
            phase: "uploading",
            progress: progress.progress ?? 0,
          });
        },
      });

      const result: SkillResult = response.data;
      this.emit("skill:complete", { skillName, result });
      return result;
    } catch (error: any) {
      const err = new Error(
        `Skill "${skillName}" failed: ${error.response?.data?.message ?? error.message}`
      );
      this.emit("skill:error", { skillName, error: err });
      throw err;
    }
  }

  /**
   * 路由用户意图到合适的 Agent
   */
  async routeIntent(userIntent: string, context: Record<string, any> = {}): Promise<AgentRoute> {
    const response = await this.http.post("/api/v1/route-agent", {
      intent: userIntent,
      context,
    });
    return response.data as AgentRoute;
  }

  /**
   * 获取 Token 使用统计
   */
  async getTokenStats(): Promise<Record<string, any>> {
    const response = await this.http.get("/api/v1/token-stats");
    return response.data;
  }
}

// ─── 使用示例 ───

async function main() {
  const ecc = new ECCClient({ harnessUrl: "http://localhost:19000" });

  // 监听事件
  ecc.on("skill:start", ({ skillName }) => {
    console.log(`🚀 开始执行技能: ${skillName}`);
  });
  ecc.on("skill:complete", ({ skillName, result }) => {
    console.log(`✅ ${skillName} 完成,消耗 Token: ${result.tokens_used}`);
  });

  // 执行代码审查
  const reviewResult = await ecc.runSkill("code-review", {
    files: ["./src/user_service.py", "./src/auth.py"],
    depth: "deep",
    focus: ["security", "performance"],
  });

  if (reviewResult.success) {
    const issues = reviewResult.data.issues as any[];
    console.log(`发现 ${issues.length} 个问题:`);
    for (const issue of issues) {
      console.log(`  [${issue.severity}] ${issue.file}:${issue.line} - ${issue.message}`);
      if (issue.suggestion) {
        console.log(`    💡 建议:${issue.suggestion}`);
      }
    }
  }

  // 查看 Token 统计
  const stats = await ecc.getTokenStats();
  console.log(`今日 Token 消耗:$${stats.daily_cost_usd}`);
}

main().catch(console.error);

7. 实战一:从零搭建 ECC 开发环境

7.1 安装(三种方式)

# 方式一:pip(推荐个人开发者)
pip install everything-claude-code
ecc setup    # 交互式配置向导

# 方式二:Docker(推荐团队/CI 环境)
docker pull affaanm/ecc:latest
docker run -v $(pwd):/workspace -p 19000:19000 affaanm/ecc:latest

# 方式三:源码安装(推荐技能包开发者)
git clone https://github.com/affaan-m/everything-claude-code.git
cd everything-claude-code
pip install -e ".[dev]"   # 包含测试、lint、格式化工具

7.2 配置文件(~/.ecc/config.yaml)

# ECC 主配置文件

# LLM 提供商配置
llm:
  provider: "anthropic"          # anthropic / openrouter / ollama
  model: "claude-sonnet-4-20250514"
  api_key_env: "ANTHROPIC_API_KEY"
  max_tokens: 8192
  temperature: 0.1

# Token 预算控制
token_budget:
  daily_limit_usd: 20.0         # 每日上限 $20
  per_request_limit: 30000       # 单次请求上限 30000 Token
  enable_cache: true             # 启用系统提示词缓存

# Agent 路由配置
routing:
  strategy: "semantic"           # semantic / keyword / hybrid
  top_k: 3                       # 最多同时激活 3 个 Agent
  confidence_threshold: 0.6      # 置信度低于 0.6 时询问用户

# 技能包配置
skills:
  enabled: ["code-review", "refactor", "test-generator", "security-audit"]
  auto_discover: true            # 自动发现 ~/.ecc/skills/ 下的自定义技能
  timeout_seconds: 300

# 日志
logging:
  level: "INFO"
  file: "~/.ecc/logs/ecc.log"
  enable_token_log: true         # 记录每次请求的 Token 消耗

8. 实战二:编写一个自定义 Skill

下面从头编写一个 「API 性能分析」技能包,演示完整的 Skill 开发流程。

8.1 技能包目录结构

~/.ecc/skills/api-perf-analyzer/
├── skill.yaml          # 元数据声明
├── execute.py          # 执行脚本
├── prompt_template.md  # LLM Prompt 模板
├── tests/
│   └── test_execute.py
└── README.md

8.2 skill.yaml

name: "api-perf-analyzer"
version: "1.0.0"
description: "API 性能分析:自动识别慢接口、N+1 查询、缺乏缓存的热点路径"
authors: ["your-name"]
tags: ["performance", "api", "analysis"]

triggers:
  - pattern: "分析接口性能|API 性能|慢接口|perf analysis"
    language: "any"

token_budget:
  input: 10000
  output: 3000

depends_on: []
output_schema:
  type: "json"
  fields:
    - name: "hotspots"
      type: "array"
    - name: "suggestions"
      type: "array"

8.3 execute.py

"""
API 性能分析技能包

工作原理:
1. 解析项目代码,提取所有 API 路由定义
2. 静态分析每个处理函数的数据库查询模式
3. 检测常见的性能反模式(N+1、无分页、同步阻塞调用)
4. 用 LLM 对检测结果做优先级排序和修复建议生成
"""

import ast
import json
import re
from pathlib import Path
from typing import Optional

def main(files: list[str], framework: Optional[str] = None) -> dict:
    """
    ECC 技能包标准入口函数
    
    Args:
        files: 要分析的文件列表
        framework: 显式指定框架(auto / flask / django / fastapi / express)
    """
    results = {
        "hotspots": [],
        "suggestions": [],
        "stats": {"files_analyzed": 0, "routes_found": 0}
    }
    
    for file_path in files:
        if not file_path.endswith(".py"):
            continue
        
        content = Path(file_path).read_text()
        results["stats"]["files_analyzed"] += 1
        
        # Step 1: 提取路由定义
        routes = extract_routes(content, file_path)
        results["stats"]["routes_found"] += len(routes)
        
        # Step 2: 静态分析性能反模式
        for route in routes:
            issues = analyze_route_performance(route, content)
            if issues:
                results["hotspots"].append({
                    "route": route["path"],
                    "method": route["method"],
                    "file": file_path,
                    "line": route["line"],
                    "issues": issues
                })
    
    # Step 3: 用 LLM 生成修复建议(只对检测到的 hotspot 调用)
    if results["hotspots"]:
        results["suggestions"] = generate_fix_suggestions(results["hotspots"])
    
    return results

def extract_routes(content: str, file_path: str) -> list[dict]:
    """从 Python 代码中提取 API 路由定义"""
    routes = []
    
    # Flask 风格
    flask_pattern = re.compile(r'@app\.route\(\s*["\']([^"\']+)["\']\s*,\s*methods=\[([^\]]+)\]')
    for match in flask_pattern.finditer(content):
        routes.append({
            "path": match.group(1),
            "method": match.group(2),
            "line": content[:match.start()].count("\n") + 1,
            "framework": "flask"
        })
    
    # FastAPI 风格(简化检测)
    fastapi_pattern = re.compile(r'@(app|router)\.(get|post|put|delete|patch)\(\s*["\']([^"\']+)["\']')
    for match in fastapi_pattern.finditer(content):
        routes.append({
            "path": match.group(3),
            "method": match.group(2).upper(),
            "line": content[:match.start()].count("\n") + 1,
            "framework": "fastapi"
        })
    
    return routes

def analyze_route_performance(route: dict, content: str) -> list[str]:
    """
    静态分析路由处理函数的性能问题
    
    检测的反模式:
    - N+1 查询:在 for 循环中使用 ORM 查询
    - 缺少分页:查询没有 limit()/paginate()
    - 同步阻塞:在异步路由中调用 requests.get()
    - 大结果集:SELECT * 没有指定字段
    """
    issues = []
    
    # 获取路由处理函数名
    func_name = extract_route_handler_name(route, content)
    if not func_name:
        return issues
    
    # 提取函数体
    func_body = extract_function_body(func_name, content)
    
    # 检测 N+1 查询
    if re.search(r'for\s+\w+\s+in\s+\w+:', func_body):
        if re.search(r'\.filter\(|\.get\(|\.objects\(', func_body):
            issues.append("疑似 N+1 查询:在 for 循环中存在数据库查询")
    
    # 检测缺少分页
    if "objects.filter" in func_body and "paginate" not in func_body and "limit" not in func_body:
        issues.append("缺少分页:列表接口可能返回大量数据")
    
    # 检测同步阻塞调用(在 async 函数中)
    if route.get("method") and "async def" in content:
        if "requests." in func_body or "urllib" in func_body:
            issues.append("同步 HTTP 调用:在异步函数中使用同步 HTTP 客户端")
    
    return issues

def generate_fix_suggestions(hotspots: list[dict]) -> list[dict]:
    """
    调用 LLM 生成修复建议
    
    注意:这里只发送 hotspot 摘要,不发送完整代码,节省 Token
    """
    # 在实际实现中,这里会调用 ECC 的 LLM 客户端
    # 这里展示 Prompt 设计
    
    prompt = f"""你是一个 API 性能优化专家。

以下 API 热点路径存在性能问题,请为每个问题提供:
1. 问题的具体解释
2. 修复后的代码示例
3. 预期的性能提升(量化)

问题列表:
{json.dumps(hotspots, ensure_ascii=False, indent=2)}

以 JSON 数组格式输出,每个元素包含:route、issue、explanation、fixed_code、estimated_improvement。
"""
    
    # llm_response = llm_client.complete(prompt, max_tokens=3000)
    # return json.loads(llm_response)
    
    # 示例返回(实际由 LLM 生成)
    return [
        {
            "route": "/api/users/<id>/posts",
            "issue": "N+1 查询",
            "explanation": "每个用户的 posts 在循环中被单独查询,应使用 select_related/prefetch_related",
            "fixed_code": (
                "posts = Post.objects.filter(user__in=user_ids)"
                ".select_related('user').prefetch_related('comments')"
            ),
            "estimated_improvement": "查询次数从 N+1 减少到 2-3 次,P99 延迟降低 80%"
        }
    ]

9. 实战三:CI/CD 中集成 ECC 质量门

9.1 GitHub Actions 集成

# .github/workflows/ecc-quality-gate.yml

name: ECC Quality Gate

on:
  pull_request:
    types: [opened, synchronize]
  push:
    branches: [main, develop]

jobs:
  ecc-review:
    runs-on: ubuntu-latest
    
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0  # 需要完整历史用于 diff
      
      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"
      
      - name: Install ECC
        run: pip install everything-claude-code
      
      - name: Start ECC Harness
        run: |
          ecc serve --daemon --port 19000
          sleep 3  # 等待服务启动
      
      - name: Run ECC Code Review
        id: review
        run: |
          # 获取 PR 的变更文件
          CHANGED_FILES=$(git diff --name-only origin/main...HEAD | grep -E '\.(py|js|ts|go|rs)$' | tr '\n' ' ')
          
          if [ -n "$CHANGED_FILES" ]; then
            # 调用 ECC 代码审查技能
            RESULT=$(ecc run-skill code-review \
              --files $CHANGED_FILES \
              --format json \
              --token-budget 15000)
            
            echo "result=$RESULT" >> $GITHUB_OUTPUT
            
            # 检查是否有 critical 级别的问题
            CRITICAL_COUNT=$(echo $RESULT | jq '.issues | map(select(.severity=="critical")) | length')
            if [ "$CRITICAL_COUNT" -gt 0 ]; then
              echo "❌ ECC 质量门失败:发现 $CRITICAL_COUNT 个 critical 级别问题"
              exit 1
            fi
          else
            echo "ℹ️  无代码文件变更,跳过 ECC 审查"
          fi
      
      - name: Run ECC Security Audit
        if: steps.review.outcome == 'success'
        run: |
          CHANGED_FILES=$(git diff --name-only origin/main...HEAD | grep -E '\.(py|js|ts)$' | tr '\n' ' ')
          if [ -n "$CHANGED_FILES" ]; then
            ecc run-skill security-audit \
              --files $CHANGED_FILES \
              --fail-on HIGH  # 发现 HIGH 级别漏洞时失败
          fi
      
      - name: Comment PR with ECC Results
        if: always() && github.event_name == 'pull_request'
        uses: actions/github-script@v7
        with:
          script: |
            const result = ${{ steps.review.outputs.result || '{}' }};
            const issues = result.issues || [];
            
            let body = "## 🤖 ECC 代码审查结果\n\n";
            
            if (issues.length === 0) {
              body += "✅ 未发现代码质量问题\n";
            } else {
              body += `共发现 **${issues.length}** 个问题:\n\n`;
              for (const issue of issues.slice(0, 10)) {  # 最多展示 10 个
                const icon = issue.severity === 'critical' ? '🔴' : 
                            issue.severity === 'high' ? '🟠' : 
                            issue.severity === 'medium' ? '🟡' : '🟢';
                body += `${icon} **[${issue.severity}]** \`${issue.file}:${issue.line}\` - ${issue.message}\n`;
                if (issue.suggestion) {
                  body += `   💡 ${issue.suggestion}\n`;
                }
              }
            }
            
            body += `\n---\n*由 ECC (Everything Claude Code) 自动生成*`;
            
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: body
            });

10. 性能优化:让 AI 编程快 3 倍的 7 个技巧

基于 ECC 社区的最佳实践,总结 7 个可立即落地的优化技巧:

技巧 1:启用上下文缓存(Claude Cache Control)

# 对系统提示词和项目结构描述启用缓存
# Claude API 对 Cache Control 的支持可以节省 70-90% 的重复请求成本

system_prompt = """你是一个 Python 专家..

.# 这里是 2000 Token 的固定系统提示词
"""

# 普通做法(每次都计费)
response = client.messages.create(
    model="claude-sonnet-4-20250514",
    system=system_prompt,  # 每次请求都消耗 2000 input Token
    messages=[...]
)

# ECC 做法(第一次计费,后续命中缓存只收 $0.30/MTok)
response = client.messages.create(
    model="claude-sonnet-4-20250514",
    system=[{
            "type": "text",
            "text": system_prompt,
            "cache_control": {"type": "ephemeral"}  # ← 关键
        }],
    messages=[...]
)

技巧 2:用 diff 替代完整文件

# ❌ 错误做法:每次都发送完整文件
prompt = f"请审查以下代码:\n{read_file('user_service.py')}"

# ✅ 正确做法:只发送 diff
diff = subprocess.check_output(["git", "diff", "HEAD~1", "--", "user_service.py"]).decode()
prompt = f"请审查以下代码变更:\n{diff}"
# Token 消耗从 5000 降至 300-800

技巧 3:批量处理同类任务

# ❌ 慢:每个文件单独请求(N 次网络往返 + N 次系统提示词计费)
for file in files:
    review_file(file)

# ✅ 快:批量请求(1 次网络往返 + 1 次系统提示词计费)
prompt = "请依次审查以下文件,以 JSON 数组格式输出每个文件的问题:\n"
for i, file in enumerate(files):
    prompt += f"\n### 文件 {i+1}: {file}\n{read_file(file)[:2000]}"  # 每个文件只取前 2000 字符
response = llm.complete(prompt)

技巧 4:设置 Token 预算上限

# ~/.ecc/config.yaml
token_budget:
  per_request_limit: 15000   # 单个请求不超过 15000 Token
  warn_at_ratio: 0.8         # 达到 80% 时打印警告

技巧 5:使用更便宜的模型做预处理

# ECC 的分层模型策略:
# 1. 代码分类/路由 → 用 Haiku(便宜、快)
# 2. 代码生成 → 用 Sonnet(质量好)
# 3. 代码审查(初筛)→ 用 Haiku
# 4. 代码审查(最终确认)→ 用 Sonnet

def route_task(task: str) -> str:
    # 用便宜模型做路由决策
    return haiku.complete(f"这个任务最适合哪个 Agent?{task}")

def execute_task(task: str, agent: str):
    # 用高质量模型执行
    return sonnet.complete(f"你是 {agent},请完成:{task}")

技巧 6:结果缓存

import hashlib
import json

class ResultCache:
    """对相同输入缓存 LLM 结果"""
    
    def __init__(self, cache_dir: Path):
        self.cache_dir = cache_dir
        self.cache_dir.mkdir(exist_ok=True)
    
    def get(self, prompt: str, model: str) -> Optional[str]:
        key = hashlib.sha256(f"{model}:{prompt}".encode()).hexdigest()
        cache_file = self.cache_dir / f"{key}.json"
        if cache_file.exists():
            return json.loads(cache_file.read_text())["response"]
        return None
    
    def set(self, prompt: str, model: str, response: str):
        key = hashlib.sha256(f"{model}:{prompt}".encode()).hexdigest()
        cache_file = self.cache_dir / f"{key}.json"
        cache_file.write_text(json.dumps({"response": response}))

技巧 7:选择支持长上下文的模型

Claude Sonnet 4:200K 上下文 → 适合大项目分析
GPT-4.1:128K 上下文
Gemini 2.5 Pro:1M 上下文 → 适合超大型代码库

如果项目超过 50K Token,优先选择 Claude Sonnet 4 或 Gemini 2.5 Pro

11. 与其他 AI 编程框架的对比

维度ECCAiderCursorCopilot Workspace
开源
本地运行
Token 优化✅ 系统化⚠️ 部分⚠️ 黑盒❌ 不透明
多语言 SDK✅ 4 种❌ 仅 Python❌ 仅 TS
技能包生态✅ 249 个⚠️ 有限⚠️ 有限
CI/CD 集成✅ 原生支持⚠️ 需脚本⚠️ 需插件⚠️ GitHub Actions
成本按 API 计费按 API 计费$20/月$39/月
离线能力✅(Ollama)

12. 总结与展望

本文回顾

ECC(Everything Claude Code)通过 Harness 架构范式,将 AI 编程助手从「能用」提升到「好用、快、便宜」的生产级水准。其核心创新在于:

  1. Agent 角色体系(63 个):让专业的事由专业的 Agent 做
  2. 技能包引擎(249 个):可组合、可扩展的能力单元
  3. 三层 Token 优化:压缩 → 缓存 → 预算控制,综合节省 60-80% 成本
  4. 多语言 SDK:统一编排层,支持 Python/TS/Rust/Go
  5. CI/CD 原生集成:质量门、安全审计、自动 PR 评论

2026 年下半年展望

根据 ECC 路线图和社区讨论,值得关注的方向:

  • 分布式 Harness:多人协作时共享 Token 预算和技能包缓存
  • RAG 增强:将项目文档、Issue 历史、PR 评论纳入上下文
  • 更多语言支持:Swift、Kotlin 社区技能包正在开发中
  • Self-hosting 部署包:Docker Compose 一键部署完整 ECC 栈

参考资源

  • ECC GitHub:https://github.com/affaan-m/everything-claude-code
  • ECC 文档:https://ecc.dev
  • Anthropic Cache Control:https://docs.anthropic.com/claude/docs/prompt-caching
  • 本文完整代码示例:https://github.com/yourname/ecc-examples

本文由 AI 辅助撰写,程序员茄子 2026-06-10 发布于 chenxutan.com

复制全文 生成海报 AI编程 性能优化 ECC Token优化 多语言SDK

推荐文章

实现微信回调多域名的方法
2024-11-18 09:45:18 +0800 CST
开发外贸客户的推荐网站
2024-11-17 04:44:05 +0800 CST
API 管理系统售卖系统
2024-11-19 08:54:18 +0800 CST
网站日志分析脚本
2024-11-19 03:48:35 +0800 CST
解决 PHP 中的 HTTP 请求超时问题
2024-11-19 09:10:35 +0800 CST
程序员茄子在线接单