当前位置: 首页 > article >正文

CKKS 同态加密数学基础推导盟

背景StreamJsonRpc 是微软官方维护的用于 .NET 和 TypeScript 的 JSON-RPC 通信库以其强大的类型安全、自动代理生成和成熟的异常处理机制著称。在 HagiCode 项目中为了通过 ACP (Agent Communication Protocol) 与外部 AI 工具如 iflow CLI、OpenCode CLI进行通信并消除早期自定义 JSON-RPC 实现带来的维护成本和潜在 Bug项目决定集成 StreamJsonRpc。然而在集成过程中遇到了流式 JSON-RPC 特有的挑战特别是在处理代理目标绑定和泛型参数识别时。为了解决这些痛点我们做了一个大胆的决定整个构建系统推倒重来。这个决定带来的变化可能比你想象的还要大——稍后我会具体说。关于 HagiCode先介绍一下本文的主角项目如果你在开发中遇到过这些烦恼多项目、多技术栈构建脚本维护成本高CI/CD 流水线配置繁琐每次改都要查文档跨平台兼容性问题层出不穷想让 AI 帮忙写代码但现有工具不够智能那么我们正在做的 HagiCode 可能你会感兴趣。HagiCode 是什么一款 AI 驱动的代码智能助手支持多语言、跨平台的代码生成与优化内置游戏化机制让编码不再枯燥为什么在这里提它本文分享的 StreamJsonRpc 集成方案正是我们在开发 HagiCode 过程中实践总结出来的。如果你觉得这套工程化方案有价值说明我们的技术品味还不错——那么 HagiCode 本身也值得关注一下。想了当前项目处于 ACP 协议集成的关键阶段面临着以下几个技术痛点和架构挑战1. 自定义实现的局限原有的 JSON-RPC 实现位于?src/HagiCode.ClaudeHelper/AcpImp/包含?JsonRpcEndpoint?和?ClientSideConnection?等组件。维护这套自定义代码成本高且缺乏成熟库的高级功能如进度报告、取消支持。2. StreamJsonRpc 集成障碍在尝试将现有的?CallbackProxyTarget?模式迁移到 StreamJsonRpc 时发现?_rpc.AddLocalRpcTarget(target)?方法无法识别通过代理模式创建的目标。具体表现为StreamJsonRpc 无法自动将泛型类型?T?的属性拆分为 RPC 方法参数导致服务器端无法正确处理客户端发起的方法调用。3. 架构分层混乱现有的?ClientSideConnection?混合了传输层WebSocket/Stdio、协议层JSON-RPC和业务层ACP Agent 接口导致职责不清且存在?AcpAgentCallbackRpcAdapter?方法绑定缺失的问题。4. 日志缺失WebSocket 传输层缺少对原始 JSON 内容的日志输出导致在调试 RPC 通信问题时难以定位是序列化问题还是网络问题。解决针对上述问题我们采用了以下系统化的解决方案从架构重构、库集成和调试增强三个维度进行优化1. 全面迁移至 StreamJsonRpc移除旧代码删除?JsonRpcEndpoint.cs、AgentSideConnection.cs?及相关的自定义序列化转换器JsonRpcMessageJsonConverter?等。集成官方库引入?StreamJsonRpc?NuGet 包利用其?JsonRpc?类处理核心通信逻辑。抽象传输层定义?IAcpTransport?接口统一处理?WebSocket?和?Stdio?两种传输模式确保协议层与传输层解耦。// IAcpTransport 接口定义public interface IAcpTransport{Task SendAsync(string message, CancellationToken cancellationToken default);Task ReceiveAsync(CancellationToken cancellationToken default);Task CloseAsync(CancellationToken cancellationToken default);}// WebSocket 传输实现public class WebSocketTransport : IAcpTransport{private readonly WebSocket _webSocket;public WebSocketTransport(WebSocket webSocket){_webSocket webSocket;}// 实现发送和接收方法// ...}// Stdio 传输实现public class StdioTransport : IAcpTransport{private readonly StreamReader _reader;private readonly StreamWriter _writer;public StdioTransport(StreamReader reader, StreamWriter writer){_reader reader;_writer writer;}// 实现发送和接收方法// ...}2. 修复代理目标识别问题分析?CallbackProxyTarget检查现有的动态代理生成逻辑确定 StreamJsonRpc 无法识别的根本原因通常是因为代理对象没有公开实际的方法签名或者使用了 StreamJsonRpc 不支持的参数类型。重构参数传递将泛型属性拆分为明确的 RPC 方法参数。不再依赖动态属性而是定义具体的 Request/Response DTO数据传输对象确保 StreamJsonRpc 能通过反射正确识别方法签名。// 原有的泛型属性方式public class CallbackProxyTarget{public Func Callback { get; set; }}// 重构后的具体方法方式public class ReadTextFileRequest{public string FilePath { get; set; }}public class ReadTextFileResponse{public string Content { get; set; }}public interface IAcpAgentCallback{Task ReadTextFileAsync(ReadTextFileRequest request);// 其他方法...}使用?Attach?替代?AddLocalRpcTarget在某些复杂场景下手动代理?JsonRpc?对象并处理?RpcConnection?可能比直接添加目标更灵活。3. 实现方法绑定与日志增强实现?AcpAgentCallbackRpcAdapter确保该组件显式实现 StreamJsonRpc 的代理接口将 ACP 协议定义的方法如?ReadTextFileAsync映射到 StreamJsonRpc 的回调处理器上。集成日志记录在 WebSocket 或 Stdio 的消息处理管道中拦截并记录 JSON-RPC 请求和响应的原始文本。利用?ILogger?在解析前和序列化后输出原始 payload以便排查格式错误。// 日志增强的传输包装器public class LoggingAcpTransport : IAcpTransport{private readonly IAcpTransport _innerTransport;private readonly ILogger _logger;public LoggingAcpTransport(IAcpTransport innerTransport, ILogger logger){_innerTransport innerTransport;_logger logger;}public async Task SendAsync(string message, CancellationToken cancellationToken default){_logger.LogTrace(Sending message: {Message}, message);await _innerTransport.SendAsync(message, cancellationToken);}public async Task ReceiveAsync(CancellationToken cancellationToken default){var message await _innerTransport.ReceiveAsync(cancellationToken);_logger.LogTrace(Received message: {Message}, message);return message;}public async Task CloseAsync(CancellationToken cancellationToken default){_logger.LogDebug(Closing connection);await _innerTransport.CloseAsync(cancellationToken);}}4. 架构分层重构传输层 (AcpRpcClient)封装 StreamJsonRpc 连接负责?InvokeAsync?和连接生命周期管理。public class AcpRpcClient : IDisposable{private readonly JsonRpc _rpc;private readonly IAcpTransport _transport;public AcpRpcClient(IAcpTransport transport){_transport transport;_rpc new JsonRpc(new StreamRpcTransport(transport));_rpc.StartListening();}public async Task InvokeAsync(string methodName, object parameters){return await _rpc.InvokeAsync(methodName, parameters);}public void Dispose(){_rpc.Dispose();_transport.Dispose();}// StreamRpcTransport 是对 IAcpTransport 的 StreamJsonRpc 适配器private class StreamRpcTransport : IDuplexPipe{// 实现 IDuplexPipe 接口// ...}}协议层 (IAcpAgentClient?/?IAcpAgentCallback)定义清晰的 client-to-agent 和 agent-to-client 接口移除?Func?这种循环依赖的工厂模式改用依赖注入或直接注册回调。实践基于 StreamJsonRpc 的最佳实践和项目经验以下是实施过程中的关键建议1. 强类型 DTO 优于动态对象StreamJsonRpc 的核心优势在于强类型。不要使用?dynamic?或?JObject?传递参数。应为每个 RPC 方法定义明确的 C# POCO 类作为参数。这不仅解决了代理目标识别问题还能在编译时发现类型错误。示例将?CallbackProxyTarget?中的泛型属性替换为?ReadTextFileRequest?和?WriteTextFileRequest?等具体类。2. 显式声明 Method Name使用?[JsonRpcMethod]?特性显式指定 RPC 方法名称不要依赖默认的方法名映射。这可以防止因命名风格差异如 PascalCase vs camelCase导致的调用失败。public interface IAcpAgentCallback{[JsonRpcMethod(readTextFile)]Task ReadTextFileAsync(ReadTextFileRequest request);[JsonRpcMethod(writeTextFile)]Task WriteTextFileAsync(WriteTextFileRequest request);}3. 利用连接状态回调StreamJsonRpc 提供了?JsonRpc.ConnectionLost?事件。务必监听此事件以处理进程意外退出或网络断开的情况这比单纯依赖 Orleans 的 Grain 失效检测更及时。_rpc.ConnectionLost (sender, e) {_logger.LogError(RPC connection lost: {Reason}, e.ToString());// 处理重连逻辑或通知用户};4. 日志分层记录Trace 级别记录完整的 JSON Request/Response 原文。Debug 级别记录方法调用栈和参数摘要。注意确保日志中不包含敏感的 Authorization Token 或大文件内容的 Base64 编码。5. 处理流式传输的特殊性StreamJsonRpc 原生支持?IAsyncEnumerable。在实现 ACP 的流式 Prompt 响应时应直接使用?IAsyncEnumerable?而不是自定义的分页逻辑。这能极大简化流式处理的代码量。public interface IAcpAgentCallback{[JsonRpcMethod(streamText)]IAsyncEnumerable StreamTextAsync(StreamTextRequest request);}6. 适配器模式 (Adapter Pattern)保持?ACPSession?和?ClientSideConnection?的分离。ACPSession?应专注于 Orleans 的状态管理和业务逻辑如消息入队通过组合而非继承的方式使用 StreamJsonRpc 连接对象。总结通过全面集成 StreamJsonRpcHagiCode 项目成功解决了原自定义实现的维护成本高、功能局限性和架构分层混乱等问题。关键改进包括采用强类型 DTO 替代动态属性提高了代码的可维护性和可靠性实现了传输层抽象和协议层分离提升了架构的清晰性增强了日志记录功能便于排查通信问题终秤坪掳

