Commit
·
98ef7f1
1
Parent(s):
ffd123e
update readme and format fix
Browse files- README.md +28 -1
- README_zh.md +26 -1
- owl/run_deepseek_zh.py +2 -4
- owl/run_mcp.py +21 -8
- owl/run_terminal.py +5 -2
- owl/run_terminal_zh.py +8 -4
- owl/utils/enhanced_role_playing.py +4 -5
- owl/utils/gaia.py +3 -1
- run_app.py +2 -1
- run_app_zh.py +2 -1
README.md
CHANGED
@@ -122,7 +122,9 @@ https://private-user-images.githubusercontent.com/55657767/420212194-e813fc05-13
|
|
122 |
- **Browser Automation**: Utilize the Playwright framework for simulating browser interactions, including scrolling, clicking, input handling, downloading, navigation, and more.
|
123 |
- **Document Parsing**: Extract content from Word, Excel, PDF, and PowerPoint files, converting them into text or Markdown format.
|
124 |
- **Code Execution**: Write and execute Python code using interpreter.
|
125 |
-
- **Built-in Toolkits**: Access to a comprehensive set of built-in toolkits including
|
|
|
|
|
126 |
|
127 |
# 🛠️ Installation
|
128 |
|
@@ -275,6 +277,23 @@ For more detailed Docker usage instructions, including cross-platform support, o
|
|
275 |
|
276 |
# 🚀 Quick Start
|
277 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
278 |
After installation and setting up your environment variables, you can start using OWL right away:
|
279 |
|
280 |
```bash
|
@@ -355,6 +374,14 @@ Here are some tasks you can try with OWL:
|
|
355 |
|
356 |
# 🧰 Toolkits and Capabilities
|
357 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
358 |
> **Important**: Effective use of toolkits requires models with strong tool calling capabilities. For multimodal toolkits (Web, Image, Video), models must also have multimodal understanding abilities.
|
359 |
|
360 |
OWL supports various toolkits that can be customized by modifying the `tools` list in your script:
|
|
|
122 |
- **Browser Automation**: Utilize the Playwright framework for simulating browser interactions, including scrolling, clicking, input handling, downloading, navigation, and more.
|
123 |
- **Document Parsing**: Extract content from Word, Excel, PDF, and PowerPoint files, converting them into text or Markdown format.
|
124 |
- **Code Execution**: Write and execute Python code using interpreter.
|
125 |
+
- **Built-in Toolkits**: Access to a comprehensive set of built-in toolkits including:
|
126 |
+
- **Model Context Protocol (MCP)**: A universal protocol layer that standardizes AI model interactions with various tools and data sources
|
127 |
+
- **Core Toolkits**: ArxivToolkit, AudioAnalysisToolkit, CodeExecutionToolkit, DalleToolkit, DataCommonsToolkit, ExcelToolkit, GitHubToolkit, GoogleMapsToolkit, GoogleScholarToolkit, ImageAnalysisToolkit, MathToolkit, NetworkXToolkit, NotionToolkit, OpenAPIToolkit, RedditToolkit, SearchToolkit, SemanticScholarToolkit, SymPyToolkit, VideoAnalysisToolkit, WeatherToolkit, BrowserToolkit, and many more for specialized tasks
|
128 |
|
129 |
# 🛠️ Installation
|
130 |
|
|
|
277 |
|
278 |
# 🚀 Quick Start
|
279 |
|
280 |
+
## Try MCP (Model Context Protocol) Integration
|
281 |
+
|
282 |
+
Experience the power of MCP by running our example that demonstrates multi-agent information retrieval and processing:
|
283 |
+
|
284 |
+
```bash
|
285 |
+
# Set up MCP servers (one-time setup)
|
286 |
+
npx -y @smithery/cli install @wonderwhy-er/desktop-commander --client claude
|
287 |
+
npx @wonderwhy-er/desktop-commander setup
|
288 |
+
|
289 |
+
# Run the MCP example
|
290 |
+
python owl/run_mcp.py
|
291 |
+
```
|
292 |
+
|
293 |
+
This example showcases how OWL agents can seamlessly interact with file systems, web automation, and information retrieval through the MCP protocol. Check out `owl/run_mcp.py` for the full implementation.
|
294 |
+
|
295 |
+
## Basic Usage
|
296 |
+
|
297 |
After installation and setting up your environment variables, you can start using OWL right away:
|
298 |
|
299 |
```bash
|
|
|
374 |
|
375 |
# 🧰 Toolkits and Capabilities
|
376 |
|
377 |
+
## Model Context Protocol (MCP)
|
378 |
+
|
379 |
+
OWL's MCP integration provides a standardized way for AI models to interact with various tools and data sources:
|
380 |
+
|
381 |
+
Try our comprehensive MCP example in `owl/run_mcp.py` to see these capabilities in action!
|
382 |
+
|
383 |
+
## Available Toolkits
|
384 |
+
|
385 |
> **Important**: Effective use of toolkits requires models with strong tool calling capabilities. For multimodal toolkits (Web, Image, Video), models must also have multimodal understanding abilities.
|
386 |
|
387 |
OWL supports various toolkits that can be customized by modifying the `tools` list in your script:
|
README_zh.md
CHANGED
@@ -105,7 +105,7 @@
|
|
105 |
</div>
|
106 |
|
107 |
- **[2025.03.12]**: 在SearchToolkit中添加了Bocha搜索功能,集成了火山引擎模型平台,并更新了Azure和OpenAI Compatible模型的结构化输出和工具调用能力。
|
108 |
-
- **[2025.03.11]**: 我们添加了 MCPToolkit、FileWriteToolkit 和 TerminalToolkit
|
109 |
- **[2025.03.09]**: 我们添加了基于网页的用户界面,使系统交互变得更加简便。
|
110 |
- **[2025.03.07]**: 我们开源了 🦉 OWL 项目的代码库。
|
111 |
- **[2025.03.03]**: OWL 在 GAIA 基准测试中取得 58.18 平均分,在开源框架中排名第一!
|
@@ -272,6 +272,23 @@ chmod +x build_docker.sh
|
|
272 |
更多详细的Docker使用说明,包括跨平台支持、优化配置和故障排除,请参阅 [DOCKER_README.md](.container/DOCKER_README.md)
|
273 |
|
274 |
# 🚀 快速开始
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
275 |
|
276 |
运行以下示例:
|
277 |
|
@@ -349,6 +366,14 @@ OWL 将自动调用与文档相关的工具来处理文件并提取答案。
|
|
349 |
|
350 |
# 🧰 工具包与功能
|
351 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
352 |
> **重要提示**:有效使用工具包需要具备强大工具调用能力的模型。对于多模态工具包(Web、图像、视频),模型还必须具备多模态理解能力。
|
353 |
|
354 |
OWL支持多种工具包,可通过修改脚本中的`tools`列表进行自定义:
|
|
|
105 |
</div>
|
106 |
|
107 |
- **[2025.03.12]**: 在SearchToolkit中添加了Bocha搜索功能,集成了火山引擎模型平台,并更新了Azure和OpenAI Compatible模型的结构化输出和工具调用能力。
|
108 |
+
- **[2025.03.11]**: 我们添加了 MCPToolkit、FileWriteToolkit 和 TerminalToolkit,增强了 OWL Agent 的 MCP(模型上下文协议)集成、文件写入能力和终端命令执行功能。MCP 作为一个通用协议层,标准化了 AI 模型与各种数据源和工具的交互方式。
|
109 |
- **[2025.03.09]**: 我们添加了基于网页的用户界面,使系统交互变得更加简便。
|
110 |
- **[2025.03.07]**: 我们开源了 🦉 OWL 项目的代码库。
|
111 |
- **[2025.03.03]**: OWL 在 GAIA 基准测试中取得 58.18 平均分,在开源框架中排名第一!
|
|
|
272 |
更多详细的Docker使用说明,包括跨平台支持、优化配置和故障排除,请参阅 [DOCKER_README.md](.container/DOCKER_README.md)
|
273 |
|
274 |
# 🚀 快速开始
|
275 |
+
|
276 |
+
## 尝试 MCP(模型上下文协议)集成
|
277 |
+
|
278 |
+
体验 MCP 的强大功能,运行我们的示例来展示多智能体信息检索和处理:
|
279 |
+
|
280 |
+
```bash
|
281 |
+
# 设置 MCP 服务器(仅需一次性设置)
|
282 |
+
npx -y @smithery/cli install @wonderwhy-er/desktop-commander --client claude
|
283 |
+
npx @wonderwhy-er/desktop-commander setup
|
284 |
+
|
285 |
+
# 运行 MCP 示例
|
286 |
+
python owl/run_mcp.py
|
287 |
+
```
|
288 |
+
|
289 |
+
这个示例展示了 OWL 智能体如何通过 MCP 协议无缝地与文件系统、网页自动化和信息检索进行交互。查看 `owl/run_mcp.py` 了解完整实现。
|
290 |
+
|
291 |
+
## 基本用法
|
292 |
|
293 |
运行以下示例:
|
294 |
|
|
|
366 |
|
367 |
# 🧰 工具包与功能
|
368 |
|
369 |
+
## 模型上下文协议(MCP)
|
370 |
+
|
371 |
+
OWL 的 MCP 集成为 AI 模型与各种工具和数据源的交互提供了标准化的方式。
|
372 |
+
|
373 |
+
查看我们的综合示例 `owl/run_mcp.py` 来体验这些功能!
|
374 |
+
|
375 |
+
## 可用工具包
|
376 |
+
|
377 |
> **重要提示**:有效使用工具包需要具备强大工具调用能力的模型。对于多模态工具包(Web、图像、视频),模型还必须具备多模态理解能力。
|
378 |
|
379 |
OWL支持多种工具包,可通过修改脚本中的`tools`列表进行自定义:
|
owl/run_deepseek_zh.py
CHANGED
@@ -31,7 +31,7 @@ from camel.toolkits import (
|
|
31 |
from camel.types import ModelPlatformType, ModelType
|
32 |
|
33 |
|
34 |
-
from utils import OwlRolePlaying, run_society
|
35 |
|
36 |
from camel.logger import set_log_level
|
37 |
|
@@ -99,9 +99,7 @@ def construct_society(question: str) -> OwlRolePlaying:
|
|
99 |
def main():
|
100 |
r"""Main function to run the OWL system with an example question."""
|
101 |
# Example research question
|
102 |
-
question =
|
103 |
-
"搜索OWL项目最近的新闻并生成一篇报告,最后保存到本地。"
|
104 |
-
)
|
105 |
|
106 |
# Construct and run the society
|
107 |
society = construct_society(question)
|
|
|
31 |
from camel.types import ModelPlatformType, ModelType
|
32 |
|
33 |
|
34 |
+
from utils import OwlRolePlaying, run_society
|
35 |
|
36 |
from camel.logger import set_log_level
|
37 |
|
|
|
99 |
def main():
|
100 |
r"""Main function to run the OWL system with an example question."""
|
101 |
# Example research question
|
102 |
+
question = "搜索OWL项目最近的新闻并生成一篇报告,最后保存到本地。"
|
|
|
|
|
103 |
|
104 |
# Construct and run the society
|
105 |
society = construct_society(question)
|
owl/run_mcp.py
CHANGED
@@ -1,3 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
"""MCP Multi-Agent System Example
|
2 |
|
3 |
This example demonstrates how to use MCP (Model Context Protocol) with CAMEL agents
|
@@ -15,7 +28,7 @@ Environment Setup:
|
|
15 |
# Install MCP service
|
16 |
npx -y @smithery/cli install @wonderwhy-er/desktop-commander --client claude
|
17 |
npx @wonderwhy-er/desktop-commander setup
|
18 |
-
|
19 |
# Configure in owl/mcp_servers_config.json:
|
20 |
{
|
21 |
"desktop-commander": {
|
@@ -33,7 +46,7 @@ Environment Setup:
|
|
33 |
# Install MCP service
|
34 |
npm install -g @executeautomation/playwright-mcp-server
|
35 |
npx playwright install-deps
|
36 |
-
|
37 |
# Configure in mcp_servers_config.json:
|
38 |
{
|
39 |
"mcpServers": {
|
@@ -49,7 +62,7 @@ Environment Setup:
|
|
49 |
```bash
|
50 |
# Install MCP service
|
51 |
pip install mcp-server-fetch
|
52 |
-
|
53 |
# Configure in mcp_servers_config.json:
|
54 |
{
|
55 |
"mcpServers": {
|
@@ -92,7 +105,6 @@ from camel.toolkits import MCPToolkit
|
|
92 |
from utils.enhanced_role_playing import OwlRolePlaying, run_society
|
93 |
|
94 |
|
95 |
-
|
96 |
load_dotenv()
|
97 |
set_log_level(level="DEBUG")
|
98 |
|
@@ -150,7 +162,7 @@ async def main():
|
|
150 |
|
151 |
question = (
|
152 |
"I'd like a academic report about Andrew Ng, including his research "
|
153 |
-
"direction, published papers (At least 3), institutions, etc."
|
154 |
"Then organize the report in Markdown format and save it to my desktop"
|
155 |
)
|
156 |
|
@@ -164,8 +176,9 @@ async def main():
|
|
164 |
# Make sure to disconnect safely after all operations are completed.
|
165 |
try:
|
166 |
await mcp_toolkit.disconnect()
|
167 |
-
except Exception
|
168 |
-
print(
|
|
|
169 |
|
170 |
if __name__ == "__main__":
|
171 |
-
asyncio.run(main())
|
|
|
1 |
+
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
|
2 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3 |
+
# you may not use this file except in compliance with the License.
|
4 |
+
# You may obtain a copy of the License at
|
5 |
+
#
|
6 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
7 |
+
#
|
8 |
+
# Unless required by applicable law or agreed to in writing, software
|
9 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
10 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11 |
+
# See the License for the specific language governing permissions and
|
12 |
+
# limitations under the License.
|
13 |
+
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
|
14 |
"""MCP Multi-Agent System Example
|
15 |
|
16 |
This example demonstrates how to use MCP (Model Context Protocol) with CAMEL agents
|
|
|
28 |
# Install MCP service
|
29 |
npx -y @smithery/cli install @wonderwhy-er/desktop-commander --client claude
|
30 |
npx @wonderwhy-er/desktop-commander setup
|
31 |
+
|
32 |
# Configure in owl/mcp_servers_config.json:
|
33 |
{
|
34 |
"desktop-commander": {
|
|
|
46 |
# Install MCP service
|
47 |
npm install -g @executeautomation/playwright-mcp-server
|
48 |
npx playwright install-deps
|
49 |
+
|
50 |
# Configure in mcp_servers_config.json:
|
51 |
{
|
52 |
"mcpServers": {
|
|
|
62 |
```bash
|
63 |
# Install MCP service
|
64 |
pip install mcp-server-fetch
|
65 |
+
|
66 |
# Configure in mcp_servers_config.json:
|
67 |
{
|
68 |
"mcpServers": {
|
|
|
105 |
from utils.enhanced_role_playing import OwlRolePlaying, run_society
|
106 |
|
107 |
|
|
|
108 |
load_dotenv()
|
109 |
set_log_level(level="DEBUG")
|
110 |
|
|
|
162 |
|
163 |
question = (
|
164 |
"I'd like a academic report about Andrew Ng, including his research "
|
165 |
+
"direction, published papers (At least 3), institutions, etc."
|
166 |
"Then organize the report in Markdown format and save it to my desktop"
|
167 |
)
|
168 |
|
|
|
176 |
# Make sure to disconnect safely after all operations are completed.
|
177 |
try:
|
178 |
await mcp_toolkit.disconnect()
|
179 |
+
except Exception:
|
180 |
+
print("Disconnect failed")
|
181 |
+
|
182 |
|
183 |
if __name__ == "__main__":
|
184 |
+
asyncio.run(main())
|
owl/run_terminal.py
CHANGED
@@ -18,7 +18,7 @@ from camel.toolkits import (
|
|
18 |
SearchToolkit,
|
19 |
BrowserToolkit,
|
20 |
FileWriteToolkit,
|
21 |
-
TerminalToolkit
|
22 |
)
|
23 |
from camel.types import ModelPlatformType, ModelType
|
24 |
from camel.logger import set_log_level
|
@@ -30,6 +30,7 @@ set_log_level(level="DEBUG")
|
|
30 |
# Get current script directory
|
31 |
base_dir = os.path.dirname(os.path.abspath(__file__))
|
32 |
|
|
|
33 |
def construct_society(question: str) -> OwlRolePlaying:
|
34 |
r"""Construct a society of agents based on the given question.
|
35 |
|
@@ -113,7 +114,9 @@ def main():
|
|
113 |
answer, chat_history, token_count = run_society(society)
|
114 |
|
115 |
# Output the result
|
116 |
-
print(
|
|
|
|
|
117 |
|
118 |
|
119 |
if __name__ == "__main__":
|
|
|
18 |
SearchToolkit,
|
19 |
BrowserToolkit,
|
20 |
FileWriteToolkit,
|
21 |
+
TerminalToolkit,
|
22 |
)
|
23 |
from camel.types import ModelPlatformType, ModelType
|
24 |
from camel.logger import set_log_level
|
|
|
30 |
# Get current script directory
|
31 |
base_dir = os.path.dirname(os.path.abspath(__file__))
|
32 |
|
33 |
+
|
34 |
def construct_society(question: str) -> OwlRolePlaying:
|
35 |
r"""Construct a society of agents based on the given question.
|
36 |
|
|
|
114 |
answer, chat_history, token_count = run_society(society)
|
115 |
|
116 |
# Output the result
|
117 |
+
print(
|
118 |
+
f"\033[94mAnswer: {answer}\nChat History: {chat_history}\ntoken_count:{token_count}\033[0m"
|
119 |
+
)
|
120 |
|
121 |
|
122 |
if __name__ == "__main__":
|
owl/run_terminal_zh.py
CHANGED
@@ -12,13 +12,13 @@
|
|
12 |
# limitations under the License.
|
13 |
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
|
14 |
from dotenv import load_dotenv
|
15 |
-
|
16 |
from camel.models import ModelFactory
|
17 |
from camel.toolkits import (
|
18 |
SearchToolkit,
|
19 |
BrowserToolkit,
|
20 |
FileWriteToolkit,
|
21 |
-
TerminalToolkit
|
22 |
)
|
23 |
from camel.types import ModelPlatformType, ModelType
|
24 |
from camel.logger import set_log_level
|
@@ -27,10 +27,12 @@ from utils import OwlRolePlaying, run_society
|
|
27 |
|
28 |
load_dotenv()
|
29 |
set_log_level(level="DEBUG")
|
30 |
-
|
|
|
31 |
# Get current script directory
|
32 |
base_dir = os.path.dirname(os.path.abspath(__file__))
|
33 |
|
|
|
34 |
def construct_society(question: str) -> OwlRolePlaying:
|
35 |
r"""Construct a society of agents based on the given question.
|
36 |
|
@@ -112,7 +114,9 @@ def main():
|
|
112 |
answer, chat_history, token_count = run_society(society)
|
113 |
|
114 |
# Output the result
|
115 |
-
print(
|
|
|
|
|
116 |
|
117 |
|
118 |
if __name__ == "__main__":
|
|
|
12 |
# limitations under the License.
|
13 |
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
|
14 |
from dotenv import load_dotenv
|
15 |
+
import os
|
16 |
from camel.models import ModelFactory
|
17 |
from camel.toolkits import (
|
18 |
SearchToolkit,
|
19 |
BrowserToolkit,
|
20 |
FileWriteToolkit,
|
21 |
+
TerminalToolkit,
|
22 |
)
|
23 |
from camel.types import ModelPlatformType, ModelType
|
24 |
from camel.logger import set_log_level
|
|
|
27 |
|
28 |
load_dotenv()
|
29 |
set_log_level(level="DEBUG")
|
30 |
+
|
31 |
+
|
32 |
# Get current script directory
|
33 |
base_dir = os.path.dirname(os.path.abspath(__file__))
|
34 |
|
35 |
+
|
36 |
def construct_society(question: str) -> OwlRolePlaying:
|
37 |
r"""Construct a society of agents based on the given question.
|
38 |
|
|
|
114 |
answer, chat_history, token_count = run_society(society)
|
115 |
|
116 |
# Output the result
|
117 |
+
print(
|
118 |
+
f"\033[94mAnswer: {answer}\nChat History: {chat_history}\ntoken_count:{token_count}\033[0m"
|
119 |
+
)
|
120 |
|
121 |
|
122 |
if __name__ == "__main__":
|
owl/utils/enhanced_role_playing.py
CHANGED
@@ -282,8 +282,7 @@ Please note that our overall task may be very complicated. Here are some tips th
|
|
282 |
)
|
283 |
|
284 |
async def astep(
|
285 |
-
self,
|
286 |
-
assistant_msg: BaseMessage
|
287 |
) -> Tuple[ChatAgentResponse, ChatAgentResponse]:
|
288 |
user_response = await self.user_agent.astep(assistant_msg)
|
289 |
if user_response.terminated or user_response.msgs is None:
|
@@ -452,9 +451,9 @@ async def run_society(
|
|
452 |
input_msg = society.init_chat(init_prompt)
|
453 |
for _round in range(round_limit):
|
454 |
assistant_response, user_response = await society.astep(input_msg)
|
455 |
-
overall_prompt_token_count +=
|
456 |
-
|
457 |
-
|
458 |
overall_prompt_token_count += (
|
459 |
assistant_response.info["usage"]["prompt_tokens"]
|
460 |
+ user_response.info["usage"]["prompt_tokens"]
|
|
|
282 |
)
|
283 |
|
284 |
async def astep(
|
285 |
+
self, assistant_msg: BaseMessage
|
|
|
286 |
) -> Tuple[ChatAgentResponse, ChatAgentResponse]:
|
287 |
user_response = await self.user_agent.astep(assistant_msg)
|
288 |
if user_response.terminated or user_response.msgs is None:
|
|
|
451 |
input_msg = society.init_chat(init_prompt)
|
452 |
for _round in range(round_limit):
|
453 |
assistant_response, user_response = await society.astep(input_msg)
|
454 |
+
overall_prompt_token_count += assistant_response.info["usage"][
|
455 |
+
"completion_tokens"
|
456 |
+
]
|
457 |
overall_prompt_token_count += (
|
458 |
assistant_response.info["usage"]["prompt_tokens"]
|
459 |
+ user_response.info["usage"]["prompt_tokens"]
|
owl/utils/gaia.py
CHANGED
@@ -191,7 +191,9 @@ class GAIABenchmark(BaseBenchmark):
|
|
191 |
except Exception as e:
|
192 |
logger.warning(e)
|
193 |
# raise FileNotFoundError(f"{self.save_to} does not exist.")
|
194 |
-
datas = [
|
|
|
|
|
195 |
logger.info(f"Number of tasks to be processed: {len(datas)}")
|
196 |
# Process tasks
|
197 |
for task in tqdm(datas, desc="Running"):
|
|
|
191 |
except Exception as e:
|
192 |
logger.warning(e)
|
193 |
# raise FileNotFoundError(f"{self.save_to} does not exist.")
|
194 |
+
datas = [
|
195 |
+
data for data in datas if not self._check_task_completed(data["task_id"])
|
196 |
+
]
|
197 |
logger.info(f"Number of tasks to be processed: {len(datas)}")
|
198 |
# Process tasks
|
199 |
for task in tqdm(datas, desc="Running"):
|
run_app.py
CHANGED
@@ -22,7 +22,8 @@ import os
|
|
22 |
import sys
|
23 |
from pathlib import Path
|
24 |
|
25 |
-
os.environ[
|
|
|
26 |
|
27 |
def main():
|
28 |
"""Main function to launch the OWL Intelligent Assistant Platform"""
|
|
|
22 |
import sys
|
23 |
from pathlib import Path
|
24 |
|
25 |
+
os.environ["PYTHONIOENCODING"] = "utf-8"
|
26 |
+
|
27 |
|
28 |
def main():
|
29 |
"""Main function to launch the OWL Intelligent Assistant Platform"""
|
run_app_zh.py
CHANGED
@@ -22,7 +22,8 @@ import os
|
|
22 |
import sys
|
23 |
from pathlib import Path
|
24 |
|
25 |
-
os.environ[
|
|
|
26 |
|
27 |
def main():
|
28 |
"""主函数,启动OWL智能助手运行平台"""
|
|
|
22 |
import sys
|
23 |
from pathlib import Path
|
24 |
|
25 |
+
os.environ["PYTHONIOENCODING"] = "utf-8"
|
26 |
+
|
27 |
|
28 |
def main():
|
29 |
"""主函数,启动OWL智能助手运行平台"""
|