0 代码仓库地址

https://github.com/bblb-sjb/bao-openmanus

觉得项目不错的话辛苦点个star⭐~

1 引言

在这里插入图片描述

在之前的章节我们使用并探索过OpenManus。这是一个很好的开源项目,我们之前博客也介绍过,有兴趣的小伙伴可以去看下:https://bblb-sjb.blog.csdn.net/article/details/154429976?spm=1001.2014.3001.5502

本系列的目标是:抛开 Python,从零开始使用 Java 复刻 OpenManus 的核心功能,打造一个属于 Java 生态的通用 AI Agent。

本章作为开篇,我们将完成项目的基础环境搭建和核心框架的初始化。

2 技术选型

为了对标 Python 版本的生态,我们精心挑选了 Java 领域的最佳实践组件:

技术 版本 用途 Python 对应
Java 21 编程语言 Python 3.x
LangChain4j 0.29.1 LLM 集成 openai SDK
Playwright 1.40.0 浏览器自动化 browser-use

2.1 为什么使用java21?

之前的 RAG 项目我们使用了 Java 17,但本次选择 Java 21 的核心原因是 虚拟线程。

OpenManus Agent 需要频繁进行网络 IO(调用 LLM、操控浏览器),Python 版使用 async/await 协程来处理。而 Java 21 的虚拟线程让我们能以同步代码的风格编写高并发程序,既保留了代码的可读性,又拥有媲美协程的性能。

3 环境搭建

3.1 创建项目

使用 IDEA 创建一个新的 Spring Boot 项目,确保 JDK 选择 Java 21。
在这里插入图片描述

3.2 引入依赖

在pom.xml中添加

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.alibaba.manus</groupId>
    <artifactId>bao-openmanus</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <!-- Dependency Versions -->
        <spring-boot.version>3.2.0</spring-boot.version>
        <langchain4j.version>0.29.1</langchain4j.version>
        <playwright.version>1.40.0</playwright.version>
        <lombok.version>1.18.30</lombok.version>
        <jackson.version>2.16.0</jackson.version>
        <slf4j.version>2.0.9</slf4j.version>
        <logback.version>1.4.14</logback.version>
        <junit.version>5.10.1</junit.version>
    </properties>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- Spring Boot Starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- LangChain4j for LLM integration -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j</artifactId>
            <version>${langchain4j.version}</version>
        </dependency>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai</artifactId>
            <version>${langchain4j.version}</version>
        </dependency>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-anthropic</artifactId>
            <version>${langchain4j.version}</version>
        </dependency>

        <!-- Playwright for browser automation -->
        <dependency>
            <groupId>com.microsoft.playwright</groupId>
            <artifactId>playwright</artifactId>
            <version>${playwright.version}</version>
        </dependency>

        <!-- Lombok for reducing boilerplate -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- Jackson for JSON processing -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>${jackson.version}</version>
        </dependency>

        <!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>${logback.version}</version>
        </dependency>

        <!-- Configuration -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- Testing -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.11.0</version>
                <configuration>
                    <source>21</source>
                    <target>21</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
  1. Spring Boot Starter:提供依赖注入、自动配置等能力
  2. LangChain4j:LLM 集成库,支持 OpenAI、Anthropic 等
  3. Playwright:浏览器自动化工具
  4. Lombok:编译时生成 getter/setter 等代码
  5. Jackson:JSON 序列化/反序列化
  6. JUnit 5:单元测试框架

3.2 添加配置

为了灵活切换模型和调整参数,我们设计了如下配置结构。这里以阿里云百炼(兼容 OpenAI 协议)为例:

openmanus:
  llm:
    provider: openai
    api-key: "sk-your-api-key-here"  # 请替换为你的 API Key
    model: "qwen-flash"
    base-url: "https://dashscope.aliyuncs.com/compatible-mode/v1"
    max-tokens: 4096
    temperature: 0.0

    # Vision 模型配置 - 对应 Python: [llm.vision] (可选)
    vision:
      provider: openai  # 用于图像处理的模型
      api-key: "sk-your-vision-api-key-here"
      model: "qwen-plus"  # 例如:qwen-plus, gpt-4o
      base-url: "https://dashscope.aliyuncs.com/compatible-mode/v1"
      max-tokens: 4096
      temperature: 0.0

  # 浏览器配置 
  browser:
    headless: false
    disable-security: true
    max-content-length: 2000

  # Agent 配置
  agent:
    max-steps: 20
    workspace-root: "./workspace"

# Spring Boot 日志配置
logging:
  level:
    com.openmanus: INFO
    root: INFO

3.3 配置类实现

在com.openmanus.infrastructure.config.OpenManusConfig中添加配置信息

使用 @ConfigurationProperties 自动绑定 YAML 配置

package com.openmanus.infrastructure.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * OpenManus 配置类
 */
@Data
@ConfigurationProperties(prefix = "openmanus")
public class OpenManusConfig {

    /**
     * LLM 配置
     */
    @Data
    public static class LLMConfig {
        private String provider = "openai";
        private String apiKey = "sk-xxx";
        private String model = "qwen-flash";
        private String baseUrl = "https://dashscope.aliyuncs.com/compatible-mode/v1";
        private Integer maxTokens = 4096;
        private Double temperature = 0.0;

        /**
         * Vision 模型配置
         * 用于处理图像相关的任务
         */
        @Data
        public static class VisionConfig {
            private String provider = "openai";
            private String apiKey = "sk-xxx";
            private String model = "qwen-flash";
            private String baseUrl = "https://dashscope.aliyuncs.com/compatible-mode/v1";
            private Integer maxTokens = 4096;
            private Double temperature = 0.0;
        }

        private VisionConfig vision;
    }

    /**
     * 浏览器配置
     */
    @Data
    public static class BrowserConfig {
        private Boolean headless = false;
        private Boolean disableSecurity = true;
        private Integer maxContentLength = 2000;
    }

    /**
     * Agent 配置
     */
    @Data
    public static class AgentConfig {
        private Integer maxSteps = 20;
        private String workspaceRoot = "./workspace";
    }

    private LLMConfig llm = new LLMConfig();
    private BrowserConfig browser = new BrowserConfig();
    private AgentConfig agent = new AgentConfig();
}

4 启动类

我们实现 CommandLineRunner 接口,以便在 Spring 容器启动后直接执行 Agent 逻辑。

package com.openmanus;

import com.openmanus.infrastructure.config.OpenManusConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

/**
 * OpenManus Java 版本主入口 - 对应 Python 版本的 main.py
 *
 * 提供命令行交互界面,运行 Agent
 */
@Slf4j
@SpringBootApplication
@EnableConfigurationProperties(OpenManusConfig.class)
public class OpenManusApplication implements CommandLineRunner {

    @Autowired
    private OpenManusConfig config;

    public static void main(String[] args) {
        SpringApplication.run(OpenManusApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        log.info("Starting OpenManus Java Edition...");
        log.info("LLM Provider: {}", config.getLlm().getProvider());
        log.info("LLM Model: {}", config.getLlm().getModel());
        log.info("Configuration loaded successfully!");

        // 后续章节将在这里添加 Agent 初始化逻辑
    }
}

4.1 启动类测试

点击 IDE 的运行按钮,观察控制台日志:
在这里插入图片描述
说明基础脚手架搭建成功,配置读取无误。

5 总结

本章我们完成了 Java 版 OpenManus 的地基建设

下一章我们将着手领域模型设计,实现 OpenManus 的核心领域模型。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