开发指南 · Development Guide

#开发指南 (Development Guide)

本文档是 Negentropy 系统的开发操作单一参考,覆盖环境搭建、日常开发工作流、数据库迁移、前后端对接及故障排查。


#目录

  1. 环境搭建
  2. 项目结构
  3. 开发工作流
  4. 后端开发
  5. 前端开发
  6. 数据库迁移
  7. 前后端对接
  8. 环境变量管理
  9. 验证与质量门禁
  10. 常见陷阱与故障排查
  11. 参考文献

#1. 环境搭建

#1.1 前置依赖

高层技术栈概览与应用边界详见 Framework §2.2。以下为环境搭建所需的完整依赖清单。

Docker 部署:如需通过 Docker Compose 一键部署全套服务(非原生开发),请参阅 Docker Compose 运维指引

  1. 后端引擎
类别技术选型
语言Python 3.13+
Python 包管理uv[1]
Agent 框架Google ADK
LLM 接口LiteLLM (统一 100+ LLM 接入)
Web 框架FastAPI (通过 ADK Web Server)
ORMSQLAlchemy 2.0 (async, asyncpg)
数据库PostgreSQL 17+ (pgvector)
迁移Alembic
沙箱MCP + MicroSandbox
可观测性structlog + OpenTelemetry + Langfuse
配置Pydantic Settings (正交配置域)
包管理uv
  1. 前端应用
类别技术选型
框架Next.js 16+
UIReact 19, TypeScript, Tailwind CSS
AI 集成AG-UI Protocol (CopilotKit)
图谱可视化D3.js (Force Graph)
图表渲染Mermaid
测试Vitest (单元/集成), Playwright (E2E)
包管理pnpm

#1.2 PostgreSQL 初始化

首次运行后端之前,必须确保 PostgreSQL 服务运行正常且所需扩展已安装。./dev(Docker 路径)已内置 pgvector Postgres,可跳过本节。

安装与启动(以 Homebrew macOS 为例;推荐 PG17,与 Docker 栈一致):

hljs bash
# 安装 PostgreSQL 17 与 pgvector 扩展
brew install postgresql@17 pgvector

# 启动服务
brew services start postgresql@17
pg_isready -h localhost -p 5432        # 验证:accepting connections

pg_cron 不再需要:自迁移 0042 起,Skill 调度与 Memory 自动化已迁入进程内 Unified Scheduler(skill_scheduler.py / engine/schedulers/),不再依赖 pg_cron 扩展 —— 无需编译安装,无需postgresql.conf 配置 shared_preload_librariesuuid-osspvector 扩展由应用启动时自动 CREATE EXTENSION(见 docker/postgres/init.sql 与迁移 env.py)。

更省事:若仅本地开发,可只起 Docker 内的 Postgres 供裸机后端连接 ——

hljs bash
docker compose up -d postgres        # 仅起数据库容器
./dev native                         # 裸机后端连接容器 DB(默认 NE_DB_URL 即 localhost:5432)

创建用户与数据库

hljs bash
psql -d postgres -c "CREATE USER aigc"
psql -d postgres -c "CREATE DATABASE negentropy OWNER aigc"
psql -d negentropy -c "GRANT ALL ON DATABASE negentropy TO aigc; GRANT ALL ON SCHEMA public TO aigc;"

验证

hljs bash
psql -h localhost -U aigc -d negentropy -c "SELECT version();"
# 应返回 PostgreSQL 17.x 版本信息

连接配置默认值为 postgresql+asyncpg://aigc:@localhost:5432/negentropy,如需覆盖可通过 config.local.yamlNE_DB_URL 环境变量。参见 §8 环境变量管理

#1.3 后端安装与首次启动

hljs bash
cd apps/negentropy
uv sync --dev                          # 安装全部依赖(含开发依赖)
uv run alembic upgrade head            # 应用数据库迁移至最新版本
uv run negentropy serve  # 启动引擎(封装 adk web,自动锚定正确 agents_dir,默认端口 3292)

#1.4 前端安装与首次启动

