Solon AI 正试发布(支持 java8+,RAG,MCP)

Solon AI 正试发布了(版号,随 Solon v3.3.1)。历时小半年。

1、简介

Solon AI 是一个 Java AI(智能体) 全场景应用开发框架,提供有丰富的接口能力。主要支持的的智能体开发场景有:Chat;RAG;MCP;AiFlow。

其中 ChatModel 是 Solon AI 的核心模型接口(其它暂略),通过方言的方式(ChatDialect)可适配各种环境(或平台)提供的大语言模型。

2、历时回顾

时间回顾备注
2025-01 中Solon Flow 项目启动将为 Solon AI 编排提供支持
2025-01 底Solon AI 项目启动
2025-02 中设计 Solon AI 开放接口,和适配机制
2025-03 中Solon Expression 项目启动为 Solon AI RAG 知识库,提供统一的过滤表达式支持
2025-04 初Solon AI MCP 项目启动
2025-05 初Solon Flow Designer 项目启动(由 广东越洋科技有限公司 供献代码)
2025-05 中Solon AI Flow 项目启动使用 Solon Flow 编排 Solon AI 定制的任务组件

3、体验展示

  • ChatModel
public void call(ChatModel chatModel) throws IOException {
    chatModel.prompt("hello").call();
}

public void stream(ChatModel chatModel) throws IOException {
    chatModel.prompt("hello").stream();
}

