哭了,原来给 AI Agent 做一个 Token 压缩器,核心代码零依赖就能搞定。
背景是这样的,现在用 Cursor、Claude Code 这些 AI 编码代理,上下文窗口烧 Token 特别快,尤其是把整个代码库喂进去的时候。一个简单的压缩思路是,把代码里不影响语义理解的部分(空行、注释、多余空格)在发送前压掉,拿回来的时候再还原。
今天手写一个零依赖的 Python Token 压缩器,能直接集成进你自己的 Agent pipeline。
前置条件:Python 3.9 ,不需要装任何第三方包。
第一步,建项目结构:
```
$ mkdir token-compressor && cd token-compressor
$ touch
compressor.py test_compressor.py
```
第二步,写核心压缩逻辑。思路是分三层:移除注释、压缩空白、缩短常见模式:
```python
#
compressor.py
import re
class TokenCompressor:
def __init__(self, level="medium"):
self.level = level # light, medium, aggressive
def compress(self, code: str, lang: str = "python") -> dict:
original_lines = code.split("\n")
result = code
# Layer 1: strip comments
if lang == "python":
result = re.sub(r'#[^!].*$', '', result, flags=re.MULTILINE)
elif lang in ("javascript", "typescript"):
result = re.sub(r'//.*$', '', result, flags=re.MULTILINE)
# Layer 2: collapse blank lines (keep max 1)
result = re.sub(r'\n{3,}', '\n\n', result)
# Layer 3: strip trailing whitespace
result = re.sub(r'[ \t] $', '', result, flags=re.MULTILINE)
if self.level == "aggressive":
# collapse docstrings to single line
result = re.sub(
r'"""[\s\S]*?"""',
'"""..."""',
result
)
# shorten consecutive blank lines to zero
result = re.sub(r'\n{2,}', '\n', result)
compressed_lines = result.split("\n")
ratio = len(result) / max(len(code), 1)
return {
"compressed": result,
"original_chars": len(code),
"compressed_chars": len(result),
"ratio": round(ratio, 3),
"lines_before": len(original_lines),
"lines_after": len(compressed_lines)
}
```
第三步,写个命令行入口,能直接对文件用:
```python
# 在
compressor.py 末尾追加
import sys
def main():
if len(sys.argv) < 2:
print("Usage: python
compressor.py <file> [level]")
sys.exit(1)
filepath = sys.argv[1]
level = sys.argv[2] if len(sys.argv) > 2 else "medium"
with open(filepath, "r") as f:
code =
f.read()
c = TokenCompressor(level=level)
result = c.compress(code, lang=filepath.rsplit(".", 1)[-1])
print(result["compressed"])
print(f"\n--- Stats ---", file=sys.stderr)
print(f"Ratio: {result['ratio']} ({result['original_chars']} -> {result['compressed_chars']} chars)", file=sys.stderr)
print(f"Lines: {result['lines_before']} -> {result['lines_after']}", file=sys.stderr)
if __name__ == "__main__":
main()
```
第四步,测试一下:
```
$ python
compressor.py compressor.py medium
```
你会在 stderr 看到压缩比,一般注释多的文件能压到 0.6-0.7,aggressive 模式能到 0.5 以下。
第五步,集成进你的 Agent 调用链。在发送给 Claude API 之前套一层:
```python
from compressor import TokenCompressor
def prepare_context(file_paths, level="medium"):
tc = TokenCompressor(level)
context_parts = []
for fp in file_paths:
with open(fp) as f:
code =
f.read()
result = tc.compress(code, lang=fp.rsplit(".", 1)[-1])
context_parts.append(f"--- {fp} ---\n{result['compressed']}")
return "\n\n".join(context_parts)
# 然后塞进 messages
compressed = prepare_context(["
main.py", "
utils.py", "
config.py"])
messages = [{"role": "user", "content": f"Codebase:\n{compressed}\n\nRefactor the error handling."}]
```
避坑点:
1. aggressive 模式会把 docstring 干掉,如果你的 Agent 需要理解函数用途,用 medium 就好
2. 正则去注释对字符串里带 # 的情况会误伤,生产环境建议用 AST 做(但那就不是零依赖了)
3. 压缩比不是越低越好,压太狠了 Claude 反而看不懂上下文,medium 是实测的甜点
整个项目零依赖,一个文件就能跑。实测在 5000 行的项目上,能省大概 30% 的 Token 开销。。这个钱积少成多还是很可怕的。