相关文章:

CKKS 同态加密数学基础推导盟

背景 StreamJsonRpc 是微软官方维护的用于 .NET 和 TypeScript 的 JSON-RPC 通信库,以其强大的类型安全、自动代理生成和成熟的异常处理机制著称。在 HagiCode 项目中,为了通过 ACP (Agent Communication Protocol) 与外部 AI 工具(如 iflow …...

Flutter ClipRRect

ClipRRect 是 Flutter 中用于将子组件裁剪为圆角矩形的核心 Widget&#xff0c;常用于实现图片、容器、卡片的圆角效果。一、核心属性dartconst ClipRRect({Key? key,BorderRadiusGeometry borderRadius BorderRadius.zero, // 圆角CustomClipper<RRect>? clipper, …...

K8s Pod CrashLoopBackOff 根因分析

Kubernetes作为容器编排领域的标杆&#xff0c;其Pod的CrashLoopBackOff状态是运维人员最头疼的问题之一。当Pod反复崩溃重启时&#xff0c;不仅影响业务连续性&#xff0c;还可能隐藏着更深层次的系统隐患。本文将深入剖析这一现象的典型诱因&#xff0c;帮助开发者快速定位问…...

2026届最火的AI写作方案实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 学术写作里&#xff0c;论文AI工具正发挥着越来越关键的作用&#xff0c;此类工具依靠自然语…...

「React + Resium 从零搭建三维地球,比你想象中简单」

官网地址&#xff1a;点我 一、效果预览 二、项目初始化 2.1 创建 React 项目 # 使用 Vite 创建 React TypeScript 项目 pnpm create vite react-cesium-starter --template react-ts cd react-cesium-starter# 或者使用 CRA&#xff08;不推荐&#xff0c;较慢&#xff09;…...

MindSpore 环境配置完全指南遮

前面我们对 Kafka 的整体架构和一些关键的概念有了一个基本的认知&#xff0c;本文主要介绍 Kafka 的一些配置参数。掌握这些参数的作用对我们的运维和调优工作还是非常有帮助的。 写在前面 Kafka 作为一个成熟的事件流平台&#xff0c;有非常多的配置参数。详细的参数列表可以…...

STEP3-VL-10B多场景应用:跨境电商商品图比对、APP界面兼容性测试

STEP3-VL-10B多场景应用&#xff1a;跨境电商商品图比对、APP界面兼容性测试 1. 引言 你有没有遇到过这样的烦恼&#xff1f;做跨境电商&#xff0c;供应商发来的商品图片和官网宣传图总有些细微差别&#xff0c;一件件人工核对眼睛都快看花了。或者&#xff0c;你的APP在不同…...

Halcon图像分析小技巧:除了平均亮度,Deviation灰度偏差能告诉你什么?

Halcon图像分析进阶&#xff1a;灰度偏差(Deviation)的深度应用与实战解析 在工业视觉检测领域&#xff0c;我们常常过于关注图像的"平均亮度"这一指标&#xff0c;却忽略了另一个同样重要的参数——灰度偏差(Deviation)。就像医生不能仅凭体温判断病人健康状况一样&…...

揭秘MySQL索引分类致

1. 架构背景与演进动力 1.1 从单体到碎片化&#xff1a;.NET 的开源征程 在.NET Framework 时代&#xff0c;构建系统主要围绕 Windows 操作系统紧密集成&#xff0c;采用传统的封闭式开发模式。然而&#xff0c;随着.NET Core 的推出&#xff0c;微软开启了彻底的开源与跨平台…...

CPLEX 2210 Linux安装指南:Python 3.7~3.10环境配置详解

1. 为什么选择CPLEX 2210&#xff1f; 如果你正在寻找一个强大的数学优化求解器&#xff0c;CPLEX绝对是个不错的选择。作为IBM旗下的商业优化软件&#xff0c;CPLEX在解决线性规划、混合整数规划等问题上表现优异。最新发布的2210版本对Python 3.7到3.10提供了更好的支持&…...

保姆级教程:用薛定谔Schrödinger Maestro搞定共价对接,从蛋白配体预处理到实战筛选

从零开始掌握薛定谔Maestro共价对接&#xff1a;药物化学家的实战指南 药物发现领域正在经历一场静默的革命——共价抑制剂重新成为研究热点。与传统的非共价结合药物不同&#xff0c;共价抑制剂能够与靶蛋白形成持久的化学键&#xff0c;往往表现出更高的效力和选择性。但如何…...

Ubuntu 24.04 + Wine 9.0 完美运行《文明5》中文版:DXVK配置全攻略

Ubuntu 24.04 Wine 9.0 完美运行《文明5》中文版&#xff1a;DXVK配置全攻略 当Linux游戏兼容性技术遇上经典策略游戏&#xff0c;会碰撞出怎样的火花&#xff1f;作为一款深度考验玩家战略思维的回合制游戏&#xff0c;《文明5》在Windows平台早已积累庞大粉丝群体。而如今&a…...

Spring Boot 缓存注解的实现原理

Spring Boot缓存注解的实现原理 在现代Web应用中&#xff0c;缓存是提升系统性能的重要手段之一。Spring Boot通过简洁的注解方式&#xff0c;为开发者提供了便捷的缓存功能&#xff0c;其底层实现原理既高效又灵活。本文将深入探讨Spring Boot缓存注解的核心机制&#xff0c;…...

从TransNet到TransNet V2:视频镜头边界检测的深度演进与实战解析

1. 视频镜头边界检测的痛点与需求 第一次接触视频剪辑的朋友可能会发现&#xff0c;把多段素材拼接成完整视频时&#xff0c;那些生硬的"咔哒"切换总显得不够专业。但你知道吗&#xff1f;就连识别这些剪辑点本身&#xff0c;对计算机来说都是个技术活。传统方法就像…...

Midscene.js:用自然语言轻松实现全平台UI自动化的终极解决方案

Midscene.js&#xff1a;用自然语言轻松实现全平台UI自动化的终极解决方案 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 还在为编写复杂的自动化脚本而烦恼吗&…...

HagiCode Desktop 混合分发架构解析:如何用 PP 加速大文件下载俺

一、Actor 模型&#xff1a;不是并发技巧&#xff0c;而是领域单元 Actor 模型的本质是&#xff1a; Actor 是独立运行的实体 Actor 之间只通过消息交互 Actor 内部状态不可被外部直接访问 Actor 自行决定如何处理收到的消息 Actor 模型真正解决的是&#xff1a; 如何在不共享状…...

AI开发-python-langchain框架(--并行流程 )僖

如果有多个供应商&#xff0c;你也可以使用 [[CC-Switch]] 来可视化管理这些API key&#xff0c;以及claude code 的skills。 # 多平台安装指令 curl -fsSL https://claude.ai/install.sh | bash ## Claude Code 配置 GLM Coding Plan curl -O "https://cdn.bigmodel.cn/i…...

卡希诺水溶肥怎么样好用吗?深度实测与农户口碑

在水溶肥市场中&#xff0c;卡希诺凭借 “智能肥” 定位脱颖而出&#xff0c;成为不少种植户的选择。这款肥料到底好不好用&#xff1f;从成分、效果、实用性等维度综合来看&#xff0c;卡希诺水溶肥是一款高效、全能、适配性强的优质肥料&#xff0c;能切实解决种植中的多种痛…...

前端内存泄漏排查指南:Chrome DevTools高级用法

前端内存泄漏排查指南&#xff1a;Chrome DevTools高级用法 在现代前端开发中&#xff0c;内存泄漏是一个常见但棘手的问题。随着单页应用&#xff08;SPA&#xff09;的普及&#xff0c;长时间运行的JavaScript代码可能导致内存占用持续增长&#xff0c;最终影响页面性能甚至…...

3分钟搞定Windows和Office激活:KMS_VL_ALL_AIO完全指南

3分钟搞定Windows和Office激活&#xff1a;KMS_VL_ALL_AIO完全指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗&#xff1f;还在为Office办公软件过期而头疼&am…...

UnrealPakViewer:终极指南!用免费图形化工具轻松解析虚幻引擎Pak文件

UnrealPakViewer&#xff1a;终极指南&#xff01;用免费图形化工具轻松解析虚幻引擎Pak文件 【免费下载链接】UnrealPakViewer 查看 UE4 Pak 文件的图形化工具&#xff0c;支持 UE4 pak/ucas 文件 项目地址: https://gitcode.com/gh_mirrors/un/UnrealPakViewer 你是否…...

蓝桥杯EDA省赛真题解析:从电路设计到实战技巧

1. 蓝桥杯EDA省赛真题核心考点剖析 参加蓝桥杯EDA竞赛的同学们都知道&#xff0c;省赛题目往往聚焦硬件设计的核心环节。从最近几届真题来看&#xff0c;以下几个模块出现频率最高&#xff1a; 首先是电源设计模块&#xff0c;这几乎是每届必考的内容。LDO线性稳压和BUCK开关电…...

零基础上手Qwen-Image-2512-ComfyUI,从环境搭建到实际出图完整教程

零基础上手Qwen-Image-2512-ComfyUI&#xff0c;从环境搭建到实际出图完整教程 你是否曾经被AI绘画的高门槛劝退&#xff1f;复杂的安装流程、晦涩的参数设置、繁琐的模型下载...这些障碍让许多创意人士望而却步。今天&#xff0c;我们将彻底改变这一现状&#xff0c;带你从零…...

OpenRouter 之后,中国企业需要怎样的 AI API 平台

随着 AI 应用的井喷&#xff0c;API 服务已成为企业降本增效、快速构建AI产品的“水电煤”。随之爆火的&#xff0c;还有 API 聚合平台——它将全球各大厂商、不同架构的 AI 模型统一集成到一个平台中。开发者和企业无需繁琐地逐一对接&#xff0c;就能轻松实现一站式调用与多模…...

ESPS USB MSC 调试全过程记录址

背景 在软件开发的漫长旅途中&#xff0c;"构建"这个词往往让人又爱又恨。爱的是&#xff0c;一键点击&#xff0c;代码变成产品&#xff0c;那是程序员最迷人的时刻&#xff1b;恨的是&#xff0c;维护那一堆乱糟糟的构建脚本&#xff0c;简直是噩梦。 在很多项目…...

Qwen3-0.6B-FP8低资源运行效果:在消费级GPU上的性能实测

Qwen3-0.6B-FP8低资源运行效果&#xff1a;在消费级GPU上的性能实测 最近在折腾本地部署大模型的朋友&#xff0c;可能都有过这样的体验&#xff1a;看着那些动辄几十亿、上百亿参数的“巨无霸”模型&#xff0c;再看看自己手头的显卡&#xff0c;只能默默叹气。显存不够、速度…...

营销自动化数据驱动 - 多源数据 OLAP 架构演进轿

1. 流图&#xff1a;数据的河流 如果把传统的堆叠面积图想象成一块块整齐堆叠的积木&#xff0c;那么流图就像一条蜿蜒流淌的河流&#xff0c;河道的宽窄变化自然流畅&#xff0c;波峰波谷过渡平滑。 它特别适合展示多个类别数据随时间的变化趋势&#xff0c;尤其是当你想强调整…...

Python点云实战:统计滤波算法原理剖析与代码实现

1. 统计滤波算法原理详解 第一次接触点云处理时&#xff0c;我被各种滤波算法搞得晕头转向。直到真正理解了统计滤波&#xff0c;才发现它其实就像小区物业筛选业主——通过分析住户的"社交距离"来判断谁是真正的业主&#xff0c;谁是可疑人员。这种算法特别适合处理…...

【Android】一键硬核锁手机

【Android】一键硬核锁手机 链接&#xff1a;https://pan.xunlei.com/s/VOpvlC-ER-sVlEs5wlB8GPbEA1?pwd9xz2# 一键硬核锁机&#xff1a;直接屏蔽视频、游戏、网页等功能&#xff0c;想玩手机&#xff1f;没门&#xff01;专治各种拖延症、手机依赖症&#xff01;想戒掉手机…...

从领域驱动到本体论:AI 时代的架构方法论变了簧

从0构建WAV文件&#xff1a;读懂计算机文件的本质 虽然接触计算机有一段时间了&#xff0c;但是我的视野一直局限于一个较小的范围之内&#xff0c;往往只能看到于算法竞赛相关的内容&#xff0c;计算机各种文件在我看来十分复杂&#xff0c;认为构建他们并能达到目的是一件困难…...