feat: allow reviewed ctas change requests
AIGC Agent 是一个可私有化部署的 AI 数据协作平台。业务人员可以用自然语言查询数据,也可以上传 CSV / Excel 提交数据变更需求;开发人员可以像审 PR 一样审阅 SQL、执行 dry-run、批准、拒绝、执行和追踪审计日志。
业务人员提出查询或变更需求 -> AI 生成查询结果或变更方案 -> 系统做 SQL 安全校验和 dry-run -> 形成 Change Request -> developer/admin 审阅并受控执行 -> 审计日志记录全过程
SELECT / WITH / SHOW / DESC / DESCRIBE / EXPLAIN
unittest
server/ FastAPI 后端 server/api/v1/ API 路由 server/service/ 业务服务层 server/dao/ 数据访问层 server/db/ 数据库连接、SQL 安全、查询执行和变更执行 server/llm/ LangChain Agent 和模型调用 server/models/ ORM、请求模型、响应模型 frontend/aigc-frontend/ Vue 3 前端 local_connector/ 用户本地数据库连接器 tests/ 后端自动化测试 scripts/ 初始化账号、demo 数据和 demo 问题 API接口文档.md 当前 API 参考 分工文档.md 模块分工和协作规则 项目介绍.md 面向新人的项目说明
推荐使用 Docker Compose。
本地开发需要:
复制模板:
cp .env.example .env
至少修改:
LLM_API_KEY=your-api-key-here LLM_API_BASE=https://api.example.com/v1 LLM_PROVIDER=openai-compatible LLM_MODEL=your-model-name JWT_SECRET=replace-with-a-random-secret DATASOURCE_SECRET_KEY=replace-with-fernet-key CORS_ORIGINS=http://localhost
生产环境必须替换 JWT_SECRET 和 DATASOURCE_SECRET_KEY。
JWT_SECRET
DATASOURCE_SECRET_KEY
生成 Fernet 密钥:
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
系统库默认使用 PostgreSQL。Docker Compose 会启动内置 postgres 服务。单机 demo 或测试如需 SQLite,可显式设置:
postgres
DATABASE_URL=sqlite+aiosqlite:///./data/test.db
docker compose up -d --build
默认访问:
APP_ENV=development
查看日志:
docker compose logs -f backend
停止服务:
docker compose down
Docker 环境:
docker compose exec backend python scripts/init_admin.py --username admin --password "change-me"
本地环境:
python scripts/init_admin.py --username admin --password "change-me"
该账号可管理数据源、创建 viewer 观察账号、审批 CR 和查看审计日志。
python -m venv .venv . .venv/Scripts/activate pip install -r requirements.txt python -m uvicorn server.main:app --reload --host 0.0.0.0 --port 8000
Windows PowerShell 如果 python 指向 WindowsApps 占位程序,可使用真实 Python 路径:
python
& 'C:\Users\HL\AppData\Local\Programs\Python\Python311\python.exe' -m uvicorn server.main:app --reload --host 0.0.0.0 --port 8000
cd frontend/aigc-frontend npm install npm run dev
前端默认通过 /api/v1 访问后端。开发代理见 frontend/aigc-frontend/vite.config.js。
/api/v1
frontend/aigc-frontend/vite.config.js
localhost
local_connector
本地连接器通过 WebSocket 主动连接后端。生产环境建议使用 HTTPS/WSS,避免登录 token 和数据库连接配置在明文网络中传输。
后端始终执行权限校验。viewer 不能创建、提交、审批、执行或查看 Change Request,也不能管理数据源、模型、系统配置、观察账号或私有看板。
自然语言问数和直接查询 SQL 都会生成一条任务记录。/chat/send 返回 task_id,/chat/send/stream 通过 event: task 持续推送状态。
/chat/send
task_id
/chat/send/stream
event: task
任务状态包括:
queued
running
tool_calling
querying
succeeded
failed
cancelled
任务查询接口按当前用户隔离:
GET /api/v1/chat/tasks/{task_id}
GET /api/v1/chat/tasks?conversation_id=...
仓库提供 demo 资源:
scripts/demo_business_schema.sql
scripts/demo_questions.md
init_postgresql_schema.sql
后端测试:
python -m unittest discover -s tests -v
Windows PowerShell:
& 'C:\Users\HL\AppData\Local\Programs\Python\Python311\python.exe' -m unittest discover -s tests -v
前端构建检查:
cd frontend/aigc-frontend npm install npm run build
.env
CORS_ORIGINS
localStorage
你可能使用的是 viewer 账号。viewer 只显示查询类入口。请使用 developer/admin 账号管理数据源、观察账号和 Change Request。
如果后端返回 {"code":401,"message":"未提供认证令牌"} 或 {"code":401,"message":"令牌无效或已过期"},请重新登录。
{"code":401,"message":"未提供认证令牌"}
{"code":401,"message":"令牌无效或已过期"}
如果错误来自模型网关,例如 Unauthorized,说明系统认证已通过,但 LLM 的 API Key、API Base、模型名或额外请求头配置不正确。请检查“模型管理”或 .env。
Unauthorized
快速判断:如果 SELECT 1 可以执行,但自然语言问数失败,通常是模型配置问题。
SELECT 1
不会。文件导入先生成映射计划和 dry-run 结果,确认后创建 CR。必须由 developer/admin 批准后才可执行。
系统会阻断无 WHERE 的 UPDATE / DELETE、多语句 SQL 和危险 DDL。这是为了避免误操作造成大范围数据破坏。
使用 developer/admin 登录后,进入审计日志页面,或调用:
GET /api/v1/change-requests/audit
可以。按“本地开发”章节分别启动后端和前端。
不推荐。系统库默认使用 PostgreSQL。SQLite 只建议用于单机 demo 或测试环境。
本项目使用 Apache License 2.0。
AIGC Agent
AIGC Agent 是一个可私有化部署的 AI 数据协作平台。业务人员可以用自然语言查询数据,也可以上传 CSV / Excel 提交数据变更需求;开发人员可以像审 PR 一样审阅 SQL、执行 dry-run、批准、拒绝、执行和追踪审计日志。
核心能力
SELECT / WITH / SHOW / DESC / DESCRIBE / EXPLAIN可直接执行,DML / DDL 会被拦截。当前状态
unittest覆盖权限、SQL 安全、CR、文件、模型和问数任务技术栈
目录结构
快速开始
1. 准备环境
推荐使用 Docker Compose。
本地开发需要:
2. 配置环境变量
复制模板:
至少修改:
生产环境必须替换
JWT_SECRET和DATASOURCE_SECRET_KEY。生成 Fernet 密钥:
系统库默认使用 PostgreSQL。Docker Compose 会启动内置
postgres服务。单机 demo 或测试如需 SQLite,可显式设置:3. Docker Compose 启动
默认访问:
APP_ENV=development时访问 http://localhost:8000/api/v1/docs查看日志:
停止服务:
4. 创建初始 developer 账号
Docker 环境:
本地环境:
该账号可管理数据源、创建 viewer 观察账号、审批 CR 和查看审计日志。
本地开发
后端
Windows PowerShell 如果
python指向 WindowsApps 占位程序,可使用真实 Python 路径:前端
前端默认通过
/api/v1访问后端。开发代理见frontend/aigc-frontend/vite.config.js。数据源连接方式
localhost表示后端容器或后端服务器。local_connector,由连接器从用户电脑访问本机数据库。本地连接器通过 WebSocket 主动连接后端。生产环境建议使用 HTTPS/WSS,避免登录 token 和数据库连接配置在明文网络中传输。
角色与权限
后端始终执行权限校验。viewer 不能创建、提交、审批、执行或查看 Change Request,也不能管理数据源、模型、系统配置、观察账号或私有看板。
Change Request 流程
Agent 任务状态
自然语言问数和直接查询 SQL 都会生成一条任务记录。
/chat/send返回task_id,/chat/send/stream通过event: task持续推送状态。任务状态包括:
queuedrunningtool_callingqueryingsucceededfailedcancelled任务查询接口按当前用户隔离:
GET /api/v1/chat/tasks/{task_id}GET /api/v1/chat/tasks?conversation_id=...Demo 数据
仓库提供 demo 资源:
scripts/demo_business_schema.sql:业务示例库表。scripts/demo_questions.md:自然语言问数与变更申请示例。init_postgresql_schema.sql:PostgreSQL 初始化参考。测试
后端测试:
Windows PowerShell:
前端构建检查:
文档
安全说明
.env、数据库密码、LLM Key 或生产 JWT 密钥。JWT_SECRET。DATASOURCE_SECRET_KEY。DATASOURCE_SECRET_KEY加密保存。CORS_ORIGINS设置为实际前端域名。localStorage保存 JWT;生产环境应部署在可信私有边界内。常见问题
登录后为什么看不到数据源管理?
你可能使用的是 viewer 账号。viewer 只显示查询类入口。请使用 developer/admin 账号管理数据源、观察账号和 Change Request。
业务问数为什么出现 401?
如果后端返回
{"code":401,"message":"未提供认证令牌"}或{"code":401,"message":"令牌无效或已过期"},请重新登录。如果错误来自模型网关,例如
Unauthorized,说明系统认证已通过,但 LLM 的 API Key、API Base、模型名或额外请求头配置不正确。请检查“模型管理”或.env。快速判断:如果
SELECT 1可以执行,但自然语言问数失败,通常是模型配置问题。CSV / Excel 导入会直接写数据库吗?
不会。文件导入先生成映射计划和 dry-run 结果,确认后创建 CR。必须由 developer/admin 批准后才可执行。
为什么 UPDATE / DELETE 被拒绝?
系统会阻断无 WHERE 的 UPDATE / DELETE、多语句 SQL 和危险 DDL。这是为了避免误操作造成大范围数据破坏。
审计日志在哪里看?
使用 developer/admin 登录后,进入审计日志页面,或调用:
可以不用 Docker 吗?
可以。按“本地开发”章节分别启动后端和前端。
还推荐 SQLite 作为系统库吗?
不推荐。系统库默认使用 PostgreSQL。SQLite 只建议用于单机 demo 或测试环境。
License
本项目使用 Apache License 2.0。