hljs bash
cd apps/negentropy-ui
pnpm install                           # 安装依赖
pnpm run dev                           # 启动开发服务器 (localhost:3192)

#2. 项目结构

架构设计原理(三层架构视图、设计模式等)详见 Framework §2。本节聚焦目录布局与开发操作视角。

hljs sh
negentropy/
├── .gitignore                         # Git 忽略规则
├── .mcp.json                          # MCP 服务配置
├── AGENTS.md                          # AI 协作协议
├── LICENSE                            # 许可协议
├── README.md                          # 项目自述
├── docs/                              # 项目文档
│   ├── development.md                 # 本文档
│   ├── framework.md                   # 架构设计方案
│   └── ...
├── apps/                              # 应用根目录
│   ├── negentropy/                    # Python 后端 (uv 管理)
│   │   ├── pyproject.toml             # uv 项目配置
│   │   ├── uv.lock                    # uv 锁文件(提交至版本库)
│   │   ├── .python-version            # Python 版本锚定
│   │   ├── alembic.ini                # Alembic 全局配置
│   │   ├── src/negentropy/            # 主包
│   │   │   ├── agents/                # 智能体编排(一核五翼)
│   │   │   ├── engine/                # 引擎层(API/工厂/适配器/沙箱)
│   │   │   ├── config/                # 配置管理(YAML 分层 + Pydantic 正交域)
│   │   │   │   └── config.default.yaml  # 包级默认 YAML(单一事实源)
│   │   │   ├── models/                # 数据模型(ORM)
│   │   │   ├── knowledge/             # 知识管理
│   │   │   ├── auth/                  # 认证与授权
│   │   │   ├── interface/             # Interface 模块(Models / SubAgents / MCP / Skills)
│   │   │   ├── storage/               # 存储抽象层
│   │   │   └── db/migrations/         # 数据库迁移
│   │   ├── tests/                     # 测试目录
│   │   │   ├── unit_tests/
│   │   │   ├── integration_tests/
│   │   │   └── performance_tests/
│   │   └── scripts/                   # 后端专用脚本
│   ├── negentropy-ui/                 # 前端 (pnpm 管理)
│   │   ├── package.json               # pnpm 项目配置
│   │   ├── pnpm-lock.yaml             # pnpm 锁文件(提交至版本库)
│   │   ├── .env.example               # 环境变量模板(前端)
│   │   ├── app/                       # Next.js App Router 页面与 API 路由
│   │   ├── components/                # 通用可复用 UI 组件
│   │   ├── features/                  # 按功能域组织的业务组件
│   │   ├── hooks/                     # 自定义 React Hooks
│   │   ├── lib/                       # 核心工具库
│   │   ├── utils/                     # 纯函数工具集
│   │   ├── types/                     # TypeScript 类型定义
│   │   ├── config/                    # 前端配置常量
│   │   ├── public/                    # 静态资源
│   │   ├── tests/                     # 测试目录
│   │   │   ├── e2e/
│   │   │   ├── integration/
│   │   │   └── unit/
│   │   └── scripts/                   # 前端专用脚本
│   └── negentropy-wiki/               # Wiki 应用 (pnpm 管理)
└── .temp/                             # 临时文件(自动清理)

#职责边界

维度Backend (uv)Frontend (pnpm)
包管理器uv[1]pnpm
锁文件uv.lockpnpm-lock.yaml
依赖安装uv syncpnpm install
开发命令uv run adk web[5]pnpm run dev[6]
测试命令uv run pytestpnpm run test
代码格式化ruffeslint / prettier

前后端仅通过 HTTP/JSON 契约交互,严禁源码互引。详见 Framework §2.2


#3. 开发工作流

日常开发循环

  1. 后端代码修改后,ADK Web 自动通过 uv run negentropy serve(内部 --reload_agents src)热重载
  2. 前端代码修改后,Next.js 自动热重载
  3. 前后端通过 AG-UI Protocol(SSE/HTTP)进行通信

#4. 后端开发

