Aicoding

这个仅用500行核心代码构建的AI代码Agent框架,展示了如何让自然语言指令直接转化为可执行的Python代码。它不只是简单的“输入-生成-输出”,而是具备安全沙盒执行和自动纠错能力——当LLM生成的代码出现bug时,系统会自动将错误信息反馈给模型进行修复,最多尝试3次,全程无需人工干预。通过四个抽象接口(LLM、执行器、工具、历史管理)和一个核心编排引擎,实现了“生成→执行→改进”的智能循环。…

从零构建一个 AI 代码 Agent:自然语言生成 Python 代码、安全执行与自动纠错

从零开始实现和了解一个极简但功能完整的 AI 代码 Agent 框架——code-agent-demo。不到 500 行核心代码,却涵盖了 LLM 调用、安全沙盒、自动改进循环、历史管理、CLI 交互等所有关键环节。


一、它能做什么?

直接上图不够直观,我们用命令行来感受一下:

> /run  matplotlib 画一个 sin(x)  cos(x) 的对比图加上图例和标题

[Agent] Generating code for:  matplotlib 画一个 sin(x)  cos(x) 的对比图...
[Agent] Code generated (847 chars)
[Agent] Executing code...
[Agent] Execution succeeded.

[Agent] === Task completed successfully ===

这就是一次典型的交互:输入自然语言 → LLM 生成代码 → 沙盒安全执行 → 输出结果

如果代码运行失败了怎么办?框架会自动进入改进循环:

[Agent] Generating code for: 实现一个快速排序算法...
[Agent] Execution failed: NameError: name 'quicksort' is not defined

[Agent] --- Improvement attempt 1/3 ---
[Agent] Improving code based on error...
[Agent] Code improved (v2, 523 chars)
[Agent] Execution succeeded.

[Agent] === Task completed successfully ===

LLM 生成了有 bug 的代码,Agent 自动把错误信息喂回给 LLM,让它修复后再执行——全程无需人工干预。


二、架构设计:四个抽象接口 + 一个编排核心

整个项目遵循「面向接口编程」的思想,核心架构非常清晰:

┌────────────────────────────────────────────┐
│              main.py (CLI 入口)             │
└───────────────────┬────────────────────────┘
                    │
┌───────────────────▼────────────────────────┐
│            Agent (core.py)                  │
│   generate() → execute() → improve()        │
│         ↑           ↑           ↑          │
│    ┌────┴────┐ ┌───┴────┐ ┌────┴─────┐    │
│    │ BaseLLM │ │BaseExec│ │ BaseTool │     │
│    └────┬────┘ └───┬────┘ └────┬─────┘    │
└─────────┼──────────┼───────────┼───────────┘
          │          │           │
    ┌─────▼─────┐ ┌──▼───────┐ ┌▼───────────┐
    │ OpenAI    │ │ Sandbox  │ │  可扩展...   │
    │ Provider  │ │ Executor │ │             │
    └───────────┘ └──────────┘ └─────────────┘

2.1 四个抽象接口

BaseLLM — LLM 抽象层,定义三个核心方法:

class BaseLLM(ABC):
    def chat(self, messages: list[dict]) -> LLMResponse: ...
    def generate_code(self, requirement: str, context: str = None) -> LLMResponse: ...
    def improve_code(self, original_code: str, error_message: str, requirement: str) -> LLMResponse: ...

目前提供了 OpenAI 的实现,但因为是抽象接口,你可以无缝切换成 Claude、本地 Llama、通义千问等任何模型。

BaseExecutor — 代码执行器抽象:

class BaseExecutor(ABC):
    def execute(self, code: str) -> ExecutionResult: ...

返回统一的 ExecutionResult,包含 successstdoutstderrexit_code 等字段。

BaseTool — 工具接口(预留扩展点),支持 Agent 调用外部工具。

HistoryManager — 历史管理器,记录每次生成和改进,支持 JSON 持久化。

2.2 核心编排引擎

Agent 类是大脑,串联起整个工作流。最核心的方法是 run()

def run(self, requirement: str) -> ExecutionResult:
    # 1. 生成代码
    code = self.generate(requirement)

    # 2. 执行代码
    result = self.execute(code)

    # 3. 失败则自动改进
    for attempt in range(self.config.max_retries):
        if result.success:
            break
        improved = self.improve(result.error_message)
        result = self.execute(improved)

    return result

就这么简洁——「生成 → 执行 → 改进」的循环构成了 Agent 的完整心智模型。


三、安全沙盒:不只是 subprocess

执行 AI 生成的代码最大的风险是什么?是安全问题。LLM 可能会生成 import os; os.system("rm -rf /") 这样的危险代码。

code-agent 采用了双重防护机制:

第一层:导入拦截 Hook

