Skip to content

Python Agent 开发规范

司册项目的 Python Agent 代码编写规范,基于 Deep Agents 框架。

背景参考: 技术选型和架构决策详见 Python-Agent-技术架构(待补充)

技术栈

组件选择版本
Python3.12.x>=3.12
包管理器uv-
Web 框架FastAPI>=0.100
Agent 框架Deep Agents>=0.5.0a2
CLI 框架Typer>=0.9.0
打包Nuitka>=2.6

目录结构

agent/
├── pyproject.toml              # Python 项目配置
├── langgraph.json              # LangGraph 配置文件
├── uv.lock

├── scripts/                    # 脚本目录
│   ├── run.sh                  # 开发启动脚本
│   └── build-bin.sh            # Nuitka 打包脚本

└── app/                        # 所有实现代码
    ├── __init__.py             # 包版本、公共导出
    ├── __main__.py             # CLI 入口: python -m app
    ├── agent.py                # LangGraph 入口 (Deep Agents 初始化)
    ├── main.py                 # FastAPI 应用工厂 (含生命周期管理)
    ├── config.py               # 配置管理
    ├── cli.py                  # CLI 命令 (Typer)
    ├── auth.py                 # 令牌验证

    ├── api/                    # FastAPI 路由层
    │   ├── __init__.py
    │   ├── health.py             # /health
    │   ├── chat.py               # /chat
    │   └── sse.py                # SSE 封装

    ├── service/                # 业务服务层(预留)

    ├── sice_agent/             # Agent 能力实现子包
    │   ├── tools/                # 工具实现
    │   ├── prompts/              # 提示词模板
    │   └── utils/                # 工具函数

    └── types/                    # Pydantic 类型定义
        ├── __init__.py
        └── schemas.py            # Pydantic 模型

关键文件职责

文件职责被谁调用
app/agent.pyDeep Agents 初始化LangGraph CLI、FastAPI、CLI
app/main.pyFastAPI 应用工厂(含生命周期管理)serve 命令、uvicorn
app/cli.pyCLI 命令定义__main__.py、打包后的可执行文件
app/__main__.py入口转发python -m app

代码编写规范

1. 配置管理 (config.py)

关键规则:

  • 使用 pydantic-settingsBaseSettings
  • 环境变量前缀必须是 SICE_
  • 数据目录默认 ~/.sice/,可通过 SICE_DATA_DIR 覆盖
  • 端口 0 表示随机分配
  • 状态文件路径 ~/.sice/agent-state.json

2. FastAPI 生命周期 (main.py)

关键规则:

  • 使用 @asynccontextmanager 定义 lifespan
  • Agent 初始化在 lifespan 的启动阶段完成
  • 资源清理在 lifespan 的关闭阶段完成
  • 使用 create_app() 工厂函数创建应用
  • 禁止单独创建 core.pylifecycle.py

3. Agent 初始化 (agent.py)

关键规则:

  • 使用 create_deep_agent() 创建实例
  • 文件路径必须是 app/agent.py
  • 导出 agent 变量供 LangGraph CLI 使用
  • 同时支持 LangGraph Dev 和 FastAPI 内嵌两种模式
  • 模型配置通过环境变量读取,支持兼容 OpenAI 规范的第三方模型

4. SSE 流式响应 (api/sse.py)

关键规则:

  • 使用 StreamingResponse 返回 SSE 流
  • 数据格式必须是 data: {json}\n\n
  • 结束标记必须是 data: [DONE]\n\n
  • 使用 json.dumps() 序列化事件数据

5. 工具定义规范

关键规则:

  • 使用 langchain_core.tools@tool 装饰器
  • 必须编写详细的 docstring 描述工具功能
  • 参数和返回值类型必须注解
  • 工具函数保持纯函数特性(无副作用)

三种使用模式

模式 1: LangGraph Dev 模式(开发时使用)

开发阶段使用 LangGraph CLI 进行调试:

bash
langgraph dev --port 2026 --no-browser
# 或
./scripts/run.sh dev

模式 2: FastAPI 服务模式(服务器部署时使用)

作为独立服务运行,内嵌 LangGraph runtime:

bash
# 开发模式
python -m app serve up
# 或
./scripts/run.sh serve

# 生产模式
sice-cli serve start

模式 3: CLI 模式(终端用户主要使用模式)

打包为二进制命令行单文件,面向终端用户的完整方案,支持通过 Tauri 的 Sidecar 模式调用。

CLI 架构设计:

  • 采用二级命令设计,同一业务类型的命令组合在一起
  • 一级和二级命令都提供 --help 帮助信息

状态文件位置: ~/.sice/

  • agent.pid - 进程ID
  • agent.port - 监听端口
  • agent.log - 运行日志
  • config.json - 用户配置

开发命令

bash
# 进入目录
cd agent

# 激活虚拟环境
source .venv/bin/activate

# 同步依赖
uv sync

# 启动服务
./scripts/run.sh dev        # LangGraph CLI
./scripts/run.sh serve      # FastAPI Server

# 打包
./scripts/build-bin.sh

关键检查点

阶段检查项
配置环境变量 SICE_* 能正确读取
目录数据目录自动创建(权限 0o700)
状态agent-state.json 写入正确
启动/health 返回 200
流式/chat 返回 SSE 流
认证无效令牌返回 401

禁止事项

  • ❌ 不要将敏感信息写入日志
  • ❌ 不要提交 .env.* 文件
  • ❌ 不要在代码中硬编码 API 密钥
  • ❌ 不要将 __pycache__ 提交到仓库
  • ❌ 不要随意变更目录结构,任何设计变更需要先确认

测试用例规范

目录结构

测试文件按模块命名:test/test_模块名.py

编写原则

  1. 验证为主:每个测试验证一个特定行为或边界条件
  2. 不依赖外部服务:单元测试不访问网络、数据库或外部 API
  3. 快速运行:所有单元测试应能在几秒内完成
  4. 沉淀资产:实现新功能或修复 bug 时,同步添加对应测试用例

命名规范

  • 测试文件:test_模块名.py(例如 test_config.py
  • 测试函数:test_功能名()(例如 test_token_generation()

安全设计测试要点

设计点测试验证
令牌生成每次重启必须生成不同的令牌
文件权限状态文件权限必须是 0o600,目录 0o700
敏感信息日志中不能输出完整令牌

E2E 测试验证要求

功能开发完成后必须进行端到端测试验证,不能仅依靠单元测试交付

必须验证:

  1. 启动验证:两种启动方式(LangGraph CLI、自定义 CLI)都能正常启动
  2. 端点验证/health 返回 200,/chat 能正常输出 SSE 流
  3. 环境变量验证.env 文件加载和环境变量覆盖正常工作
  4. 流式验证:输出正常 SSE 流并以 data: [DONE] 结束

参考

基于 MIT 许可发布