魏晓东 发表于 2025-3-12 18:38:56

本地部署 OpenManus 保姆级教程(Windows 版)

一、环境搭建

我的电脑是Windows 10版本,其他的没实验,假如各人系统和我的差别等,请自行判定,根本上没什么大的收支啊。
openManus的Git地址:https://github.com/mannaandpoem/OpenManus
根据官网的两种安装推荐方式如下:
https://i-blog.csdnimg.cn/direct/fbf7c6073cab43a1b421180602f4e02e.png
这里我利用第一只方式,固然推荐了利用UV,但是我利用过,就不消第二种方式。
二、Anaconda下载

我电脑上没有安装:Anaconda,那就一并安装一下吧
这里推荐两种下载方式一是官网下载,二是镜像下载;官网下载太慢可选用镜像下载。
官网下载:https://www.anaconda.com/products/distribution
https://i-blog.csdnimg.cn/direct/b37eb70c70e44491938c83f5ec5ba06c.png
镜像下载:https://mirrors.bfsu.edu.cn/anaconda/archive/
https://i-blog.csdnimg.cn/direct/e340a02658e64fd5b888582f7bc8e020.png
我这里选择了Anaconda3-5.3.1-Windows-x86_64.exe这个镜像版本,各人随意啊。
具体Anaconda怎样安装的,各人自行搜索啊,这里就不赘述了。
三、焦点组件安装

为了方便不知道怎样安装的,我也偷懒一下,也是直接利用deepseek帮我搞一下:
https://i-blog.csdnimg.cn/direct/39db583002cd45cc80c655a65bc165f4.png
https://github.com/mannaandpoem/OpenManus
我在学习如何使用open-manus,但是下面的安装步骤,是在linux中运行的,我的电脑是window10 ,请把下面的操作步骤换成windows10中的步骤,让我一目了然
使用 conda
创建一个新的 conda 环境:
conda create -n open_manus python=3.12
conda activate open_manus
克隆存储库:
git clone https://github.com/mannaandpoem/OpenManus.git
cd OpenManus
安装依赖项:
pip install -r requirements.txt

为了方便各人快速搭建,直接贴了我的提示词,运行结果如下:
以下是为 Windows 10 系统适配的详细步骤(使用 Anaconda):