在用户代码执行前,注入一段 Hook 代码,劫持 __import__ 函数:

RESTRICTED_IMPORTS = {"os.system", "subprocess", "shutil", "socket", "requests", "urllib"}

def _safe_import(name, *args, **kwargs):
    for restricted in RESTRICTED:
        if name == restricted or name.startswith(restricted + '.'):
            raise ImportError("Import is not allowed in sandbox")
    return _original_import(name, *args, **kwargs)

_builtins.__import__ = _safe_import

任何被列入黑名单的模块,直接抛出 ImportError

第二层:禁用危险内置函数

for func in ("exec", "eval", "compile", "open", "breakpoint", "__import__"):
    _builtins.__dict__[func] = _blocked

exec()eval()open() 等函数全部被封堵。

第三层:子进程隔离

在子进程中运行用户代码,限制超时时间,捕获 stdout 和 stderr。即使沙盒 Hook 被绕过,最多也只能影响子进程,不会波及主进程。


四、代码风格:追求可读性的 Python

整个项目刻意保持极简风格,尽量使用 Python 原生特性:

  • dataclass 替代普通类,减少样板代码
  • 类型注解 全覆盖,配合 IDE 有完整的智能提示
  • 抽象基类(ABC) 定义接口契约
  • YAML + 环境变量 管理配置,${OPENAI_API_KEY} 自动展开
  • 零框架依赖,只依赖 openaipyyaml

项目文件结构一目了然:

code-agent/
├── agent/
   ├── core.py              # Agent 核心编排引擎
   ├── llm/                 # LLM 抽象层 + OpenAI 实现
   ├── executor/            # 执行器抽象层 + 沙盒实现
   ├── tools/               # 工具接口(扩展预留)
   └── history/             # 历史记录管理
├── main.py                  # CLI 交互入口
├── config.yaml              # 配置文件
├── requirements.txt         # 依赖
└── test_agent.py            # 单元测试 + 集成测试

五、实战:5 分钟跑起来

第 1 步:安装依赖

pip install -r requirements.txt

第 2 步:配置 LLM

编辑 config.yaml

llm:
  model: gpt-4o-mini
  api_key: ${OPENAI_API_KEY}   # 自动从环境变量读取
  base_url: null               # 或填 http://localhost:1234/v1 用本地模型

支持 OpenAI 官方 API 和 LM Studio 等本地推理服务。

第 3 步:启动 CLI

python main.py

你会看到一个交互式命令行:

Commands:
  /generate <requirement>  - 生成代码
  /run <requirement>       - 生成并执行(含自动改进)
  /execute                 - 执行上次生成的代码
  /improve                 - 基于上次错误改进代码
  /show                    - 查看当前代码
  /history                 - 查看会话历史
  /save <filename>         - 保存代码到文件
  /exit                    - 退出

第 4 步:试试这些提示词

/run 生成 100 个随机数,计算均值和标准差
/run 写一个装饰器,测量任意函数的执行时间
/run 实现一个简单的 LRU 缓存类

六、为什么这个项目值得关注?

  1. 学习的绝佳起点:如果你对 AI Agent 感兴趣但不知从何入手,这个项目的 500 行核心代码是最好的教材。它剥离了所有不必要的复杂度,只保留 Agent 的骨架。

  2. 高度的可扩展性:想接入 Claude?实现一个 ClaudeProvider(BaseLLM) 即可。想用 Docker 执行代码?实现一个 DockerExecutor(BaseExecutor)。想接入搜索引擎?实现一个 SearchTool(BaseTool)。每个模块都是可插拔的。

  3. 扎实的安全防护:三层沙盒机制,多一层保障就少一分风险。这在 AI 生成代码自动执行的场景中至关重要。

  4. 完整的工程实践:从抽象接口到具体实现,从单元测试到集成测试,从配置管理到 CLI 设计,这是一个麻雀虽小五脏俱全的 Python 项目。


七、未来展望(一些规划中的方向,大概率实现不了,只是作为学习的起点)

  • 工具链扩展:文件读写、HTTP 请求、数据库查询等标准工具
  • 多轮对话记忆:让 Agent 记住之前的上下文,支持更复杂的任务拆解

八、总结

code-agent 用不到 500 行代码,展示了 AI Agent 的核心工作流:理解需求 → 生成代码 → 安全执行 → 错误自愈。它不是一个庞然大物,但胜在清晰、可扩展、能跑通——这正好是学习和上手 AI Agent 开发的最佳状态。

项目地址:[GitHub – code-agent]


如果你也在做 AI Agent 相关的项目,或者对这篇文章有任何想法,欢迎在评论区交流!

作者: cavalier

能源行业从业者,业余爱好象棋、C++还有二胡、乒乓也很喜欢

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注