如何用 Pydantic-AI 自己寫一個 AI 編程 Agent
市面上已經有不少成熟的 AI 編程工具,它們確實很厲害,可以做很多事情。但是在實際使用過程中,我發現一個問題:這些工具總是太通用,和我的工作流程并不完全匹配。它們缺少針對我項目特性的“個性化”。于是,我萌生了一個想法:為什么不自己動手,做一個完全貼合我需求的 CLI 編程助手呢?
于是,我決定用 Pydantic-AI 搭建屬于自己的 AI 編程Agent?,F在,它不僅能幫我修復測試、查文檔,甚至還能修改代碼。下面,我就來分享整個過程,以及為什么我選擇自己動手。
為什么要自己動手?
市面上的商業工具,比如 GitHub Copilot 或 Claude Code 確實很酷,但它們就像超市買來的餅干:方便快捷,但總是少了一點“專屬感”。
我的項目有一些奇怪的配置,還有一些 AWS 的特性,讓通用工具經常束手無策。自己動手的好處有三個:
1. 量身定制:你的助手會完全適應項目的復雜性和混亂。
2. 學習與掌控:自己搭建過程讓你理解這些 AI 工具是怎么運作的,這種知識非常寶貴。
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這里只安裝了兩個包: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()運行:
uv run python main.py立刻就能進入 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現在我只需輸入:“測試掛了,幫我看看!” 它就能運行 pytest,分析錯誤,并給出修改建議。早期有一次,它試圖去“修測試而不是修代碼”,結果我立刻給它設定了規則。
第三步:給Agent一些開發規則
智能歸智能,但還是得指導它。我寫了一段開發說明,讓它知道我的偏好:
instructions = """
你是我 XXXXXX 項目的編程小助手。開發規則如下:
- **測試失???修代碼**:測試是標準,代碼必須符合。只有測試明顯錯誤時才改測試。
- **保持簡單**:只修復問題,不重寫整個程序。新功能先寫測試。
- **精簡函數**:每個函數只做一件事。正確處理異常,注意測試配置陷阱。
閱讀錯誤信息就像破案一樣,找到真正問題再動手。
"""
agent = Agent(instructions=instructions, model=model)現在,它會遵循 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",
],
)? 最新文檔查詢:
context7 = MCPServerStdio(command="npx", args=["-y", "@upstash/context7-mcp"], tool_prefix="context")? 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",
)? 網絡搜索:
internet_search = MCPServerStdio(command="uvx", args=["duckduckgo-mcp-server"])? 智能代碼推理:
code_reasoning = MCPServerStdio(
command="npx",
args=["-y", "@mettamatt/code-reasoning"],
tool_prefix="code_reasoning",
)? 桌面指揮官:
desktop_commander = MCPServerStdio(
command="npx",
args=["-y", "@wonderwhy-er/desktop-commander"],
tool_prefix="desktop_commander",
)這一套下來,它可以:
1. 跑測試。
2. 查文檔。
3. 修改代碼。
4. 再次驗證測試。
就像和一個永遠不偷零食的 AI 搭檔 pair programming。
改變我的開發流程
自從有了這個Agent,我的工作方式徹底改變:
? 調試像團隊協作:它能運行測試、給出修復建議,并解釋原因。
? 學習更快:新庫?它能演示例子、指出坑點。
? 不再切換標簽:文檔、搜索、AWS 全都在一個 CLI 里。
? 更聰明的問題解決:一步步推理,而不是簡單輸出代碼。
? 內置代碼審查:提交前發現潛在問題,就像有個隨叫隨到的資深開發。
我的總結與經驗
1. MCP 是核心:不是單一工具,而是組合魔力。測試 + 文檔 + 編輯 = 高效。
2. 實時信息勝過訓練數據:實時搜索與最新文檔總是比舊訓練數據靠譜。
3. 思考比敲代碼重要:智能Agent是合作伙伴,而不僅是自動補全。
4. 上下文很關鍵:Agent記住測試錯誤,修改代碼時不用反復提醒。
5. 定制化是王道:通用工具也許能用,但自己的助手更懂你的代碼庫。
打造一個自己的 CLI 編程小助手,不僅提高了效率,也讓整個開發過程變得更有趣、更可控。對我來說,這已經不只是一個工具,而是一位永不疲倦、懂我項目的“編程搭檔”。
































