Files
ThearchyHelios 2e7d6103ea 应用库可移植到 PostgreSQL:AGENTLAB_DATABASE_URL 设成 postgresql+asyncpg://… 时整个应用库用 PostgreSQL,断点用官方的 langgraph-checkpoint-postgres(同一个库,AGENTLAB_CHECKPOINT_URL 可另给);不设时照旧是数据目录里的 SQLite,行为不变
- 配置:database_url、checkpoint_url(启动时校验写法,只认 PostgreSQL)、连接池四项;启动日志写用的是哪种库(主机、库名、用户,不写密码)
- 引擎(db/base.make_engine):SQLite 照旧 WAL、外键、忙等;PostgreSQL 用连接池、探活、会话时区 UTC,装上方言调整(db/postgres.py):建表时 String(n) 是不限长的 VARCHAR(SQLite 从不查长度,导过来的存量也可能超长)、ORDER BY 里可空列的 NULL 位置照 SQLite 补写(升序在前、降序在后,窗口函数里同样);Integer 列在 PostgreSQL 上是 BIGINT(列挂到表上时换成 with_variant,绑定参数跟着列按 BIGINT 转换);JSON 列两边都存原文(PostgreSQL 的 json,不用 JSONB:JSONB 重排对象里的键,快照的列序、表的先后读回来就变了);JSON 里的 NaN 写成 null、NUL 去掉(PostgreSQL 不收)
- 迁移按方言:已有的列和索引用 inspector 认;PostgreSQL 上补列的类型取模型里这一列的、缺省值取迁移表里的(布尔 0/1 换成 false/true),ADD COLUMN IF NOT EXISTS;去重语句里的布尔按方言写;部分唯一索引补 postgresql_where;init_db 在 PostgreSQL 上拿咨询锁(几个进程同时启动不撞)
- 应用库上的 SQLite 专用写法改成按方言编译的表达式(db/portable.py):json_extract 的十几处(口径召回、出具、对账、个人应用、幂等键、访问控制、数据源变化通知、剖析任务、待办超时)换成 json_eq / json_flag / json_text,json_type 换成 json_is_string(两种库同一套带类型的比较);能力登记的 sqlite insert 换成按会话方言的 insert_ignore;能力使用次数的 json_each 按方言分支;附件「没绑记录」的条件不靠 json 的等号;按报错文字认唯一约束的地方换成 unique_violation(按表和列认,两种库的报错都认得)
- 断点(engine/checkpoints.py):PostgreSQL 时开 psycopg 连接池、在咨询锁里 setup;runner 只认 BaseCheckpointSaver,读断点仍只走 saver 的公开接口
- 依赖:新 extra postgres(asyncpg、psycopg[binary] 3、psycopg-pool、langgraph-checkpoint-postgres 3.1.2);langgraph-checkpoint 卡在 <4.3(断点格式就在这个包里,postgres 包新版要 4.3,不动已装的 4.2.0);锁文件补上新包
- 运行收尾:记 action.unknown、安排核实做完才把运行摘掉(以前先摘掉,等「不在跑了」再读事件的一方在库慢时读不到这一条)
- 测试:AGENTLAB_TEST_DATABASE_URL 时跑在 PostgreSQL 上(每个 xdist 进程建自己的库、按事件循环分的连接池 tests/pgpool.py),不设时盖掉环境里的数据库地址照旧用 SQLite;scripts/test-postgres.sh 起临时的 postgres:16 容器跑全量;sqlite_only 标记;另开连接改库的几个竞态测试、触发器测试改成两种库都能跑(tests/appdb.py);新增 test_db_portable 守着方言调整、JSON 键序、超长字符串、大整数、NULL 排序、时区、PostgreSQL 老库迁移
2026-10-19 09:52:09 +08:00

