longchain4j 学习系列(4)-mcp调用

继续学习langchain4j,以下是langchain4j 调用MCP的示例:

1、添加pom依赖

1 <dependency>
2     <groupId>dev.langchain4j</groupId>
3     <artifactId>langchain4j-mcp</artifactId>
4     <version>1.1.0-beta7</version>
5 </dependency>
View Code

这里要注意版本号,不同的版本api细节略有不同。

2、Mcp Client初始化

/*** 初始化SSE客户端** @param sseUrl SSE服务器连接地址* @return McpClient实例*/
private static McpClient initSseClient(String sseUrl) {// 构建默认MCP客户端return new DefaultMcpClient.Builder().clientName("yjmyzz.cnblogs.com").protocolVersion("2024-11-05").toolExecutionTimeout(Duration.ofSeconds(10))// 配置HTTP传输层参数.transport(new HttpMcpTransport.Builder()// 设置SSE服务器连接URL.sseUrl(sseUrl)// 设置连接超时时间.timeout(Duration.ofSeconds(10))// 启用请求日志记录.logRequests(true)// 启用响应日志记录.logResponses(true).build()).build();
}

3、定义1个Assistant接口

    private interface Assistant {String chat(String userMessage);}

4、调用MCP

    /*** 直接获取订单状态信息** @param orderId 订单ID,用于查询指定订单的状态* @return ResponseEntity<String> 包含订单状态信息的响应实体,成功时返回订单状态JSON字符串,* 失败时返回包含错误信息的JSON字符串*/@GetMapping(value = "/order", produces = MediaType.APPLICATION_JSON_VALUE)public ResponseEntity<String> getOrderStatusDirect(@RequestParam String orderId) {McpClient mcpClient = null;try {// 初始化SSE客户端连接mcpClient = initSseClient("http://localhost:8070/sse");// 构建AI助手服务,配置聊天模型和工具提供者Assistant assistant = AiServices.builder(Assistant.class).chatModel(deepSeekChatModel).toolProvider(McpToolProvider.builder().mcpClients(mcpClient).build()).build();// 调用AI助手查询订单状态String response = assistant.chat("查询订单状态,订单号:" + orderId);return ResponseEntity.ok(response);} catch (Exception e) {log.error("查询订单状态时发生错误", e);return ResponseEntity.ok("{\"error\":\"查询订单状态失败: " + e.getMessage() + "\"}");} finally {// 确保MCP客户端连接被正确关闭if (mcpClient != null) {try {mcpClient.close();} catch (Exception e) {log.error("关闭MCP客户端时发生错误", e);}}}}

注:这里的mcp server 可参考 spring-ai 学习系列(5)-MCP(webflux sse)

image

日志:

2025-10-03T20:30:43.277+08:00  INFO 18312 --- [longchain4j-study] [nio-8080-exec-2] d.l.http.client.log.LoggingHttpClient    : HTTP request:
- method: POST
- url: https://api.deepseek.com/chat/completions
- headers: [Authorization: Beare...00], [User-Agent: langchain4j-openai], [Content-Type: application/json]
- body: {"model" : "deepseek-chat","messages" : [ {"role" : "user","content" : "查询订单状态,订单号:25070602"} ],"temperature" : 0.7,"stream" : false,"max_tokens" : 2048,"tools" : [ {"type" : "function","function" : {"name" : "queryOrderStatus","description" : "根据订单号查询订单状态","parameters" : {"type" : "object","properties" : {"orderNo" : {"type" : "string","description" : "订单号,格式为8位数字,比如:25070601"}},"required" : [ "orderNo" ]}}} ]
}...2025-10-03T20:30:45.770+08:00  INFO 18312 --- [longchain4j-study] [nio-8080-exec-2] d.l.http.client.log.LoggingHttpClient    : HTTP request:
- method: POST
- url: https://api.deepseek.com/chat/completions
- headers: [Authorization: Beare...00], [User-Agent: langchain4j-openai], [Content-Type: application/json]
- body: {"model" : "deepseek-chat","messages" : [ {"role" : "user","content" : "查询订单状态,订单号:25070602"}, {"role" : "assistant","content" : "我来帮您查询订单号为25070602的订单状态。","tool_calls" : [ {"id" : "call_00_QnwEmctjY5kaQf5MEQ5C2i9Y","type" : "function","function" : {"name" : "queryOrderStatus","arguments" : "{\"orderNo\": \"25070602\"}"}} ]}, {"role" : "tool","tool_call_id" : "call_00_QnwEmctjY5kaQf5MEQ5C2i9Y","content" : "\"订单号:25070602,订单状态:已完成\""} ],"temperature" : 0.7,"stream" : false,"max_tokens" : 2048,"tools" : [ {"type" : "function","function" : {"name" : "queryOrderStatus","description" : "根据订单号查询订单状态","parameters" : {"type" : "object","properties" : {"orderNo" : {"type" : "string","description" : "订单号,格式为8位数字,比如:25070601"}},"required" : [ "orderNo" ]}}} ]
}

 

文中代码:GitHub - yjmyzz/langchain4j-study at day04

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/973976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 学习路线可按「基础→进阶→实战→架构」四阶段推进

一、基础入门阶段(1-2个月) 核心目标:掌握Java语法和基本编程思维,能独立写简单程序。 核心知识点: 环境搭建(JDK安装、IDEA使用、环境变量配置) 基础语法(变量、数据类型、运算符、流程控制、数组) 面向对象…

Jetson Orin Nano super -2 烧录概念及必要性

一、什么是烧录?(核心定义) 烧录(又称 “写入”“刷写”)是指 将预先打包好的系统镜像、程序固件或驱动文件,通过专用工具和协议,写入嵌入式设备(如 Jetson 开发板、单片机)的存储介质(如 eMMC、SD 卡、NVMe…

blog搬迁

博客已经搬迁到https://langx1ng.github.io/处我要吃炸鸡

102302122许志安作业3

要求:指定一个网站,爬取这个网站中的所有的所有图片,例如中国气象网(http://www.weather.com.cn)。实现单线程和多线程的方式爬取。 代码如下: import os import requests from bs4 import BeautifulSoup from u…

iPhone14系列电池容量多少毫安

iPhone 14:3279mAhiPhone 14 Plus:4325mAhiPhone 14 Pro:3200mAhiPhone 14 Pro Max:4323mAh作为对比iPhone 13 / Pro 系列电池容量:iPhone 13 mini:2406mAhiPhone 13:3227mAhiPhone 13 Pro:3095mAhiPhone 13 P…

ipc linux

在 Linux 中,IPC(Inter-Process Communication,进程间通信) 是一种让不同进程之间进行数据交换和协作的机制。常见的 IPC 方式包括:1. 管道(Pipe)用途:用于父子进程之间传递数据。命令示例:cat file1 | grep …

读 《d2l:Chapter3. 线性神经网络 》随笔

讲一下Softmax回归 先说说自带mnist等库中的one-hot encoding 就是:一个向量,分量 (Row) == 类别 如: A、B、C 对应 \((1, 0, 0)\)、\((0, 1, 0)\)、\((0, 0, 1)\) 注:全连接层: 不同层使用线性连接 \(softmax\)运…

错排的

1.关键错排的理解 当1不放在k时 n个元素去掉k而k原来的位置可以看成1现在的位置(不能放的)变成了n-1个元素的错排 2.记忆化搜索 你后面要写函数啊 include <bits/stdc++.h> using namespace std; long long dp…

ipad学linux

iPad 并不是 Linux 系统,它是一款 iOS 设备,运行的是 Apple iOS 操作系统。因此,无法直接在 iPad 上运行 Linux。不过,你可以通过以下几种方式在 iPad 上使用 Linux:? 一、在 iPad 上运行 Linux(通过虚拟机或容…

iPadOS16有什么新功能

1、信息 App 为用户带来高效协作新方式2、一款协作类新 App 全面支持 Apple Pencil,让用户能在同一块灵活的画布上实时进行查看、分享和协作3、邮件 App 推出的全新搜索功能可得到相关性更高、更准确、更完整的搜索结…

ipad linux

您提到的 "iPad Linux" 实际上是 iPad 无法直接运行 Linux 的一个常见误解。iPad 是苹果公司生产的触摸屏设备,基于 iOS 系统,而 Linux 是一个开源操作系统,通常运行在桌面或服务器设备上。如果您是想在 …

ip 查看linux

ip 是一个用于查看和管理网络接口的命令行工具,常用于查看网络接口的状态、配置信息、路由表等。以下是 ip 命令的一些常见用法和示例:一、查看网络接口状态ip a显示所有网络接口的详细信息,包括接口名、IP 地址、子…

从上下文工程到组织知识管理重构——HRBP在人机协同时代的新使命 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:蓝色星球如何打造能与企业共同进化的灵活系统

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

第七讲上自监督学习self-supervised learning-BERT

第七讲自监督学习self-supervised learning 常见的自监督模型大小:BERT<GPT<SWITCH 监督学习(supervised learning):有标签 自监督学习(self-supervised learning):没标签(属于无监督学习的一种类型)自…

内网渗透过程的多种代理搭建方法

在渗透的时候或多或少都会遇到各种不同的内网环境 因此我们拿下目标的外网资产后除了隐蔽自己外还有一个重要的步骤就是搭建内网代理,用外围机器作为跳板去攻击内网其他靶机 1.Neo-reGeorg reGeorg是一个老牌搭建内网…

男女生排列 女生的一定千万别忘了

进步就是我的代码模板化了不少 递推式再写一次include <bits/stdc++.h> using namespace std; long long dp[55]; long long f(int x) { if(dp[x]!=-1) return dp[x]; return dp[x]=f(x-4)+f(x-2)+f(x-1); } int…

2025年11月上海专业防水补漏推荐!Top5口碑公司实测,先检测后施工有保障

随着建筑防水需求的不断升级,市场对专业防水补漏服务的要求日益严苛。本榜单基于技术实力、服务范围、施工质量和客户口碑四大维度,结合行业数据与用户反馈,对上海地区主流防水补漏企业进行综合评测,为消费者和企业…

商品推荐系统-FAISS召回

1. 背景与挑战 在互联网电商、内容平台等实际业务中,商品库动辄百万量级,如何为每位用户从海量商品中迅速召回个性化、高相关的候选商品,是推荐系统最基础也最关键的一环。 如果只依赖商品的原始属性(如标题、描述…

AI 时代,.NET 开发者是向左还是向右?

**AI时代,.NET开发者不是向左还是向右的问题,****而是如何用自己最擅长的技术,抓住AI红利的问题。**AI 时代,.NET 开发者向左还是向右?Microsoft Agent Framework vs LangChain 1.0 —— 一场关乎未来的技术选择开…