public void toolCall(ChatModel chatModel) throws IOException {
    chatModel.prompt("今天杭州的天气情况?")
        .options(o -> o.toolsAdd(new WeatherTools())
        .call();
}

public void session(ChatModel chatModel) throws IOException {
    ChatSession chatSession = new ChatSessionDefault("session-1"); 
    
    chatSession.addMessage(ChatMessage.ofUser("今天杭州的天气情况?")); 
    
    chatModel.prompt(chatSession)
        .options(o -> o.toolsAdd(new WeatherTools())
        .stream();
}
  • RAG
public void init(ChatModel chatModel, RepositoryStorable repository) throws IOException {
    PdfLoader loader = new PdfLoader(new File("lzsite.pdf")).additionalMetadata("file", "lzsite.pdf");

    List<Document> documents = new SplitterPipeline() 
                    .next(new RegexTextSplitter("\n\n"))
                    .next(new TokenSizeTextSplitter(500))
                    .split(loader.load());

    repository.insert(documents);
}

public void search(ChatModel chatModel, RepositoryStorable repository) throws IOException {
    String query = "良渚遗址公司有哪些景点?"
    
    //知识库检索
    List<Document> context = repository.search(message);
    
    //消息增强
    ChatMessage message = ChatMessage.augment(query, context)
    
    chatModel.prompt(message).call();
}
  • MCP-server
@McpServerEndpoint(sseEndpoint = "/mcp/sse")
public class McpServerTool {
    @ToolMapping(description = "查询天气预报")
    public String getWeather(@Param(description = "城市位置") String location) {
        return "晴,14度";
    }

    @ResourceMapping(uri = "config://app-version", description = "获取应用版本号", mimeType = "text/config")
    public String getAppVersion() {
        return "v3.2.0";
    }
    
    @ResourceMapping(uri = "db://users/{user_id}/email", description = "根据用户ID查询邮箱")
    public String getEmail(@Param(description = "用户Id") String user_id) {
        return user_id + "@example.com";
    }

    @PromptMapping(description = "生成关于某个主题的提问")
    public Collection<ChatMessage> askQuestion(@Param(description = "主题") String topic) {
        return Arrays.asList(ChatMessage.ofUser("请解释一下'" + topic + "'的概念?"));
    }
}
  • MCP-client
public void client(ChatModel chatModel){
    McpClientProvider clientProvider = McpClientProvider.builder()
                .apiUrl("http://localhost:8080/mcp/sse")
                .build();
                
    String rst = clientProvider.callToolAsText("getWeather", Map.of("location", "杭州"))
                               .getContent();
                               
                               
    chatModel.prompt("杭州今天的天气怎么样?")
                .options(options -> { options.toolsAdd(clientProvider))
                .call();
}
  • AiFlow
id: helloworld
layout:
  - task: "@VarInput"
    meta:
      message: "你好"
  - task: "@ChatModel"
    meta:
      chatConfig: # "@type": "org.noear.solon.ai.chat.ChatConfig"
        provider: "ollama"
        model: "qwen2.5:1.5b"
        apiUrl: "http://127.0.0.1:11434/api/chat"
  - task: "@ConsoleOutput"

# flowEngine.eval("helloworld");

4、最近更新日志

  • 新增 solon-ai-flow 插件
  • 新增 solon-ai-load-ddl 插件
  • 添加 solon-ai-core ChatMessage:ofUser(media) 方法
  • 添加 solon-ai-core ChatSession:addMessage(ChatPrompt) 方法
  • 添加 solon-ai-core ChatSession:addMessage(Collection) 方法
  • 添加 solon-ai-core RerankingConfig,RerankingModel toString 方法
  • 添加 solon-ai-core 模型的网络代理支持(支持简单配置,和复杂构建)
  • 添加 solon-ai-mcp 客户端的网络代理简单配置支持
  • 添加 solon-ai-mcp messageEndpoint 端点配置支持(应对特殊需求,一般自动更好)
  • 添加 solon-ai-mcp ToolMapping,ResourceMapping 注解方法对 Produces 注解的支持(用它可指定结果转换处理)
  • 添加 solon-ai-mcp ToolCallResultConverter:matched 方法
  • 添加 solon-ai-mcp 资源模板的响应适配
  • 添加 solon-ai-mcp McpClientProvider:getResourceTemplates 方法
  • 添加 solon-ai-mcp 检查原语是否存在的方法(hasTool, hasPrompt, hasResource)
  • 添加 solon-ai-mcp 提示语支持 UserMessage 拆解成多条 mcp 内容(如果,同时有媒体和文本的话)
  • 优化 solon-ai-core tool 空参数时的不同大模型兼容性
  • 优化 solon-ai-core ChatSession 的作用,为限数提供支持
  • 优化 solon-ai-core MethodFunctionTool 移除对 Mapping 注解的支持(语意更清楚,之前 MethodToolProvider 已经移除,这个落了)
  • 优化 solon-ai-core EmbeddingRequest,ImageRequest,RerankingRequest 当 resp.getError() 非 null 时,直接出抛异常
  • 优化 solon-ai-mcp 取消 MethodFunctionResource 对反回类型的限制(增加了 resultConverter 转换处理)
  • 优化 solon-ai-mcp McpServerEndpointProvider 支持零添加原语,postStart 后,可添加原语
  • 修复 solon-ai ChatRequestDefault:stream 请求 r1 时,可能会产生两次 tink 消息发射
原创作者: noear 转载于: https://www.cnblogs.com/noear/p/18893165
### Solon AI MCP 示例代码与教程 Solon AI MCP 是一种用于构建 MCP 服务器的强大框架,支持多种 Java 版本(如 Java 8 及以上),并且可以轻松嵌入到其他流行的框架中,例如 Spring Boot、JFinal 和 Vert.x[^2]。 下面是一些关于如何使用 Solon AI MCP 进行 Java 开发的具体示例代码和教程。 #### 1. 安装与环境准备 首先,确保您的项目环境中包含了 Solon AI MCP 的依赖项。如果您在使用 Maven 构建工具,可以在 `pom.xml` 文件中添加以下内容: ```xml <dependency> <groupId>org.noear.solon</groupId> <artifactId>solon-ai-mcp</artifactId> <version>最新版本号</version> </dependency> ``` 此配置将导入 Solon AI MCP 所需的核心库[^3]。 #### 2. 创建一个简单的 MCP Server 接下来,我们将通过编写一些基本代码来启动一个 MCP Server。这里展示了一个非常基础的例子,演示了如何接收客户端请求并返回响应数据。 ##### 主程序入口 ```java import org.noear.solon.Solon; import org.noear.solon.core.AopContext; public class MainApp { public static void main(String[] args) { AopContext.context().scan("com.example.mcp"); Solon.start(MainApp.class, args); } } ``` 这段代码设置了扫描包路径以便自动加载控制器和其他组件,并启动了应用程序实例[^4]。 #### 3. 配置 Controller 处理 HTTP 请求 现在我们定义一个 controller 类用来处理传入的 HTTP 请求。假设我们要实现一个 RESTful API 接口,该接口接受 POST 方法并将接收到的信息回显给调用方。 ```java package com.example.mcp.controller; import org.noear.solon.annotation.Controller; import org.noear.solon.annotation.Mapping; import org.noear.solon.annotation.Param; import org.noear.solon.core.handle.ModelAndView; @Controller @Mapping("/api/mcp") public class McpController { @Mapping(value = "echo", method = "POST") public ModelAndView echo(@Param("message") String message){ ModelAndView mv = new ModelAndView(); mv.put("result", "Echo: "+message); return mv; } } ``` 在这个例子中,当有 POST 请求到达 `/api/mcp/echo` 路径时,参数中的 'message' 字段会被读取出来并通过视图模型对象返回给前端显示[^5]。 #### 4. 测您的新服务 最后一步就是测我们的新创建的服务是否常运作。您可以借助 Postman 或 curl 命令行工具向刚才部署好的 URL 发送模拟请求验证其行为表现。 例如,如果运行的是本地主机上的默认端口号 (通常是 8080),那么可以用下面这样的命令看效果: ```bash curl --location --request POST 'http://localhost:8080/api/mcp/echo' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'message=Hello World!' ``` 预期输出应该是类似于这样的一条记录: ```json { "result": "Echo: Hello World!" } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值