add docker
Browse files- .dockerignore +74 -0
- DOCKER_README.md +298 -0
- Dockerfile +57 -0
- build_docker.bat +24 -0
- build_docker.sh +41 -0
- check_docker.bat +60 -0
- check_docker.sh +92 -0
- docker-compose.yml +52 -0
- owl/run_qwq_demo.py +92 -0
- run_in_docker.bat +61 -0
- run_in_docker.sh +82 -0
.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
|