打造一个自己的 CLI 编程小助手,不仅提高了效率,也让整个开发过程变得更有趣、更可控。对我来说,这已经不只是一个工具,而是一位永不疲倦、懂我项目的“编程搭档”。​

市面上已经有不少成熟的 AI 编程工具,它们确实很厉害,可以做很多事情。但是在实际使用过程中,我发现一个问题:这些工具总是太通用,和我的工作流程并不完全匹配。它们缺少针对我项目特性的“个性化”。于是,我萌生了一个想法:为什么不自己动手,做一个完全贴合我需求的 CLI 编程助手呢?

于是,我决定用 Pydantic-AI 搭建属于自己的 AI 编程Agent。现在,它不仅能帮我修复测试、查文档,甚至还能修改代码。下面,我就来分享整个过程,以及为什么我选择自己动手。

为什么要自己动手?

市面上的商业工具,比如 GitHub Copilot 或 Claude Code 确实很酷,但它们就像超市买来的饼干:方便快捷,但总是少了一点“专属感”。

我的项目有一些奇怪的配置,还有一些 AWS 的特性,让通用工具经常束手无策。自己动手的好处有三个:

  1. 1. 量身定制:你的助手会完全适应项目的复杂性和混乱。
  2. 2. 学习与掌控:自己搭建过程让你理解这些 AI 工具是怎么运作的,这种知识非常宝贵。
  3. 3. 决策自主:想先修复代码再看测试?没问题,你说了算。

打个比方:当然外卖披萨很快,但自己挑配料,总是更合心意。

我的 AI 助手结构

我的Agent并不是一个神秘黑盒,它由几个模块组合而成:

• 大脑:Claude Sonnet 4(通过 AWS Bedrock),理解代码就像长期 pair programming 的搭档。

• 胶水:Pydantic-AI,使搭建Agent像堆积乐高一样简单。

• 工具:MCP Servers,一些小插件,用于跑测试或查文档。

• 交互界面:纯 CLI,输入命令即可获取答案,无需华丽 GUI。

这里 MCP 是关键,它像一个通用连接器,你可以像插 USB 一样添加工具,无需复杂集成。

第一步:从最基础开始

我先用 Python 的快速包管理器 uv 搭建基础环境:

uv init
uv add pydantic_ai
uv add boto3
  • 1.
  • 2.
  • 3.

这里只安装了两个包:pydantic-ai 用于搭建Agent,boto3 用于与 AWS 交互。接着在 main.py 里写了以下内容:

import boto3
from pydantic_ai import Agent
from pydantic_ai.mcp import MCPServerStdio
from pydantic_ai.models.bedrock import BedrockConverseModel
from pydantic_ai.providers.bedrock import BedrockProvider
from botocore.config import Config as BotocoreConfig

bedrock_config = BotocoreConfig(
    read_timeout=300,
    connect_timeout=60,
    retries={"max_attempts": 3},
)
bedrock_client = boto3.client(
    "bedrock-runtime", region_name="eu-central-1", config=bedrock_config
)
model = BedrockConverseModel(
    "eu.anthropic.claude-sonnet-4-20250514-v1:0",
    provider=BedrockProvider(bedrock_client=bedrock_client),
)
agent = Agent(model=model)

if __name__ == "__main__":
    agent.to_cli_sync()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

运行:

uv run python main.py
  • 1.

立刻就能进入 CLI。我输入:“写一个反转字符串的函数”,它就输出了干净的 Python 代码。简直太神奇了,但这只是开始。

第二步:让它帮我跑测试(我最讨厌手动跑)

每天频繁运行 pytest?太浪费时间了。我给Agent加了一个工具来处理:

import subprocess

@agent.tool_plain()
def run_unit_tests() -> str:
    """使用 uv 跑单元测试"""
    result = subprocess.run(
        ["uv", "run", "pytest", "-xvs", "tests/"],
        capture_output=True,
        text=True
    )
    return result.stdout
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

