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

打印 上一主题 下一主题

主题 939|帖子 939|积分 2817

一、环境搭建

我的电脑是Windows 10版本,其他的没实验,假如各人系统和我的差别等,请自行判定,根本上没什么大的收支啊。
openManus的Git地址:https://github.com/mannaandpoem/OpenManus
根据官网的两种安装推荐方式如下:

这里我利用第一只方式,固然推荐了利用UV,但是我利用过,就不消第二种方式。
二、Anaconda下载

我电脑上没有安装:Anaconda,那就一并安装一下吧
这里推荐两种下载方式一是官网下载,二是镜像下载;官网下载太慢可选用镜像下载。
官网下载:https://www.anaconda.com/products/distribution

镜像下载:https://mirrors.bfsu.edu.cn/anaconda/archive/

我这里选择了Anaconda3-5.3.1-Windows-x86_64.exe这个镜像版本,各人随意啊。
具体Anaconda怎样安装的,各人自行搜索啊,这里就不赘述了。
三、焦点组件安装

为了方便不知道怎样安装的,我也偷懒一下,也是直接利用deepseek帮我搞一下:

  1. https://github.com/mannaandpoem/OpenManus
  2. 我在学习如何使用open-manus,但是下面的安装步骤,是在linux中运行的,我的电脑是window10 ,请把下面的操作步骤换成windows10中的步骤,让我一目了然
  3. 使用 conda
  4. 创建一个新的 conda 环境:
  5. conda create -n open_manus python=3.12
  6. conda activate open_manus
  7. 克隆存储库:
  8. git clone https://github.com/mannaandpoem/OpenManus.git
  9. cd OpenManus
  10. 安装依赖项:
  11. pip install -r requirements.txt
