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

购买了域名之后怎么做网站百度知道app

购买了域名之后怎么做网站,百度知道app,一站式网络推广服务,天空台108网站找手工活带回家做SpringBoot 整合 MCP MCP MCP 协议主要分为: Client 客户端(一般就是指 openai,deepseek 这些大模型)Server 服务端(也就是我们的业务系统)我们要做的就是把我们存量系统配置成 MCP Server 环境 JDK17…

SpringBoot 整合 MCP

MCP

MCP 协议主要分为:

  • Client 客户端(一般就是指 openai,deepseek 这些大模型)
  • Server 服务端(也就是我们的业务系统)我们要做的就是把我们存量系统配置成 MCP Server

环境

  • JDK17
  • SpringBoot 3

引入依赖

        <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-core</artifactId><version>1.0.0-M6</version></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-spring-boot-autoconfigure</artifactId><version>1.0.0-M6</version></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>1.0.0-M6</version></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-server-webmvc-spring-boot-starter</artifactId><version>1.0.0-M6</version></dependency>

配置 yaml

spring:ai:openai:base-url: https://api.deepseek.comapi-key: sk-xxxxxxxx			# deepseek 的 api-keychat:enabled: trueoptions:model: deepseek-chat		# 使用这个模型temperature: 0.7stream-usage: true		# 有的模型不支持logging:level:org.springframework.ai: debug	# 开启 debug,打印思考链路

工具类

工具类的作用就是获取 springboot 里所有需要注册的 bean,这里是策略是 获取所有 “Controller”, “Service”, “Manager” 结尾的 bean,可以自行修改。

import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.framework.Advised;
import org.springframework.aop.support.AopUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;/*** Spring 框架工具类** @author wen7.online*/
@Slf4j
@Component
public class SpringTools{@Resourceprivate ApplicationContext applicationContext;/*** 获取所有 "Controller", "Service", "Manager" 结尾的 bean,里面的 @Tool 注解的方法作为大模型上下文 MCP** @return 所有 "Controller", "Service", "Manager" 结尾的 bean*/public List<Object> findToolCallbackBeans() {String[] suffixes = {"Controller", "Service", "Manager"};String[] excludeNames = {"AiController"};		//这里是因为在 AiController 里循环引用了Set<String> excludeSet = Arrays.stream(excludeNames).collect(Collectors.toSet());return Arrays.stream(applicationContext.getBeanNamesForAnnotation(Component.class)).filter(beanName -> {log.info("beanName: {}", beanName);Class<?> type = applicationContext.getType(beanName);if (type == null) return false;String simpleName = type.getSimpleName();if (excludeSet.contains(simpleName)) return false;return Arrays.stream(suffixes).anyMatch(simpleName.replace("$$SpringCGLIB$$0","")::endsWith);        //有可能获取的是代理对象,$$SpringCGLIB$$0 结尾}).map(applicationContext::getBean).collect(Collectors.toList());}public Object unwrapProxy(Object bean) {if (AopUtils.isAopProxy(bean)) { // 检查是否是代理对象try {Object target = ((Advised) bean).getTargetSource().getTarget();// 递归解包,确保多层代理情况下能获取到最终原始对象return unwrapProxy(target);} catch (Exception e) {return bean;}}return bean; // 非代理对象直接返回}}

配置类

mport com.quick.common.utils.spring.SpringTools;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Arrays;
import java.util.List;/*** ChatClient 配置*/
@Slf4j
@Configuration
public class ChatClientConfiguration {@Beanpublic ToolCallbackProvider toolCallbackProvider(SpringTools springTools) {List<Object> toolObjects = springTools.findToolCallbackBeans().stream().map(springTools::unwrapProxy)  // 获取源对象,防止代理原因.toList();//核心,把所有的 bean 注入,会自动读取 @Tool 注解MethodToolCallbackProvider provider = MethodToolCallbackProvider.builder().toolObjects(toolObjects.toArray()).build();List<ToolCallback> tools = Arrays.stream(provider.getToolCallbacks()).toList();tools.stream().forEach(tool->{log.info("Register Tool: {}.{}", tool.getName(),tool.getDescription());});return provider;}@Beanpublic ChatClient chatClient(ChatClient.Builder builder, ToolCallbackProvider toolCallbackProvider) {return builder.defaultSystem("""本系统是一个 SaaS 平台,分为平台,租户,用户每次操作 token 中携带了 tenantId有 tenantId 说明是租户内的雇员在操作,tenantId = 1 是平台管理员在操作,没有 tenantId 说明是用户在操作""").defaultTools(toolCallbackProvider).build();}
}

修改源码

主要在方法上添加注解,注意 name 有命名规范,不能是中文,最好类似 selectMenuIdsByRoleIds。

