当前位置: 首页 > 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 …...

高性能客服系统技术内幕:通过 SpinWait 自旋等待结构体提升高频消息分发性能痹

1. 智能软件工程的范式转移:从库集成到原生框架演进 在生成式人工智能(Generative AI)从单纯的文本生成向具备自主规划与执行能力的“代理化(Agentic)”系统跨越的过程中,.NET 生态系统正在经历一场自该平台…...

Kafka-King:现代化Kafka管理GUI工具的技术解析与使用指南

Kafka-King:现代化Kafka管理GUI工具的技术解析与使用指南 【免费下载链接】Kafka-King A modern and practical kafka GUI client 💕🎉Kafka-King 是一款现代化、实用的 Kafka GUI 客户端,旨在通过直观的桌面界面简化 Apache Kafk…...

LinkSwift:八大网盘直链解析引擎,开源智能下载加速方案

LinkSwift:八大网盘直链解析引擎,开源智能下载加速方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动…...

【信奥业余科普】02:给机器注入灵魂的两位天才——图灵与冯·诺依曼

第二篇信奥基础知识科普:了解“计算机科学之父”图灵与“现代计算机之父”冯诺依曼的伟大构想,以及现代计算机体系结构的基础奠定。 计算机硬件 写在前面的话:这是一系列专为对信奥(信息学奥赛)感兴趣的中小学生及家…...

2026年最新:直接填内容自动排版的简历工具测评,5款AI加持的简历制作神器

引言:2026年,简历不再只是文字堆砌步入2026年,求职市场的竞争态势愈发白热化。如今,一份简历不再仅仅是工作经历和教育背景的简单罗列,它更是求职者专业能力、个人品牌和求职意愿的综合体现。传统的手动排版、反复修改…...

WarcraftHelper完全指南:让魔兽争霸III在现代系统重获新生

WarcraftHelper完全指南:让魔兽争霸III在现代系统重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏魔兽争霸III在Wi…...

Python 3D游戏开发实战:Ursina引擎从入门到精通

1. 为什么选择Ursina引擎开发3D游戏 如果你正在寻找一个简单易用的Python 3D游戏引擎,Ursina绝对值得一试。作为一个基于Panda3D的轻量级封装,Ursina让3D游戏开发变得前所未有的简单。我最初接触它时,就被它简洁的API设计所吸引——用不到10行…...

产品经理年度述职全攻略:从职责梳理到未来规划的完整指南

1. 年度述职的核心价值与准备要点 每到年底,产品经理们都会面临一场"年终大考"——述职报告。这不仅是展示个人价值的舞台,更是系统复盘工作、规划未来的重要契机。我经历过7次年度述职,从最初的照本宣科到现在的游刃有余&#xff…...

非标三菱PLC伺服六轴程序实战解析:成熟可靠案例,适用于三菱FX3U系列PLC电气爱好者参考

非标三菱PLC伺服六轴程序 此程序已经实际设备上批量应用,用了六个伺服电机,程序成熟可靠,借鉴价值高,程序有注释,用的三菱FX3U系列plc。 是入门级三菱FX3U PLC电气爱好从业人员借鉴和参考经典案列。最近在车间调试一套…...

《数论探微:进阶版》(Arithmetic Tales: Advanced Edition)伪

一、核心问题及解决方案(按踩坑频率排序) 问题 1:误删他人持有锁——最基础也最易犯的漏洞 成因:释放锁时未做身份校验,直接执行 DEL 命令删除键。典型场景:服务 A 持有锁后,业务逻辑耗时超过…...

保姆级 uPyPi 教程|从 到 :MicroPython 驱动包一键安装 + 分享全攻略交

这个代码的核心功能是:基于输入词的长度动态选择反义词示例,并调用大模型生成反义词,体现了 “动态少样本提示(Dynamic Few-Shot Prompting)” 与 “上下文长度感知的示例选择” 的能力。 from langchain.prompts impo…...

猫抓Cat-Catch:革命性网页资源智能捕获工具

猫抓Cat-Catch:革命性网页资源智能捕获工具 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾在浏览网页时,看到心仪…...

.NET 诊断技巧 | 日志框架原理、手写日志框架学习赡

一、 什么是 AI Skills:从工具级到框架级的演化 AI Skills(AI 技能) 的概念最早在 Claude Code 等前沿 Agent 实践中被强化。最初,Skills 被视为“工具级”的增强,如简单的文件读写或终端操作,方便用户快速…...

从“微信群聊”理解HGNN:给算法工程师的超图神经网络直觉构建指南

超图神经网络直觉指南:用微信群聊思维重构高阶关系建模 想象一下,你被拉进了一个学术讨论群,群里既有计算机视觉专家,也有自然语言处理研究员,还有几位跨领域的学者。每次有人发言,信息并非只传递给某一个人…...

用ESP32-S3和LVGL做个桌面天气站:从硬件接线到API调用的完整流程

用ESP32-S3和LVGL打造高颜值桌面天气站:从硬件选型到动态UI的全栈指南 在创客圈里,ESP32系列开发板早已成为物联网项目的标配,而S3版本凭借双核240MHz主频、8MB PSRAM和丰富的外设接口,更是将性能提升到了新高度。这次我们要做的&…...