1. 安装前置工具
- 确保已安装 (https://git-scm.com/download/win)
- 确保已安装 (https://docs.conda.io/en/latest/miniconda.html)

2. 打开 Anaconda Prompt(推荐)或 PowerShell

3. 创建 conda 环境
```powershell
conda create -n open_manus python=3.12 -y
conda activate open_manus

[*]克隆堆栈
git clone https://github.com/mannaandpoem/OpenManus.git
cd OpenManus

[*]安装依赖
pip install -r requirements.txt
常见问题解决方案:

[*] 假如遇到环境激活问题:

[*]在 PowerShell 中初次利用需实行:conda init powershell
[*]关闭后重新打开终端

[*] 假如缺少 C++ 编译工具(安装某些包时报错):
安装 Microsoft C++ Build Tools
[*] 假如 Python 3.12 不可用:
conda create -n open_manus python=3.11

[*] 替代克隆方式(假如 git 不可用):
直接下载 ZIP:https://github.com/mannaandpoem/OpenManus/archive/refs/heads/main.zip
解压后进入目录实行后续步骤
至此已经本地已经安装完毕了。
四、服务设置与连接

https://i-blog.csdnimg.cn/direct/401ca8105ea840baacfe5838d783be61.png
找到Config文件夹,进去,重新复制一份config.toml文件
https://i-blog.csdnimg.cn/direct/d1605f9ff83a43d3a0e4ff6375a7986b.png
这里替换config文件设置:
# Global LLM configuration

model = "Qwen/QwQ-32B"
base_url = "https://api.siliconflow.cn/v1"
api_key = "这里写你自己的Key"
max_tokens = 16384
temperature = 0.6

# Optional configuration for specific LLM models

model = "Qwen/Qwen2-VL-72B-Instruct"
base_url = "https://api.siliconflow.cn/v1"
api_key = "这里写你自己的Key"
这里我利用的硅基流动Key,他们家刚好有运动,注册就送你2000万Tokens,我们这边测试用,完全够了,薅羊毛地址是:https://cloud.siliconflow.cn/i/pCa1dBVX
各人有其他的Key,也是可以用,随本身的意愿。
设置完毕之后,接下来就是运行main.py
https://i-blog.csdnimg.cn/direct/6708523593474e229a78cb3cd5819ab5.png
至此,流程根本已经开始跑起来了。
五、前端页面

由于是控制台我不喜欢,然后我又用deepseek帮我制作了html页面,便于我页面处理:
https://i-blog.csdnimg.cn/direct/4eae44bf9a2242f9882d73441a587510.png
这里就写了2个文件
https://i-blog.csdnimg.cn/direct/171d43033b1b4033a4a69eee51e4921e.png
https://i-blog.csdnimg.cn/direct/b7bdedcfbb9843ee906e92cc67c16f9e.png
主要两个文件:app.py和templates/index.html
两个文件的具体代码如下:
app.py:
from flask import Flask, Response, request, jsonify, render_template
from flask_cors import CORS
import subprocess
import sys
import os
import signal
import threading

app = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})

# 进程管理
process_lock = threading.Lock()
current_process = None

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/stream', methods=['GET', 'POST', 'OPTIONS'])
def stream_execute():
    global current_process
   
    # 处理预检请求
    if request.method == 'OPTIONS':
      return _build_preflight_response()
   
    # 获取输入内容
    idea = request.json.get('idea', '') if request.method == 'POST' else request.args.get('idea', '')
    if not idea:
      return Response("data: 错误:未提供输入\n\n", mimetype='text/event-stream')
   
    # 终止已有进程
    with process_lock:
      if current_process and current_process.poll() is None:
            current_process.terminate()
      
      # 启动新进程
      current_process = subprocess.Popen(
            ,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            text=True,
            bufsize=1,
            universal_newlines=True,
            creationflags=subprocess.CREATE_NEW_PROCESS_GROUP if os.name == 'nt' else 0
      )
      
      # 发送输入
      current_process.stdin.write(idea + '\n')
      current_process.stdin.flush()
   
    # 流式响应
    def generate():
      while True:
            line = current_process.stdout.readline()
            if not line:
                if current_process.poll() is not None:
                  break
                continue
            yield f"data: {line}\n\n"
      yield "event: end\ndata: \n\n"
   
    return Response(
      generate(),
      mimetype='text/event-stream',
      headers={
            'Access-Control-Allow-Origin': '*',
            'Cache-Control': 'no-cache',
            'X-Accel-Buffering': 'no'
      }
    )

def _build_preflight_response():
    response = jsonify({'status': 'ok'})
    response.headers.add("Access-Control-Allow-Origin", "*")
    response.headers.add("Access-Control-Allow-Headers", "*")
    response.headers.add("Access-Control-Allow-Methods", "*")
    return response

@app.route('/stop', methods=['POST'])
def stop_execution():
    global current_process
    with process_lock:
      if current_process and current_process.poll() is None:
            current_process.terminate()
            return jsonify({'status': 'stopped'})
    return jsonify({'status': 'not running'}), 404

@app.after_request
def add_cors_headers(response):
    response.headers['Access-Control-Allow-Origin'] = '*'
    response.headers['Access-Control-Allow-Headers'] = 'Content-Type'
    response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS'
    return response

if __name__ == '__main__':
    app.run(port=5000, threaded=True)
index.html的页面代码如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>OpenManus 实时控制台</title>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
    <style>
      #output {
            background: #1e1e1e;
            color: #d4d4d4;
            padding: 20px;
            border-radius: 5px;
            font-family: 'Consolas', monospace;
            height: 60vh;
            overflow-y: auto;
            white-space: pre-wrap;
      }
      .log-item {
            margin: 5px 0;
            padding: 3px 10px;
            border-left: 3px solid #3c3c3c;
      }
      .loading {
            position: fixed;
            top: 20px;
            right: 20px;
            display: none;
      }
    </style>
</head>
<body>
    <div class="container py-5">
      <h1 class="text-primary mb-4">
页: [1]
查看完整版本: 本地部署 OpenManus 保姆级教程(Windows 版)