已合并
fix(mcp): retry rate-limited RAM-A initialization [AI: Codex GPT-5] #293
DoraA_Mengjie创建于 7月30日
fix(mcp): retry rate-limited RAM-A initialization [AI: Codex GPT-5] #293
已合并
DoraA_Mengjie创建于 7月30日
DoraA_Mengjie
DoraA_Mengjie
7月30日

当前PR是否有AI参与:

[ ] 否

[x] 是
__1. AI Agent 平台: Codex
__2. AI 模型: GPT-5
__3. Prompt上下文 : 基于本 MR 范围内的 xiaoO MCP 配置加载、MCP Streamable HTTP client transport、RAM-A 长期记忆接入、联调问题修复、本地测试和代码审查上下文。

参考:openEuler社区《生成式AI工具使用与开源贡献政策》

PR功能描述 / 为什么需要这个合入**:

本 PR 为 xiaoO 增加与 RAM-A 长期记忆服务对接所需的 MCP 能力,支持通过 MCP 2025-11-25 Streamable HTTP 连接独立部署的 RAM-A HTTP MCP 服务,并提供可选的长期记忆自动召回与写入能力。

主要修改:

  • 新增 .mcp.json 加载能力,支持从命令行参数、环境变量、工作区和用户配置目录加载 MCP server 配置。
  • 新增 MCP Streamable HTTP client transport,支持 /mcp endpoint、MCP-Protocol-Version: 2025-11-25Mcp-Session-Id、Bearer token 环境变量、X-Agent-ID、会话关闭、超时、取消和 initialize 429 一次安全重试。
  • 保留原有 stdio 与 legacy SSE MCP 连接方式,不改变既有配置和默认行为。
  • 支持标准 MCP tool calling:通过 tools/list 发现 MCP 工具,将工具 schema 暴露给模型,由模型自主判断是否调用,再通过 tools/call 执行。
  • 新增 opt-in 的 RAM-A memory automation:turn 前 bounded/untrusted long-term memory recall,turn 成功后 durable ingest queue 写入长期记忆。
  • memory automation 默认关闭;RAM-A/MCP 故障时 fail-open,不阻断 xiaoO 正常对话。
  • 增加 TUI/CLI/daemon 配置接入、状态展示和文档说明,明确 allowed_agent_roles 对自动记忆是否启用的影响。

为什么需要:

RAM-A 是一个独立的长期记忆服务,需要作为共享 HTTP MCP 服务被 xiaoO 连接。原有 stdio 模式适合本地子进程,不适合多个 xiaoO 实例或多 Agent 共享同一个 RAM-A 服务;legacy SSE 也不符合 RAM-A 当前使用的 Streamable HTTP MCP 2025-11-25 会话协议。因此需要在xiaoO 中新增 Streamable HTTP MCP transport,并在 turn 生命周期内接入自动召回和写入。

兼容性说明:

  • 默认不开启 RAM-A memory automation,不影响未配置用户。
  • 原有 TOML MCP、stdio MCP、legacy SSE MCP 继续保留。
  • .mcp.json 是运行时导入,不会写回 TOML。
  • Bearer token 只从环境变量读取,配置文件不保存 secret。
  • 召回内容以 untrusted memory block 形式注入,不修改用户原文。
  • MCP/RAM-A 异常时继续普通对话。

验证情况:

  • cargo fmt --all -- --check: passed
  • cargo test --locked -p mcp: 51 passed
  • cargo test -p xiaoo-shared memory_automation: 14 passed
  • cargo test -p xiaoo-endside: 223 passed
  • cargo clippy -p mcp --all-targets -- -D warnings: passed

该PR关联的issue