D3KeyHelper终极指南:5步打造暗黑3智能操作体系

D3KeyHelper终极指南:5步打造暗黑3智能操作体系 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款基于AutoHotkey开发的图…...

SkillsVote:从技能目录走向终极技能网关(Ultimate Skill Gateway)

成千上万个 skills 摆在面前,你的 Agent 为什么还是不会干活? 2025 年底 Anthropic 把 Agent Skills 规范作为开放标准发布,OpenAI 在 Codex CLI 里跟进了同一套格式,Cursor、Gemini CLI 也陆续接入。有人说 2026 是"Agent …...

从LSB到MSB:位平面分割在图像隐写与压缩中的实战解析

1. 什么是位平面分割? 第一次听说"位平面分割"这个词时,我也是一头雾水。直到有一天我在处理一张老照片时,发现即使删除了某些数据,照片看起来依然清晰,这才恍然大悟。位平面分割(Bit-Plane Sli…...

第5篇 | SOA实践启示录:从信号到服务,AUTOSAR的架构跃迁

2025年底,L2级辅助驾驶渗透率已接近60%,汽车正从“功能堆叠”走向“服务化”。AUTOSAR Adaptive平台是这场变革的技术底座。 SOME/IP服务接口详解 SOME/IP将服务接口分为三类: Method:请求-响应式操作(如SetTargetTe…...

大型欧姆龙PLC NJ系列ST语言Ethercat总线24轴 伺服电池生产线欧姆龙PLC程序大...

大型欧姆龙PLC NJ系列ST语言Ethercat总线24轴 伺服电池生产线欧姆龙PLC程序大型程序NJ系列 ST语言EtherCat总 线控制24个伺服轴大型程序电池生产线 包括PLC NJ-1400和威纶通触摸屏程序 PLC通过EtherCat总线连接24个IS620N伺服 伺服轴已经写好FB块,可以直接复制粘贴 …...

第4篇 | 功能安全的底层悖论:AUTOSAR的安全机制真的足够安全吗?

ISO 26262要求ASIL C和D等级的系统必须检测:定时和执行故障、内存故障、信息交换故障。AUTOSAR 4.x提供了看门狗、E2E保护、内存分区等机制,但仍有盲区。 定时故障检测的盲区 AUTOSAR的Watchdog Manager可以监控任务是否“卡死”(长时间不喂狗),但它无法检测任务的无限期阻…...

基于Carsim与Simulink联合仿真的汽车ESP系统单侧双轮制动控制模型与说明

汽车ESP系统仿真建模,基于carsim与simulink联合仿真做的联合仿真,采用单侧双轮制动的控制方法。 有完整的模型和说明 汽车电子稳定程序(ESP)就像车辆的"防上头助手",关键时刻一把拽住快要失控的车身。但要让…...

LeetCode 最长回文子串:python 题解苑

1 实用案例 1.1 表格样式生成 本示例用于生成包含富文本样式与单元格背景色的Word表格文档。 模板内容: 渲染代码: # python-docx-template/blob/master/tests/comments.py from docxtpl import DocxTemplate, RichText # data: python-docx-template/bl…...

OpenFace 2.2.0:如何用开源工具包实现精准面部行为分析?

OpenFace 2.2.0:如何用开源工具包实现精准面部行为分析? 【免费下载链接】OpenFace OpenFace – a state-of-the art tool intended for facial landmark detection, head pose estimation, facial action unit recognition, and eye-gaze estimation. …...

Legacy-iOS-Kit:终极iOS降级与越狱完整指南

Legacy-iOS-Kit:终极iOS降级与越狱完整指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 你是否有一…...

2026 AI 技术十大趋势:大模型、Agent 与边缘智能的全面爆发

前言2026 年,人工智能技术迎来前所未有的爆发式发展。从大模型能力的持续突破,到 AI Agent 的广泛应用,再到边缘智能的普及,AI 正在重塑每一个行业。一、大模型进入百万上下文时代2026 年,主流大模型的上下文窗口已突破…...

Zotero SciPDF插件终极指南:3步实现文献PDF自动下载的完整方案

Zotero SciPDF插件终极指南:3步实现文献PDF自动下载的完整方案 【免费下载链接】zotero-scipdf Download PDF from Sci-Hub automatically For Zotero7 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-scipdf 你是否曾因找不到论文PDF而焦虑&#xff1…...

Go赋值操作的关键细节

一、: 短变量声明的细节1.作用域规则2.重复声明规则3类型推断二、 赋值操作的细节1.类型必须匹配2.多重赋值特性三、 零值初始化细节1.Go为所有类型提供零值四、指针赋值的细节1.基本指针操作理解这段代码的关键在于搞清楚两个概念:普通变量、指针变量,…...

Java生产者消费者模式实战解析

Java生产者消费者模式实战解析异步模式传统版改进版阻塞队列异步模式 传统版 异步模式之生产者/消费者: class ShareData {private int number 0;private Lock lock new ReentrantLock();private Condition condition lock.newCondition();public void increm…...