本仓库(Velaria,当前版本 v0.3.0)用于纯 C++20 数据流引擎调研与演进,当前工作重心是先稳住本地最小闭环,再逐步把执行链路扩展到本地多进程与后续分布式运行时。
- 主要语言:
C++20(核心内核)、Python 3.12+(生态层)、TypeScript(桌面 app 原型) - 构建系统:
Bazel(C++ 侧,依赖rules_cc 0.2.17、rules_python 1.7.0)、uv(Python 侧)、npm + electron-builder(桌面 app) - 当前重点目录:
src/dataflow/core/(内核)、src/dataflow/experimental/(实验运行时)、python/(Python 生态)、app/(桌面原型) - 当前执行路线:
operator chain in-proc + cross-process RPC + simple jobmaster
Velaria/
├── src/dataflow/
│ ├── core/ # 内核
│ │ ├── contract/api/ # DataflowSession, DataFrame 公开接口
│ │ ├── contract/catalog/ # Catalog 元数据
│ │ ├── contract/source_sink_abi.h # Source/Sink ABI
│ │ ├── execution/ # 执行层:Value, Table, ColumnarBatch, CSV, FileSource, NanoArrow IPC
│ │ ├── execution/runtime/ # Executor, ExecutionOptimizer, AggregateLayout, SIMD Dispatch, VectorIndex
│ │ ├── execution/serial/ # Serializer
│ │ ├── execution/stream/ # Stream, BinaryRowBatch
│ │ └── logical/ # SQL Parser, SQL Planner, Plan
│ │ └── sql/frontend/ # libpg_query-based SQL frontend (RAII, validator, lowerer)
│ ├── ai/ # AI Plugin Runtime
│ ├── experimental/
│ │ ├── rpc/ # ActorRPC Codec, RPC Codec, Serialization
│ │ ├── runner/ # Actor Runner
│ │ ├── runtime/ # ActorRuntime, ByteTransport, JobMaster, RPC Runner
│ │ ├── stream/ # Actor Stream Runtime, Actor Execution Optimizer
│ │ └── transport/ # IPC Transport
│ ├── interop/python/ # Python native binding (python_module.cc)
│ ├── examples/ # 所有 demo/benchmark/CLI 入口 (.cc)
│ └── tests/ # C++ 回归测试 (.cc)
├── python/
│ ├── velaria/ # Python 包(cli/, ai_runtime/, embedding, keyword_index, agentic_*, bitable, excel, custom_stream, workspace/)
│ ├── tests/ # Python 测试
│ ├── examples/ # Python 示例
│ ├── benchmarks/ # Python 基准
│ ├── experimental/ # Python 实验功能
│ ├── pyproject.toml # Python 项目配置(deps: pyarrow, pandas, openpyxl, jieba)
│ └── velaria_service/ # 本地 service 包(_router, handlers, helpers)
├── app/ # Electron 桌面 app 原型
│ ├── src/main/ # Electron main process
│ ├── src/preload/ # Preload scripts
│ ├── src/renderer/ # 前端渲染层
│ └── scripts/ # build-sidecar, package-macos
├── docs/ # 设计文档与 benchmark 报告
├── plans/ # 演进计划与路线图
├── scripts/ # 构建、回归、发布、benchmark 脚本
├── skills/ # 用户面技能说明
├── tools/ # Bazel 辅助规则 (python_configure.bzl)
├── BUILD.bazel # 根 Bazel 构建文件
└── MODULE.bazel # Bazel 模块定义(nanoarrow 0.8.0, cppjieba 5.6.3, limonp)
| 依赖 | 版本 | 用途 |
|---|---|---|
| nanoarrow | 0.8.0 | Arrow 列式格式与 IPC 编解码 |
| cppjieba | 5.6.3 | 中文分词(keyword search) |
| limonp | master | cppjieba 工具库依赖 |
| libpg_query | 16-5.1.0 | PostgreSQL SQL 解析(sql/frontend/ 内部,不暴露到公共头文件) |
| nlohmann/json | 3.11.3 | JSON 解析(预留给 protobuf→JSON 迁移路径) |
| 依赖 | 版本范围 | 用途 |
|---|---|---|
| pyarrow | >=23,<24 | Arrow 交换层 |
| pandas | >=2.1,<3 | 数据帧操作 |
| openpyxl | >=3.1,<4 | Excel .xlsx 文件读取 |
| xlrd | >=2,<3 | Excel .xls 文件读取 |
| jieba | >=0.42,<1 | 中文分词 |
| mcp | >=1.27,<2 | Agent runtime 的 Velaria MCP/function bridge |
| codex-app-server-sdk | >=0.1.0 | 默认 Codex Agent runtime |
| prompt-toolkit | >=3,<4 | 交互式 CLI 的 TTY 增强 |
| rich | >=13,<15 | CLI Markdown/终端渲染 |
| sentence-transformers | >=5.3.0 (optional: embedding) | 离线 embedding 生成 |
| socksio | >=1.0.0 (optional: embedding) | SOCKS 代理支持 |
| 依赖 | 版本范围 | 用途 |
|---|---|---|
| claude-agent-sdk | >=0.1.60 | Claude Agent SDK runtime |
dataflow_core— 主内核库(batch/stream/SQL/vector/SIMD)dataflow_actor_rpc_codec— Actor RPC 编解码dataflow_transport— 传输层dataflow_actor_runtime— Actor 运行时dataflow_actor_runner— Actor Runner(含 scheduler/worker/client 依赖)dataflow_stream_actor_runtime— Stream Actor 运行时
sql_demo,df_demo,stream_demo,stream_sql_demo— 单节点 demoactor_rpc_scheduler,actor_rpc_worker,actor_rpc_client— 多进程组件actor_rpc_smoke— RPC 冒烟测试velaria_cli— C++ CLI_velaria_native/velaria_pyext— Python 原生扩展
stream_benchmark,stream_actor_benchmark— 流式基准tpch_q1_style_benchmark— TPC-H Q1 风格基准batch_aggregate_benchmark— 批聚合基准string_builtin_benchmark— 字符串内置函数基准vector_search_benchmark— 向量搜索基准file_source_benchmark— 文件源基准
core_regression— 核心回归(columnar_batch, planner, source_sink_abi, sql, simd, stream, vector, source_materialization, file_source)sql_frontend_test— PG SQL 前端回归(diagnostic, offset map, config, session integration)sql_feature_validator_test— SQL feature policy 矩阵测试sql_dual_frontend_test— dual-mode + pg_query fallback 测试python_ecosystem_regression— Python 生态回归experimental_regression— 实验运行时回归
- 优先保证语义一致性、边界可诊断、最小可用先行。
- 修改前先明确影响范围:
SQL / Planner / Executor / Session / Stream / Runtime。 - 涉及 SQL、Planner、Executor、Session、Stream、Runtime、Agent runtime 或 CLI 交互链路的改动,修改前必须先跑当前基线端到端验证或最小可复现 smoke,并记录基线结果;修改后再跑同一链路和必要回归,确保问题是被修复而不是被测试环境变化掩盖。
- 小步推进,每次改动围绕一个可验证目标,不做无关重构。
- 保持现有 C++/Bazel 风格,新增示例源码统一使用
.cc,头文件使用.h。 session对外入口统一使用DataflowSession。- 现阶段不做 JVM/Python 宿主栈移植,核心计算逻辑保持纯 C++ 实现。
- 单节点示例命令保持可用,不要为了多进程实验破坏
sql_demo / df_demo / stream_demo。 - 所有 Python 相关命令统一显式使用
uv执行,包括测试、脚本、依赖安装;不要直接调用python/pip。 - 涉及
python、多维表格导入、embedding pipeline、desktop sidecar 的开发与验证时,默认可继续使用python/.venv;如需隔离环境,使用UV_PROJECT_ENVIRONMENT=<env-name> uv ... --project python显式指定,不要在文档或规则里写死某个特定环境名。 README.md保持英文,README-zh.md保持中文;后续修改 README 内容时必须同步更新这两份文档。skills/*.md面向最终用户使用说明,不写仓库内部编译、Bazel 构建、源码同步或其他实现侧操作;只保留用户可直接执行的使用方式、参数说明与输入输出约束。- 仓库文档若展示 Python CLI 命令,必须使用仓库内真实可见入口:源码脚本
uv run --project python python python/velaria_cli.py ...,或已打包产物./dist/velaria-cli ...;不要默认写成全局可执行的velaria-cli ...,除非文档已明确提供安装该命令的步骤。 - Agent/runtime core 必须保持领域无关和抽象纯粹;不要在 core、agent 指令或本地 function 中硬编码某个行业、数据源、指数、字段名或业务场景的特化映射/兜底逻辑。遇到编码、列名、表名等问题时,优先做通用规范化、显式 metadata / mapping 返回和可诊断错误,让 agent 或用户基于上下文决定业务语义。
- 所有与 agent 交互相关的错误必须保持 agentic-friendly:错误信息必须包含
error_type(机器可分类)、message(人类可读)、hint(修复建议/workaround),必要时附带candidates(候选值列表)和byte_offset(精确定位)。不要返回裸 exception message 或 traceback 到 agent 上下文;parse_error / unsupported_sql_feature / bind_error / execution_error 必须严格区分,让 agent 能够根据 error_type 选择合适的 react/retry 策略。 - 新功能开发禁止一开始就堆多个版本、兼容路径或“莫须有”的兜底逻辑;先实现一条语义清晰、可验证的主路径。只有在真实用例、测试或运行错误证明边界存在后,才补充最小化、可诊断、可删除的处理分支。
velaria_cli.py -i是交互式 Velaria Agent 主入口;普通输入默认进入 active agent thread,slash 命令负责会话/状态控制,:<command>才作为原 CLI escape hatch。不要把交互式主路径重新设计成ai ...前缀命令。- Velaria Agent 复用 Codex/Claude 等既有 agent runtime,但产品身份、工具选择与用户交互语义都属于 Velaria。默认 runtime 为 Codex(默认模型
gpt-5.4-mini),Claude runtime(默认模型claude-sonnet-4-20250514)需额外安装可选依赖。默认 reasoning effort 均为none,网络访问默认开启。 - Agent 配置统一使用
agent*命名,例如agentRuntime、agentModel、agentAuthMode、agentRuntimeWorkspace、agentCodexNetworkAccess(Codex)、agentNetworkAccess(Claude)、agentProxy;不要再新增ai*配置键。旧ai子命令只作为非交互 SQL 生成/历史兼容入口,不作为新交互能力的主设计面。 - Velaria usage skill 与 SQL catalog 都按需暴露为 MCP resource/tool,不把完整 skill 或完整 SQL 函数清单内联进默认 prompt。SQL 函数、边界和模板通过
velaria_sql_capabilities、velaria_sql_function_search、velaria_sql_query_patterns或velaria://sql/catalog检索。 - 多 runtime 实现(Codex/Claude)之间禁止复制粘贴工具函数;共用逻辑(代理环境变量、bool 转换、trace 开关等)必须提取到一个共享模块或统一放在
__init__.py的 module-level helper 中,不要让同一段代码出现在两个 runtime 文件里。 - 配置解析禁止出现三级以上的优先级链(如
agentClaudeModel > agentModel > default已到上限);如果需要更复杂的 fallback,先提取为命名良好的_resolve_*函数并写清 docstring,再考虑是否真的需要那么多层。多模型配置场景优先使用agentClaudeModel/agentCodexModel分别指定,而非依赖agentModel兜底。
- 根
README.md/README-zh.md只保留项目目标、分层模型、稳定 contract、当前范围、真实入口与最小运行/验证路径;避免写过长的大段说明,细节下沉到python/README.md。 - 新增 Python 生态能力时,根 README 只做高层概念归位:说明它属于
Python Ecosystem,负责什么、不负责什么;具体参数、CLI 示例与端到端用法写进python/README.md。 skills/*.md的示例命令必须直接可执行,优先写源码入口或打包产物入口;不要假设存在额外安装步骤、shell alias 或全局命令。- Python 生态层的新能力如果面向 agent/skill 调用,默认要求 stdout 维持机器可读 JSON,日志落文件,失败路径也不能退化成 traceback 噪音。
- 类似 workspace/run tracking 这类 Python 侧能力,要明确保持 kernel contract 不变:
explain继续对齐logical/physical/strategy,progress继续直接使用原生snapshotJson(),不要在生态层发明第二套语义。 - 本轮多维表格批量导入优化默认落在 Python 生态层时,要求优先采用 stream/batch 方式驱动 embedding provider,避免先整表
to_pylist()后再做一次大批量物化;如确需回退到整表物化,必须先说明原因与边界。 - 本轮 Python 侧验证默认仍可直接使用项目默认环境;若某次任务需要隔离依赖或避免污染现有环境,再显式设置
UV_PROJECT_ENVIRONMENT=<env-name>后运行uv sync/uv run。
不要再引入外部框架专名。统一使用仓库内部术语:
Session风格命名统一使用DataflowSession- SQL 入口统一使用
session.sql(...) - 读取入口统一使用
session.read(...) compatibility表达统一改为语义对齐或接口语义参考
如果需要描述兼容关系,使用“语义对齐”“接口映射”“外部行为参考”,不要把外部框架名直接放进仓库主接口或注释里。
CREATE TABLE:普通表,支持SELECT与INSERT。CREATE SOURCE TABLE:源表,当前约束为只读,不允许INSERT写入。CREATE SINK TABLE:汇聚/结果表,当前约束为禁止SELECT查询使用该表(包括 join 输入)。
INSERT INTO ... VALUES:支持全列/显式列插入。INSERT INTO ... SELECT:支持查询结果写入目标表(目标表不应为SOURCE TABLE)。SINK TABLE可用于写入,不应用于查询输入。
- scheduler 负责接入、快照记录、分发与状态收集,不在本地执行 SQL。
- 客户端提交均应走 worker 执行链路。
- 任务建模:提交后生成
job,再拆成chain与task;远端执行走RemoteTaskSpec队列。 - 队列与触发:
chain达到可运行状态后进入待调度队列;scheduler周期性扫描idle_workers并调用dispatch下发任务。 - 典型流:
SUBMITTED -> CHAIN_READY -> CHAIN_SCHEDULED -> CHAIN_RUNNING -> CHAIN_SUCCEEDED/FAILED(task 相应变化)。
- 排队:当无空闲 worker 时,任务保留在
JobMaster的 remote pending queue,不会丢弃。 - 分发方式:
first-come-first-served的空闲 worker 分配;由task_to_worker跟踪绑定。 - 失败与恢复:task 发送失败触发本地失败落盘并通知客户端;链内失败进入 jobmaster 重试逻辑(当前重试策略按配置)。
- worker 供给:scheduler 默认自动启动本地 worker(
--local-workers,默认 1);如指定--no-auto-worker则走手工挂载模式。
| 工具 | 用途 | 安装方式 |
|---|---|---|
| Bazel | C++ 构建 | brew install bazel |
| uv | Python 包管理 | curl -LsSf https://astral.sh/uv/install.sh | sh |
| Python 3.12+ | Python 运行时 | brew install python@3.13 |
| Node.js + npm | 桌面 app | brew install node |
# 1. C++ 构建验证
bazel build //:sql_demo //:df_demo //:stream_demo
# 2. Python 生态 bootstrap
bazel build //:velaria_pyext
bazel run //python:sync_native_extension
uv sync --project python --python python3.13
# 3. 桌面 app(可选)
cd app && npm install && cd ..
# 4. Agent Runtime(可选;仅 Claude 需要额外依赖)
uv sync --project python --extra ai-claudebazel build //:sql_demo
bazel build //:df_demo
bazel build //:stream_demo
bazel build //:actor_rpc_scheduler //:actor_rpc_worker //:actor_rpc_client //:actor_rpc_smokebazel run //:sql_demo
bazel run //:df_demo
bazel run //:stream_demo
bazel run //:actor_rpc_smoke
./scripts/run_actor_rpc_scheduler.sh -- --listen 127.0.0.1:61000 --node-id scheduler
bazel run //:actor_rpc_worker -- --connect 127.0.0.1:61000 --node-id worker-1
bazel run //:actor_rpc_client -- --connect 127.0.0.1:61000 --payload "demo payload"uv run --project python python python/examples/demo_batch_sql_arrow.py
uv run --project python python python/examples/demo_stream_sql.py
uv run --project python python python/examples/demo_vector_search.py
uv run --project python python python/velaria_cli.py --helpuv run --project python python python/velaria_cli.py -i
uv run --project python python python/velaria_cli.py ai generate-sql \
--prompt "找出每个部门的平均分数" \
--schema "name,score,region,department"bazel build //:sql_demo //:df_demo //:stream_demo \
//:actor_rpc_scheduler //:actor_rpc_worker //:actor_rpc_client //:actor_rpc_smoke \
&& bazel run //:actor_rpc_smoke \
&& echo '[summary] build+smoke ok'# C++ 核心回归
bazel test //:core_regression
# Python 生态回归
bazel test //:python_ecosystem_regression
# 实验运行时回归
bazel test //:experimental_regression
# 脚本入口
./scripts/run_core_regression.sh
./scripts/run_python_ecosystem_regression.sh
./scripts/run_experimental_regression.sh
./scripts/run_stream_observability_regression.shuv sync --project python
uv run --project python python -m unittest
bazel build //:velaria_pyext
bazel test //python:custom_stream_source_test
bazel test //python:streaming_v05_test
bazel test //python:arrow_stream_ingestion_testcd app && npm install && npm start
bash app/scripts/build-sidecar-macos.sh
bash app/scripts/package-macos.shbazel run //:actor_rpc_smoke通过标准:
- 输出
[smoke] actor rpc codec roundtrip ok - 返回码为
0
按顺序执行:
bazel run //:actor_rpc_scheduler -- --listen 127.0.0.1:61000 --node-id scheduler
bazel run //:actor_rpc_worker -- --connect 127.0.0.1:61000 --node-id worker-1
bazel run //:actor_rpc_client -- --connect 127.0.0.1:61000 --payload "demo payload"默认 scheduler 会自启动一个本地 worker;如需验证手工挂载链路,可按上面保留 worker 步骤单独运行,或使用 --no-auto-worker。
或一键执行:
./scripts/run_actor_rpc_e2e.sh --payload "demo payload"通过标准:
- scheduler 输出
[scheduler] listen 127.0.0.1:61000 - worker 输出
[worker] connected 127.0.0.1:61000 - client 先输出
job accepted,再输出job result - 日志中通常不出现
no-worker-available(除非配置--no-auto-worker) - 日志中不出现
cannot connect - 日志中不出现
scheduler closed connection
bazel run //:sql_demo
bazel run //:df_demo
bazel run //:stream_demo修改与调试期间,以上单节点链路应保持不变。
- 编译标准固定为
C++20,不要引入更高版本语法或库假设。 - 示例文件统一保持
.cc;不要新建.cpp/.cxx示例。 --listen/--connect参数必须是host:port。- 多进程验收顺序必须是
scheduler -> worker -> client。 - Python 测试、脚本、依赖安装统一使用
uv run .../uv pip ...,不要直接使用python3/pip3。 - Python 生态层若需要隔离依赖或避免污染默认环境,使用
UV_PROJECT_ENVIRONMENT=<env-name>显式创建和复用隔离环境,并在当前任务说明中写清环境用途;不要把具体环境名硬编码进仓库规则。 - 若出现
no-worker-available,优先确认是否启动了--no-auto-worker,然后再检查 worker 是否已连上 scheduler。 - 若出现
cannot connect,先查 scheduler 是否已监听、端口是否一致。 Value当前允许Int64/Double跨类型比较;若改成严格类型模式,需同步更新 Planner 与示例。Schema/Join场景要注意对象生命周期,避免临时对象引用外泄。- 当前多进程路径只是本地多进程验证,不要误写成完整分布式调度已完成。
- 当前 SQL 仍是 v1 子集。
- 当前版本已支持最小 window SQL:
WINDOW BY <time_col> EVERY <window_ms> AS <output_col>;但不继续横向扩展 ANSI window 语法。 - 当前版本不扩展 CTE / 子查询;batch SQL 已有最小
UNION/UNION ALL,stream SQL 不扩展UNION。 JOIN仅保留现有最小能力,不在本轮继续做更复杂 join 扩展。- Python 继续只做 Arrow 交换层和前端入口,不引入 Python callback/UDF 进入热路径。
- 错误恢复能力还需继续加强,当前优先依赖清晰日志与失败文案。
- 分布式运行时尚未真正接入,当前以本地执行器与本地多进程协作为准。