Files
Genarrative/server-rs
lhk229 872a2f6454 流式工具槽位身份冲突改为失败关闭
push_tool_fragment 遇到已有槽位时无条件覆盖 id / 函数名,参数却是追加
(Chat / Anthropic)或整段覆盖(Responses 的 arguments_complete)。两者
不自洽:前一个调用参数为空时,拼接结果正好是后一个调用的合法 JSON,
参数完整性检查兜不住,调用方只拿到后一个工具,前一个静默消失并直接交给
Runtime 执行。

守规协议不会命中——Chat 的 index、Responses 的 output_index、Anthropic 的
content block index 在单条响应内都不重复。已知触发路径两条:兼容网关把
Chat 的 index 恒置 0;Responses 的 response.completed 回退按 output[] 下标
重建槽位时与流式 output_index 基准错位(如 completed 载荷省略 reasoning
item),后者会产出「前一个调用的身份配后一个调用的参数」。

改为同槽位身份只允许从缺失变已知或重复同一个值,互不相同的非空值返回
Deserialize。id 与函数名都查:并行调用同一个工具时函数名相同,只有 id 能
区分。空白身份按缺失跳过,不算冲突——部分兼容网关在续传分片里回发完整
function 对象且 name / id 为空串,按「不等即冲突」会整批误杀,这也与归一层
的空白即缺失约定一致。身份冲突不走尾部错误保留路径,累加状态已不可信。

隔离验证:退回无条件覆盖后,四条拒绝用例全红,其中 Chat 那条返回
Ok(tool_calls=[call_b/get_air_quality]),call_a/get_weather 无声消失。

platform-llm 90 passed(原 84),新增 6 条:Chat 换工具 / Chat 同名换 id /
Responses completed 与增量矛盾 / Anthropic 复用 index 四条拒绝,外加
网关每片回发同一身份、completed 重复确认同槽位两条兼容性守卫。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 10:34:53 +00:00
..
2026-07-17 16:56:46 +08:00
2026-07-21 11:20:56 +08:00
2026-07-17 21:03:15 +08:00
2026-07-17 16:56:46 +08:00

server-rs 工作区说明

更新时间:2026-05-15

server-rs/ 是当前唯一后端工作区,承载 Rust api-server、SpacetimeDB module、领域模块、平台副作用适配和共享契约。旧 server-node、Express、PostgreSQL、Go 服务端和 maincloud 口径均为历史残留,不再作为当前实现目标。

当前职责

  • crates/api-server:Axum HTTP / SSE / BFF 门面、鉴权、中间件、外部服务编排和 DTO 映射。
  • crates/spacetime-module:SpacetimeDB 表、reducer、procedure、事务 adapter、row mapper 和迁移。
  • crates/spacetime-client:后端访问 SpacetimeDB 的 typed facade。
  • crates/module-*:领域模型、命令、应用规则、领域事件和领域错误。
  • crates/platform-*:OSS、LLM、语音、认证等外部平台能力。
  • crates/shared-contracts:前后端共享 DTO 与公开契约。
  • crates/shared-kernel、crates/shared-logging、crates/tests-support:跨模块基础能力、日志和测试支撑。

开发规则

  1. server-rs/Cargo.toml 是 workspace 成员和依赖版本事实源;第三方依赖和 workspace 内 crate path 优先放在 [workspace.dependencies]。
  2. module-* 不直接依赖 Axum、SpacetimeDB table/reducer/procedure、reqwest、OSS、LLM、spacetime-client、tokio 或文件系统。
  3. api-server 不承接领域真相;发现领域规则时优先沉到对应 module-*。
  4. SpacetimeDB schema 变化必须同步 spacetime-module/src/migration.rs、生成绑定和当前后端架构文档的表目录。
  5. 人工命令、本地联调和文档示例不要使用 spacetime --root-dir。

常用命令

cargo check -p api-server --manifest-path server-rs/Cargo.toml
cargo test -p api-server --manifest-path server-rs/Cargo.toml
npm run check:server-rs-ddd
npm run check:spacetime-schema
npm run spacetime:generate
npm run dev:api-server

涉及 API smoke 时用 npm run dev:api-server 启动后端并检查 /healthz,不要使用旧 api-server:maincloud。

当前文档