(格式为fixes #<issue号>, 或者resolves #<issue号>): fixes #

希望检视人员了解:

本 PR 只引入 RAM-A 对接所需的 MCP Streamable HTTP transport 和 opt-in memory automation,不改变 xiaoO 默认对话流程。

实际联调中暴露过 RAM-A session 未关闭导致 initialize 429 的问题,本 PR 已在客户端侧对 initialize 增加一次受 deadline 约束的安全重试,并保留 MCP session close;如果 RAM-A 服务端长期处于 session admission 饱和状态,仍需要服务端释放或重启,这是服务端资 源治理问题,客户端不会无限重试。

likedislike
Pull Request已成功合入, 合并人@openeuler-ci-bot
(感谢 DoraA_Mengjie 的贡献)
DoraA_MengjieDoraA_Mengjie
7月30日 创建了 pull request,commit 6080f381
atomgit-bot
atomgit-bot
7月30日 评论:

变更摘要

本 PR 为 xiaoO 引入与 RAM-A 长期记忆服务对接的完整 MCP 能力,主要包括:新增 MCP 2025-11-25 Streamable HTTP 传输层(支持 session 管理、[REDACTED] 鉴权、SSE 流式响应、会话恢复和 initialize 429 安全重试);新增可选的长期记忆自动化模块(turn 前召回、turn 后异步持久化摄入队列含重试 worker);新增 .mcp.json JSON 配置文件加载和与 TOML 配置合并的能力;在 TUI 状态面板中展示内存健康状态。

主要改动

  • 新增 StreamableHttpTransport 传输层: 在 crates/mcp/src/transport/streamable_http.rs 中实现了 MCP 2025-11-25 协议传输,支持 /mcp endpoint、Mcp-Session-Id 会话管理、[REDACTED] 环境变量鉴权、X-Agent-ID 代理标识、SSE 事件流解析与重连、会话恢复机制,以及 initialize 请求在收到 429 时进行一次安全重试。
  • 新增 McpMemoryAutomation 长期记忆自动化: 在 apps/shared/src/gateway/memory_automation.rs 中实现了可选的 RAM-A 记忆自动化,包含 turn 前通过 memory_search 召回记忆并渲染为 <untrusted_long_term_memory> 系统上下文、turn 后通过 memory_ingest 异步摄入对话记录,以及基于 JSONL 文件的 DurableIngestQueue 持久化队列(支持文件锁、重试退避、并发安全)。
  • 新增 .mcp.json JSON 配置加载与合并: 在 crates/mcp/src/json_config.rs 中实现了从命令行 --mcp-config、环境变量 XIAOO_MCP_CONFIG、工作区 .mcp.json 和用户目录 ~/.config/xiaoo/mcp.json 的自动发现链;merge_server_configs 确保 TOML 与 JSON 服务器名不冲突,并在重复时报告双方源文件路径。
  • Session 生命周期集成记忆自动化: 在 apps/shared/src/gateway/session_service_impl.rsCoreBackedSessionService 中,turn 执行前调用 recall 将召回记忆注入系统提示词,turn 成功后构建 CompletedTurnIngest 入队异步写入;AppBootstrap 新增 from_session_components_with_hooks_and_backend_manager_and_memory_automation 方法接受可选的 TurnMemoryAutomation
  • TUI 与 Daemon 端到端集成: CLI 和 TUI 入口新增 --mcp-config 参数、MemoryAutomationConfig 配置段和 MemoryStatus 状态枚举(Disabled/Unknown/Connected/Degraded),在状态面板标题栏实时展示内存连接状态,并通过 watch::channel 在 turn 间传递健康变化。
likedislike
不准确?
atomgit-bot
atomgit-bot
7月30日 评论:

代码审查

审查总结

逐文件审查确认

文件 结论
apps/endside/src/cli/config.rs 无问题
apps/endside/src/cli/entry.rs 无问题
apps/endside/src/cli/mod.rs 无问题
apps/endside/src/gateway_api/remote.rs 无问题
apps/endside/src/gateway_api/runtime_request.rs 无问题
apps/endside/src/gateway_api/runtime_stream.rs 无问题
apps/endside/src/gateway_api/session.rs 无问题
apps/endside/src/gateway_api/session_core.rs 无问题
apps/endside/src/main.rs 无问题
apps/endside/src/render/header.rs 无问题
apps/endside/src/render/status_panel.rs 无问题
apps/endside/src/support/config.rs 无问题
apps/serverside/src/daemon_config.rs 无问题
apps/serverside/src/main.rs 无问题
apps/shared/Cargo.toml 无问题
apps/shared/src/gateway/bootstrap.rs 无问题
apps/shared/src/gateway/hosted_runtime_resolver.rs 无问题
apps/shared/src/gateway/memory_automation.rs 无问题
apps/shared/src/gateway/memory_automation_test.rs 无问题
apps/shared/src/gateway/mod.rs 无问题
apps/shared/src/gateway/session_service_impl.rs 无问题
crates/llm-client/src/url_fallback.rs 无问题
crates/mcp/Cargo.toml 无问题
crates/mcp/src/client.rs 无问题
crates/mcp/src/config.rs P3 ×1
crates/mcp/src/error.rs 无问题
crates/mcp/src/json_config.rs 无问题
crates/mcp/src/lib.rs 无问题
crates/mcp/src/transport/mod.rs 无问题
crates/mcp/src/transport/sse.rs P3 ×1
crates/mcp/src/transport/stdio.rs P3 ×1
crates/mcp/src/transport/streamable_http.rs 无问题
crates/mcp/src/types.rs 无问题
crates/mcp/tests/streamable_http.rs 无问题
docs/config_file_guide.md 无问题
docs/mcp.md 无问题

按严重度统计

  • P0: 0
  • P1: 0
  • P2: 0
  • P3: 3(均为可选的改进建议,不修复也不影响正确性)

整体风险判断

低风险。 此 PR 在逻辑正确性、安全性和可靠性方面质量较高。核心功能(MCP Streamable HTTP 传输、.mcp.json 配置加载、RAM-A memory automation)实现正确,错误处理完善,安全措施到位(bearer token 通过环境变量注入、禁止在 JSON 中写入密钥、memory 内容做了 HTML 转义防注入、UNIX 文件锁保证持久队列并发安全)。3 个 P3 发现均为可选改进:1 个过于保守的头名称匹配策略,2 个冗余的空方法覆盖。无阻塞性问题,可以合入。

类型 数量
🔴 阻塞 0
🟡 建议 1

💬 仅评论

likedislike
不准确?
openeuler-ci-botopeneuler-ci-bot成员
7月30日 将lyhu,huzhengce,liumiao27,fromhsc,gogoxiaoxiao,wqianli,leon-wang2021,kaitiandu设为审查人
openeuler-ci-botopeneuler-ci-bot成员
7月30日 添加了label:sig/sig-intelligence
openeuler-ci-bot
openeuler-ci-bot成员
7月30日 评论:

Welcome To openEuler Community

Hey @jie-qi , thanks for your contribution to the community.

Bot Usage Manual

I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands.

Contact Guide

If you have any questions, please contact the SIG: sig-intelligence ,
and any of the maintainers: @fromhsc, @gogoxiaoxiao, @huzhengce, @kaitiandu, @leon-wang2021, @liumiao27, @lyhu, @wqianli ,
and any of the committers: @extinctfire, @hypothesiser, @xiangyou_xie, @xujing99 .

likedislike
openeuler-ci-botopeneuler-ci-bot成员
7月30日 添加了label:openeuler-cla/no
openeuler-ci-botopeneuler-ci-bot成员
7月30日 添加了label:stat/needs-squashai-co-authored
openeuler-ci-botopeneuler-ci-bot成员
7月30日 添加了label:ai-includes-code
openeuler-ci-botopeneuler-ci-bot成员
7月30日 添加了label:ci_processing
openeuler-ci-bot
openeuler-ci-bot成员
7月30日 评论:

门禁正在运行, 您可以通过以下链接查看实时门禁检查结果.
若您对门禁结果含义不清晰或者遇到问题不知如何解决,可参考门禁指导手册
门禁入口及编码规范检查: multiarch/openeuler/trigger/xiaoO/630/console

likedislike
openeuler-ci-botopeneuler-ci-bot成员
7月30日 添加了label:ai-compliance-successful
openeuler-ci-botopeneuler-ci-bot成员
7月31日 删除了label:ci_processing
openeuler-ci-bot
openeuler-ci-bot成员
7月31日 评论:
Check Name Build Result 详情 Build Details
check_sca SUCCESS #630
check_package_license WARNING • 仓库copyright检查未通过: 缺少项目级Copyright声明文件
x86_64 check_build SUCCESS #653
aarch64 check_build SUCCESS #635
likedislike
openeuler-ci-botopeneuler-ci-bot成员
7月31日 添加了label:ci_successful
openeuler-ci-bot
openeuler-ci-bot成员
7月31日 评论:
likedislike
atomgit-bot
atomgit-bot7月31日进行代码检视2
apps/shared/src/gateway/memory_automation.rs
已过期
@@ -0,0 +357,4 @@
357+ loop {
358+ if try_lock_file(&file)? {
359+ file.set_len(0)?;
360+ writeln!(file, "pid={}", std::process::id())?;
atomgit-bot
atomgit-bot7月31日评论:

🟡 Medium Priority

DurableIngestQueue::acquire_lock 方法(apps/shared/src/gateway/memory_automation.rs 第 345-368 行)在 async 函数中使用了同步阻塞 I/O:

在 tokio 多线程 runtime 中,这些调用会阻塞当前 worker 线程。对于本地文件系统这通常很快,但在网络文件系统(NFS/CIFS)或高 I/O 压力下可能导致明显的延迟,影响同一 runtime 上其他 async 任务的执行。

建议:将 acquire_lock 中所有同步 I/O 操作(OpenOptions::open、file.set_len、writeln!)包裹在 tokio::task::spawn_blocking 中执行,避免阻塞 async worker 线程。

likedislike
不准确?
System
系统消息系统
8月1日 评论:

changed this line on 046592cb view diff detail

DoraA_MengjieDoraA_Mengjie
8月1日 update merge request[project id: 9586310, iid: 293, commit_id: 4a3fc80f1fd646282e4e596dc3859742aac58499] virtual merging success
DoraA_MengjieDoraA_Mengjie
8月1日 强制推送  19 个提交:1bb0e16c-12 commits from branch master4939aafb-feat(mcp): add Streamable HTTP server configuration [AI: Codex GPT-5],7d71cba2-feat(memory): add opt-in RAM-A long-term memory [AI: Codex GPT-5],d7cba002-docs(mcp): document RAM-A Streamable HTTP integration [AI: Codex GPT-5],a7c3730b-fix(mcp): harden RAM-A lifecycle and operator status [AI: Codex GPT-5],6add15af-docs(mcp): clarify role-gated memory activation [AI: Codex GPT-5],385edb6e-fix(mcp): retry rate-limited RAM-A initialization [AI: Codex GPT-5],046592cb-fix(memory): move durable queue locking off async workers [AI: Codex GPT-5]
DoraA_MengjieDoraA_Mengjie
8月1日 update merge request[project id: 9586310, iid: 293, commit_id: 596ef89bbbc15f151602bef19a124abd420441ea] virtual merging success
openeuler-ci-botopeneuler-ci-bot成员
8月1日 删除了label:ci_successful
openeuler-ci-bot
openeuler-ci-bot成员
8月1日 评论:

Notification

This pull request has been changed(code update) or closed, so removes the following label(s): ci_successful.

likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月1日 添加了label:ci_processing
openeuler-ci-bot
openeuler-ci-bot成员
8月1日 评论:

门禁正在运行, 您可以通过以下链接查看实时门禁检查结果.
若您对门禁结果含义不清晰或者遇到问题不知如何解决,可参考门禁指导手册
门禁入口及编码规范检查: multiarch/openeuler/trigger/xiaoO/642/console

likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月1日 删除了label:ci_processing
openeuler-ci-bot
openeuler-ci-bot成员
8月1日 评论:
Check Name Build Result 详情 Build Details
check_sca SUCCESS #642
check_package_license WARNING • 仓库copyright检查未通过: 缺少项目级Copyright声明文件
x86_64 check_build SUCCESS #665
aarch64 check_build SUCCESS #647
likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月1日 添加了label:ci_successful
openeuler-ci-bot
openeuler-ci-bot成员
8月1日 评论:
likedislike
DoraA_MengjieDoraA_Mengjie
8月1日 update merge request[project id: 9586310, iid: 293, commit_id: bfad7a5de3bfcec1e731910b6029de855c5a95c0] virtual merging success
DoraA_MengjieDoraA_Mengjie
8月1日 强制推送  7 个提交:41a75dcd-feat(mcp): add Streamable HTTP server configuration [AI: Codex GPT-5],aa520798-feat(memory): add opt-in RAM-A long-term memory [AI: Codex GPT-5],132f7313-docs(mcp): document RAM-A Streamable HTTP integration [AI: Codex GPT-5],57551e1f-fix(mcp): harden RAM-A lifecycle and operator status [AI: Codex GPT-5],fbea701b-docs(mcp): clarify role-gated memory activation [AI: Codex GPT-5],b90745ae-fix(mcp): retry rate-limited RAM-A initialization [AI: Codex GPT-5],52f37748-fix(memory): move durable queue locking off async workers [AI: Codex GPT-5]
DoraA_MengjieDoraA_Mengjie
8月1日 update merge request[project id: 9586310, iid: 293, commit_id: 599cc1eb1f5627f39e0de6385a6aeb921cb4230b] virtual merging success
openeuler-ci-botopeneuler-ci-bot成员
8月1日 删除了label:openeuler-cla/no
openeuler-ci-botopeneuler-ci-bot成员
8月1日 删除了label:ci_successful
openeuler-ci-bot
openeuler-ci-bot成员
8月1日 评论:

Notification

This pull request has been changed(code update) or closed, so removes the following label(s): ci_successful.

likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月1日 添加了label:openeuler-cla/yes
openeuler-ci-bot
openeuler-ci-bot成员
8月1日 评论:

CLA Signature Pass

jie-qi, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月1日 添加了label:ci_processing
openeuler-ci-bot
openeuler-ci-bot成员
8月1日 评论:

门禁正在运行, 您可以通过以下链接查看实时门禁检查结果.
若您对门禁结果含义不清晰或者遇到问题不知如何解决,可参考门禁指导手册
门禁入口及编码规范检查: multiarch/openeuler/trigger/xiaoO/643/console

likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月1日 删除了label:ci_processing
openeuler-ci-bot
openeuler-ci-bot成员
8月1日 评论:
Check Name Build Result 详情 Build Details
check_sca SUCCESS #643
check_package_license WARNING • 仓库copyright检查未通过: 缺少项目级Copyright声明文件
x86_64 check_build SUCCESS #666
aarch64 check_build SUCCESS #648
likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月1日 添加了label:ci_successful
openeuler-ci-bot
openeuler-ci-bot成员
8月1日 评论:
likedislike
hypothesier
hypothesier成员
8月3日 评论:

/lgtm

likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月3日 添加了label:lgtm
openeuler-ci-bot
openeuler-ci-bot成员
8月3日 评论:

Review Code Feedback

  • The label lgtm was added to this pull request. It means that hypothesiser reviewed the code changes. 👋
Tips
  • If this pull request is not merged while all conditions are met, comment /check-pr to try again. 😄
likedislike
hypothesier
hypothesier成员
8月3日 评论:

/lgtm

likedislike
hypothesier
hypothesier成员
8月3日 评论:

/approve

likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月3日 添加了label:approved
openeuler-ci-bot
openeuler-ci-bot成员
8月3日 评论:

Review Code Feedback

  • The label approved was added to this pull request. It means that hypothesiser reviewed the code changes. 👋
Tips
  • If this pull request is not merged while all conditions are met, comment /check-pr to try again. 😄
likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月3日 合入了pull request,合并节点 SHA:d906f8526e2a4fd29f6858a4903769a14d786419