71 lines
3.6 KiB
TOML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[project]
name = "agentlab-backend"
version = "0.1.0"
description = "AgentLab — 可视化 Agent 编排实验台后端"
requires-python = ">=3.12"
dependencies = [
"fastapi>=0.115",
"uvicorn[standard]>=0.32",
"pydantic>=2.9",
"pydantic-settings>=2.6",
# db/base.py 给 aiosqlite 0.22 的 stop() 打了补丁(并发调用会死锁),SQLAlchemy 连接池
# 强制 terminate 时也会走到它。两个一起卡住小版本,换版本前先确认补丁还成立
"sqlalchemy[asyncio]>=2.0.36,<2.1",
"aiosqlite>=0.22.1,<0.23",
"greenlet>=3.1",
"httpx>=0.28",
"python-multipart>=0.0.17",
# 引擎直接依赖这一族的运行时语义:断点格式、interrupt / resume、流式事件、
# thinking 块。小版本也改过行为(resume 发 Command 在当前版本会直接崩),
# 所以上限卡到下一个小版本——升级要主动改这里、重新锁、跑一遍测试。
# 精确版本在 requirements.lock 里
"langgraph>=1.2.11,<1.3",
# 断点的序列化格式就在这个包里(langgraph 只要求 <5,上面那条卡不住它);SQLite、PostgreSQL 两种断点库
# 共用这一份格式,copy-to-postgres 搬断点也靠它前后一致
"langgraph-checkpoint>=4.2.0,<4.3",
"langgraph-checkpoint-sqlite>=3.1.1,<3.2",
"langchain-core>=1.6.3,<1.7",
"langchain-anthropic>=1.7.2,<1.8",
"langchain-openai>=1.6.2,<1.7",
"langchain-mcp-adapters>=0.3.2,<0.4",
"mcp>=1.30,<2",
"numpy>=2.0",
"jsonschema>=4.23",
"beautifulsoup4>=4.12",
"cryptography>=43.0",
# 数据目录的 SQL 检查(data/sqlcheck.py)按数据源方言解析 SQL。sqlglot 的大版本常改语法树节点和
# 方言行为(节点改名、某个写法从解析成 Anonymous 变成专门的节点),规则是照着这些节点写的,
# 上限卡到下一个大版本——升级要重新锁、跑一遍 test_sqlcheck
"sqlglot>=30.21,<31",
]
[project.optional-dependencies]
# microVM 沙箱(独立 Linux 内核)。约 35MB wheel + 首次约 50MB 运行时下载,
# 再加一次 OCI 镜像拉取(实测约 55s),所以不进默认安装。
# environment.yml 里已经带上了;单独装用 `pip install 'agentlab-backend[microvm]'`。
microvm = ["microsandbox>=0.6"]
# 测试:conda 环境默认不装,跑测试前 pip install 'agentlab-backend[dev]'
dev = ["pytest>=8.0", "pytest-asyncio>=0.24", "pytest-xdist>=3.6"]
# 文档解析。PDF 和 Word 的解析库加起来几十兆,只用纯文本的人不该为此
# 付出安装时间——和 microvm、db 一样做成可选。HTML 用已在依赖里的 bs4。
docs = ["pypdf>=5.0", "python-docx>=1.1", "python-pptx>=1.0", "openpyxl>=3.1"]
# 数据库接入。三个驱动都是 asyncio 原生且免装数据库客户端——
# oracledb 走 thin 模式,省掉了 Oracle Instant Client 这个历来最劝退的一步。
db = ["aiomysql>=0.2", "oracledb>=2.0", "asyncpg>=0.30"]
# 应用自己的库用 PostgreSQL(AGENTLAB_DATABASE_URL=postgresql+asyncpg://…)。应用库走 asyncpg;LangGraph 的断点
# 走官方的 langgraph-checkpoint-postgres,它只认 psycopg 3 和它的连接池。psycopg 带 binary:wheel 里自带 libpq,
# 镜像和本机都不用另装 PostgreSQL 客户端。断点格式归 LangGraph 一族管,上限同上卡到下一个小版本
postgres = [
"asyncpg>=0.30",
"psycopg[binary]>=3.2,<4",
"psycopg-pool>=3.2,<4",
"langgraph-checkpoint-postgres>=3.1.2,<3.2",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["app"]