跳至主要內容
2025年第25周开源学习周报

ClassFinal

https://gitee.com/roseboy/classfinal

ClassFinal是一款java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework;可避免源码泄漏或字节码被反编译。

功能特性

  • 无需修改原项目代码,只要把编译好的jar/war包用本工具加密即可。
  • 运行加密项目时,无需求修改tomcat,spring等源代码。
  • 支持普通jar包、springboot jar包以及普通java web项目编译的war包。
  • 支持spring framework、swagger等需要在启动过程中扫描注解或生成字节码的框架。
  • 支持maven插件,添加插件后在打包过程中自动加密。
  • 支持加密WEB-INF/lib或BOOT-INF/lib下的依赖jar包。
  • 支持绑定机器,项目加密后只能在特定机器运行。
  • 支持加密springboot的配置文件。

悟空...大约 1 分钟
MCP 源码解析 2

思考题

上述 4 种 MCP 的传输实现方式,具体业务场景中应该如何选型?

思路:本地 / 调试:如果只是同机启动或者做调试,用 stdio 最简单;浏览器或 HTTP 服务:前端无法直接用 stdin/stdout,可用 SSE+POST,它在所有浏览器里原生支持;可靠生产:若要在 HTTP/1.1 上做断连重连、流复用、可恢复推流,就选 Streamable HTTP;高性能双向:需要真正双向、低延迟、长连接,且网络允许 WS 的场景,则用 WebSocket。

如果部署在不稳定的网络环境下,希望在 WebSocket 链路失败后自动切换到 HTTP + SSE,再切回 WebSocket,你会如何在 Host/ClientSession 层设计这一机制?哪些事件或回调最合适触发重连或降级?


悟空...大约 2 分钟
09、mcp promt

思考题

思考题 1、应该将动态获取到的 prompt_list 利用起来,通过用户输入和 prompt_list 进行匹配,然后传给 client.use_prompt() 方法。我写了一个扩展的 client 和 扩展的 server,且增加了一种提示词用于重构代码。

另外修复了当角色为 system 报错的问题。详见 PR:https://github.com/huangjia2019/mcp-in-action/pull/3/commits


悟空...小于 1 分钟
安装依赖

python3 --version

pip install uv

brew install swig

uv run .

pip install faiss-cpu


悟空...小于 1 分钟
MCP协议源码解析 1

文章中的遇到的问题

问题 1、Generic 没有这个枚举值 ReceiveResultT

ReceiveResultT # 我们会接收的 Response(Result)类型

image-20250624090804820
image-20250624090804820

悟空...大约 16 分钟
A2A 协议学习

启动专门负责汇率计算的 Agent

该 Agent 能够实时的访问各种国家的货币汇率信息。

image-20250619091923344
image-20250619091923344
 uv run .      
INFO:__main__:Starting server on localhost:10000
INFO:     Started server process [42799]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://localhost:10000 (Press CTRL+C to quit)
INFO:     127.0.0.1:59793 - "GET / HTTP/1.1" 405 Method Not Allowed
INFO:     127.0.0.1:59793 - "GET /favicon.ico HTTP/1.1" 404 Not Found
INFO:     127.0.0.1:60325 - "GET /.well-known/agent.json HTTP/1.1" 200 OK
INFO:     127.0.0.1:63998 - "GET /.well-known/agent.json HTTP/1.1" 200 OK
INFO:common.server.task_manager:Upserting task b0b996b7-252f-44f7-8674-6c190d1ad105



WARNING:langchain_google_genai.chat_models:Retrying langchain_google_genai.chat_models._chat_with_retry.<locals>._chat_with_retry in 2.0 seconds as it raised RetryError: Timeout of 600.0s exceeded, last exception: 503 failed to connect to all addresses; last error: UNAVAILABLE: ipv4:172.253.117.95:443: Failed to connect to remote host: Timeout occurred: FD shutdown.

悟空...小于 1 分钟
我是如何学习 MCP 和 A2A 的

你好,我是悟空。

看过我写的原创文章的读者朋友,应该都知道我最近在写 AI 相关的文章,前几天就发布一个 我自己写的AI 编程助手的小册深入浅出编程智能体

在编写这个小册的过程中,我看了很多关于 MCP 协议的文章,最令我印象深刻的是黄佳老师的《MCP & A2A 前沿实战》,整体的内容如下:


悟空...大约 3 分钟
申请阿里百炼 api key

阿里百炼

https://bailian.console.aliyun.com/?tab=model#/api-key

遇到的问题和经验总结:
1、示例中的 openai 不是一般人能用的,首先得学术上网,然后还得申请一个 openai 的 api key,还需要充值。
2、.env 文件需要自己创建一个,Google 的那个 api key 不需要。如果你访问不了 openai,就用阿里云百炼。官网:https://bailian.console.aliyun.com/?tab=model#/api-key
3、示例代码的文件名和目录名和文章中的不一样,需要自己调整下,比如 client 和 server 目录,特别注意 client 中的有个 mcp server 的路径,是一个绝对路径,我用的 MacOS,路径前面一段必须是 “/Users/wukong/”,不能是“~”,否则会报找不到路径。
4、我用的 deepseek 作为推理大模型, 直接用这个命令跑就行,uv run client-v3-deepseek.py ../rag-server/server.py
5、索引的文档只有几种病症,都放在 medical_docs 变量里面在,如果你输入一个 感冒,就会检索不到。不要以为是程序问题,自己再一个文档丢进去就行。
6、另外我做了一个好玩的事情,我加了一个感冒的文档,但是对感冒的描述是错的,最后的现象是 能检索到这个文档,但是将问题+文档检索到的内容丢给大模型时,大模型会告诉我文档有明显的问题。AI 回答:“根据提供的文档内容,关于感冒的描述存在明显错误或不准确的信息。文档中提到的感冒特征为"血糖水平持续降低"[5],这与医学上对感冒(上呼吸道病毒感染)的认知完全不符。”
7、将 openai 替换为 阿里云百炼的代码如下。官网文档有示例代码,需要注意的是维度需要改成一样的,1536。
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"), # 如果您没有配置环境变量,请在此处用您的API Key进行替换
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" # 百炼服务的base_url
)


悟空...大约 2 分钟
历时一个月,我的「编程智能体」学习小册免费开源了,共 12 讲

你好,我是悟空。

上个月我实践了「编程智能体」的应用和开发实践,总结了 12 篇文章,汇总成了一本小册,开源免费,欢迎学习探讨。

给这个小册取个容易记住的名字:《深入浅出编程智能体 CodeBuddy(天宫版)》

CodeBuddy 这款 AI 编程智能体具有很强的编程能力,可以为自己打工。我们可以借助它,用自然语言编程,AI 自主完成多文件代码生成和改写,让灵感即刻落地。

小册文章汇总

01 | CodeBuddy Craft,我的 AI 编程“搭子”


悟空...大约 4 分钟