  • @Tool(name = "selectMenuIdsByRoleIds", description = "根据角色id列表查询菜单id列表")
    

还可以在字段,方法参数上添加

  • @ToolParam(description = "角色id列表")
    
    /*** 根据角色id查询菜单id** @param roleIds 角色id* @return 菜单id, 平铺, 去重*/@Tool(name = "selectMenuIdsByRoleIds", description = "根据角色id列表查询菜单id列表")public List<Long> selectMenuIdsByRoleIds(@ToolParam(description = "角色id列表") List<Long> roleIds) {List<RoleMenuPo> poList = roleMenuRepository.findByRoleIdIn(roleIds);List<Long> menuIdList = poList.stream().map(RoleMenuPo::getMenuId).distinct().collect(Collectors.toList());log.info("根据角色id查询菜单id, roleIds:{}, menuIdList:{}", roleIds, menuIdList);return menuIdList;}

配置聊天接口

import com.quick.ai.pojo.dto.ChatRequest;
import com.quick.common.utils.lang.StringUtils;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;import java.nio.charset.StandardCharsets;/*** ai 对话** @author wen7.online*/
@Slf4j
@RestController
@RequestMapping(value = "/ai", name = "ai聊天")
public class AiController {@Resourceprivate ChatClient chatClient;@PostMapping(value = "/v1/chat", name = "聊天")public String chat(@RequestBody ChatRequest chatRequest, HttpServletResponse response) {String userMessage = chatRequest.getMessage();log.info("用户问题 message:{}", userMessage);if (StringUtils.isEmpty(userMessage)) {return "";}String content = chatClient.prompt().user(userMessage).call().content();return new String(content.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);}//配置  produces = MediaType.TEXT_EVENT_STREAM_VALUE@PostMapping(value = "/v1/chat/stream", name = "聊天流式数据", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<String> chatStream(@RequestBody ChatRequest chatRequest) {String userMessage = chatRequest.getMessage();Flux<String> flux = chatClient.prompt().user(userMessage).stream().content();return flux;}}

接口访问

调用接口

http://127.0.0.1:8080/ai/v1/chat
http://127.0.0.1:8080/ai/v1/chat/stream

前端代码 vue3

https://wen7.online/social/social_wechat

实现效果

通过自然语言实现,调用内部函数或接口,
虽然略有瑕疵,但是 领导说了,先上线吧,以后慢慢优化
在这里插入图片描述

http://www.dtcms.com/wzjs/166253.html

相关文章:

  • 东莞网站建设备案济宁百度竞价推广
  • 安全的网站制作公司自己怎么制作一个网站
  • 南京做网站建设的公司竞价托管
  • 最好的网站建设报价野狼seo团队
  • 阿里云主机做网站2023年国家免费技能培训
  • 物流官方网站厦门seo网络推广
  • 怎么让百度收录你的网站百度权重是怎么来的
  • 网站开发各小组互评表南宁一站网网络技术有限公司
  • 株洲营销型网站建设全网推广成功再收费
  • 外贸网站 栏目百度推广可以自己开户吗
  • 金塔精神文明建设网站网店代运营诈骗
  • 手机网站排名优化广州:推动优化防控措施落
  • 国外网站怎么做推广站长申论
  • 网站开发课设域名批量查询注册
  • 网站分享平台7个经典软文营销案例
  • 嘉兴网站定制公司镇江网站建设方案
  • 毕业设计做 什么网站好百度如何做推广
  • 瓯海网站建设aso优化费用
  • 兰州建设网站公司线下推广宣传方式有哪些
  • 做网站内嵌地图广告联盟点击赚钱平台
  • 请为hs公司的钻石礼品网站做网络营销沟通策划_预算是20万.厦门关键词seo排名网站
  • 旅游网站建设初衷西安百度网站排名优化
  • 做购物网站是怎么连接银行谷歌推广外包
  • 如何建立自己的公司seo排名优化推广
  • 怎么做算命的网站太原百度快照优化排名
  • 要做网站照片怎么处理今天的三个新闻
  • 专门做萝莉视频网站seo是什么及作用
  • 网站建设员深圳百度推广电话
  • 专业商城网站设计友情链接交换网址大全
  • 店面设计师招聘淘宝关键词优化技巧教程