zjrwtx commited on
Commit
5d9f8de
·
1 Parent(s): b3ed449

add docker

Browse files
.dockerignore ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Git
2
+ .git
3
+ .gitignore
4
+ .github
5
+
6
+ # Docker
7
+ Dockerfile
8
+ docker-compose.yml
9
+ .dockerignore
10
+ DOCKER_README.md
11
+ run_in_docker.sh
12
+
13
+ # Python
14
+ __pycache__/
15
+ *.py[cod]
16
+ *$py.class
17
+ *.so
18
+ .Python
19
+ env/
20
+ build/
21
+ develop-eggs/
22
+ dist/
23
+ downloads/
24
+ eggs/
25
+ .eggs/
26
+ lib/
27
+ lib64/
28
+ parts/
29
+ sdist/
30
+ var/
31
+ *.egg-info/
32
+ .installed.cfg
33
+ *.egg
34
+ .pytest_cache/
35
+ .coverage
36
+ htmlcov/
37
+
38
+ # 虚拟环境
39
+ venv/
40
+ ENV/
41
+ env/
42
+ .env
43
+
44
+ # IDE
45
+ .idea/
46
+ .vscode/
47
+ *.swp
48
+ *.swo
49
+ .DS_Store
50
+
51
+ # 临时文件
52
+ temp_*
53
+ *.tmp
54
+ *.log
55
+ *.bak
56
+
57
+ # 缓存
58
+ .cache/
59
+ .npm/
60
+ .yarn/
61
+
62
+ # 大型数据文件
63
+ *.csv
64
+ *.sqlite
65
+ *.db
66
+ *.hdf5
67
+ *.h5
68
+ *.parquet
69
+ *.feather
70
+ *.pkl
71
+ *.pickle
72
+
73
+ # 数据目录
74
+ data/
DOCKER_README.md ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # OWL项目Docker使用指南
2
+
3
+ 本文档提供了如何使用Docker运行OWL项目的详细说明。
4
+
5
+ ## 前提条件
6
+
7
+ - 安装 [Docker](https://docs.docker.com/get-docker/)
8
+ - 安装 [Docker Compose](https://docs.docker.com/compose/install/) (推荐v2.x版本)
9
+ - 获取必要的API密钥(OpenAI API等)
10
+
11
+ ## 技术说明
12
+
13
+ 本Docker配置使用了以下技术来确保OWL项目在容器中正常运行:
14
+
15
+ - **Xvfb**:虚拟帧缓冲区,用于在无显示器的环境中模拟X服务器
16
+ - **Playwright**:用于自动化浏览器操作,配置为无头模式
17
+ - **共享内存**:增加了共享内存大小,以提高浏览器性能
18
+ - **BuildKit**:使用Docker BuildKit加速构建过程
19
+ - **缓存优化**:使用持久化卷缓存pip和Playwright依赖
20
+ - **跨平台兼容**:提供了适用于Windows和macOS/Linux的脚本
21
+
22
+ ## Docker Compose版本说明
23
+
24
+ 本项目使用的docker-compose.yml文件兼容Docker Compose v2.x版本。如果您使用的是较旧的Docker Compose v1.x版本,可能需要手动添加版本号:
25
+
26
+ ```yaml
27
+ version: '3'
28
+
29
+ services:
30
+ # ...其余配置保持不变
31
+ ```
32
+
33
+ ## 快速开始
34
+
35
+ ### 0. 检查环境
36
+
37
+ 首先,运行检查脚本确保您的环境已准备好:
38
+
39
+ #### 在macOS/Linux上检查
40
+
41
+ ```bash
42
+ # 先给脚本添加执行权限
43
+ chmod +x check_docker.sh
44
+
45
+ # 运行检查脚本
46
+ ./check_docker.sh
47
+ ```
48
+
49
+ #### 在Windows上检查
50
+
51
+ ```cmd
52
+ check_docker.bat
53
+ ```
54
+
55
+ 如果检查脚本发现任何问题,请按照提示进行修复。
56
+
57
+ ### 1. 配置环境变量
58
+
59
+ 复制环境变量模板文件并填写必要的API密钥:
60
+
61
+ ```bash
62
+ cp owl/.env_template owl/.env
63
+ ```
64
+
65
+ 然后编辑 `owl/.env` 文件,填写必要的API密钥,例如:
66
+
67
+ ```
68
+ OPENAI_API_KEY=your_openai_api_key
69
+ GOOGLE_API_KEY=your_google_api_key
70
+ SEARCH_ENGINE_ID=your_search_engine_id
71
+ ```
72
+
73
+ ### 2. 快速构建Docker镜像
74
+
75
+ #### 在macOS/Linux上构建
76
+
77
+ 使用提供的Shell脚本,可以加速Docker镜像的构建:
78
+
79
+ ```bash
80
+ # 先给脚本添加执行权限
81
+ chmod +x build_docker.sh
82
+
83
+ # 运行构建脚本
84
+ ./build_docker.sh
85
+ ```
86
+
87
+ #### 在Windows上构建
88
+
89
+ 使用提供的批处理文件:
90
+
91
+ ```cmd
92
+ build_docker.bat
93
+ ```
94
+
95
+ 或者使用标准方式构建并启动:
96
+
97
+ ```bash
98
+ # 使用BuildKit加速构建
99
+ set DOCKER_BUILDKIT=1
100
+ set COMPOSE_DOCKER_CLI_BUILD=1
101
+ docker-compose build --build-arg BUILDKIT_INLINE_CACHE=1
102
+
103
+ # 启动容器
104
+ docker-compose up -d
105
+ ```
106
+
107
+ ### 3. 交互式使用容器
108
+
109
+ 容器启动后,会自动进入交互式shell环境,并显示欢迎信息和可用脚本列表:
110
+
111
+ ```bash
112
+ # 进入容器(如果没有自动进入)
113
+ docker-compose exec owl bash
114
+ ```
115
+
116
+ 在容器内,您可以直接运行任何可用的脚本:
117
+
118
+ ```bash
119
+ # 运行默认脚本
120
+ xvfb-python run.py
121
+
122
+ # 运行DeepSeek示例
123
+ xvfb-python run_deepseek_example.py
124
+
125
+ # 运行脚本并传递查询参数
126
+ xvfb-python run.py "什么是人工智能?"
127
+ ```
128
+
129
+ ### 4. 使用外部脚本运行查询
130
+
131
+ #### 在macOS/Linux上运行
132
+
133
+ ```bash
134
+ # 先给脚本添加执行权限
135
+ chmod +x run_in_docker.sh
136
+
137
+ # 默认使用 run.py 脚本
138
+ ./run_in_docker.sh "你的问题"
139
+
140
+ # 指定使用特定脚本
141
+ ./run_in_docker.sh run_deepseek_example.py "你的问题"
142
+ ```
143
+
144
+ #### 在Windows上运行
145
+
146
+ ```cmd
147
+ REM 默认使用 run.py 脚本
148
+ run_in_docker.bat "你的问题"
149
+
150
+ REM 指定使用特定脚本
151
+ run_in_docker.bat run_deepseek_example.py "你的问题"
152
+ ```
153
+
154
+ **可用脚本**:
155
+ - `run.py` - 默认脚本,使用OpenAI GPT-4o模型
156
+ - `run_deepseek_example.py` - 使用DeepSeek模型
157
+ - `run_gaia_roleplaying.py` - GAIA基准测试脚本
158
+
159
+ ## 目录挂载
160
+
161
+ Docker Compose配置中已经设置了以下挂载点:
162
+
163
+ - `./owl/.env:/app/owl/.env`:挂载环境变量文件,方便修改API密钥
164
+ - `./data:/app/data`:挂载数据目录,用于存储和访问数据文件
165
+ - `playwright-cache`:持久化卷,用于缓存Playwright浏览器
166
+ - `pip-cache`:持久化卷,用于缓存pip包
167
+
168
+ ## 环境变量
169
+
170
+ 您可以通过以下两种方式设置环境变量:
171
+
172
+ 1. 修改 `owl/.env` 文件
173
+ 2. 在 `docker-compose.yml` 文件的 `environment` 部分添加环境变量
174
+
175
+ ## 构建优化
176
+
177
+ 本Docker配置包含多项构建优化:
178
+
179
+ 1. **使用国内镜像源**:使用清华大学镜像源加速pip包下载
180
+ 2. **层优化**:减少Dockerfile中的层数,提高构建效率
181
+ 3. **缓存利用**:
182
+ - 启用pip缓存,避免重复下载依赖包
183
+ - 使用Docker BuildKit内联缓存
184
+ - 合理安排Dockerfile指令顺序,最大化利用缓存
185
+ 4. **BuildKit**:启用Docker BuildKit加速构建
186
+ 5. **持久化缓存**:
187
+ - 使用Docker卷缓存pip包(`pip-cache`)
188
+ - 使用Docker卷缓存Playwright浏览器(`playwright-cache`)
189
+ - 本地缓存目录(`.docker-cache`)
190
+
191
+ ### 缓存清理
192
+
193
+ 如果需要清理缓存,可以使用以下命令:
194
+
195
+ ```bash
196
+ # 清理Docker构建缓存
197
+ docker builder prune
198
+
199
+ # 清理Docker卷(会删除所有未使用的卷,包括缓存卷)
200
+ docker volume prune
201
+
202
+ # 清理本��缓存目录
203
+ rm -rf .docker-cache
204
+ ```
205
+
206
+ ## 跨平台兼容性
207
+
208
+ 本项目提供了适用于不同操作系统的脚本:
209
+
210
+ 1. **检查脚本**:
211
+ - `check_docker.sh`(macOS/Linux):检查Docker环境
212
+ - `check_docker.bat`(Windows):检查Docker环境
213
+
214
+ 2. **构建脚本**:
215
+ - `build_docker.sh`(macOS/Linux):构建Docker镜像
216
+ - `build_docker.bat`(Windows):构建Docker镜像
217
+
218
+ 3. **运行脚本**:
219
+ - `run_in_docker.sh`(macOS/Linux):运行Docker容器中的脚本
220
+ - `run_in_docker.bat`(Windows):运行Docker容器中的脚本
221
+
222
+ 这些脚本会自动检测操作系统类型,并使用适当的命令。
223
+
224
+ ## 故障排除
225
+
226
+ ### 容器无法启动
227
+
228
+ 检查日志以获取更多信息:
229
+
230
+ ```bash
231
+ docker-compose logs
232
+ ```
233
+
234
+ ### API密钥问题
235
+
236
+ 确保您已经在 `owl/.env` 文件中正确设置了所有必要的API密钥。
237
+
238
+ ### Docker Compose警告
239
+
240
+ 如果您看到关于`version`属性过时的警告:
241
+
242
+ ```
243
+ WARN[0000] docker-compose.yml: the attribute `version` is obsolete
244
+ ```
245
+
246
+ 这是因为您使用的是Docker Compose v2.x,它不再需要显式指定版本号。我们已经从配置文件中移除了这个属性,所以您不会再看到这个警告。
247
+
248
+ ### 浏览器相关问题
249
+
250
+ 如果遇到浏览器相关的问题,可以尝试以下解决方案:
251
+
252
+ 1. 确保在Docker容器中使用`xvfb-python`命令运行Python脚本
253
+ 2. 检查是否正确安装了Xvfb和相关依赖
254
+ 3. 增加共享内存大小(在docker-compose.yml中已设置为2GB)
255
+
256
+ ### 构建速度慢
257
+
258
+ 如果构建速度慢,可以尝试以下解决方案:
259
+
260
+ 1. 确保启用了Docker BuildKit(`DOCKER_BUILDKIT=1`)
261
+ 2. 确保启用了pip缓存(已在docker-compose.yml中配置)
262
+ 3. 使用`--build-arg BUILDKIT_INLINE_CACHE=1`参数构建(已在构建脚本中配置)
263
+ 4. 如果是首次构建,下载依赖包可能需要较长时间,后续构建会更快
264
+
265
+ ### Windows特有问题
266
+
267
+ 如果在Windows上遇到问题:
268
+
269
+ 1. 确保使用管理员权限运行命令提示符或PowerShell
270
+ 2. 如果遇到路径问题,尝试使用正斜杠(/)而不是反斜杠(\)
271
+ 3. 如果遇到Docker Compose命令问题,尝试使用`docker compose`(无连字符)
272
+
273
+ ### 内存不足
274
+
275
+ 如果遇到内存不足的问题,可以在 `docker-compose.yml` 文件中调整资源限制:
276
+
277
+ ```yaml
278
+ services:
279
+ owl:
280
+ # 其他配置...
281
+ deploy:
282
+ resources:
283
+ limits:
284
+ cpus: '4' # 增加CPU核心数
285
+ memory: 8G # 增加内存限制
286
+ ```
287
+
288
+ ## 自定义Docker镜像
289
+
290
+ 如果需要自定义Docker镜像,可以修改 `Dockerfile` 文件,然后重新构建:
291
+
292
+ ```bash
293
+ # macOS/Linux
294
+ ./build_docker.sh
295
+
296
+ # Windows
297
+ build_docker.bat
298
+ ```
Dockerfile ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.10-slim
2
+
3
+ WORKDIR /app
4
+
5
+ # 设置pip镜像源以加速下载
6
+ RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
7
+
8
+ # 优化apt安装,减少层数
9
+ RUN apt-get update && apt-get install -y --no-install-recommends \
10
+ build-essential \
11
+ curl \
12
+ software-properties-common \
13
+ git \
14
+ ffmpeg \
15
+ libsm6 \
16
+ libxext6 \
17
+ # 添加xvfb和相关依赖
18
+ xvfb \
19
+ xauth \
20
+ x11-utils \
21
+ && apt-get clean \
22
+ && rm -rf /var/lib/apt/lists/*
23
+
24
+ # 先复制并安装requirements.txt,利用Docker缓存机制
25
+ COPY requirements.txt .
26
+ # 启用pip缓存以加速构建
27
+ RUN pip install -r requirements.txt
28
+
29
+ # 安装 Playwright 依赖(使用国内镜像源)
30
+ ENV PLAYWRIGHT_BROWSERS_PATH=/root/.cache/ms-playwright
31
+ ENV PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright
32
+ RUN pip install playwright && \
33
+ playwright install --with-deps chromium
34
+
35
+ # 复制项目文件
36
+ COPY owl/ ./owl/
37
+ COPY licenses/ ./licenses/
38
+ COPY assets/ ./assets/
39
+ COPY README.md .
40
+ COPY README_zh.md .
41
+
42
+ # 设置环境变量文件
43
+ COPY owl/.env_template ./owl/.env
44
+
45
+ # 设置工作目录
46
+ WORKDIR /app/owl
47
+
48
+ # 创建启动脚本
49
+ RUN echo '#!/bin/bash\nxvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" python "$@"' > /usr/local/bin/xvfb-python && \
50
+ chmod +x /usr/local/bin/xvfb-python
51
+
52
+ # 创建欢迎脚本
53
+ RUN echo '#!/bin/bash\necho "欢迎使用OWL项目Docker环境!"\necho ""\necho "可用的脚本:"\nls -1 *.py | grep -v "__" | sed "s/^/- /"\necho ""\necho "运行示例:"\necho " xvfb-python run.py # 运行默认脚本"\necho " xvfb-python run_deepseek_example.py # 运行DeepSeek示例"\necho ""\necho "或者使用自定义查询:"\necho " xvfb-python run.py \"你的问题\""\necho ""' > /usr/local/bin/owl-welcome && \
54
+ chmod +x /usr/local/bin/owl-welcome
55
+
56
+ # 容器启动命令(改为交互式shell)
57
+ CMD ["/bin/bash", "-c", "owl-welcome && /bin/bash"]
build_docker.bat ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @echo off
2
+ echo 在Windows上构建Docker镜像...
3
+
4
+ REM 设置Docker BuildKit环境变量
5
+ set DOCKER_BUILDKIT=1
6
+ set COMPOSE_DOCKER_CLI_BUILD=1
7
+
8
+ echo 启用Docker BuildKit加速构建...
9
+
10
+ REM 创建缓存目录
11
+ if not exist ".docker-cache\pip" mkdir .docker-cache\pip
12
+
13
+ REM 构建Docker镜像
14
+ docker-compose build --build-arg BUILDKIT_INLINE_CACHE=1
15
+
16
+ if %ERRORLEVEL% EQU 0 (
17
+ echo Docker镜像构建成功!
18
+ echo 可以使用以下命令启动容器:
19
+ echo docker-compose up -d
20
+ ) else (
21
+ echo Docker镜像构建失败,请检查错误信息。
22
+ )
23
+
24
+ pause
build_docker.sh ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # 检测操作系统类型
4
+ OS_TYPE=$(uname -s)
5
+ echo "检测到操作系统: $OS_TYPE"
6
+
7
+ # 设置Docker BuildKit环境变量
8
+ export DOCKER_BUILDKIT=1
9
+ export COMPOSE_DOCKER_CLI_BUILD=1
10
+
11
+ echo "启用Docker BuildKit加速构建..."
12
+
13
+ # 创建缓存目录
14
+ mkdir -p .docker-cache/pip
15
+
16
+ # 根据操作系统类型执行不同的命令
17
+ if [[ "$OS_TYPE" == "Darwin" ]]; then
18
+ # macOS
19
+ echo "在macOS上构建Docker镜像..."
20
+ docker-compose build --build-arg BUILDKIT_INLINE_CACHE=1
21
+ elif [[ "$OS_TYPE" == "Linux" ]]; then
22
+ # Linux
23
+ echo "在Linux上构建Docker镜像..."
24
+ docker-compose build --parallel --build-arg BUILDKIT_INLINE_CACHE=1
25
+ elif [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
26
+ # Windows
27
+ echo "在Windows上构建Docker镜像..."
28
+ docker-compose build --build-arg BUILDKIT_INLINE_CACHE=1
29
+ else
30
+ echo "未知操作系统,尝试使用标准命令构建..."
31
+ docker-compose build --build-arg BUILDKIT_INLINE_CACHE=1
32
+ fi
33
+
34
+ # 检查构建结果
35
+ if [ $? -eq 0 ]; then
36
+ echo "Docker镜像构建成功!"
37
+ echo "可以使用以下命令启动容器:"
38
+ echo "docker-compose up -d"
39
+ else
40
+ echo "Docker镜像构建失败,请检查错误信息。"
41
+ fi
check_docker.bat ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @echo off
2
+ echo 检查Docker环境...
3
+
4
+ REM 检查Docker是否安装
5
+ where docker >nul 2>nul
6
+ if %ERRORLEVEL% NEQ 0 (
7
+ echo 错误: Docker未安装
8
+ echo 在Windows上安装Docker的方法:
9
+ echo 1. 访问 https://docs.docker.com/desktop/install/windows-install/ 下载Docker Desktop
10
+ echo 2. 安装并启动Docker Desktop
11
+ pause
12
+ exit /b 1
13
+ )
14
+
15
+ echo Docker已安装
16
+
17
+ REM 检查Docker Compose是否安装
18
+ where docker-compose >nul 2>nul
19
+ if %ERRORLEVEL% NEQ 0 (
20
+ echo 警告: Docker Compose未找到,尝试使用新的docker compose命令
21
+ docker compose version >nul 2>nul
22
+ if %ERRORLEVEL% NEQ 0 (
23
+ echo 错误: Docker Compose未安装
24
+ echo Docker Desktop for Windows应该已包含Docker Compose
25
+ echo 请确保Docker Desktop已正确安装
26
+ pause
27
+ exit /b 1
28
+ ) else (
29
+ echo 使用新的docker compose命令
30
+ )
31
+ ) else (
32
+ echo Docker Compose已安装
33
+ )
34
+
35
+ REM 检查Docker是否正在运行
36
+ docker info >nul 2>nul
37
+ if %ERRORLEVEL% NEQ 0 (
38
+ echo 错误: Docker未运行
39
+ echo 请启动Docker Desktop应用程序
40
+ pause
41
+ exit /b 1
42
+ )
43
+
44
+ echo Docker正在运行
45
+
46
+ REM 检查是否有.env文件
47
+ if not exist "owl\.env" (
48
+ echo 警告: 未找到owl\.env文件
49
+ echo 请运行以下命令创建环境变量文件:
50
+ echo copy owl\.env_template owl\.env
51
+ echo 然后编辑owl\.env文件,填写必要的API密钥
52
+ ) else (
53
+ echo 环境变量文件已存在
54
+ )
55
+
56
+ echo 所有检查完成,您的系统已准备好构建和运行OWL项目的Docker容器
57
+ echo 请运行以下命令构建Docker镜像:
58
+ echo build_docker.bat
59
+
60
+ pause
check_docker.sh ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # 检测操作系统类型
4
+ OS_TYPE=$(uname -s)
5
+ echo "检测到操作系统: $OS_TYPE"
6
+
7
+ # 检查Docker是否安装
8
+ if ! command -v docker &> /dev/null; then
9
+ echo "错误: Docker未安装"
10
+
11
+ if [[ "$OS_TYPE" == "Darwin" ]]; then
12
+ echo "在macOS上安装Docker的方法:"
13
+ echo "1. 访问 https://docs.docker.com/desktop/install/mac-install/ 下载Docker Desktop"
14
+ echo "2. 安装并启动Docker Desktop"
15
+ elif [[ "$OS_TYPE" == "Linux" ]]; then
16
+ echo "在Linux上安装Docker的方法:"
17
+ echo "1. 运行以下命令:"
18
+ echo " sudo apt-get update"
19
+ echo " sudo apt-get install docker.io docker-compose"
20
+ echo "2. 启动Docker服务:"
21
+ echo " sudo systemctl start docker"
22
+ echo " sudo systemctl enable docker"
23
+ elif [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
24
+ echo "在Windows上安装Docker的方法:"
25
+ echo "1. 访问 https://docs.docker.com/desktop/install/windows-install/ 下载Docker Desktop"
26
+ echo "2. 安装并启动Docker Desktop"
27
+ fi
28
+
29
+ exit 1
30
+ fi
31
+
32
+ echo "Docker已安装"
33
+
34
+ # 检查Docker Compose是否安装
35
+ if ! command -v docker-compose &> /dev/null; then
36
+ echo "错误: Docker Compose未安装"
37
+
38
+ if [[ "$OS_TYPE" == "Darwin" ]]; then
39
+ echo "Docker Desktop for Mac已包含Docker Compose"
40
+ elif [[ "$OS_TYPE" == "Linux" ]]; then
41
+ echo "在Linux上安装Docker Compose的方法:"
42
+ echo "1. 运行以下命令:"
43
+ echo " sudo apt-get install docker-compose"
44
+ elif [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
45
+ echo "Docker Desktop for Windows已包含Docker Compose"
46
+ fi
47
+
48
+ exit 1
49
+ fi
50
+
51
+ echo "Docker Compose已安装"
52
+
53
+ # 检查Docker是否正在运行
54
+ if ! docker info &> /dev/null; then
55
+ echo "错误: Docker未运行"
56
+
57
+ if [[ "$OS_TYPE" == "Darwin" ]]; then
58
+ echo "请启动Docker Desktop应用程序"
59
+ elif [[ "$OS_TYPE" == "Linux" ]]; then
60
+ echo "请运行以下命令启动Docker服务:"
61
+ echo "sudo systemctl start docker"
62
+ elif [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
63
+ echo "请启动Docker Desktop应用程序"
64
+ fi
65
+
66
+ exit 1
67
+ fi
68
+
69
+ echo "Docker正在运行"
70
+
71
+ # 检查是否有足够的磁盘空间
72
+ FREE_SPACE=$(df -h . | awk 'NR==2 {print $4}')
73
+ echo "可用磁盘空间: $FREE_SPACE"
74
+
75
+ # 检查是否有.env文件
76
+ if [ ! -f "owl/.env" ]; then
77
+ echo "警告: 未找到owl/.env文件"
78
+ echo "请运行以下命令创建环境变量文件:"
79
+ echo "cp owl/.env_template owl/.env"
80
+ echo "然后编辑owl/.env文件,填写必要的API密钥"
81
+ else
82
+ echo "环境变量文件已存在"
83
+ fi
84
+
85
+ echo "所有检查完成,您的系统已准备好构建和运行OWL项目的Docker容器"
86
+ echo "请运行以下命令构建Docker镜像:"
87
+
88
+ if [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
89
+ echo "build_docker.bat"
90
+ else
91
+ echo "./build_docker.sh"
92
+ fi
docker-compose.yml ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ services:
2
+ owl:
3
+ build:
4
+ context: .
5
+ dockerfile: Dockerfile
6
+ args:
7
+ # 构建参数
8
+ BUILDKIT_INLINE_CACHE: 1
9
+ # 使用BuildKit加速构建
10
+ cache_from:
11
+ - python:3.10-slim
12
+ volumes:
13
+ # 挂载.env文件,方便配置API密钥
14
+ - ./owl/.env:/app/owl/.env
15
+ # 可选:挂载数据目录
16
+ - ./data:/app/data
17
+ # 挂载缓存目录,避免重复下载
18
+ - playwright-cache:/root/.cache/ms-playwright
19
+ - pip-cache:/root/.pip/cache
20
+ environment:
21
+ # 可以在这里设置环境变量,覆盖.env文件中的设置
22
+ - OPENAI_API_KEY=${OPENAI_API_KEY}
23
+ # 添加显示相关的环境变量
24
+ - DISPLAY=:99
25
+ - PLAYWRIGHT_BROWSERS_PATH=/root/.cache/ms-playwright
26
+ # 设置Python不生成.pyc文件,减少磁盘IO
27
+ - PYTHONDONTWRITEBYTECODE=1
28
+ # 设置Python不缓冲输出,方便查看日志
29
+ - PYTHONUNBUFFERED=1
30
+ # 设置终端颜色
31
+ - TERM=xterm-256color
32
+ # 启用pip缓存
33
+ - PIP_CACHE_DIR=/root/.pip/cache
34
+ ports:
35
+ # 如果项目有Web界面,可以映射端口
36
+ - "8000:8000"
37
+ # 使用交互模式运行容器
38
+ stdin_open: true
39
+ tty: true
40
+ # 添加共享内存大小,提高浏览器性能
41
+ shm_size: 2gb
42
+ # 设置资源限制
43
+ deploy:
44
+ resources:
45
+ limits:
46
+ cpus: '2'
47
+ memory: 4G
48
+
49
+ # 定义持久化卷,用于缓存
50
+ volumes:
51
+ playwright-cache:
52
+ pip-cache:
owl/run_qwq_demo.py ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ from dotenv import load_dotenv
3
+ load_dotenv()
4
+
5
+ from camel.models import ModelFactory
6
+ from camel.toolkits import *
7
+ from camel.types import ModelPlatformType, ModelType
8
+ from camel.configs import ChatGPTConfig
9
+
10
+ from typing import List, Dict
11
+
12
+ from retry import retry
13
+ from loguru import logger
14
+
15
+ from utils import OwlRolePlaying, run_society
16
+ import os
17
+
18
+
19
+
20
+
21
+ def construct_society(question: str) -> OwlRolePlaying:
22
+ r"""Construct the society based on the question."""
23
+
24
+ user_role_name = "user"
25
+ assistant_role_name = "assistant"
26
+
27
+ user_model = ModelFactory.create(
28
+ model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,
29
+ model_type="qwq-32b",
30
+ api_key=os.getenv("QWEN_API_KEY"),
31
+ url="https://dashscope.aliyuncs.com/compatible-mode/v1",
32
+ model_config_dict={"temperature": 0.4, "max_tokens": 4096},
33
+ )
34
+
35
+ assistant_model = ModelFactory.create(
36
+ model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,
37
+ model_type="qwq-32b",
38
+ api_key=os.getenv("QWEN_API_KEY"),
39
+ url="https://dashscope.aliyuncs.com/compatible-mode/v1",
40
+ model_config_dict={"temperature": 0.4, "max_tokens": 4096},
41
+ )
42
+
43
+
44
+ tools_list = [
45
+ *WebToolkit(
46
+ headless=False,
47
+ web_agent_model=assistant_model,
48
+ planning_agent_model=assistant_model
49
+ ).get_tools(),
50
+ *DocumentProcessingToolkit().get_tools(),
51
+ *VideoAnalysisToolkit(model=assistant_model).get_tools(), # This requires OpenAI Key
52
+ *AudioAnalysisToolkit().get_tools(), # This requires OpenAI Key
53
+ *CodeExecutionToolkit().get_tools(),
54
+ *ImageAnalysisToolkit(model=assistant_model).get_tools(),
55
+ *SearchToolkit(model=assistant_model).get_tools(),
56
+ *ExcelToolkit().get_tools()
57
+ ]
58
+
59
+ user_role_name = 'user'
60
+ user_agent_kwargs = dict(model=user_model)
61
+ assistant_role_name = 'assistant'
62
+ assistant_agent_kwargs = dict(model=assistant_model,
63
+ tools=tools_list)
64
+
65
+ task_kwargs = {
66
+ 'task_prompt': question,
67
+ 'with_task_specify': False,
68
+ }
69
+
70
+ society = OwlRolePlaying(
71
+ **task_kwargs,
72
+ user_role_name=user_role_name,
73
+ user_agent_kwargs=user_agent_kwargs,
74
+ assistant_role_name=assistant_role_name,
75
+ assistant_agent_kwargs=assistant_agent_kwargs,
76
+ )
77
+
78
+ return society
79
+
80
+
81
+ # Example case
82
+ question = "What was the volume in m^3 of the fish bag that was calculated in the University of Leicester paper `Can Hiccup Supply Enough Fish to Maintain a Dragon’s Diet?` "
83
+
84
+ society = construct_society(question)
85
+ answer, chat_history, token_count = run_society(society)
86
+
87
+ logger.success(f"Answer: {answer}")
88
+
89
+
90
+
91
+
92
+
run_in_docker.bat ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @echo off
2
+ setlocal enabledelayedexpansion
3
+
4
+ REM 检查参数
5
+ if "%~1"=="" (
6
+ echo 用法: run_in_docker.bat [脚本名称] "你的问题"
7
+ echo 例如: run_in_docker.bat run.py "什么是人工智能?"
8
+ echo 或者: run_in_docker.bat run_deepseek_example.py "什么是人工智能?"
9
+ echo 如果不指定脚本名称,默认使用 run.py
10
+ exit /b 1
11
+ )
12
+
13
+ REM 判断第一个参数是否是脚本名称
14
+ set SCRIPT_NAME=%~1
15
+ set QUERY=%~2
16
+
17
+ if "!SCRIPT_NAME:~-3!"==".py" (
18
+ REM 如果提供了第二个参数,则为查询内容
19
+ if "!QUERY!"=="" (
20
+ echo 请提供查询参数,例如: run_in_docker.bat !SCRIPT_NAME! "你的问题"
21
+ exit /b 1
22
+ )
23
+ ) else (
24
+ REM 如果第一个参数不是脚本名称,则默认使用 run.py
25
+ set QUERY=!SCRIPT_NAME!
26
+ set SCRIPT_NAME=run.py
27
+ )
28
+
29
+ REM 检查脚本是否存在
30
+ if not exist "owl\!SCRIPT_NAME!" (
31
+ echo 错误: 脚本 'owl\!SCRIPT_NAME!' 不存在
32
+ echo 可用的脚本有:
33
+ dir /b owl\*.py | findstr /v "__"
34
+ exit /b 1
35
+ )
36
+
37
+ echo 使用脚本: !SCRIPT_NAME!
38
+ echo 查询内容: !QUERY!
39
+
40
+ REM 确保Docker容器正在运行
41
+ docker-compose ps | findstr "owl.*Up" > nul
42
+ if errorlevel 1 (
43
+ echo 启动Docker容器...
44
+ docker-compose up -d
45
+
46
+ REM 等待容器启动
47
+ echo 等待容器启动...
48
+ timeout /t 5 /nobreak > nul
49
+ )
50
+
51
+ REM 在容器中运行指定的脚本,传递查询参数
52
+ echo 在Docker容器中运行脚本...
53
+ docker-compose exec -T owl xvfb-python !SCRIPT_NAME! "!QUERY!"
54
+
55
+ if errorlevel 0 (
56
+ echo 查询完成!
57
+ ) else (
58
+ echo 查询执行失败,请检查错误信息。
59
+ )
60
+
61
+ pause
run_in_docker.sh ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # 检测操作系统类型
4
+ OS_TYPE=$(uname -s)
5
+ echo "检测到操作系统: $OS_TYPE"
6
+
7
+ # 检查是否提供了查询参数
8
+ if [ $# -lt 1 ]; then
9
+ echo "用法: ./run_in_docker.sh [脚本名称] '你的问题'"
10
+ echo "例如: ./run_in_docker.sh run.py '什么是人工智能?'"
11
+ echo "或者: ./run_in_docker.sh run_deepseek_example.py '什么是人工智能?'"
12
+ echo "如果不指定脚本名称,默认使用 run.py"
13
+ exit 1
14
+ fi
15
+
16
+ # 判断第一个参数是否是脚本名称
17
+ if [[ $1 == *.py ]]; then
18
+ SCRIPT_NAME="$1"
19
+ # 如果提供了第二个参数,则为查询内容
20
+ if [ $# -ge 2 ]; then
21
+ QUERY="$2"
22
+ else
23
+ echo "请提供查询参数,例如: ./run_in_docker.sh $SCRIPT_NAME '你的问题'"
24
+ exit 1
25
+ fi
26
+ else
27
+ # 如果第一个参数不是脚本名称,则默认使用 run.py
28
+ SCRIPT_NAME="run.py"
29
+ QUERY="$1"
30
+ fi
31
+
32
+ # 根据操作系统类型设置脚本路径检查方式
33
+ if [[ "$OS_TYPE" == "Darwin" ]] || [[ "$OS_TYPE" == "Linux" ]]; then
34
+ # macOS 或 Linux
35
+ if [ ! -f "owl/$SCRIPT_NAME" ]; then
36
+ echo "错误: 脚本 'owl/$SCRIPT_NAME' 不存在"
37
+ echo "可用的脚本有:"
38
+ ls -1 owl/*.py | grep -v "__"
39
+ exit 1
40
+ fi
41
+ else
42
+ # Windows
43
+ if [ ! -f "owl/$SCRIPT_NAME" ]; then
44
+ echo "错误: 脚本 'owl/$SCRIPT_NAME' 不存在"
45
+ echo "可用的脚本有:"
46
+ find owl -name "*.py" | grep -v "__" | sed 's/\\/\//g'
47
+ exit 1
48
+ fi
49
+ fi
50
+
51
+ echo "使用脚本: $SCRIPT_NAME"
52
+ echo "查询内容: $QUERY"
53
+
54
+ # 确保Docker容器正在运行
55
+ CONTAINER_RUNNING=$(docker-compose ps | grep -c "owl.*Up" || true)
56
+ if [ "$CONTAINER_RUNNING" -eq 0 ]; then
57
+ echo "启动Docker容器..."
58
+ docker-compose up -d
59
+
60
+ # 等待容器启动
61
+ echo "等待容器启动..."
62
+ sleep 5
63
+ fi
64
+
65
+ # 直接在容器中运行指定的脚本,传递查询参数
66
+ echo "在Docker容器中运行脚本..."
67
+
68
+ # 根据操作系统类型执行不同的命令
69
+ if [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
70
+ # Windows可能需要特殊处理引号
71
+ winpty docker-compose exec -T owl xvfb-python $SCRIPT_NAME "$QUERY"
72
+ else
73
+ # macOS 或 Linux
74
+ docker-compose exec -T owl xvfb-python $SCRIPT_NAME "$QUERY"
75
+ fi
76
+
77
+ # 检查命令执行结果
78
+ if [ $? -eq 0 ]; then
79
+ echo "查询完成!"
80
+ else
81
+ echo "查询执行失败,请检查错误信息。"
82
+ fi