#4.1 核心配置:apps/negentropy/pyproject.toml

  • 锚定 Python 版本(requires-python >= "3.13,<3.14"
  • 运行依赖与开发依赖分离([dependency-groups] dev = [...]
  • 锁文件 uv.lock 必须提交到版本库

#4.2 启动命令

hljs bash
cd apps/negentropy

# ADK Web 模式(推荐,支持 AG-UI Protocol,默认端口 3292)
uv run negentropy serve

# FastAPI 独立模式
uv run fastapi dev

#4.3 测试

hljs bash
uv run pytest                          # 运行全部测试
uv run pytest tests/unit_tests/        # 仅单元测试
uv run pytest tests/integration_tests/ # 仅集成测试

#4.4 代码质量

hljs bash
uv run ruff check .                    # Lint 检查
uv run ruff format .                   # 代码格式化

#5. 前端开发

#5.1 核心配置:apps/negentropy-ui/package.json

  • 明确 dev / build / test / lint / typecheck 脚本
  • 锁文件 pnpm-lock.yaml 必须提交到版本库

#5.2 启动命令

hljs bash
cd apps/negentropy-ui

pnpm run dev                           # 开发启动 (localhost:3192)
pnpm run build                         # 生产构建
pnpm run start                         # 生产启动

#5.3 测试矩阵

hljs bash
pnpm run test                          # 单元/集成测试 (Vitest)
pnpm run test:coverage                 # 覆盖率报告
pnpm run test:e2e                      # E2E 测试 (Playwright)

#5.4 代码质量

hljs bash
pnpm run lint                          # ESLint 检查
pnpm run typecheck                     # TypeScript 类型检查

#5.5 关键事实源

前端开发中需关注的核心文件参考点:

#5.6 验证路径(流式交互)

确保 UI → BFF → ADK → AG-UI 全链路可用。

前置条件

  • 后端 ADK 已启动,AGUI_BASE_URL 可访问
  • 前端已启动:http://localhost:3192
  • .env.localNEXT_PUBLIC_AGUI_APP_NAMENEXT_PUBLIC_AGUI_USER_ID 已设置

验证步骤

  1. 打开 /:三栏布局显示(Session 列表 / 对话区 / 状态+事件)
  2. 点击 New Session:左栏新增会话
  3. 发送指令,期望结果:
    • 中栏出现用户消息与 Agent 回应(逐步更新)
    • 右栏 Event Timeline 出现文本/工具/状态/Artifact 卡片
    • 连接状态 connecting → streaming → idle 变化可见
  4. 若后端触发工具调用:右栏展示工具卡片(名称/入参/结果/状态)
  5. 切换左侧已有 Session:中栏加载历史消息,右栏加载历史事件

#6. 数据库迁移

数据库迁移是系统数据架构演进的版本控制机制。本项目采用 Alembic 确保数据库 Schema 能够随同领域模型有序迭代。

#6.1 首次初始化

完整的 PostgreSQL 安装与配置请参见 §1.2 PostgreSQL 初始化。本节聚焦数据库层面(Schema / Extension)的初始化逻辑。

alembic upgrade head 首次执行时,env.py 会自动完成以下操作:

  1. 创建 SchemaCREATE SCHEMA IF NOT EXISTS negentropy(所有业务表归属此 schema)
  2. 启用 pgvectorCREATE EXTENSION IF NOT EXISTS vector(向量检索 / embedding 列依赖)
  3. 应用迁移链:按版本顺序执行 versions/ 下所有迁移脚本

因此首次初始化只需确保 PostgreSQL 运行 + 连接配置正确,然后执行:

hljs bash
cd apps/negentropy
uv run alembic upgrade head
uv run alembic current               # 验证:应显示最新 revision

运行时扩展(非迁移必需,但应用功能依赖):

扩展安装方式依赖模块是否需要 shared_preload_libraries
pgvectorbrew install pgvectorKnowledge / Embedding 向量检索
uuid-ossp随 PostgreSQL 自带UUID 生成

pg_cron 已废弃:自迁移 0042 起,Skill 调度与 Memory 自动化改由进程内 Unified Scheduler 驱动,不再依赖 pg_cron,无需安装、无需 shared_preload_libraries、无需重启 PostgreSQL。pgvector / uuid-ossp 由应用启动时自动 CREATE EXTENSION

#6.2 环境准备

所有迁移操作必须在应用根目录apps/negentropy)下执行:

hljs bash
cd apps/negentropy
uv sync --dev                          # 确保本地环境与 pyproject.toml 一致

确保 PostgreSQL 服务运行中(pg_isready -h localhost -p 5432),连接配置(database_url)已在 config.local.yamlconfig/database.py 中正确加载。

#6.3 基础设施元定义

组件文件作用
演进模板script.py.mako生成新迁移脚本的蓝图,定义标准代码结构
全局配置alembic.iniAlembic CLI 入口配置(脚本路径、连接字符串、时区、日志)
运行时上下文env.py加载模型元数据、读取数据库连接配置、驱动异步迁移

#6.4 pgvector 类型识别

当数据库启用 pgvector 且模型使用 Vector 类型时,env.py 中已注册 vector 的反射映射,并在 compare_type 中做等价比较,从源头消除不必要的类型告警。

关键约束:

  • 不屏蔽告警:保留 Alembic 正常提示机制,仅让 vector 类型能够被正确识别
  • 不改变运行时逻辑:只影响 Alembic 反射与比对行为

#6.5 演进工作流

#捕捉变更 (Capture)

src/negentropy/models/ 中的领域模型发生变更时,需生成对应的迁移脚本:

hljs bash
uv run alembic revision --autogenerate -m "描述变更内容"

关键步骤:自动生成的脚本位于 src/negentropy/db/migrations/versions/务必人工审查生成的 Python 脚本,确保其精准反映变更意图,且不包含意外的破坏性操作。

#应用变更 (Apply)

hljs bash
uv run alembic upgrade head

#版本回溯 (Rollback)

hljs bash
uv run alembic downgrade -1             # 回退至上一版本
uv run alembic downgrade base           # 重置至初始状态

#6.6 状态观测与审计

hljs bash
uv run alembic current                  # 确认当前数据库版本
uv run alembic history                  # 追溯架构演进路线

#6.7 模型开发规范

#字段定义

使用 SQLAlchemy 2.0 的 Mapped[] 类型注解风格:

hljs python
from sqlalchemy import String, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column
from negentropy.models.base import Base, UUIDMixin, TimestampMixin, fk

class MyModel(Base, UUIDMixin, TimestampMixin):
    __tablename__ = "my_model"

    name: Mapped[str] = mapped_column(String(255), nullable=False)
    thread_id: Mapped[UUID] = mapped_column(fk("threads", ondelete="CASCADE"))

    __table_args__ = (
        UniqueConstraint("name", name="uq_my_model_name"),
        {"schema": NEGENTROPY_SCHEMA},
    )

#外键引用

使用 fk() 辅助函数简化外键定义:

hljs python
# 推荐
thread_id: Mapped[UUID] = mapped_column(fk("threads", ondelete="CASCADE"))

# 避免
thread_id: Mapped[UUID] = mapped_column(
    ForeignKey(f"{NEGENTROPY_SCHEMA}.threads.id", ondelete="CASCADE")
)

#可用 Mixin

Mixin提供字段
UUIDMixinid: UUID (主键)
TimestampMixincreated_at, updated_at

#自定义类型

类型用途
Vector(dim)pgvector 向量类型,如 Vector(1536)

#7. 前后端对接

#7.1 对接原则

  • 不侵入后端核心逻辑:前端通过 AG-UI Protocol 与 ADK 服务通信
  • 复用现有运行入口:使用 uv run negentropy serve(默认端口 3292)
  • BFF 代理层:前端在 app/api/agui/ 下设置 Route Handler 作为代理,解决 CORS/鉴权/统一路由问题

#7.2 BFF 路由表

路径方法目的实现位置
/api/aguiPOST发送用户输入并返回 SSE 流app/api/agui/route.ts
/api/agui/sessionsPOST创建 Sessionapp/api/agui/sessions/route.ts
/api/agui/sessions/listGET拉取 Session 列表app/api/agui/sessions/list/route.ts
/api/agui/sessions/:idGET获取 Session 详情(含 events,用于回放)app/api/agui/sessions/[sessionId]/route.ts
/api/healthGETUI 运行自检app/api/health/route.ts

BFF 代理层仅做连接与头部注入,不做协议语义改写,避免"二次真值源"。

#7.3 关键环境变量

变量作用域说明
AGUI_BASE_URL服务端后端地址(默认 http://localhost:3292
NEXT_PUBLIC_AGUI_APP_NAME客户端应用名称标识
NEXT_PUBLIC_AGUI_USER_ID客户端用户标识

#7.4 跨域处理

若前后端不通过 BFF 代理通信(直连模式),需在后端配置 CORS 中间件:

hljs python
from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["http://localhost:3192"],
    allow_methods=["*"],
    allow_headers=["*"],
)

#8. 环境变量管理

#8.1 YAML 分层加载策略

后端按以下优先级加载配置(高优先级覆盖低优先级):

  1. Shell 环境变量(最高优先级,支持 env_nested_delimiter="__" 覆盖深层嵌套字段)
  2. config.local.yaml(cwd 相对路径,已 gitignore,用于本地密钥/覆盖)
  3. CLI 指定 YAMLNE_CONFIG_PATH 环境变量或 -c 参数)
  4. ~/.negentropy/config.yaml(用户级配置,由 negentropy init 生成)
  5. config.default.yaml(包级默认值,单一事实源,提交至版本库)