复制代码
为了方便各人快速搭建,直接贴了我的提示词,运行结果如下:
  1. 以下是为 Windows 10 系统适配的详细步骤(使用 Anaconda):
  2. 1. 安装前置工具
  3. - 确保已安装 [Git for Windows](https://git-scm.com/download/win)
  4. - 确保已安装 [Miniconda 或 Anaconda](https://docs.conda.io/en/latest/miniconda.html)
  5. 2. 打开 Anaconda Prompt(推荐)或 PowerShell
  6. 3. 创建 conda 环境
  7. ```powershell
  8. conda create -n open_manus python=3.12 -y
  9. conda activate open_manus
复制代码

  • 克隆堆栈
  1. git clone https://github.com/mannaandpoem/OpenManus.git
  2. cd OpenManus
复制代码

  • 安装依赖
  1. pip install -r requirements.txt
复制代码
常见问题解决方案:

  • 假如遇到环境激活问题:

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

  • 假如缺少 C++ 编译工具(安装某些包时报错):
    安装 Microsoft C++ Build Tools
  • 假如 Python 3.12 不可用:
    1. conda create -n open_manus python=3.11
    复制代码
  • 替代克隆方式(假如 git 不可用):
    直接下载 ZIP:https://github.com/mannaandpoem/OpenManus/archive/refs/heads/main.zip
    解压后进入目录实行后续步骤
至此已经本地已经安装完毕了。
四、服务设置与连接


找到Config文件夹,进去,重新复制一份config.toml文件

这里替换config文件设置:
  1. # Global LLM configuration
  2. [llm]
  3. model = "Qwen/QwQ-32B"
  4. base_url = "https://api.siliconflow.cn/v1"
  5. api_key = "这里写你自己的Key"
  6. max_tokens = 16384
  7. temperature = 0.6
  8. # Optional configuration for specific LLM models
  9. [llm.vision]
  10. model = "Qwen/Qwen2-VL-72B-Instruct"
  11. base_url = "https://api.siliconflow.cn/v1"
  12. api_key = "这里写你自己的Key"
复制代码
这里我利用的硅基流动Key,他们家刚好有运动,注册就送你2000万Tokens,我们这边测试用,完全够了,薅羊毛地址是:https://cloud.siliconflow.cn/i/pCa1dBVX
各人有其他的Key,也是可以用,随本身的意愿。
设置完毕之后,接下来就是运行main.py

至此,流程根本已经开始跑起来了。
五、前端页面

由于是控制台我不喜欢,然后我又用deepseek帮我制作了html页面,便于我页面处理:

这里就写了2个文件


主要两个文件:app.py和templates/index.html
两个文件的具体代码如下:
app.py:
  1. from flask import Flask, Response, request, jsonify, render_template
  2. from flask_cors import CORS
  3. import subprocess
  4. import sys
  5. import os
  6. import signal
  7. import threading
  8. app = Flask(__name__)
  9. CORS(app, resources={r"/*": {"origins": "*"}})
  10. # 进程管理
  11. process_lock = threading.Lock()
  12. current_process = None
  13. @app.route('/')
  14. def index():
  15.     return render_template('index.html')
  16. @app.route('/stream', methods=['GET', 'POST', 'OPTIONS'])
  17. def stream_execute():
  18.     global current_process
  19.    
  20.     # 处理预检请求
  21.     if request.method == 'OPTIONS':
  22.         return _build_preflight_response()
  23.    
  24.     # 获取输入内容
  25.     idea = request.json.get('idea', '') if request.method == 'POST' else request.args.get('idea', '')
  26.     if not idea:
  27.         return Response("data: 错误:未提供输入\n\n", mimetype='text/event-stream')
  28.    
  29.     # 终止已有进程
  30.     with process_lock:
  31.         if current_process and current_process.poll() is None:
  32.             current_process.terminate()
  33.         
  34.         # 启动新进程
  35.         current_process = subprocess.Popen(
  36.             [sys.executable, '-u', 'main.py'],
  37.             stdin=subprocess.PIPE,
  38.             stdout=subprocess.PIPE,
  39.             stderr=subprocess.STDOUT,
  40.             text=True,
  41.             bufsize=1,
  42.             universal_newlines=True,
  43.             creationflags=subprocess.CREATE_NEW_PROCESS_GROUP if os.name == 'nt' else 0
  44.         )
  45.         
  46.         # 发送输入
  47.         current_process.stdin.write(idea + '\n')
  48.         current_process.stdin.flush()
  49.    
  50.     # 流式响应
  51.     def generate():
  52.         while True:
  53.             line = current_process.stdout.readline()
  54.             if not line:
  55.                 if current_process.poll() is not None:
  56.                     break
  57.                 continue
  58.             yield f"data: {line}\n\n"
  59.         yield "event: end\ndata: \n\n"
  60.    
  61.     return Response(
  62.         generate(),
  63.         mimetype='text/event-stream',
  64.         headers={
  65.             'Access-Control-Allow-Origin': '*',
  66.             'Cache-Control': 'no-cache',
  67.             'X-Accel-Buffering': 'no'
  68.         }
  69.     )
  70. def _build_preflight_response():
  71.     response = jsonify({'status': 'ok'})
  72.     response.headers.add("Access-Control-Allow-Origin", "*")
  73.     response.headers.add("Access-Control-Allow-Headers", "*")
  74.     response.headers.add("Access-Control-Allow-Methods", "*")
  75.     return response
  76. @app.route('/stop', methods=['POST'])
  77. def stop_execution():
  78.     global current_process
  79.     with process_lock:
  80.         if current_process and current_process.poll() is None:
  81.             current_process.terminate()
  82.             return jsonify({'status': 'stopped'})
  83.     return jsonify({'status': 'not running'}), 404
  84. @app.after_request
  85. def add_cors_headers(response):
  86.     response.headers['Access-Control-Allow-Origin'] = '*'
  87.     response.headers['Access-Control-Allow-Headers'] = 'Content-Type'
  88.     response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS'
  89.     return response
  90. if __name__ == '__main__':
  91.     app.run(port=5000, threaded=True)
复制代码
index.html的页面代码如下:
[code]<!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">

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表