现在我只需输入:“测试挂了,帮我看看!” 它就能运行 pytest,分析错误,并给出修改建议。早期有一次,它试图去“修测试而不是修代码”,结果我立刻给它设定了规则。

第三步:给Agent一些开发规则

智能归智能,但还是得指导它。我写了一段开发说明,让它知道我的偏好:

instructions = """
你是我 XXXXXX 项目的编程小助手。开发规则如下:

- **测试失败?修代码**:测试是标准,代码必须符合。只有测试明显错误时才改测试。
- **保持简单**:只修复问题,不重写整个程序。新功能先写测试。
- **精简函数**:每个函数只做一件事。正确处理异常,注意测试配置陷阱。

阅读错误信息就像破案一样,找到真正问题再动手。
"""

agent = Agent(instructions=instructions, model=model)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

现在,它会遵循 TDD 和小修原则,不再轻易大改代码。

第四步:用 MCP 插件增强它

MCP 服务器就像小应用,为Agent添加新技能,本地运行保证数据安全。我用了几个:

• 安全 Python 沙箱:

run_python = MCPServerStdio(
    "deno",
    args=[
        "run",
        "-N",
        "-R=node_modules",
        "-W=node_modules",
        "--node-modules-dir=auto",
        "jsr:@pydantic/mcp-run-python",
        "stdio",
    ],
)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

• 最新文档查询:

context7 = MCPServerStdio(command="npx", args=["-y", "@upstash/context7-mcp"], tool_prefix="context")
  • 1.

• AWS 知识库:

awslabs = MCPServerStdio(
    command="uvx",
    args=["awslabs.core-mcp-server@latest"],
    env={"FASTMCP_LOG_LEVEL": "ERROR"},
    tool_prefix="awslabs",
)
aws_docs = MCPServerStdio(
    command="uvx",
    args=["awslabs.aws-documentation-mcp-server@latest"],
    env={"FASTMCP_LOG_LEVEL": "ERROR", "AWS_DOCUMENTATION_PARTITION": "aws"},
    tool_prefix="aws_docs",
)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

• 网络搜索:

internet_search = MCPServerStdio(command="uvx", args=["duckduckgo-mcp-server"])
  • 1.

• 智能代码推理:

code_reasoning = MCPServerStdio(
    command="npx",
    args=["-y", "@mettamatt/code-reasoning"],
    tool_prefix="code_reasoning",
)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

• 桌面指挥官:

desktop_commander = MCPServerStdio(
    command="npx",
    args=["-y", "@wonderwhy-er/desktop-commander"],
    tool_prefix="desktop_commander",
)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

这一套下来,它可以:

1. 跑测试。

2. 查文档。

3. 修改代码。

4. 再次验证测试。

就像和一个永远不偷零食的 AI 搭档 pair programming。

改变我的开发流程

自从有了这个Agent,我的工作方式彻底改变:

• 调试像团队协作:它能运行测试、给出修复建议,并解释原因。

• 学习更快:新库?它能演示例子、指出坑点。

• 不再切换标签:文档、搜索、AWS 全都在一个 CLI 里。

• 更聪明的问题解决:一步步推理,而不是简单输出代码。

• 内置代码审查:提交前发现潜在问题,就像有个随叫随到的资深开发。

我的总结与经验

1. MCP 是核心:不是单一工具,而是组合魔力。测试 + 文档 + 编辑 = 高效。

2. 实时信息胜过训练数据:实时搜索与最新文档总是比旧训练数据靠谱。

3. 思考比敲代码重要:智能Agent是合作伙伴,而不仅是自动补全。

4. 上下文很关键:Agent记住测试错误,修改代码时不用反复提醒。

5. 定制化是王道:通用工具也许能用,但自己的助手更懂你的代码库。

打造一个自己的 CLI 编程小助手,不仅提高了效率,也让整个开发过程变得更有趣、更可控。对我来说,这已经不只是一个工具,而是一位永不疲倦、懂我项目的“编程搭档”。

文章来自:51CTO

Loading

作者 yinhua

发表回复