密钥/敏感项严禁写入 YAML 文件或提交到仓库,应通过 shell 环境变量或 config.local.yaml(仅本地)提供。

#8.2 后端配置

后端配置以 apps/negentropy/src/negentropy/config/config.default.yaml 为单一事实源。密钥/敏感项通过 shell 环境变量或 config.local.yaml 覆盖。支持 env_nested_delimiter="__" 覆盖深层嵌套字段。

hljs bash
# 首次使用:生成用户级配置文件
uv run negentropy init    # 写入 ~/.negentropy/config.yaml

# 本地覆盖:创建 config.local.yaml(已被 .gitignore 排除)
cp src/negentropy/config/config.default.yaml config.local.yaml
# 编辑 config.local.yaml 填入本地配置

# 核心配置(通过 shell 环境变量覆盖 YAML 默认值)
export NE_DB_URL=postgresql+asyncpg://localhost:5432/negentropy
export NE_ENV=development

# 深层嵌套覆盖示例(使用 __ 分隔符)
export NE_KNOWLEDGE_DEFAULT_EXTRACTOR_ROUTES__URL__PRIMARY__TIMEOUT_MS=90000

# 密钥类变量(严禁写入 YAML 或提交到仓库)
export OPENAI_API_KEY=...
export ANTHROPIC_API_KEY=...
export GEMINI_API_KEY=...

#8.3 前端环境变量

使用 apps/negentropy-ui/.env.example 作为模板。仅 NEXT_PUBLIC_ 前缀变量暴露给客户端[7]

hljs bash
# 服务端(仅 Route Handler 可用)
AGUI_BASE_URL=http://localhost:3292

# 客户端(浏览器可见)
NEXT_PUBLIC_AGUI_APP_NAME=negentropy
NEXT_PUBLIC_AGUI_USER_ID=dev-user

#8.4 安全约束

  • 后端配置默认值由 config.default.yaml 承载;密钥仅通过 shell 环境变量或 config.local.yaml 提供,严禁写入版本库
  • config.local.yaml 仅用于本地覆盖,已 .gitignore 排除,不得提交
  • 前端 .env.example 仅作模板,.env.local / .env.production 用于环境覆盖
  • .gitignore 必须排除 config.local.yaml.env.env.local.env.*.local

#9. 验证与质量门禁

#9.1 提交前检查清单

  • 锁文件已更新并提交(uv.lockpnpm-lock.yaml
  • 所有测试通过(uv run pytest + pnpm run test
  • Linter 无报错(ruff check + pnpm run lint
  • 类型检查通过(pnpm run typecheck
  • 后端默认配置已同步(config.default.yaml),前端环境变量模板已同步(.env.example);后端本地覆盖通过 config.local.yaml
  • .gitignore 正确排除敏感文件
  • 文档已同步更新

#9.2 CI 最低门禁


#10. 常见陷阱与故障排查

#10.1 常见陷阱 (二阶思维)

陷阱表象根因防范措施
依赖版本漂移本地可运行,CI 失败锁文件未提交或不同步强制提交 uv.lockpnpm-lock.yaml
端口冲突Address already in use多实例并发或未正确清理脚本中增加端口检测与自动清理逻辑
环境变量泄漏密钥出现在日志中配置文件误提交.gitignore 严格排除 config.local.yaml,Pre-commit Hook 检查
跨域问题浏览器报错 CORS开发环境未配置代理后端启用 CORS 中间件,前端配置 BFF 代理
虚拟环境丢失uv run 找不到模块.venv.gitignore 忽略执行 uv sync 恢复

#10.2 后端启动失败

hljs bash
# 检查 Python 版本
cd apps/negentropy
python --version  # 应与 .python-version 一致

# 重新同步依赖
uv sync --reinstall

# 检查端口占用
lsof -i :3292

#10.3 PostgreSQL 启动或连接失败

症状alembic upgrade headOSError: [Errno 61] Connect call failed ('127.0.0.1', 5432)

hljs bash
# 1. 检查 PostgreSQL 运行状态
pg_isready -h localhost -p 5432
brew services info postgresql@17

# 2. 若服务未运行,尝试启动
brew services restart postgresql@17

# 3. 若启动失败,查看日志定位原因
/opt/homebrew/opt/postgresql@17/bin/pg_ctl \
  -D /opt/homebrew/var/postgresql@17 \
  -l /tmp/pg_debug.log start
cat /tmp/pg_debug.log

常见启动失败原因

错误信息根因修复
could not access file "pg_cron"旧版残留:postgresql.conf 仍配置了 shared_preload_libraries = 'pg_cron',而 pg_cron 已不再需要注释/删除 postgresql.conf 中的 shared_preload_libraries 配置项并重启 PostgreSQL(pg_cron 自迁移 0042 起已废弃)
extension "vector" does not existpgvector 扩展未安装brew install pgvector(或使用 Docker 内置 pgvector Postgres)
port 5432 already in use端口被其他 PG 实例或进程占用lsof -i :5432 定位并处理占用进程
data directory was initialized by PostgreSQL version X数据目录版本与 PG 版本不匹配使用 pg_upgrade 迁移或重新 initdb

#10.4 前端启动失败

hljs bash
# 清理缓存
cd apps/negentropy-ui
rm -rf node_modules pnpm-lock.yaml
pnpm install

# 检查 Node 版本
node --version
pnpm --version

#10.5 跨域请求问题

确认后端 FastAPI 已配置 CORS 中间件(参见 §7.4),或确认前端 BFF 代理层(/api/agui)正常工作。


#11. 参考文献

[1] Astral, "uv: A very fast Python package installer," Python Packaging Authority, 2024. [Online]. Available: https://github.com/astral-sh/uv

[2] Astral, "uv CLI Reference," uv Documentation, 2025. [Online]. Available: https://docs.astral.sh/uv/reference/cli/#uv-run

[3] M. Community, "npm best practices," npm Documentation, 2024. [Online]. Available: https://docs.npmjs.com/cli/v9/using-npm/best-practices

[4] S. Ramirez, "First Steps," FastAPI Documentation, 2025. [Online]. Available: https://fastapi.tiangolo.com/tutorial/first-steps/

[5] S. Ramirez, "FastAPI Documentation," FastAPI, 2025. [Online]. Available: https://fastapi.tiangolo.com/

[6] Vercel, "Installation," Next.js Documentation, 2025. [Online]. Available: https://nextjs.org/docs/app/getting-started/installation

[7] Vercel, "Environment Variables," Next.js Documentation, 2025. [Online]. Available: https://nextjs.org/docs/app/guides/environment-variables

[8] Vercel, "next CLI," Next.js Documentation, 2025. [Online]. Available: https://nextjs.org/docs/app/api-reference/cli/next